summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--COPYING-DOCS397
-rw-r--r--Makefile.am.in11
-rw-r--r--Makefile.cvs15
-rw-r--r--README126
-rw-r--r--atlantikdesigner/Makefile.am17
-rw-r--r--atlantikdesigner/TODO15
-rw-r--r--atlantikdesigner/atlantikdesigner.desktop170
-rw-r--r--atlantikdesigner/atlantikdesignerui.rc24
-rw-r--r--atlantikdesigner/configure.in.bot9
-rw-r--r--atlantikdesigner/configure.in.in7
-rw-r--r--atlantikdesigner/designer/Makefile.am10
-rw-r--r--atlantikdesigner/designer/boardinfo.cpp186
-rw-r--r--atlantikdesigner/designer/boardinfo.h74
-rw-r--r--atlantikdesigner/designer/designer.cpp1099
-rw-r--r--atlantikdesigner/designer/designer.h106
-rw-r--r--atlantikdesigner/designer/editor.cpp938
-rw-r--r--atlantikdesigner/designer/editor.h310
-rw-r--r--atlantikdesigner/designer/group.cpp242
-rw-r--r--atlantikdesigner/designer/group.h99
-rw-r--r--atlantikdesigner/designer/main.cpp37
-rw-r--r--atlantikdesigner/pics/Makefile.am1
-rw-r--r--atlantikdesigner/pics/hi16-app-atlantikdesigner.pngbin0 -> 785 bytes
-rw-r--r--atlantikdesigner/pics/hi32-app-atlantikdesigner.pngbin0 -> 1640 bytes
-rw-r--r--configure.in.in4
-rw-r--r--doc/Makefile.am5
-rw-r--r--doc/kate-plugins/Makefile.am4
-rw-r--r--doc/kate-plugins/configure_insertcommand.pngbin0 -> 23622 bytes
-rw-r--r--doc/kate-plugins/filetemplates.docbook323
-rw-r--r--doc/kate-plugins/htmltools.docbook84
-rw-r--r--doc/kate-plugins/index.docbook131
-rw-r--r--doc/kate-plugins/insertcommand.docbook150
-rw-r--r--doc/kate-plugins/insertcommand.pngbin0 -> 6558 bytes
-rw-r--r--doc/kate-plugins/openheader.docbook49
-rw-r--r--doc/kate-plugins/textfilter.docbook50
-rw-r--r--doc/kate-plugins/xmlcheck.docbook102
-rw-r--r--doc/kate-plugins/xmltools.docbook186
-rw-r--r--doc/kicker-applets/Makefile.am4
-rw-r--r--doc/kicker-applets/index.docbook113
-rw-r--r--doc/kicker-applets/kolourpicker.docbook56
-rw-r--r--doc/kicker-applets/ktimemon.docbook429
-rw-r--r--doc/konq-plugins/Makefile.am6
-rw-r--r--doc/konq-plugins/babel/Makefile.am6
-rw-r--r--doc/konq-plugins/babel/index.docbook95
-rw-r--r--doc/konq-plugins/crashes/Makefile.am6
-rw-r--r--doc/konq-plugins/crashes/index.docbook58
-rw-r--r--doc/konq-plugins/dirfilter/Makefile.am6
-rw-r--r--doc/konq-plugins/dirfilter/index.docbook61
-rw-r--r--doc/konq-plugins/domtreeviewer/Makefile.am6
-rw-r--r--doc/konq-plugins/domtreeviewer/index.docbook62
-rw-r--r--doc/konq-plugins/fsview/Makefile.am6
-rw-r--r--doc/konq-plugins/fsview/index.docbook182
-rw-r--r--doc/konq-plugins/imgallery/Makefile.am6
-rw-r--r--doc/konq-plugins/imgallery/folders.pngbin0 -> 26953 bytes
-rw-r--r--doc/konq-plugins/imgallery/index.docbook207
-rw-r--r--doc/konq-plugins/imgallery/look.pngbin0 -> 27791 bytes
-rw-r--r--doc/konq-plugins/imgallery/thumbnails.pngbin0 -> 20725 bytes
-rw-r--r--doc/konq-plugins/index.docbook158
-rw-r--r--doc/konq-plugins/khtmlsettings/Makefile.am6
-rw-r--r--doc/konq-plugins/khtmlsettings/index.docbook114
-rw-r--r--doc/konq-plugins/kuick/Makefile.am6
-rw-r--r--doc/konq-plugins/kuick/index.docbook116
-rw-r--r--doc/konq-plugins/mediaplayer/Makefile.am6
-rw-r--r--doc/konq-plugins/mediaplayer/index.docbook59
-rw-r--r--doc/konq-plugins/uachanger/Makefile.am6
-rw-r--r--doc/konq-plugins/uachanger/index.docbook102
-rw-r--r--doc/konq-plugins/validators/Makefile.am6
-rw-r--r--doc/konq-plugins/validators/index.docbook87
-rw-r--r--doc/konq-plugins/webarchiver/Makefile.am6
-rw-r--r--doc/konq-plugins/webarchiver/index.docbook62
-rw-r--r--doc/ksig/Makefile.am2
-rw-r--r--doc/ksig/index.docbook431
-rw-r--r--doc/ksig/screenshot.pngbin0 -> 7692 bytes
-rw-r--r--kaddressbook-plugins/Makefile.am1
-rw-r--r--kaddressbook-plugins/configure.in.in7
-rw-r--r--kaddressbook-plugins/xxports/Makefile.am1
-rw-r--r--kaddressbook-plugins/xxports/gmx/Makefile.am18
-rw-r--r--kaddressbook-plugins/xxports/gmx/gmx_xxport.cpp346
-rw-r--r--kaddressbook-plugins/xxports/gmx/gmx_xxport.desktop109
-rw-r--r--kaddressbook-plugins/xxports/gmx/gmx_xxport.h47
-rw-r--r--kaddressbook-plugins/xxports/gmx/gmx_xxportui.rc14
-rw-r--r--kaddressbook-plugins/xxports/kworldclock/Makefile.am17
-rw-r--r--kaddressbook-plugins/xxports/kworldclock/geo_xxport.cpp114
-rw-r--r--kaddressbook-plugins/xxports/kworldclock/geo_xxport.desktop112
-rw-r--r--kaddressbook-plugins/xxports/kworldclock/geo_xxport.h42
-rw-r--r--kaddressbook-plugins/xxports/kworldclock/geo_xxportui.rc11
-rw-r--r--kate/Makefile.am5
-rw-r--r--kate/cppsymbolviewer/Makefile.am17
-rw-r--r--kate/cppsymbolviewer/cpp_parser.cpp335
-rw-r--r--kate/cppsymbolviewer/katecppsymbolviewer.desktop115
-rw-r--r--kate/cppsymbolviewer/plugin_katesymbolviewer.cpp337
-rw-r--r--kate/cppsymbolviewer/plugin_katesymbolviewer.h300
-rw-r--r--kate/cppsymbolviewer/tcl_parser.cpp150
-rw-r--r--kate/cppsymbolviewer/testfile.c59
-rw-r--r--kate/cppsymbolviewer/ui.rc9
-rw-r--r--kate/filelistloader/Makefile.am34
-rw-r--r--kate/filelistloader/katefll.desktop83
-rw-r--r--kate/filelistloader/katefll_initplugin.cpp96
-rw-r--r--kate/filelistloader/katefll_initplugin.desktop112
-rw-r--r--kate/filelistloader/katefll_initplugin.h46
-rw-r--r--kate/filelistloader/katefll_plugin.cpp241
-rw-r--r--kate/filelistloader/katefll_plugin.desktop125
-rw-r--r--kate/filelistloader/katefll_plugin.h67
-rw-r--r--kate/filelistloader/ui.rc13
-rw-r--r--kate/filetemplates/Makefile.am1
-rw-r--r--kate/filetemplates/katefiletemplates.kateproject15
-rw-r--r--kate/filetemplates/plugin/Makefile.am25
-rw-r--r--kate/filetemplates/plugin/filetemplates.cpp1254
-rw-r--r--kate/filetemplates/plugin/filetemplates.h258
-rw-r--r--kate/filetemplates/plugin/katefiletemplates.desktop113
-rw-r--r--kate/filetemplates/plugin/katetemplate.xml87
-rw-r--r--kate/filetemplates/plugin/ui.rc15
-rw-r--r--kate/filetemplates/templates/Makefile.am5
-rw-r--r--kate/filetemplates/templates/cppgpl.cpp.katetemplate24
-rw-r--r--kate/filetemplates/templates/cppgpl.hh.katetemplate34
-rw-r--r--kate/filetemplates/templates/cpplgpl.cpp.katetemplate23
-rw-r--r--kate/filetemplates/templates/cpplgpl.hh.katetemplate32
-rw-r--r--kate/filetemplates/templates/docbookchapter.xml.katetemplate75
-rw-r--r--kate/filetemplates/templates/html.katetemplate18
-rw-r--r--kate/filetemplates/templates/language.xml.katetemplate60
-rw-r--r--kate/helloworld/Makefile.am18
-rw-r--r--kate/helloworld/katehelloworld.desktop119
-rw-r--r--kate/helloworld/plugin_katehelloworld.cpp66
-rw-r--r--kate/helloworld/plugin_katehelloworld.h30
-rw-r--r--kate/helloworld/ui.rc8
-rw-r--r--kate/htmltools/Makefile.am21
-rw-r--r--kate/htmltools/katehtmltools.desktop136
-rw-r--r--kate/htmltools/plugin_katehtmltools.cpp161
-rw-r--r--kate/htmltools/plugin_katehtmltools.h53
-rw-r--r--kate/htmltools/ui.rc8
-rw-r--r--kate/insertcommand/Makefile.am21
-rw-r--r--kate/insertcommand/kateinsertcommand.desktop119
-rw-r--r--kate/insertcommand/plugin_kateinsertcommand.cpp417
-rw-r--r--kate/insertcommand/plugin_kateinsertcommand.h170
-rw-r--r--kate/insertcommand/ui.rc8
-rw-r--r--kate/kjswrapper/Makefile.am16
-rw-r--r--kate/kjswrapper/bindings.cpp466
-rw-r--r--kate/kjswrapper/bindings.h150
-rw-r--r--kate/kjswrapper/plugin_katekjswrapper.cpp437
-rw-r--r--kate/kjswrapper/plugin_katekjswrapper.h180
-rw-r--r--kate/kjswrapper/samples/Makefile.am23
-rw-r--r--kate/kjswrapper/samples/katekjsconsolewindow.desktop55
-rw-r--r--kate/kjswrapper/samples/katekjsconsolewindow.js18
-rw-r--r--kate/kjswrapper/samples/katekjsconsolewindow.rc8
-rw-r--r--kate/kjswrapper/samples/katekjsselect.desktop53
-rw-r--r--kate/kjswrapper/samples/katekjsselect.js92
-rw-r--r--kate/kjswrapper/samples/katekjsselect.rc8
-rw-r--r--kate/kjswrapper/samples/katekjstest1.desktop90
-rw-r--r--kate/kjswrapper/samples/katekjstest1.js167
-rw-r--r--kate/kpybrowser/Makefile.am18
-rw-r--r--kate/kpybrowser/katepybrowse.desktop128
-rw-r--r--kate/kpybrowser/kpybrowser.cpp397
-rw-r--r--kate/kpybrowser/kpybrowser.desktop18
-rw-r--r--kate/kpybrowser/kpybrowser.h69
-rw-r--r--kate/kpybrowser/pybrowse.xpm495
-rw-r--r--kate/kpybrowser/pybrowse_part.cpp157
-rw-r--r--kate/kpybrowser/pybrowse_part.h72
-rw-r--r--kate/kpybrowser/pybrowsenode.cpp209
-rw-r--r--kate/kpybrowser/pybrowsenode.h68
-rw-r--r--kate/kpybrowser/ui.rc8
-rw-r--r--kate/make/Makefile.am21
-rw-r--r--kate/make/katemake.desktop119
-rw-r--r--kate/make/plugin_katemake.cpp736
-rw-r--r--kate/make/plugin_katemake.h108
-rw-r--r--kate/make/ui.rc12
-rw-r--r--kate/modeline/Makefile.am21
-rw-r--r--kate/modeline/ModelinePlugin.cpp125
-rw-r--r--kate/modeline/ModelinePlugin.h40
-rw-r--r--kate/modeline/katemodeline.desktop119
-rw-r--r--kate/modeline/ui.rc8
-rw-r--r--kate/openheader/Makefile.am21
-rw-r--r--kate/openheader/kateopenheader.desktop112
-rw-r--r--kate/openheader/plugin_kateopenheader.cpp117
-rw-r--r--kate/openheader/plugin_kateopenheader.h50
-rw-r--r--kate/openheader/ui.rc8
-rw-r--r--kate/scripts/Makefile.am2
-rw-r--r--kate/scripts/html-tidy.desktop77
-rw-r--r--kate/scripts/html-tidy.sh64
-rw-r--r--kate/snippets/CWidgetSnippetsBase.ui214
-rw-r--r--kate/snippets/CWidgetSnippetsBase.ui.h28
-rw-r--r--kate/snippets/Makefile.am17
-rw-r--r--kate/snippets/csnippet.cpp17
-rw-r--r--kate/snippets/csnippet.h39
-rw-r--r--kate/snippets/cwidgetsnippets.cpp22
-rw-r--r--kate/snippets/cwidgetsnippets.h26
-rw-r--r--kate/snippets/katesnippets.desktop101
-rw-r--r--kate/snippets/plugin_katesnippets.cpp321
-rw-r--r--kate/snippets/plugin_katesnippets.h78
-rw-r--r--kate/snippets/plugin_katesnippets.rc11
-rw-r--r--kate/tabbarextension/Makefile.am17
-rw-r--r--kate/tabbarextension/katetabbarextension.desktop109
-rw-r--r--kate/tabbarextension/plugin_katetabbarextension.cpp530
-rw-r--r--kate/tabbarextension/plugin_katetabbarextension.h322
-rw-r--r--kate/tabbarextension/ui.rc7
-rw-r--r--kate/textfilter/Makefile.am21
-rw-r--r--kate/textfilter/katetextfilter.desktop123
-rw-r--r--kate/textfilter/plugin_katetextfilter.cpp336
-rw-r--r--kate/textfilter/plugin_katetextfilter.h65
-rw-r--r--kate/textfilter/ui.rc8
-rw-r--r--kate/xmlcheck/Makefile.am21
-rw-r--r--kate/xmlcheck/katexmlcheck.desktop122
-rw-r--r--kate/xmlcheck/plugin_katexmlcheck.cpp353
-rw-r--r--kate/xmlcheck/plugin_katexmlcheck.h87
-rw-r--r--kate/xmlcheck/ui.rc8
-rw-r--r--kate/xmltools/ChangeLog11
-rw-r--r--kate/xmltools/Makefile.am30
-rw-r--r--kate/xmltools/README43
-rw-r--r--kate/xmltools/html4-loose.dtd.xml13498
-rw-r--r--kate/xmltools/html4-strict.dtd.xml11145
-rw-r--r--kate/xmltools/katexmltools.desktop129
-rw-r--r--kate/xmltools/kcfg.dtd.xml354
-rw-r--r--kate/xmltools/kde-docbook.dtd.xml21489
-rw-r--r--kate/xmltools/kpartgui.dtd.xml673
-rw-r--r--kate/xmltools/language.dtd.xml960
-rw-r--r--kate/xmltools/plugin_katexmltools.cpp1141
-rw-r--r--kate/xmltools/plugin_katexmltools.h150
-rw-r--r--kate/xmltools/pseudo_dtd.cpp466
-rw-r--r--kate/xmltools/pseudo_dtd.h76
-rw-r--r--kate/xmltools/simplify_dtd.xsl64
-rw-r--r--kate/xmltools/testcases.xml73
-rw-r--r--kate/xmltools/ui.rc10
-rw-r--r--kate/xmltools/xhtml1-frameset.dtd.xml14043
-rw-r--r--kate/xmltools/xhtml1-strict.dtd.xml11629
-rw-r--r--kate/xmltools/xhtml1-transitional.dtd.xml13983
-rw-r--r--kate/xmltools/xslt-1.0.dtd.xml1690
-rw-r--r--kdeaddons.lsm11
-rw-r--r--kfile-plugins/Makefile.am5
-rw-r--r--kfile-plugins/RETURNED_ITEMS28
-rw-r--r--kfile-plugins/cert/Makefile.am22
-rw-r--r--kfile-plugins/cert/configure.in.in2
-rw-r--r--kfile-plugins/cert/kfile_cert.cpp161
-rw-r--r--kfile-plugins/cert/kfile_cert.desktop60
-rw-r--r--kfile-plugins/cert/kfile_cert.h42
-rw-r--r--kfile-plugins/desktop/Makefile.am22
-rw-r--r--kfile-plugins/desktop/kfile_desktop.cpp128
-rw-r--r--kfile-plugins/desktop/kfile_desktop.desktop68
-rw-r--r--kfile-plugins/desktop/kfile_desktop.h39
-rw-r--r--kfile-plugins/folder/Makefile.am21
-rw-r--r--kfile-plugins/folder/kfile_folder.cpp86
-rw-r--r--kfile-plugins/folder/kfile_folder.desktop70
-rw-r--r--kfile-plugins/folder/kfile_folder.h37
-rw-r--r--kfile-plugins/html/Makefile.am22
-rw-r--r--kfile-plugins/html/kfile_html.cpp158
-rw-r--r--kfile-plugins/html/kfile_html.desktop66
-rw-r--r--kfile-plugins/html/kfile_html.h38
-rw-r--r--kfile-plugins/lnk/Makefile.am34
-rw-r--r--kfile-plugins/lnk/README29
-rw-r--r--kfile-plugins/lnk/kfile_lnk.cpp93
-rw-r--r--kfile-plugins/lnk/kfile_lnk.desktop62
-rw-r--r--kfile-plugins/lnk/kfile_lnk.h46
-rw-r--r--kfile-plugins/lnk/lnkforward.cpp130
-rw-r--r--kfile-plugins/lnk/lnkforward.desktop114
-rw-r--r--kfile-plugins/lnk/lnkforward.h42
-rw-r--r--kfile-plugins/lnk/read_lnk.cpp227
-rw-r--r--kfile-plugins/lnk/read_lnk.h46
-rw-r--r--kfile-plugins/lnk/x-win-lnk.desktop61
-rw-r--r--kfile-plugins/mhtml/Makefile.am21
-rw-r--r--kfile-plugins/mhtml/kfile_mhtml.cpp201
-rw-r--r--kfile-plugins/mhtml/kfile_mhtml.desktop60
-rw-r--r--kfile-plugins/mhtml/kfile_mhtml.h45
-rw-r--r--kfile-plugins/txt/Makefile.am21
-rw-r--r--kfile-plugins/txt/kfile_txt.cpp129
-rw-r--r--kfile-plugins/txt/kfile_txt.desktop70
-rw-r--r--kfile-plugins/txt/kfile_txt.h39
-rw-r--r--kicker-applets/Makefile.am2
-rw-r--r--kicker-applets/kbinaryclock/Makefile.am22
-rw-r--r--kicker-applets/kbinaryclock/datepicker.cpp51
-rw-r--r--kicker-applets/kbinaryclock/datepicker.h42
-rw-r--r--kicker-applets/kbinaryclock/kbinaryclock.cpp411
-rw-r--r--kicker-applets/kbinaryclock/kbinaryclock.desktop108
-rw-r--r--kicker-applets/kbinaryclock/kbinaryclock.h105
-rw-r--r--kicker-applets/kbinaryclock/kbinaryclock.kcfg49
-rw-r--r--kicker-applets/kbinaryclock/prefs.kcfgc7
-rw-r--r--kicker-applets/kbinaryclock/settings.ui483
-rw-r--r--kicker-applets/kolourpicker/Makefile.am23
-rw-r--r--kicker-applets/kolourpicker/TODO1
-rw-r--r--kicker-applets/kolourpicker/kolourpicker.cpp382
-rw-r--r--kicker-applets/kolourpicker/kolourpicker.desktop145
-rw-r--r--kicker-applets/kolourpicker/kolourpicker.h70
-rw-r--r--kicker-applets/kolourpicker/simplebutton.cpp256
-rw-r--r--kicker-applets/kolourpicker/simplebutton.h89
-rw-r--r--kicker-applets/ktimemon/Makefile.am22
-rw-r--r--kicker-applets/ktimemon/README65
-rw-r--r--kicker-applets/ktimemon/TODO13
-rw-r--r--kicker-applets/ktimemon/confdlg.cc295
-rw-r--r--kicker-applets/ktimemon/confdlg.h99
-rw-r--r--kicker-applets/ktimemon/configure.in.in3
-rw-r--r--kicker-applets/ktimemon/cr16-app-ktimemon.pngbin0 -> 306 bytes
-rw-r--r--kicker-applets/ktimemon/cr32-app-ktimemon.pngbin0 -> 345 bytes
-rw-r--r--kicker-applets/ktimemon/ktimemon.desktop129
-rw-r--r--kicker-applets/ktimemon/lo16-app-ktimemon.pngbin0 -> 306 bytes
-rw-r--r--kicker-applets/ktimemon/lo32-app-ktimemon.pngbin0 -> 345 bytes
-rw-r--r--kicker-applets/ktimemon/sample.cc508
-rw-r--r--kicker-applets/ktimemon/sample.h94
-rw-r--r--kicker-applets/ktimemon/timemon.cc435
-rw-r--r--kicker-applets/ktimemon/timemon.h107
-rw-r--r--kicker-applets/math/Makefile.am19
-rw-r--r--kicker-applets/math/mathapplet.cpp285
-rw-r--r--kicker-applets/math/mathapplet.desktop114
-rw-r--r--kicker-applets/math/mathapplet.h74
-rw-r--r--kicker-applets/math/parser.cpp813
-rw-r--r--kicker-applets/math/parser.h241
-rw-r--r--kicker-applets/mediacontrol/AUTHORS5
-rw-r--r--kicker-applets/mediacontrol/Makefile.am28
-rw-r--r--kicker-applets/mediacontrol/README28
-rw-r--r--kicker-applets/mediacontrol/TODO7
-rw-r--r--kicker-applets/mediacontrol/amarokInterface.cpp310
-rw-r--r--kicker-applets/mediacontrol/amarokInterface.h69
-rw-r--r--kicker-applets/mediacontrol/configfrontend.cpp99
-rw-r--r--kicker-applets/mediacontrol/configfrontend.h52
-rw-r--r--kicker-applets/mediacontrol/configure.in.in48
-rw-r--r--kicker-applets/mediacontrol/jukInterface.cpp314
-rw-r--r--kicker-applets/mediacontrol/jukInterface.h72
-rw-r--r--kicker-applets/mediacontrol/kscdInterface.cpp332
-rw-r--r--kicker-applets/mediacontrol/kscdInterface.h68
-rw-r--r--kicker-applets/mediacontrol/mcslider.cpp66
-rw-r--r--kicker-applets/mediacontrol/mcslider.h37
-rw-r--r--kicker-applets/mediacontrol/mediacontrol.cpp614
-rw-r--r--kicker-applets/mediacontrol/mediacontrol.desktop121
-rw-r--r--kicker-applets/mediacontrol/mediacontrol.h122
-rw-r--r--kicker-applets/mediacontrol/mediacontrolconfig.cpp197
-rw-r--r--kicker-applets/mediacontrol/mediacontrolconfig.h54
-rw-r--r--kicker-applets/mediacontrol/mediacontrolconfigwidget.ui374
-rw-r--r--kicker-applets/mediacontrol/mediacontroliface.h31
-rw-r--r--kicker-applets/mediacontrol/mpdInterface.cpp585
-rw-r--r--kicker-applets/mediacontrol/mpdInterface.h100
-rw-r--r--kicker-applets/mediacontrol/noatunInterface.cpp283
-rw-r--r--kicker-applets/mediacontrol/noatunInterface.h67
-rw-r--r--kicker-applets/mediacontrol/pics/Makefile.am2
-rw-r--r--kicker-applets/mediacontrol/pics/blueish/Makefile.am4
-rw-r--r--kicker-applets/mediacontrol/pics/blueish/next.pngbin0 -> 174 bytes
-rw-r--r--kicker-applets/mediacontrol/pics/blueish/pause.pngbin0 -> 119 bytes
-rw-r--r--kicker-applets/mediacontrol/pics/blueish/play.pngbin0 -> 160 bytes
-rw-r--r--kicker-applets/mediacontrol/pics/blueish/prev.pngbin0 -> 173 bytes
-rw-r--r--kicker-applets/mediacontrol/pics/blueish/stop.pngbin0 -> 115 bytes
-rw-r--r--kicker-applets/mediacontrol/pics/default/Makefile.am4
-rw-r--r--kicker-applets/mediacontrol/pics/default/next.pngbin0 -> 392 bytes
-rw-r--r--kicker-applets/mediacontrol/pics/default/pause.pngbin0 -> 345 bytes
-rw-r--r--kicker-applets/mediacontrol/pics/default/play.pngbin0 -> 342 bytes
-rw-r--r--kicker-applets/mediacontrol/pics/default/prev.pngbin0 -> 379 bytes
-rw-r--r--kicker-applets/mediacontrol/pics/default/stop.pngbin0 -> 356 bytes
-rw-r--r--kicker-applets/mediacontrol/pics/fulldecent/Makefile.am4
-rw-r--r--kicker-applets/mediacontrol/pics/fulldecent/README12
-rw-r--r--kicker-applets/mediacontrol/pics/fulldecent/next.pngbin0 -> 553 bytes
-rw-r--r--kicker-applets/mediacontrol/pics/fulldecent/pause.pngbin0 -> 423 bytes
-rw-r--r--kicker-applets/mediacontrol/pics/fulldecent/play.pngbin0 -> 546 bytes
-rw-r--r--kicker-applets/mediacontrol/pics/fulldecent/prev.pngbin0 -> 573 bytes
-rw-r--r--kicker-applets/mediacontrol/pics/fulldecent/source.xcfbin0 -> 9566 bytes
-rw-r--r--kicker-applets/mediacontrol/pics/fulldecent/stop.pngbin0 -> 427 bytes
-rw-r--r--kicker-applets/mediacontrol/playerInterface.cpp34
-rw-r--r--kicker-applets/mediacontrol/playerInterface.h57
-rw-r--r--kicker-applets/mediacontrol/simplebutton.cpp256
-rw-r--r--kicker-applets/mediacontrol/simplebutton.h89
-rw-r--r--kicker-applets/mediacontrol/xmmsInterface.cpp183
-rw-r--r--kicker-applets/mediacontrol/xmmsInterface.h59
-rw-r--r--knewsticker-scripts/GENERAL23
-rw-r--r--knewsticker-scripts/Generic.Newsticker.Error134
-rw-r--r--knewsticker-scripts/Makefile.am7
-rw-r--r--knewsticker-scripts/README.kataribe44
-rw-r--r--knewsticker-scripts/Readme.ErrorHandling19
-rw-r--r--knewsticker-scripts/Readme.newsrss48
-rw-r--r--knewsticker-scripts/Readme.stock36
-rwxr-xr-xknewsticker-scripts/bbc.pl54
-rwxr-xr-xknewsticker-scripts/fyensget.pybin0 -> 3312 bytes
-rwxr-xr-xknewsticker-scripts/kataribe.pl96
-rw-r--r--knewsticker-scripts/newsrss.pl100
-rwxr-xr-xknewsticker-scripts/sportscores.py241
-rwxr-xr-xknewsticker-scripts/stock.pl276
-rw-r--r--konq-plugins/Makefile.am6
-rw-r--r--konq-plugins/README91
-rw-r--r--konq-plugins/akregator/Makefile.am25
-rw-r--r--konq-plugins/akregator/akregator_konqfeedicon.desktop116
-rw-r--r--konq-plugins/akregator/akregator_konqfeedicon.rc3
-rw-r--r--konq-plugins/akregator/akregator_konqplugin.desktop54
-rw-r--r--konq-plugins/akregator/akregatorplugin.cpp135
-rw-r--r--konq-plugins/akregator/akregatorplugin.h60
-rw-r--r--konq-plugins/akregator/feeddetector.cpp147
-rw-r--r--konq-plugins/akregator/feeddetector.h77
-rw-r--r--konq-plugins/akregator/konqfeedicon.cpp222
-rw-r--r--konq-plugins/akregator/konqfeedicon.h77
-rw-r--r--konq-plugins/akregator/pluginbase.cpp102
-rw-r--r--konq-plugins/akregator/pluginbase.h60
-rw-r--r--konq-plugins/akregator/rss.pngbin0 -> 1158 bytes
-rw-r--r--konq-plugins/akregator/rss.svgzbin0 -> 2075 bytes
-rw-r--r--konq-plugins/arkplugin/Makefile.am18
-rw-r--r--konq-plugins/arkplugin/ark_plugin.desktop59
-rw-r--r--konq-plugins/arkplugin/arkplugin.cpp566
-rw-r--r--konq-plugins/arkplugin/arkplugin.desktop59
-rw-r--r--konq-plugins/arkplugin/arkplugin.h72
-rw-r--r--konq-plugins/autorefresh/Makefile.am21
-rw-r--r--konq-plugins/autorefresh/autorefresh.cpp107
-rw-r--r--konq-plugins/autorefresh/autorefresh.desktop120
-rw-r--r--konq-plugins/autorefresh/autorefresh.h55
-rw-r--r--konq-plugins/autorefresh/autorefresh.rc10
-rw-r--r--konq-plugins/autorefresh/lo16-app-autorefresh.pngbin0 -> 258 bytes
-rw-r--r--konq-plugins/babelfish/Makefile.am26
-rw-r--r--konq-plugins/babelfish/cr16-action-babelfish.pngbin0 -> 790 bytes
-rw-r--r--konq-plugins/babelfish/cr22-action-babelfish.pngbin0 -> 1356 bytes
-rw-r--r--konq-plugins/babelfish/plugin_babelfish.cpp376
-rw-r--r--konq-plugins/babelfish/plugin_babelfish.desktop126
-rw-r--r--konq-plugins/babelfish/plugin_babelfish.h52
-rw-r--r--konq-plugins/babelfish/plugin_babelfish.rc11
-rw-r--r--konq-plugins/babelfish/translaterc15
-rw-r--r--konq-plugins/crashes/Makefile.am16
-rw-r--r--konq-plugins/crashes/crashesplugin.cpp193
-rw-r--r--konq-plugins/crashes/crashesplugin.desktop124
-rw-r--r--konq-plugins/crashes/crashesplugin.h70
-rw-r--r--konq-plugins/crashes/crashesplugin.rc11
-rw-r--r--konq-plugins/dirfilter/Makefile.am19
-rw-r--r--konq-plugins/dirfilter/dirfilterplugin.cpp492
-rw-r--r--konq-plugins/dirfilter/dirfilterplugin.desktop125
-rw-r--r--konq-plugins/dirfilter/dirfilterplugin.h132
-rw-r--r--konq-plugins/dirfilter/dirfilterplugin.rc13
-rw-r--r--konq-plugins/domtreeviewer/Makefile.am44
-rw-r--r--konq-plugins/domtreeviewer/attributeeditdialog.ui174
-rw-r--r--konq-plugins/domtreeviewer/cr16-action-domtreeviewer.pngbin0 -> 932 bytes
-rw-r--r--konq-plugins/domtreeviewer/cr22-action-domtreeviewer.pngbin0 -> 1359 bytes
-rw-r--r--konq-plugins/domtreeviewer/domlistviewitem.cpp73
-rw-r--r--konq-plugins/domtreeviewer/domlistviewitem.h57
-rw-r--r--konq-plugins/domtreeviewer/domtreecommands.cpp562
-rw-r--r--konq-plugins/domtreeviewer/domtreecommands.h375
-rw-r--r--konq-plugins/domtreeviewer/domtreeview.cpp1226
-rw-r--r--konq-plugins/domtreeviewer/domtreeview.h203
-rw-r--r--konq-plugins/domtreeviewer/domtreeviewbase.ui525
-rw-r--r--konq-plugins/domtreeviewer/domtreeviewerui.rc45
-rw-r--r--konq-plugins/domtreeviewer/domtreewindow.cpp379
-rw-r--r--konq-plugins/domtreeviewer/domtreewindow.h194
-rw-r--r--konq-plugins/domtreeviewer/elementeditdialog.ui201
-rw-r--r--konq-plugins/domtreeviewer/messagedialog.ui117
-rw-r--r--konq-plugins/domtreeviewer/messagedialog.ui.h20
-rw-r--r--konq-plugins/domtreeviewer/plugin_domtreeviewer.cpp56
-rw-r--r--konq-plugins/domtreeviewer/plugin_domtreeviewer.desktop128
-rw-r--r--konq-plugins/domtreeviewer/plugin_domtreeviewer.h27
-rw-r--r--konq-plugins/domtreeviewer/plugin_domtreeviewer.rc11
-rw-r--r--konq-plugins/domtreeviewer/signalreceiver.cpp37
-rw-r--r--konq-plugins/domtreeviewer/signalreceiver.h67
-rw-r--r--konq-plugins/domtreeviewer/texteditdialog.ui149
-rw-r--r--konq-plugins/fsview/Makefile.am51
-rw-r--r--konq-plugins/fsview/README29
-rw-r--r--konq-plugins/fsview/fsview.cpp540
-rw-r--r--konq-plugins/fsview/fsview.desktop120
-rw-r--r--konq-plugins/fsview/fsview.h136
-rw-r--r--konq-plugins/fsview/fsview_part.cpp413
-rw-r--r--konq-plugins/fsview/fsview_part.desktop58
-rw-r--r--konq-plugins/fsview/fsview_part.h122
-rw-r--r--konq-plugins/fsview/fsview_part.rc15
-rw-r--r--konq-plugins/fsview/hi22-app-fsview.pngbin0 -> 834 bytes
-rw-r--r--konq-plugins/fsview/hi32-app-fsview.pngbin0 -> 902 bytes
-rw-r--r--konq-plugins/fsview/inode.cpp385
-rw-r--r--konq-plugins/fsview/inode.h97
-rw-r--r--konq-plugins/fsview/main.cpp56
-rw-r--r--konq-plugins/fsview/scan.cpp362
-rw-r--r--konq-plugins/fsview/scan.h230
-rw-r--r--konq-plugins/fsview/scantest.cpp56
-rw-r--r--konq-plugins/fsview/treemap.cpp3199
-rw-r--r--konq-plugins/fsview/treemap.h742
-rw-r--r--konq-plugins/imagerotation/Makefile.am7
-rwxr-xr-xkonq-plugins/imagerotation/exif.py1079
-rw-r--r--konq-plugins/imagerotation/imageconverter.desktop83
-rwxr-xr-xkonq-plugins/imagerotation/jpegorient89
-rw-r--r--konq-plugins/imagerotation/jpegorient.desktop307
-rwxr-xr-xkonq-plugins/imagerotation/orient.py104
-rw-r--r--konq-plugins/khtmlsettingsplugin/Makefile.am18
-rw-r--r--konq-plugins/khtmlsettingsplugin/khtmlsettingsplugin.desktop136
-rw-r--r--konq-plugins/khtmlsettingsplugin/khtmlsettingsplugin.lsm18
-rw-r--r--konq-plugins/khtmlsettingsplugin/khtmlsettingsplugin.rc11
-rw-r--r--konq-plugins/khtmlsettingsplugin/settingsplugin.cpp328
-rw-r--r--konq-plugins/khtmlsettingsplugin/settingsplugin.h56
-rw-r--r--konq-plugins/kimgalleryplugin/Makefile.am21
-rw-r--r--konq-plugins/kimgalleryplugin/cr16-action-imagegallery.pngbin0 -> 878 bytes
-rw-r--r--konq-plugins/kimgalleryplugin/cr22-action-imagegallery.pngbin0 -> 1443 bytes
-rw-r--r--konq-plugins/kimgalleryplugin/imgallerydialog.cpp455
-rw-r--r--konq-plugins/kimgalleryplugin/imgallerydialog.h113
-rw-r--r--konq-plugins/kimgalleryplugin/imgalleryplugin.cpp499
-rw-r--r--konq-plugins/kimgalleryplugin/imgalleryplugin.h80
-rw-r--r--konq-plugins/kimgalleryplugin/kimgalleryplugin.desktop129
-rw-r--r--konq-plugins/kimgalleryplugin/kimgalleryplugin.rc8
-rw-r--r--konq-plugins/kuick/Makefile.am26
-rw-r--r--konq-plugins/kuick/kcmkuick/Makefile.am17
-rw-r--r--konq-plugins/kuick/kcmkuick/kcmkuick.cpp155
-rw-r--r--konq-plugins/kuick/kcmkuick/kcmkuick.desktop202
-rw-r--r--konq-plugins/kuick/kcmkuick/kcmkuick.h46
-rw-r--r--konq-plugins/kuick/kcmkuick/kcmkuickdialog.ui197
-rw-r--r--konq-plugins/kuick/kdirmenu.cpp169
-rw-r--r--konq-plugins/kuick/kdirmenu.h61
-rw-r--r--konq-plugins/kuick/kimcontactmenu.cpp82
-rw-r--r--konq-plugins/kuick/kimcontactmenu.h54
-rw-r--r--konq-plugins/kuick/kmetamenu.cpp180
-rw-r--r--konq-plugins/kuick/kmetamenu.h67
-rw-r--r--konq-plugins/kuick/kuick_plugin.cpp114
-rw-r--r--konq-plugins/kuick/kuick_plugin.desktop67
-rw-r--r--konq-plugins/kuick/kuick_plugin.h54
-rw-r--r--konq-plugins/kuick/kuickplugin.desktop66
-rw-r--r--konq-plugins/mediarealfolder/Makefile.am5
-rwxr-xr-xkonq-plugins/mediarealfolder/kio_media_realfolder20
-rw-r--r--konq-plugins/mediarealfolder/media_realfolder.desktop55
-rw-r--r--konq-plugins/microformat/Makefile.am19
-rw-r--r--konq-plugins/microformat/README14
-rw-r--r--konq-plugins/microformat/hcard.pngbin0 -> 304 bytes
-rw-r--r--konq-plugins/microformat/konqmficon.cpp323
-rw-r--r--konq-plugins/microformat/konqmficon.h70
-rw-r--r--konq-plugins/microformat/mf_konqmficon.desktop110
-rw-r--r--konq-plugins/microformat/mf_konqmficon.rc3
-rw-r--r--konq-plugins/microformat/microformat.pngbin0 -> 1046 bytes
-rw-r--r--konq-plugins/microformat/microformat.svgzbin0 -> 1258 bytes
-rw-r--r--konq-plugins/microformat/pluginbase.cpp43
-rw-r--r--konq-plugins/microformat/pluginbase.h38
-rw-r--r--konq-plugins/minitools/Makefile.am14
-rw-r--r--konq-plugins/minitools/cr16-action-minitools.pngbin0 -> 690 bytes
-rw-r--r--konq-plugins/minitools/cr22-action-minitools.pngbin0 -> 996 bytes
-rw-r--r--konq-plugins/minitools/cr32-action-minitools.pngbin0 -> 1454 bytes
-rw-r--r--konq-plugins/minitools/cr48-action-minitools.pngbin0 -> 2272 bytes
-rw-r--r--konq-plugins/minitools/minitoolsplugin.cpp156
-rw-r--r--konq-plugins/minitools/minitoolsplugin.desktop121
-rw-r--r--konq-plugins/minitools/minitoolsplugin.h66
-rw-r--r--konq-plugins/minitools/minitoolsplugin.rc11
-rw-r--r--konq-plugins/rellinks/AUTHORS3
-rw-r--r--konq-plugins/rellinks/ChangeLog31
-rw-r--r--konq-plugins/rellinks/Makefile.am12
-rw-r--r--konq-plugins/rellinks/README13
-rw-r--r--konq-plugins/rellinks/TODO20
-rw-r--r--konq-plugins/rellinks/plugin_rellinks.cpp618
-rw-r--r--konq-plugins/rellinks/plugin_rellinks.desktop120
-rw-r--r--konq-plugins/rellinks/plugin_rellinks.h170
-rw-r--r--konq-plugins/rellinks/plugin_rellinks.rc38
-rw-r--r--konq-plugins/rellinks/rellinks.kdevelop157
-rw-r--r--konq-plugins/rellinks/rellinks.lsm16
-rw-r--r--konq-plugins/searchbar/Makefile.am21
-rw-r--r--konq-plugins/searchbar/icons/Makefile.am3
-rw-r--r--konq-plugins/searchbar/icons/cr16-action-google.pngbin0 -> 820 bytes
-rw-r--r--konq-plugins/searchbar/searchbar.cpp556
-rw-r--r--konq-plugins/searchbar/searchbar.desktop121
-rw-r--r--konq-plugins/searchbar/searchbar.h168
-rw-r--r--konq-plugins/searchbar/searchbar.lsm13
-rw-r--r--konq-plugins/searchbar/searchbar.rc6
-rw-r--r--konq-plugins/sidebar/Makefile.am5
-rw-r--r--konq-plugins/sidebar/delicious/Makefile.am22
-rw-r--r--konq-plugins/sidebar/delicious/bookmarkListItem.cpp72
-rw-r--r--konq-plugins/sidebar/delicious/bookmarkListItem.h51
-rw-r--r--konq-plugins/sidebar/delicious/delicious_add.desktop57
-rw-r--r--konq-plugins/sidebar/delicious/mainWidget.cpp354
-rw-r--r--konq-plugins/sidebar/delicious/mainWidget.h175
-rw-r--r--konq-plugins/sidebar/delicious/pics/Makefile.am1
-rw-r--r--konq-plugins/sidebar/delicious/pics/cr16-app-konqsidebar_delicious.pngbin0 -> 128 bytes
-rw-r--r--konq-plugins/sidebar/delicious/plugin.cpp108
-rw-r--r--konq-plugins/sidebar/delicious/plugin.h85
-rw-r--r--konq-plugins/sidebar/delicious/tagListItem.cpp78
-rw-r--r--konq-plugins/sidebar/delicious/tagListItem.h50
-rw-r--r--konq-plugins/sidebar/delicious/widget.ui165
-rw-r--r--konq-plugins/sidebar/mediaplayer/AUTHORS13
-rw-r--r--konq-plugins/sidebar/mediaplayer/COPYING12
-rw-r--r--konq-plugins/sidebar/mediaplayer/Makefile.am33
-rw-r--r--konq-plugins/sidebar/mediaplayer/controls.cpp138
-rw-r--r--konq-plugins/sidebar/mediaplayer/controls.h93
-rw-r--r--konq-plugins/sidebar/mediaplayer/engine.cpp207
-rw-r--r--konq-plugins/sidebar/mediaplayer/engine.h97
-rw-r--r--konq-plugins/sidebar/mediaplayer/mediaplayer.cpp74
-rw-r--r--konq-plugins/sidebar/mediaplayer/mediaplayer.h43
-rw-r--r--konq-plugins/sidebar/mediaplayer/mediaplayerplugin.desktop115
-rw-r--r--konq-plugins/sidebar/mediaplayer/mediawidget.cpp169
-rw-r--r--konq-plugins/sidebar/mediaplayer/mediawidget.h57
-rw-r--r--konq-plugins/sidebar/mediaplayer/mediawidget_skel.ui340
-rw-r--r--konq-plugins/sidebar/mediaplayer/mediawidget_skel_designer.ui340
-rw-r--r--konq-plugins/sidebar/mediaplayer/mplayer_add.desktop61
-rw-r--r--konq-plugins/sidebar/mediaplayer/pics/Makefile.am1
-rw-r--r--konq-plugins/sidebar/mediaplayer/pics/cr16-app-konqsidebar_mediaplayer.pngbin0 -> 897 bytes
-rw-r--r--konq-plugins/sidebar/mediaplayer/pics/cr22-app-konqsidebar_mediaplayer.pngbin0 -> 1319 bytes
-rw-r--r--konq-plugins/sidebar/mediaplayer/pics/cr32-app-konqsidebar_mediaplayer.pngbin0 -> 2070 bytes
-rw-r--r--konq-plugins/sidebar/mediaplayer/pics/cr48-app-konqsidebar_mediaplayer.pngbin0 -> 4411 bytes
-rw-r--r--konq-plugins/sidebar/mediaplayer/pics/lo32-app-konqsidebar_mediaplayer.pngbin0 -> 467 bytes
-rw-r--r--konq-plugins/sidebar/mediaplayer/player.cpp180
-rw-r--r--konq-plugins/sidebar/mediaplayer/player.h178
-rw-r--r--konq-plugins/sidebar/metabar/AUTHORS1
-rw-r--r--konq-plugins/sidebar/metabar/COPYING340
-rw-r--r--konq-plugins/sidebar/metabar/ChangeLog0
-rw-r--r--konq-plugins/sidebar/metabar/Doxyfile275
-rw-r--r--konq-plugins/sidebar/metabar/INSTALL167
-rw-r--r--konq-plugins/sidebar/metabar/Makefile.am1
-rw-r--r--konq-plugins/sidebar/metabar/NEWS0
-rw-r--r--konq-plugins/sidebar/metabar/README0
-rw-r--r--konq-plugins/sidebar/metabar/TODO0
-rw-r--r--konq-plugins/sidebar/metabar/config.h.in244
-rw-r--r--konq-plugins/sidebar/metabar/configure.in.in5
-rw-r--r--konq-plugins/sidebar/metabar/metabar.kdevelop213
-rw-r--r--konq-plugins/sidebar/metabar/metabar.kdevses47
-rw-r--r--konq-plugins/sidebar/metabar/src/Makefile.am28
-rw-r--r--konq-plugins/sidebar/metabar/src/configdialog.cpp611
-rw-r--r--konq-plugins/sidebar/metabar/src/configdialog.h114
-rw-r--r--konq-plugins/sidebar/metabar/src/default.css64
-rw-r--r--konq-plugins/sidebar/metabar/src/defaultplugin.cpp458
-rw-r--r--konq-plugins/sidebar/metabar/src/defaultplugin.h64
-rw-r--r--konq-plugins/sidebar/metabar/src/hi128-app-metabar.pngbin0 -> 11139 bytes
-rw-r--r--konq-plugins/sidebar/metabar/src/hi16-app-metabar.pngbin0 -> 735 bytes
-rw-r--r--konq-plugins/sidebar/metabar/src/hi32-app-metabar.pngbin0 -> 1710 bytes
-rw-r--r--konq-plugins/sidebar/metabar/src/hi48-app-metabar.pngbin0 -> 2912 bytes
-rw-r--r--konq-plugins/sidebar/metabar/src/hi64-app-metabar.pngbin0 -> 4318 bytes
-rw-r--r--konq-plugins/sidebar/metabar/src/hisc-app-metabar.svgzbin0 -> 5341 bytes
-rw-r--r--konq-plugins/sidebar/metabar/src/httpplugin.cpp119
-rw-r--r--konq-plugins/sidebar/metabar/src/httpplugin.h51
-rw-r--r--konq-plugins/sidebar/metabar/src/iconsrc4
-rw-r--r--konq-plugins/sidebar/metabar/src/layout.html48
-rw-r--r--konq-plugins/sidebar/metabar/src/metabar.cpp59
-rw-r--r--konq-plugins/sidebar/metabar/src/metabar.desktop81
-rw-r--r--konq-plugins/sidebar/metabar/src/metabar.h32
-rw-r--r--konq-plugins/sidebar/metabar/src/metabar_add.desktop70
-rw-r--r--konq-plugins/sidebar/metabar/src/metabarfunctions.cpp242
-rw-r--r--konq-plugins/sidebar/metabar/src/metabarfunctions.h59
-rw-r--r--konq-plugins/sidebar/metabar/src/metabarwidget.cpp592
-rw-r--r--konq-plugins/sidebar/metabar/src/metabarwidget.h88
-rw-r--r--konq-plugins/sidebar/metabar/src/protocolplugin.cpp157
-rw-r--r--konq-plugins/sidebar/metabar/src/protocolplugin.h60
-rw-r--r--konq-plugins/sidebar/metabar/src/remoteplugin.cpp52
-rw-r--r--konq-plugins/sidebar/metabar/src/remoteplugin.h37
-rw-r--r--konq-plugins/sidebar/metabar/src/serviceloader.cpp213
-rw-r--r--konq-plugins/sidebar/metabar/src/serviceloader.h59
-rw-r--r--konq-plugins/sidebar/metabar/src/settingsplugin.cpp201
-rw-r--r--konq-plugins/sidebar/metabar/src/settingsplugin.h56
-rw-r--r--konq-plugins/sidebar/metabar/stamp-h.in0
-rw-r--r--konq-plugins/sidebar/newsticker/Makefile.am36
-rw-r--r--konq-plugins/sidebar/newsticker/README38
-rw-r--r--konq-plugins/sidebar/newsticker/configfeeds.cpp38
-rw-r--r--konq-plugins/sidebar/newsticker/configfeeds.h53
-rw-r--r--konq-plugins/sidebar/newsticker/configfeedsbase.ui26
-rw-r--r--konq-plugins/sidebar/newsticker/konq_sidebarnews.kcfg15
-rw-r--r--konq-plugins/sidebar/newsticker/news_add.desktop44
-rw-r--r--konq-plugins/sidebar/newsticker/norsswidget.cpp100
-rw-r--r--konq-plugins/sidebar/newsticker/norsswidget.h51
-rw-r--r--konq-plugins/sidebar/newsticker/nspanel.cpp181
-rw-r--r--konq-plugins/sidebar/newsticker/nspanel.h109
-rw-r--r--konq-plugins/sidebar/newsticker/nsstacktabwidget.cpp365
-rw-r--r--konq-plugins/sidebar/newsticker/nsstacktabwidget.h91
-rw-r--r--konq-plugins/sidebar/newsticker/pics/LICENSE16
-rw-r--r--konq-plugins/sidebar/newsticker/pics/Makefile.am1
-rw-r--r--konq-plugins/sidebar/newsticker/pics/cr16-app-konqsidebar_news.pngbin0 -> 759 bytes
-rw-r--r--konq-plugins/sidebar/newsticker/pics/livemark-item.pngbin0 -> 3449 bytes
-rw-r--r--konq-plugins/sidebar/newsticker/sidebar_news.cpp279
-rw-r--r--konq-plugins/sidebar/newsticker/sidebar_news.h89
-rw-r--r--konq-plugins/sidebar/newsticker/sidebarsettings.kcfgc5
-rw-r--r--konq-plugins/smbmounter/Readme19
-rw-r--r--konq-plugins/uachanger/Makefile.am17
-rw-r--r--konq-plugins/uachanger/uachangerplugin.cpp436
-rw-r--r--konq-plugins/uachanger/uachangerplugin.desktop121
-rw-r--r--konq-plugins/uachanger/uachangerplugin.h95
-rw-r--r--konq-plugins/uachanger/uachangerplugin.rc11
-rw-r--r--konq-plugins/uninstall.desktop2
-rw-r--r--konq-plugins/validators/Makefile.am24
-rw-r--r--konq-plugins/validators/cr16-action-cssvalidator.pngbin0 -> 746 bytes
-rw-r--r--konq-plugins/validators/cr16-action-htmlvalidator.pngbin0 -> 631 bytes
-rw-r--r--konq-plugins/validators/cr16-action-validators.pngbin0 -> 631 bytes
-rw-r--r--konq-plugins/validators/cr22-action-cssvalidator.pngbin0 -> 1125 bytes
-rw-r--r--konq-plugins/validators/cr22-action-htmlvalidator.pngbin0 -> 999 bytes
-rw-r--r--konq-plugins/validators/cr22-action-validators.pngbin0 -> 999 bytes
-rw-r--r--konq-plugins/validators/plugin_validators.cpp202
-rw-r--r--konq-plugins/validators/plugin_validators.desktop128
-rw-r--r--konq-plugins/validators/plugin_validators.h72
-rw-r--r--konq-plugins/validators/plugin_validators.rc11
-rw-r--r--konq-plugins/validators/validatorsdialog.cpp176
-rw-r--r--konq-plugins/validators/validatorsdialog.h58
-rw-r--r--konq-plugins/webarchiver/Makefile.am32
-rw-r--r--konq-plugins/webarchiver/archivedialog.cpp565
-rw-r--r--konq-plugins/webarchiver/archivedialog.h82
-rw-r--r--konq-plugins/webarchiver/archiveviewbase.ui128
-rw-r--r--konq-plugins/webarchiver/cr16-action-webarchiver.pngbin0 -> 919 bytes
-rw-r--r--konq-plugins/webarchiver/cr22-action-webarchiver.pngbin0 -> 1419 bytes
-rw-r--r--konq-plugins/webarchiver/plugin_webarchiver.cpp116
-rw-r--r--konq-plugins/webarchiver/plugin_webarchiver.desktop130
-rw-r--r--konq-plugins/webarchiver/plugin_webarchiver.h42
-rw-r--r--konq-plugins/webarchiver/plugin_webarchiver.rc11
-rw-r--r--konq-plugins/webarchiver/webarchivecreator.cpp117
-rw-r--r--konq-plugins/webarchiver/webarchivecreator.h51
-rw-r--r--konq-plugins/webarchiver/webarchivethumbnail.desktop76
-rw-r--r--ksig/Makefile.am20
-rw-r--r--ksig/hi16-app-ksig.pngbin0 -> 751 bytes
-rw-r--r--ksig/hi32-app-ksig.pngbin0 -> 1731 bytes
-rw-r--r--ksig/ksig.cpp273
-rw-r--r--ksig/ksig.desktop72
-rw-r--r--ksig/ksig.h75
-rw-r--r--ksig/ksig.spec45
-rw-r--r--ksig/ksigui.rc26
-rw-r--r--ksig/main.cpp69
-rw-r--r--ksig/siggenerator.cpp87
-rw-r--r--ksig/siggenerator.h43
-rw-r--r--ksig/siglistview.cpp124
-rw-r--r--ksig/siglistview.h71
-rw-r--r--ksig/siglistviewitem.cpp108
-rw-r--r--ksig/siglistviewitem.h57
-rw-r--r--ksig/standardtext.cpp51
-rw-r--r--ksig/standardtext.h39
-rw-r--r--ksig/standardtextbase.ui119
-rw-r--r--noatun-plugins/Makefile.am18
-rw-r--r--noatun-plugins/alarm/Makefile.am21
-rw-r--r--noatun-plugins/alarm/kminutespinbox.cpp41
-rw-r--r--noatun-plugins/alarm/kminutespinbox.h38
-rw-r--r--noatun-plugins/alarm/kpercentspinbox.cpp38
-rw-r--r--noatun-plugins/alarm/kpercentspinbox.h33
-rw-r--r--noatun-plugins/alarm/wakeup.cpp373
-rw-r--r--noatun-plugins/alarm/wakeup.h103
-rw-r--r--noatun-plugins/alarm/wakeup.plugin115
-rw-r--r--noatun-plugins/alsaplayer/AlsaPlayer.ui2640
-rw-r--r--noatun-plugins/alsaplayer/Custom.cw20
-rw-r--r--noatun-plugins/alsaplayer/Makefile.am24
-rw-r--r--noatun-plugins/alsaplayer/alsaplayerui.cpp35
-rw-r--r--noatun-plugins/alsaplayer/alsaplayerui.plugin84
-rw-r--r--noatun-plugins/alsaplayer/configmodule.cpp72
-rw-r--r--noatun-plugins/alsaplayer/configmodule.h53
-rw-r--r--noatun-plugins/alsaplayer/seeker.cpp61
-rw-r--r--noatun-plugins/alsaplayer/seeker.h50
-rw-r--r--noatun-plugins/alsaplayer/userinterface.cpp339
-rw-r--r--noatun-plugins/alsaplayer/userinterface.h91
-rw-r--r--noatun-plugins/blurscope/Makefile.am10
-rw-r--r--noatun-plugins/blurscope/blurscope.plugin74
-rw-r--r--noatun-plugins/blurscope/scopedisplayer.cpp291
-rw-r--r--noatun-plugins/blurscope/sdlscope.cpp78
-rw-r--r--noatun-plugins/blurscope/sdlscope.h110
-rw-r--r--noatun-plugins/charlatan/Makefile.am23
-rw-r--r--noatun-plugins/charlatan/charlatanui.cpp35
-rw-r--r--noatun-plugins/charlatan/charlatanui.plugin77
-rw-r--r--noatun-plugins/charlatan/configmodule.cpp71
-rw-r--r--noatun-plugins/charlatan/configmodule.h53
-rw-r--r--noatun-plugins/charlatan/pixmaps.h612
-rw-r--r--noatun-plugins/charlatan/seeker.cpp104
-rw-r--r--noatun-plugins/charlatan/seeker.h58
-rw-r--r--noatun-plugins/charlatan/userinterface.cpp408
-rw-r--r--noatun-plugins/charlatan/userinterface.h99
-rw-r--r--noatun-plugins/configure.in.bot10
-rw-r--r--noatun-plugins/configure.in.in203
-rw-r--r--noatun-plugins/dub/AUTHORS1
-rw-r--r--noatun-plugins/dub/BUGS8
-rw-r--r--noatun-plugins/dub/COPYING340
-rw-r--r--noatun-plugins/dub/ChangeLog38
-rw-r--r--noatun-plugins/dub/INSTALL167
-rw-r--r--noatun-plugins/dub/Makefile.am11
-rw-r--r--noatun-plugins/dub/NEWS35
-rw-r--r--noatun-plugins/dub/README22
-rw-r--r--noatun-plugins/dub/TODO20
-rw-r--r--noatun-plugins/dub/configure.in.in4
-rw-r--r--noatun-plugins/dub/design.txt43
-rw-r--r--noatun-plugins/dub/dub.kdevprj198
-rw-r--r--noatun-plugins/dub/dub/Makefile.am20
-rw-r--r--noatun-plugins/dub/dub/dub.cpp641
-rw-r--r--noatun-plugins/dub/dub/dub.h207
-rw-r--r--noatun-plugins/dub/dub/dub.plugin69
-rw-r--r--noatun-plugins/dub/dub/dubapp.cpp98
-rw-r--r--noatun-plugins/dub/dub/dubapp.h83
-rw-r--r--noatun-plugins/dub/dub/dubconfigmodule.cpp125
-rw-r--r--noatun-plugins/dub/dub/dubconfigmodule.h40
-rw-r--r--noatun-plugins/dub/dub/dubplaylist.cpp158
-rw-r--r--noatun-plugins/dub/dub/dubplaylist.h77
-rw-r--r--noatun-plugins/dub/dub/dubplaylistitem.cpp83
-rw-r--r--noatun-plugins/dub/dub/dubplaylistitem.h55
-rw-r--r--noatun-plugins/dub/dub/dubprefs.ui187
-rw-r--r--noatun-plugins/dub/dub/dubui.rc8
-rw-r--r--noatun-plugins/dub/dub/dubview.cpp63
-rw-r--r--noatun-plugins/dub/dub/dubview.h52
-rw-r--r--noatun-plugins/dub/dub/fileselectorwidget.cpp183
-rw-r--r--noatun-plugins/dub/dub/fileselectorwidget.h74
-rw-r--r--noatun-plugins/dub/dub/random.h43
-rw-r--r--noatun-plugins/dub/dub/templates/cpp_template15
-rw-r--r--noatun-plugins/dub/dub/templates/header_template21
-rw-r--r--noatun-plugins/ffrs/Makefile.am17
-rw-r--r--noatun-plugins/ffrs/ffrs.cpp305
-rw-r--r--noatun-plugins/ffrs/ffrs.h80
-rw-r--r--noatun-plugins/ffrs/ffrs.plugin108
-rw-r--r--noatun-plugins/luckytag/Makefile.am11
-rw-r--r--noatun-plugins/luckytag/luckytag.cpp49
-rw-r--r--noatun-plugins/luckytag/luckytag.h35
-rw-r--r--noatun-plugins/luckytag/luckytag.plugin121
-rw-r--r--noatun-plugins/luckytag/parsedmp3filename.cpp98
-rw-r--r--noatun-plugins/luckytag/parsedmp3filename.h49
-rw-r--r--noatun-plugins/lyrics/Makefile.am17
-rw-r--r--noatun-plugins/lyrics/TODO17
-rw-r--r--noatun-plugins/lyrics/cmodule.cpp218
-rw-r--r--noatun-plugins/lyrics/cmodule.h43
-rw-r--r--noatun-plugins/lyrics/historymanager.cpp56
-rw-r--r--noatun-plugins/lyrics/historymanager.h28
-rw-r--r--noatun-plugins/lyrics/lyrics.cpp268
-rw-r--r--noatun-plugins/lyrics/lyrics.h55
-rw-r--r--noatun-plugins/lyrics/lyrics.plugin117
-rw-r--r--noatun-plugins/lyrics/lyricsui.rc24
-rw-r--r--noatun-plugins/nexscope/Makefile.am22
-rw-r--r--noatun-plugins/nexscope/bitmappool.cpp54
-rw-r--r--noatun-plugins/nexscope/convolve.c297
-rw-r--r--noatun-plugins/nexscope/convolve.h61
-rw-r--r--noatun-plugins/nexscope/gui.cpp197
-rw-r--r--noatun-plugins/nexscope/gui.h54
-rw-r--r--noatun-plugins/nexscope/input.cpp238
-rw-r--r--noatun-plugins/nexscope/nex.cpp597
-rw-r--r--noatun-plugins/nexscope/nex.h352
-rw-r--r--noatun-plugins/nexscope/nexscope.plugin72
-rw-r--r--noatun-plugins/nexscope/noatunplugin.cpp49
-rw-r--r--noatun-plugins/nexscope/noatunplugin.h25
-rw-r--r--noatun-plugins/nexscope/output.cpp48
-rw-r--r--noatun-plugins/nexscope/regionwidget.cpp77
-rw-r--r--noatun-plugins/nexscope/regionwidget.h47
-rw-r--r--noatun-plugins/nexscope/renderers.cpp369
-rw-r--r--noatun-plugins/nexscope/renderers.h34
-rw-r--r--noatun-plugins/noatunmadness/Makefile.am10
-rw-r--r--noatun-plugins/noatunmadness/madness.cpp123
-rw-r--r--noatun-plugins/noatunmadness/madness.h32
-rw-r--r--noatun-plugins/noatunmadness/madness.plugin105
-rw-r--r--noatun-plugins/oblique/COPYING35
-rw-r--r--noatun-plugins/oblique/Makefile.am18
-rw-r--r--noatun-plugins/oblique/base.cpp435
-rw-r--r--noatun-plugins/oblique/base.h105
-rw-r--r--noatun-plugins/oblique/cmodule.cpp663
-rw-r--r--noatun-plugins/oblique/cmodule.h123
-rw-r--r--noatun-plugins/oblique/configure.in.in30
-rw-r--r--noatun-plugins/oblique/file.cpp248
-rw-r--r--noatun-plugins/oblique/file.h115
-rw-r--r--noatun-plugins/oblique/kbuffer.cpp87
-rw-r--r--noatun-plugins/oblique/kbuffer.h48
-rw-r--r--noatun-plugins/oblique/kdatacollection.cpp143
-rw-r--r--noatun-plugins/oblique/kdatacollection.h144
-rw-r--r--noatun-plugins/oblique/kdbt.h59
-rw-r--r--noatun-plugins/oblique/menu.cpp231
-rw-r--r--noatun-plugins/oblique/menu.h99
-rw-r--r--noatun-plugins/oblique/oblique.cpp325
-rw-r--r--noatun-plugins/oblique/oblique.h142
-rw-r--r--noatun-plugins/oblique/oblique.plugin73
-rw-r--r--noatun-plugins/oblique/obliqueui.rc31
-rw-r--r--noatun-plugins/oblique/query.cpp570
-rw-r--r--noatun-plugins/oblique/query.h176
-rw-r--r--noatun-plugins/oblique/schemas/Makefile.am3
-rw-r--r--noatun-plugins/oblique/schemas/obliqueschema.dtd14
-rw-r--r--noatun-plugins/oblique/schemas/standard80
-rw-r--r--noatun-plugins/oblique/selector.cpp226
-rw-r--r--noatun-plugins/oblique/selector.h76
-rw-r--r--noatun-plugins/oblique/tree.cpp812
-rw-r--r--noatun-plugins/oblique/tree.h194
-rw-r--r--noatun-plugins/oblique/view.cpp251
-rw-r--r--noatun-plugins/oblique/view.h71
-rw-r--r--noatun-plugins/pitchablespeed/Makefile.am15
-rw-r--r--noatun-plugins/pitchablespeed/pitchablespeed.cpp167
-rw-r--r--noatun-plugins/pitchablespeed/pitchablespeed.h63
-rw-r--r--noatun-plugins/pitchablespeed/pitchablespeed.plugin113
-rw-r--r--noatun-plugins/pitchablespeed/speedtuner.ui195
-rw-r--r--noatun-plugins/synaescope/Makefile.am23
-rw-r--r--noatun-plugins/synaescope/cmodule.cpp88
-rw-r--r--noatun-plugins/synaescope/cmodule.h49
-rw-r--r--noatun-plugins/synaescope/core.cpp432
-rw-r--r--noatun-plugins/synaescope/cr16-app-synaescope.pngbin0 -> 762 bytes
-rw-r--r--noatun-plugins/synaescope/font.h258
-rw-r--r--noatun-plugins/synaescope/icons.h4868
-rw-r--r--noatun-plugins/synaescope/main.cpp196
-rw-r--r--noatun-plugins/synaescope/polygon.h106
-rw-r--r--noatun-plugins/synaescope/sdlwrap.cpp207
-rw-r--r--noatun-plugins/synaescope/symbol.h1021
-rw-r--r--noatun-plugins/synaescope/syna.h253
-rw-r--r--noatun-plugins/synaescope/synaescope.cpp110
-rw-r--r--noatun-plugins/synaescope/synaescope.h41
-rw-r--r--noatun-plugins/synaescope/synaescope.plugin80
-rw-r--r--noatun-plugins/synaescope/ui.cpp609
-rw-r--r--noatun-plugins/tippercanoe/Makefile.am21
-rw-r--r--noatun-plugins/tippercanoe/core.cpp425
-rw-r--r--noatun-plugins/tippercanoe/font.h258
-rw-r--r--noatun-plugins/tippercanoe/icons.h4847
-rw-r--r--noatun-plugins/tippercanoe/main.cpp170
-rw-r--r--noatun-plugins/tippercanoe/polygon.h98
-rw-r--r--noatun-plugins/tippercanoe/sdlwrap.cpp197
-rw-r--r--noatun-plugins/tippercanoe/symbol.h1021
-rw-r--r--noatun-plugins/tippercanoe/syna.h247
-rw-r--r--noatun-plugins/tippercanoe/synaescope.cpp103
-rw-r--r--noatun-plugins/tippercanoe/synaescope.h46
-rw-r--r--noatun-plugins/tippercanoe/tippecanoe.plugin72
-rw-r--r--noatun-plugins/tippercanoe/ui.cpp507
-rw-r--r--noatun-plugins/tyler/AUTHORS8
-rw-r--r--noatun-plugins/tyler/COPYING340
-rw-r--r--noatun-plugins/tyler/Makefile.am21
-rw-r--r--noatun-plugins/tyler/README89
-rw-r--r--noatun-plugins/tyler/README.Infinity89
-rw-r--r--noatun-plugins/tyler/compute.c188
-rw-r--r--noatun-plugins/tyler/compute.h23
-rw-r--r--noatun-plugins/tyler/display.c481
-rw-r--r--noatun-plugins/tyler/display.h40
-rw-r--r--noatun-plugins/tyler/file.cpp81
-rw-r--r--noatun-plugins/tyler/file.h31
-rw-r--r--noatun-plugins/tyler/main.cpp100
-rw-r--r--noatun-plugins/tyler/main.h30
-rw-r--r--noatun-plugins/tyler/renderer.c195
-rw-r--r--noatun-plugins/tyler/renderer.h69
-rw-r--r--noatun-plugins/tyler/tyler.cpp72
-rw-r--r--noatun-plugins/tyler/tyler.h34
-rw-r--r--noatun-plugins/tyler/tyler.plugin70
-rw-r--r--noatun-plugins/tyler/tylerstatesbin0 -> 928 bytes
-rw-r--r--noatun-plugins/wavecapture/Makefile.am18
-rw-r--r--noatun-plugins/wavecapture/wavecapture.cpp197
-rw-r--r--noatun-plugins/wavecapture/wavecapture.h72
-rw-r--r--noatun-plugins/wavecapture/wavecapture.plugin112
-rw-r--r--renamedlgplugins/Makefile.am3
-rw-r--r--renamedlgplugins/README7
-rw-r--r--renamedlgplugins/audio/Makefile.am16
-rw-r--r--renamedlgplugins/audio/TODO9
-rw-r--r--renamedlgplugins/audio/audio_plugin.cpp104
-rw-r--r--renamedlgplugins/audio/audiopreview.cpp135
-rw-r--r--renamedlgplugins/audio/audiopreview.h75
-rw-r--r--renamedlgplugins/audio/renaudiodlg.desktop63
-rw-r--r--renamedlgplugins/images/Makefile.am21
-rw-r--r--renamedlgplugins/images/image_plugin.cpp85
-rw-r--r--renamedlgplugins/images/imagevisualizer.cpp83
-rw-r--r--renamedlgplugins/images/imagevisualizer.h66
-rw-r--r--renamedlgplugins/images/renimagedlg.desktop66
900 files changed, 205018 insertions, 0 deletions
diff --git a/COPYING-DOCS b/COPYING-DOCS
new file mode 100644
index 0000000..4a0fe1c
--- /dev/null
+++ b/COPYING-DOCS
@@ -0,0 +1,397 @@
+ GNU Free Documentation License
+ Version 1.2, November 2002
+
+
+ Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+0. PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+
+1. APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The "Document", below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as "you". You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A "Secondary Section" is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject. (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not "Transparent" is called "Opaque".
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification. Examples of
+transparent image formats include PNG, XCF and JPG. Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".) To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+
+2. VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+3. COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+
+4. MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+A. Use in the Title Page (and on the covers, if any) a title distinct
+ from that of the Document, and from those of previous versions
+ (which should, if there were any, be listed in the History section
+ of the Document). You may use the same title as a previous version
+ if the original publisher of that version gives permission.
+B. List on the Title Page, as authors, one or more persons or entities
+ responsible for authorship of the modifications in the Modified
+ Version, together with at least five of the principal authors of the
+ Document (all of its principal authors, if it has fewer than five),
+ unless they release you from this requirement.
+C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+D. Preserve all the copyright notices of the Document.
+E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+F. Include, immediately after the copyright notices, a license notice
+ giving the public permission to use the Modified Version under the
+ terms of this License, in the form shown in the Addendum below.
+G. Preserve in that license notice the full lists of Invariant Sections
+ and required Cover Texts given in the Document's license notice.
+H. Include an unaltered copy of this License.
+I. Preserve the section Entitled "History", Preserve its Title, and add
+ to it an item stating at least the title, year, new authors, and
+ publisher of the Modified Version as given on the Title Page. If
+ there is no section Entitled "History" in the Document, create one
+ stating the title, year, authors, and publisher of the Document as
+ given on its Title Page, then add an item describing the Modified
+ Version as stated in the previous sentence.
+J. Preserve the network location, if any, given in the Document for
+ public access to a Transparent copy of the Document, and likewise
+ the network locations given in the Document for previous versions
+ it was based on. These may be placed in the "History" section.
+ You may omit a network location for a work that was published at
+ least four years before the Document itself, or if the original
+ publisher of the version it refers to gives permission.
+K. For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the section all
+ the substance and tone of each of the contributor acknowledgements
+ and/or dedications given therein.
+L. Preserve all the Invariant Sections of the Document,
+ unaltered in their text and in their titles. Section numbers
+ or the equivalent are not considered part of the section titles.
+M. Delete any section Entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+N. Do not retitle any existing section to be Entitled "Endorsements"
+ or to conflict in title with any Invariant Section.
+O. Preserve any Warranty Disclaimers.
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+
+5. COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications". You must delete all sections
+Entitled "Endorsements".
+
+
+6. COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+
+7. AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+
+8. TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+
+9. TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License. Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License. However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+
+10. FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+
+
+ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+ Copyright (c) YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.2
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+ A copy of the license is included in the section entitled "GNU
+ Free Documentation License".
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+
+ with the Invariant Sections being LIST THEIR TITLES, with the
+ Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
diff --git a/Makefile.am.in b/Makefile.am.in
new file mode 100644
index 0000000..66a6d68
--- /dev/null
+++ b/Makefile.am.in
@@ -0,0 +1,11 @@
+## kdeaddons/Makefile.am
+## (C) 1997 Stephan Kulow
+
+AUTOMAKE_OPTIONS = foreign 1.6.1
+
+EXTRA_DIST = admin
+dist-hook:
+ cd $(top_distdir) && perl $(top_srcdir)/admin/am_edit -padmin
+
+include admin/deps.am
+
diff --git a/Makefile.cvs b/Makefile.cvs
new file mode 100644
index 0000000..d5c4a7b
--- /dev/null
+++ b/Makefile.cvs
@@ -0,0 +1,15 @@
+
+all:
+ @echo "This Makefile is only for the CVS repository"
+ @echo "This will be deleted before making the distribution"
+ @echo ""
+ @if test ! -d admin; then \
+ echo "Please recheckout this module!" ;\
+ echo "for cvs: use checkout once and after that update again" ;\
+ echo "for cvsup: checkout kde-common from cvsup and" ;\
+ echo " link kde-common/admin to ./admin" ;\
+ exit 1 ;\
+ fi
+ $(MAKE) -f admin/Makefile.common cvs
+
+.SILENT:
diff --git a/README b/README
new file mode 100644
index 0000000..a803e37
--- /dev/null
+++ b/README
@@ -0,0 +1,126 @@
+In this file:
+
+* What it is
+* Plugins for Kate
+* Plugins for kfile
+* Plugins for Kicker
+* Plugins for Konqueror
+* Plugins for Noatun
+* Scripts for KNewsTicker
+
+What it is
+----------
+
+kdeaddons contains additional plugins and scripts for some KDE applications.
+
+Plugins for Kate
+----------------
+
+* cppsymbolviewer: C/C++ symbol viewer
+* filelistloader: Save and load file lists (removed in KDE4)
+* filetemplates: Create new files from templates
+* helloworld: demo plugin, insert's "Hello World" into your document
+* htmltools: facilitates insertion of HTML tags
+* insertcommand: inserts shell command output into a document
+* kjswrapper: demo kjs wrapper plugin (not compiled at the moment)
+* kpybrowser: browse python files
+* make: Compile and parse error messages
+* modeline: Set document settings based on vim or emacs modelines
+ (removed in KDE4)
+* scripts: scripts shown in the Tools>Kate Scripts menu
+* snippets: Configurable Text-Snippets for Kate
+* tabbarextension: Tab Bar extension for documents
+* openheader: opens .h for .c file and vica verca
+* textfilter: pipe your document throught a filter
+* xmlcheck: Validates XML files using xmllint
+* xmltools: lists XML elements, attributes, attributes values and
+ entities allowed by DTD
+
+Plugins for kfile
+-----------------
+
+* cert: Certificate Info
+* desktop: Desktop Entry Info
+* folder: Folder Info
+* html: HTML Playlist Info
+* lnk: Start link given in Windows .lnk file
+* mhtml: mhtml Info
+* txt: Text File Info
+
+Plugins for Kicker
+------------------
+
+* kbinaryclock: display binary clock
+* kolourpicker: picks color from anywhere and displays it's values
+* ktimemon: little app to display cpu, memory and swap info
+* kbandwidth: a network bandwidth monitor
+* math: A mathematical expression evaluator
+* mediacontrol: Applet to control media players
+
+Plugins for Konqueror
+---------------------
+
+* akregator: RSS feed reader and manager
+* arkplugin: Compress/Extract Files with Ark
+* autorefresh: Auto Refresh Plugin
+* babelfish: cringes the current web page through babelfish for a rough
+ translation
+* crashes: Crashes monitor
+* dirfilter: this allows Konqueror as file manager to filter the current
+ directory display
+* domtreeviewer: display the document object model (DOM) in a dialog box
+* fsview: Graphical Disk Usage KPart for inode/directory, only for local files.
+* imagerotation: servicemenu for image rotation and conversion
+* khtmlsettingsplugin: to quickly enable/disble Javascript, Java, Cache etc
+* kimgalleryplugin: Konqueror as file manager creates HTML files with a
+ gallery of graphics file
+* kuick: allows to select a bunch of files and copy and move them really quick
+* mediarealfolder: servicemenu for mounted devs: Open the medium system folder...
+* microformat: Displays icon in the statusbar when the page has a microformat
+* minitools: minitools
+* rellinks: Document Relations plugin
+* searchbar: Search Bar Plugin. Presents you with a textbox for direct access
+ to search engines like Google.
+* sidebar/mediaplayer: small embedded mediaplayer
+* sidebar/newsticker: show newsticker
+* smbmounter: smbmount/umount samba shares (removed since KDE 3.4)
+* uachanger: quickly change the user agent so that you can browse hostile
+ web sites :-)
+* validators: validates a HTML or CSS file against W3's html validor
+* webarchiver: store a complete web page with pictures locally as a *.war file
+
+Plugins for Noatun
+------------------
+
+* alarm: a simple, customizable wakeup alarm
+* alsaplayer: AlsaPlayer UI clone
+* blurscope: a pretty fading monoscope
+* charlatan: "The dead man's interface"
+* dub: A filesystem based playlist
+* ffrs: French Foreign Region
+* luckytag: guesses tag information from the filename
+* lyrics: Display the lyrics for the current song
+* nexscope: the ultra-customizable visualization
+* noatunmadness: a weird and annoying scope that moves your windows
+* oblique: Auto-collating playlist
+* pitchablespeed: pitchable playing speed
+* synaescope: a visualization
+* tippercanoe: a visualization
+* tyler: a psychodelic visualization, tunnel like
+* wavecapture: Capture to wave file
+
+Scripts for KNewsTicker
+-----------------------
+
+* fyensget.py: A Python script to retrieve news from the danish newspaper
+ "Fyens Stiftstidende". Take this as a motivation to write scripts for your
+ local newspaper. :-)
+* bbc.pl:
+* kataribe.pl:
+* newsrss.pl: A nifty Perl script which you can use to have the most recent
+ postings which appeared in a USENET newsgroup of your chance show up in the
+ news ticker. Check the script for further details.
+* stock.pl: Use this Perl script to turn KNewsTicker into a stock ticker, check
+ the script for information on how to define which symbols to monitor.
+
+
diff --git a/atlantikdesigner/Makefile.am b/atlantikdesigner/Makefile.am
new file mode 100644
index 0000000..1c6ba3d
--- /dev/null
+++ b/atlantikdesigner/Makefile.am
@@ -0,0 +1,17 @@
+INCLUDES = $(all_includes)
+LDFLAGS = $(all_libraries) $(KDE_RPATH)
+LDADD = $(LIB_KSYCOCA) $(LIB_KFILE)
+
+SUBDIRS = designer pics
+
+EXTRA_DIST = atlantikdesigner.desktop
+
+xdg_apps_DATA = atlantikdesigner.desktop
+
+METASOURCES = AUTO
+
+rcdir = $(kde_datadir)/atlantikdesigner
+rc_DATA = atlantikdesignerui.rc
+
+messages: rc.cpp
+ $(XGETTEXT) `find . -name '*.cpp'` -o $(podir)/atlantikdesigner.pot
diff --git a/atlantikdesigner/TODO b/atlantikdesigner/TODO
new file mode 100644
index 0000000..3450d34
--- /dev/null
+++ b/atlantikdesigner/TODO
@@ -0,0 +1,15 @@
+Bugfixes
+--------
+
+- fix leak of 4-300 Kb each time one switches board, i've investigated
+ but haven't found leak :(
+- let you delete last card in a stack, it made designer crash, so delete
+ doesn't do anything if there is only 1 card on stack
+- disable "Less properties" when there are no properties for a card
+
+For 0.3.0
+---------
+
+- support <Board>'s go= instead of type=go in <Estate>
+- libatlantikui exists, make designer a seperate app again
+- remove type= entirely (depends on proper monopd groups)
diff --git a/atlantikdesigner/atlantikdesigner.desktop b/atlantikdesigner/atlantikdesigner.desktop
new file mode 100644
index 0000000..7b883a9
--- /dev/null
+++ b/atlantikdesigner/atlantikdesigner.desktop
@@ -0,0 +1,170 @@
+[Desktop Entry]
+Type=Application
+Exec=atlantikdesigner -caption "%c" %i %m
+Icon=atlantikdesigner
+Terminal=false
+Name=Atlantik Designer
+Name[af]=Atlantik Ontwerper
+Name[ar]=المصمم Atlantik
+Name[az]=Atlantik Tərtib Edicisi
+Name[bg]=Дизайнер на Atlantik
+Name[br]=Ergrafer Atlantik
+Name[ca]=Dissenyador Atlantik
+Name[cs]=Atlantik designer
+Name[cy]=Dylunydd Atlantik
+Name[da]=Atlantik-designer
+Name[de]=Atlantik Spielbrett-Editor
+Name[el]=Σχεδιαστής Atlantik
+Name[eo]=Atlantika Desegnilo
+Name[es]=Diseñador de Atlantik
+Name[et]=Atlantik disainer
+Name[fa]=طراح Atlantik
+Name[fo]=Atlantik-sniðari
+Name[fy]=Atlantik Untwerper
+Name[gl]=Deseñador Atlantik
+Name[he]=מעצב Atlantik
+Name[hi]=अटलांटिक डिज़ाइनर
+Name[hr]=Atlantik Dizajner
+Name[ja]=Atlantik デザイナー
+Name[ka]=Atlantik დიზაინერი
+Name[kk]=Atlantik конструкторы
+Name[km]=កម្មវិធី​រចនា Atlantik​
+Name[lv]=Atlantijas Konstruktors
+Name[mk]=Атлантик дизајнер
+Name[mt]=Diżinjatur Atlantik
+Name[nb]=Atlantik-designer
+Name[nds]=Atlantik-Maker
+Name[ne]=एटालन्टिक डिजाइनर
+Name[nso]=Mokgabisi wa Atlantik
+Name[pa]=ਐਟਲਾਟਿਕ ਨਿਰਮਾਤਾ
+Name[pl]=Projektant do programu Atlantyk
+Name[ru]=Редактор полей Atlantik
+Name[sl]=Snovalnik za Atlantik
+Name[sr]=Atlantik-ов дизајнер
+Name[sr@Latn]=Atlantik-ov dizajner
+Name[sv]=Atlantik designer
+Name[ta]=அட்லாண்டிக் வடிவமைப்பான்
+Name[tg]=Коркарди Atlantik
+Name[th]=ออกแบบเกมแอตแลนติก
+Name[tr]=Atlantik Tasarımcısı
+Name[uk]=Редактор Atlantik
+Name[uz]=Atlantik dizayneri
+Name[uz@cyrillic]=Atlantik дизайнери
+Name[vi]=Bộ thiết kế Atlantik
+Name[xh]=Umzobi we Atlantik
+Name[zh_CN]=Atlantik 设计器
+Name[zh_TW]=Atlantik 設計者
+Comment=Game board designer for Atlantik
+Comment[af]=Speletjie bord ontwerper vir Atlantik
+Comment[ar]=مصمم لوحات ألعاب لـ Atlantic
+Comment[az]=Atlantik üçün oyun lövhəsi tərtib edicisi
+Comment[bg]=Дизайнер на игралната дъска за играта Atlantik
+Comment[bs]=Dizajner tabli za igru za Atlantik
+Comment[ca]=Dissenyador de jocs de taula per a Atlantik
+Comment[cs]=Návrhář hracích desek pro hru Atlantik
+Comment[cy]=Dylunydd byrddau gêm am Atlantik
+Comment[da]=Spillebræt-designer for Atlantik
+Comment[de]=Spielbrett-Editor für das Spiel "Atlantik"
+Comment[el]=Σχεδιαστής πινάκων παιχνιδιού για το Atlantik
+Comment[eo]=Breta desegnilo por Atlantiko
+Comment[es]=Diseñador de tableros de juego para Atlantik
+Comment[et]=Atlantik mängulaua disainer
+Comment[eu]=Atlantik jokorako taula diseinatzeko tresna
+Comment[fa]=طراح تخته بازی برای Atlantik
+Comment[fi]=Pelilaudan suunnitteluohjelma Atlantikiin
+Comment[fo]=Spælabrettissniðari til Atlantik
+Comment[fr]=Concepteur de plateaux de jeu pour Atlantik
+Comment[fy]=Spulboerdûntwerper foar Atlantik
+Comment[ga]=Dearthóir clár cluiche le haghaidh Atlantik
+Comment[gl]=O deseñador de taboleiro de Atlantik
+Comment[he]=מעצב לוחות משחק ל־Atlantik
+Comment[hi]=अटलांटिक के लिए खेल बिसातडिज़ाइनर
+Comment[hr]=Dizajner ploče za Atlantik
+Comment[hu]=Táblatervező az Atlantikhoz
+Comment[is]=Hönnun borða fyrir Atlantik
+Comment[it]=Per progettare tabelloni per Atlantik
+Comment[ja]=Atlantik 用のゲームボードデザイナー
+Comment[ka]=Atlantik-სთვის სათამაშო დაფის დიზაინერი
+Comment[kk]=Atlantik ойын тақта конструкторы
+Comment[km]=កម្មវិធី​រចនា​ក្ដារ​ល្បែង​សម្រាប់ Atlantik
+Comment[lt]=Žaidimo stalo dizaineris, skirtas Atlantik
+Comment[lv]=Spēļu galda konstruktors Antlantikai
+Comment[mk]=Дизајнер за игри на табла за Атлантик
+Comment[ms]=Pereka permainan papan untuk Atlantik
+Comment[mt]=Diżinjatur ta' logħob tal-bord għall-Atlantik
+Comment[nb]=Spillebrettbygger for Atlantik
+Comment[nds]=En Speelbrettmaker för Atlantik
+Comment[ne]=एटलान्टिकका लागि खेल पाटी डिजाइनर
+Comment[nl]=Spelbordontwerper voor Atlantik
+Comment[nn]=Utforming av spelebrett for Atlantik
+Comment[pl]=Program do projektowania plansz dla programu Atlantyk
+Comment[pt]=O desenhador do tabuleiro do Atlantik
+Comment[pt_BR]=O designer de jogo para o Atlantik
+Comment[ro]=Desenator de table de joc pentru Atlantik
+Comment[ru]=Редактор полей Atlantik
+Comment[sk]=Návrhár pre hru Atlantik
+Comment[sl]=Snovalnik igralnih miz za Atlantik
+Comment[sr]=Дизајнер табли за игру Atlantik
+Comment[sr@Latn]=Dizajner tabli za igru Atlantik
+Comment[sv]=Atlantik spelplanskonstruktion
+Comment[ta]=அட்லாண்டிக்கிற்கான மேஜை விளையாட்டு வடிவமைப்பாளர்
+Comment[tg]=Коркарди дизайн барои бозии Atlantik
+Comment[th]=เครื่องมือออกแบบกระดานเกมแอตแลนติก
+Comment[tr]=Atlantik için oyun tahtası düzenleyici
+Comment[uk]=Редактор гри Atlantik
+Comment[uz]=Atlantik uchun oʻyin maydoni tahrirchisi
+Comment[uz@cyrillic]=Atlantik учун ўйин майдони таҳрирчиси
+Comment[vi]=Bộ thiết kế bảng trò chơi cho Atlantik
+Comment[xh]=Umzobi womdlalo webhodi we Atlantik
+Comment[zh_CN]=Atlantik 的游戏盘设计器
+Comment[zh_TW]=Atlantik 遊戲板設計師
+Categories=Qt;KDE;Game;BoardGame;
+GenericName=Monopoly®-like Board Designer
+GenericName[bg]=Дизайнер на Atlantik
+GenericName[ca]=Dissenyador de taulells de tipus Monopoly®
+GenericName[cs]=Návrhář desky podobný Monopolům®
+GenericName[da]=Matador®-lignende brætdesigner
+GenericName[de]=Monopoly®-ähnlicher Spielbrett-Editor
+GenericName[el]=Σχεδιαστής πίνακα σε στυλ Monopoly®
+GenericName[eo]=Monopoly-similaj breta desegnilo
+GenericName[es]=Diseñador de tableros similar al Monopoly®
+GenericName[et]=Monopoly® laadsete mängulaudade disainer
+GenericName[eu]=Monopoly®-bezalako diseinatzailea
+GenericName[fi]=Monopoly®-tyylisen pelin suunnitteluohjelma
+GenericName[fr]=Concepteur de plateaux dans le style du Monopoly®
+GenericName[fy]=Monopoly®-eftige boerdûntwerper
+GenericName[ga]=Dearthóir Cluichí cosúil le Monopoly®
+GenericName[gl]=Deseñador de Taboleiros tipo Monopoly®
+GenericName[he]=בונה לוחות לתואמי מונופל®
+GenericName[hr]=Dizajner ploče za igre poput Monopola®
+GenericName[hu]=Monopoly®-szerű táblatervező
+GenericName[is]=Matador (Monopoly) borðhönnuður
+GenericName[it]=Gioco da tavolo simile a Monopoly®
+GenericName[ja]=Monopoly® 風ボードゲームのデザイナー
+GenericName[ka]=Monopoly®-ს მაგვარი სამაგიდო თამაში
+GenericName[kk]=Monopoly® секілді тақта конструкторы
+GenericName[km]=កម្មវិធី​រចនា​ក្ដារ Monopoly®-like
+GenericName[lt]=Monopoly® primenančių lentų kūrimo priemonė
+GenericName[mk]=Дизајнер за табли за игри како Монопол®
+GenericName[nb]=Monopol®-aktig spillebrettmaker
+GenericName[nds]=Maker för Monopoly®-liek Speelbreed
+GenericName[ne]=एकाधिकारी®-जस्तै पाटी डिजाइनर
+GenericName[nl]=Monopoly®-achtige bordontwerper
+GenericName[nn]=Monopol®-liknande brettutforming
+GenericName[pa]=Monopoly®-ਵਰਗੀ ਬੋਰਡ ਡਿਜ਼ਾਈਨਰ
+GenericName[pl]=Edytor planszy do gry typu Monopoly®
+GenericName[pt]=Desenhador de Tabuleiros tipo Monopoly®
+GenericName[pt_BR]=Construtor de Tabuleiros para o Atlantik
+GenericName[ru]=Редактор полей Atlantik
+GenericName[sk]=Board Designer typu Monopoly®
+GenericName[sl]=Snovalnik plošč, podobnim za Monopoly®
+GenericName[sr]=Дизајнер табли налик на Monopoly®
+GenericName[sr@Latn]=Dizajner tabli nalik na Monopoly®
+GenericName[sv]=Konstruktion av Monopol®-liknande spelplaner
+GenericName[tr]=Monopoly®-like Tahta Düzenleyici
+GenericName[uk]=Monopoly®-подібний дизайнер дошки
+GenericName[uz]=Monopoly® oʻyinga oʻxshagan oʻyin maydoni tahrirchisi
+GenericName[uz@cyrillic]=Monopoly® ўйинга ўхшаган ўйин майдони таҳрирчиси
+GenericName[vi]=Bộ thiết kế bảng kiểu Monopoly®
+GenericName[zh_CN]=类似 Monopoly(R) 的棋盘设计器
+GenericName[zh_TW]=類似 Monopoly® 棋盤設計師
diff --git a/atlantikdesigner/atlantikdesignerui.rc b/atlantikdesigner/atlantikdesignerui.rc
new file mode 100644
index 0000000..99d942e
--- /dev/null
+++ b/atlantikdesigner/atlantikdesignerui.rc
@@ -0,0 +1,24 @@
+<!DOCTYPE kpartgui>
+<kpartgui name="atlanticdesigner" version="2">
+<MenuBar>
+ <Menu name="file">
+ <Action name="boardinfo" />
+ <Action name="groupeditor" />
+ </Menu>
+ <Menu name="edit">
+ <Action name="smaller" />
+ <Action name="larger" />
+ </Menu>
+ <Menu name="go_web">
+ <Action name="estate_num" />
+ <Separator />
+ <Action name="up" />
+ <Action name="down" />
+ <Action name="left" />
+ <Action name="right" />
+ </Menu>
+</MenuBar>
+<ToolBar name="mainToolBar">
+ <Action name="estate_num" />
+</ToolBar>
+</kpartgui>
diff --git a/atlantikdesigner/configure.in.bot b/atlantikdesigner/configure.in.bot
new file mode 100644
index 0000000..74e3848
--- /dev/null
+++ b/atlantikdesigner/configure.in.bot
@@ -0,0 +1,9 @@
+if test "x$ATLANTIKDESIGNER_SUBDIR" = "x"; then
+ echo ""
+ echo "You're missing the Atlantik header files, therefore Atlantik Designer"
+ echo "will not be compiled. Install Atlantik from kdegames if you want to"
+ echo "compile Atlantik Designer."
+ echo ""
+ all_tests=bad
+fi
+
diff --git a/atlantikdesigner/configure.in.in b/atlantikdesigner/configure.in.in
new file mode 100644
index 0000000..394e4f9
--- /dev/null
+++ b/atlantikdesigner/configure.in.in
@@ -0,0 +1,7 @@
+ATLANTIKDESIGNER_SUBDIR=
+KDE_CHECK_HEADER(atlantik/ui/board.h, ATLANTIKDESIGNER_SUBDIR=atlantikdesigner)
+
+if test -z "$ATLANTIKDESIGNER_SUBDIR"; then
+ dnl dir will only be compiled conditionally
+ DO_NOT_COMPILE="$DO_NOT_COMPILE atlantikdesigner"
+fi
diff --git a/atlantikdesigner/designer/Makefile.am b/atlantikdesigner/designer/Makefile.am
new file mode 100644
index 0000000..ca9fadc
--- /dev/null
+++ b/atlantikdesigner/designer/Makefile.am
@@ -0,0 +1,10 @@
+bin_PROGRAMS = atlantikdesigner
+INCLUDES = -I$(kde_includes)/atlantic $(all_includes)
+AM_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+LDADD = -latlantikui -lkdegames $(LIB_KIO)
+
+SUBDIRS =
+
+atlantikdesigner_SOURCES = boardinfo.cpp designer.cpp editor.cpp main.cpp group.cpp
+
+METASOURCES = AUTO
diff --git a/atlantikdesigner/designer/boardinfo.cpp b/atlantikdesigner/designer/boardinfo.cpp
new file mode 100644
index 0000000..9bc6dbb
--- /dev/null
+++ b/atlantikdesigner/designer/boardinfo.cpp
@@ -0,0 +1,186 @@
+#include <qstring.h>
+#include <qlayout.h>
+#include <qstringlist.h>
+#include <qframe.h>
+#include <qptrlist.h>
+#include <qlabel.h>
+
+#include <kcolorbutton.h>
+#include <kdialogbase.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <klineedit.h>
+#include <kpushbutton.h>
+#include <kurllabel.h>
+
+#include "boardinfo.h"
+
+BoardInfoDlg::BoardInfoDlg(bool editable, BoardInfo *info, QWidget *parent, const char *_name, bool modal)
+ : KDialogBase(KDialogBase::Tabbed, i18n("Gameboard Information"), (editable? Ok|Apply|Cancel : Close), (editable? Ok : Close), parent, _name, modal)
+{
+ if (!info)
+ return;
+ this->info = info;
+
+ setWFlags(WDestructiveClose);
+
+ QFrame *about = addPage(i18n("Information"));
+ QVBoxLayout *aboutLayout = new QVBoxLayout(about, spacingHint());
+
+ if (editable)
+ {
+ aboutLayout->addWidget(name = new KLineEdit(about));
+ name->setText(info->name);
+ }
+ else
+ {
+ aboutLayout->addWidget(new QLabel(info->name, about));
+ name = 0;
+ }
+
+ QHBoxLayout *versionLayout = new QHBoxLayout(aboutLayout, spacingHint());
+ versionLayout->addWidget(new QLabel(i18n("Version:"), about));
+ if (editable)
+ {
+ versionLayout->addWidget(version = new KLineEdit(about));
+ version->setText(info->version);
+ }
+ else
+ versionLayout->addWidget(new QLabel(info->version, about));
+
+ QHBoxLayout *urlLayout = new QHBoxLayout(aboutLayout, spacingHint());
+ urlLayout->addWidget(new QLabel(i18n("URL:"), about));
+ if (editable)
+ urlLayout->addWidget(url = new KLineEdit(info->url, about));
+ else
+ urlLayout->addWidget(new KURLLabel(info->url, info->url, about));
+
+ aboutLayout->addStretch(3);
+
+ aboutLayout->addWidget(new QLabel(i18n("Description:"), about));
+ aboutLayout->addStretch();
+ aboutLayout->addWidget(description = new KLineEdit(about));
+ description->setText(info->description);
+ if (!editable)
+ {
+ description->setReadOnly(true);
+ }
+
+ if (editable)
+ {
+ QHBoxLayout *bgLayout = new QHBoxLayout(aboutLayout, spacingHint());
+ bgLayout->addWidget(new QLabel(i18n("Background color:"), about));
+ bgColor = new KColorButton(info->bgColor, about);
+ bgLayout->addWidget(bgColor);
+ }
+ else
+ bgColor = 0;
+
+ QFrame *authorsFrame = addPage(i18n("&Authors"));
+ QVBoxLayout *authorsLayout = new QVBoxLayout(authorsFrame, spacingHint());
+ authorsLayout->addWidget(authors = new LotsaEdits(editable, info->authors, authorsFrame));
+
+ QFrame *creditsFrame = addPage(i18n("&Thanks To"));
+ QVBoxLayout *creditsLayout = new QVBoxLayout(creditsFrame, spacingHint());
+ creditsLayout->addWidget(credits = new LotsaEdits(editable, info->credits, creditsFrame));
+}
+
+void BoardInfoDlg::slotApply()
+{
+ info->name = name->text();
+ info->description = description->text();
+ info->version = version->text();
+ info->url = url->text();
+ info->authors = authors->save();
+ info->credits = credits->save();
+
+ if (bgColor)
+ info->bgColor = bgColor->color().name();
+
+ emit okClicked();
+ KDialogBase::slotApply();
+}
+
+void BoardInfoDlg::slotOk()
+{
+ slotApply();
+
+ KDialogBase::slotOk();
+}
+
+///////////////////////////////////
+
+LotsaEdits::LotsaEdits(bool editable, QStringList defaults, QWidget *parent, const char *name) : QWidget(parent, name)
+{
+ list.setAutoDelete(true);
+ this->editable = editable;
+
+ layout = new QVBoxLayout(this, KDialogBase::spacingHint());
+ QHBoxLayout *hlayout = new QHBoxLayout(layout, KDialogBase::spacingHint());
+
+ if (editable)
+ {
+ KPushButton *more = new KPushButton(i18n("&Add Name"), this);
+ hlayout->addWidget(more);
+ connect(more, SIGNAL(clicked()), this, SLOT(more()));
+ hlayout->addStretch();
+ KPushButton *less= new KPushButton(i18n("&Delete Name"), this);
+ hlayout->addWidget(less);
+ connect(less, SIGNAL(clicked()), this, SLOT(less()));
+ }
+
+ layout->addStretch();
+
+ for (QStringList::Iterator it = defaults.begin(); it != defaults.end(); ++it)
+ {
+ more();
+ if (editable)
+ static_cast<KLineEdit *>(list.last())->setText(*it);
+ else
+ static_cast<QLabel *>(list.last())->setText(*it);
+ }
+}
+
+void LotsaEdits::more()
+{
+ QWidget *edit;
+ if (editable)
+ edit = new KLineEdit(this);
+ else
+ edit = new QLabel(this);
+ layout->addWidget(edit);
+ list.append(edit);
+ edit->show();
+}
+
+void LotsaEdits::less()
+{
+ list.removeLast();
+ /*
+ QWidget *edit = 0;
+ for (edit = list.first(); edit; edit = list.next())
+ {
+ if (edit->hasFocus())
+ {
+ list.remove();
+ break;
+ }
+ }
+ */
+}
+
+QStringList LotsaEdits::save()
+{
+ QStringList ret;
+
+ QWidget *edit = 0;
+ for (edit = list.first(); edit; edit = list.next())
+ if (editable)
+ ret.append(static_cast<KLineEdit *>(edit)->text());
+ else
+ ret.append(static_cast<QLabel *>(edit)->text());
+
+ return ret;
+}
+
+#include "boardinfo.moc"
diff --git a/atlantikdesigner/designer/boardinfo.h b/atlantikdesigner/designer/boardinfo.h
new file mode 100644
index 0000000..00825a5
--- /dev/null
+++ b/atlantikdesigner/designer/boardinfo.h
@@ -0,0 +1,74 @@
+#ifndef ATLANTIK_BOARDINFO_H
+#define ATLANTIK_BOARDINFO_H
+
+#include <qcolor.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qptrlist.h>
+#include <qwidget.h>
+
+#include <kdialogbase.h>
+
+class KColorButton;
+class KLineEdit;
+class KURLLabel;
+
+class QVBoxLayout;
+
+struct BoardInfo
+{
+ BoardInfo() { bgColor = Qt::lightGray; }
+ QString name;
+ QStringList authors;
+ QStringList credits;
+ QString description;
+ QString url;
+ QString version;
+ QColor bgColor;
+};
+
+class LotsaEdits : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ LotsaEdits(bool, QStringList=QStringList(), QWidget *parent=0, const char *name=0);
+
+ public slots:
+ QStringList save();
+
+ private slots:
+ void more();
+ void less();
+
+ private:
+ bool editable;
+ QPtrList<QWidget> list;
+ QVBoxLayout *layout;
+};
+
+class BoardInfoDlg : public KDialogBase
+{
+ Q_OBJECT
+
+ public:
+ BoardInfoDlg(bool editable, BoardInfo *, QWidget *parent=0, const char *_name=0, bool = true);
+
+ protected slots:
+ void slotOk();
+ void slotApply();
+
+ private:
+ KLineEdit *name;
+ KLineEdit *url;
+ KLineEdit *version;
+ KLineEdit *description;
+ KColorButton *bgColor;
+
+ LotsaEdits *authors;
+ LotsaEdits *credits;
+
+ BoardInfo *info;
+};
+
+#endif
diff --git a/atlantikdesigner/designer/designer.cpp b/atlantikdesigner/designer/designer.cpp
new file mode 100644
index 0000000..11da0e3
--- /dev/null
+++ b/atlantikdesigner/designer/designer.cpp
@@ -0,0 +1,1099 @@
+#include <qcolor.h>
+#include <qpalette.h>
+#include <qevent.h>
+#include <qfile.h>
+#include <qguardedptr.h>
+#include <qlayout.h>
+#include <qpoint.h>
+#include <qpopupmenu.h>
+#include <qptrlist.h>
+#include <qstring.h>
+#include <qtextcodec.h>
+#include <qtextstream.h>
+#include <qtimer.h>
+#include <qwidget.h>
+
+#include <kaction.h>
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kglobal.h>
+#include <kfiledialog.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kmainwindow.h>
+#include <kmessagebox.h>
+#include <kstandarddirs.h>
+#include <kstdaction.h>
+#include <kurl.h>
+
+#include <atlantic/estate.h>
+#include <atlantic/player.h>
+#include <atlantik/ui/board.h>
+
+#include "boardinfo.h"
+#include "editor.h"
+#include "designer.h"
+
+AtlanticDesigner::AtlanticDesigner(QWidget *parent, const char *name)
+ : KMainWindow(parent, name)
+{
+ firstBoard = true;
+ estates.setAutoDelete(true);
+
+ isMod = false;
+ m_player = 0;
+ copiedEstate = 0;
+ editor = 0;
+ board = 0;
+ layout = 0;
+
+ (void) KStdAction::quit(this, SLOT(close()), actionCollection());
+ (void) KStdAction::open(this, SLOT(open()), actionCollection());
+ (void) KStdAction::openNew(this, SLOT(openNew()), actionCollection());
+ (void) KStdAction::save(this, SLOT(save()), actionCollection());
+ (void) KStdAction::saveAs(this, SLOT(saveAs()), actionCollection());
+ (void) new KAction(i18n("&Edit Gameboard Info..."), CTRL+Key_I, this, SLOT(info()), actionCollection(), "boardinfo");
+ (void) new KAction(i18n("&Edit Groups..."), CTRL+Key_G, this, SLOT(editGroups()), actionCollection(), "groupeditor");
+
+ (void) new KAction(i18n("&Add 4 Squares"), "viewmag+", 0, this, SLOT(larger()), actionCollection(), "larger");
+ (void) new KAction(i18n("&Remove 4 Squares"), "viewmag-", 0, this, SLOT(smaller()), actionCollection(), "smaller");
+ (void) KStdAction::copy(this, SLOT(copy()), actionCollection());
+ (void) KStdAction::paste(this, SLOT(paste()), actionCollection());
+ (void) new KAction(i18n("&Up"), Key_Up, this, SLOT(up()), actionCollection(), "up");
+ (void) new KAction(i18n("&Down"), Key_Down, this, SLOT(down()), actionCollection(), "down");
+ (void) new KAction(i18n("&Left"), Key_Left, this, SLOT(left()), actionCollection(), "left");
+ (void) new KAction(i18n("&Right"), Key_Right, this, SLOT(right()), actionCollection(), "right");
+
+ recentAct = KStdAction::openRecent(0, 0, actionCollection());
+ connect(recentAct, SIGNAL(urlSelected(const KURL &)), this, SLOT(openRecent(const KURL &)));
+ recentAct->loadEntries(KGlobal::config(), "Designer recent files");
+
+ estateAct = new KListAction(i18n("Change Estate"), 0, 0, 0, actionCollection(), "estate_num");
+ connect(estateAct, SIGNAL(activated(int)), SLOT(changeEstate(int)));
+
+ createGUI("atlantikdesignerui.rc");
+
+ KConfig *config = kapp->config();
+ config->setGroup("General");
+ QColor defaultColor = colorGroup().background();
+ defaultBg = config->readColorEntry("alternateBackground", &defaultColor);
+ config->setGroup("WM");
+ defaultColor = colorGroup().dark();
+ defaultFg = config->readColorEntry("activeBackground", &defaultColor);
+
+ // these must match up to the ones in editor.cpp!
+ // I don't think these are used anymore.
+ types.append("street");
+ types.append("cards");
+ types.append("freeparking");
+ types.append("tojail");
+ types.append("tax");
+ types.append("jail");
+
+ openNew();
+
+ resize(350, 400);
+ applyMainWindowSettings(KGlobal::config(), "DesignerTopLevelWindow");
+}
+
+AtlanticDesigner::~AtlanticDesigner()
+{
+ delete m_player;
+}
+
+void AtlanticDesigner::initMembers()
+{
+ estates.clear();
+ cards.clear();
+ groups.clear();
+
+ boardInfo = BoardInfo();
+
+ for (ConfigEstateGroupList::Iterator it = groups.begin(); it != groups.end(); ++it)
+ if ((*it).name() == "Default")
+ return;
+
+ ConfigEstateGroup defaultGroup("Default");
+ defaultGroup.setBgColor(defaultBg);
+ defaultGroup.setFgColor(defaultFg);
+ groups.append(defaultGroup);
+}
+
+void AtlanticDesigner::initBoard()
+{
+ // let her say her prayers (if she's alive)
+ if (!firstBoard)
+ editor->aboutToDie();
+
+ firstBoard = false;
+
+ delete editor;
+ delete board;
+ delete layout;
+
+ board = new AtlantikBoard(0, max, AtlantikBoard::Edit, this, "Board");
+
+ setCentralWidget(board);
+ layout = new QVBoxLayout(board->centerWidget());
+ editor = new EstateEdit(&groups, &estates, &cards, board->centerWidget(), "Estate Editor");
+ connect(editor, SIGNAL(goChecked(int)), this, SLOT(goChanged(int)));
+ connect(editor, SIGNAL(updateBackground()), this, SLOT(updateBackground()));
+ connect(editor, SIGNAL(resized()), board, SLOT(slotResizeAftermath()));
+ layout->addWidget(editor);
+
+ editor->setReady(false);
+
+ board->show();
+ editor->show();
+
+ initToken();
+}
+
+void AtlanticDesigner::initToken()
+{
+ if (!m_player)
+ m_player = new Player(0);
+ else
+ m_player->setLocation(0);
+
+ board->addToken(m_player);
+
+ connect(m_player, SIGNAL(changed(Player *)), board, SLOT(playerChanged(Player *)));
+}
+
+void AtlanticDesigner::openNew()
+{
+ if (warnClose())
+ return;
+ filename = QString::null;
+
+ max = 40;
+
+ initMembers();
+ initBoard();
+
+ for (int i = 0; i < 40; ++i)
+ {
+ (void) newEstate(i);
+ }
+
+ doCaption(false);
+ updateJumpMenu();
+
+ groupsChanged();
+ updateBackground();
+
+ QTimer::singleShot(500, this, SLOT(setPlayerAtBeginning()));
+ doCaption(false);
+}
+
+ConfigEstate *AtlanticDesigner::newEstate(int i)
+{
+ ConfigEstate *estate = new ConfigEstate(i);
+ estate->setName(i18n("New Estate"));
+ estate->setPrice(100);
+ for (int j = 0; j < 6; ++j)
+ estate->setRent(j, 10 * (j + 1));
+ estate->setChanged(false);
+ estates.insert(i, estate);
+
+ connect(estate, SIGNAL(LMBClicked(Estate *)), this, SLOT(changeEstate(Estate *)));
+ connect(estate, SIGNAL(changed()), this, SLOT(modified()));
+
+ board->addEstateView(estate);
+
+ return estate;
+}
+
+bool AtlanticDesigner::warnClose()
+{
+ if (isMod)
+ {
+ int result = KMessageBox::warningYesNoCancel(this, i18n("There are unsaved changes to gameboard. Save them?"), i18n("Unsaved Changes"), KStdGuiItem::save(), KStdGuiItem::discard(), "DiscardAsk", true);
+ switch(result)
+ {
+ case KMessageBox::Yes:
+ save();
+ // fallthrough
+ case KMessageBox::No:
+ return false;
+ case KMessageBox::Cancel:
+ return true;
+ }
+ }
+ return false;
+}
+
+void AtlanticDesigner::open()
+{
+ if (warnClose())
+ return;
+
+ filename = KFileDialog::getOpenFileName();
+
+ if (filename.isNull())
+ return;
+
+ openFile(filename);
+ recentAct->addURL(KURL::fromPathOrURL( filename ));
+}
+
+void AtlanticDesigner::openRecent(const KURL &url)
+{
+ if (url.isLocalFile())
+ {
+ filename = url.path();
+ openFile(filename);
+
+ recentAct->popupMenu()->setItemChecked(recentAct->currentItem(), false);
+ }
+ else
+ {
+ recentAct->removeURL(url);
+ }
+}
+
+void AtlanticDesigner::openFile(const QString &filename)
+{
+ enum ParseMode { Parse_Nothing, Parse_General, Parse_Board, Parse_Cards, Parse_EstateGroups, Parse_Estates };
+ QFile f(filename);
+ if (!f.open(IO_ReadOnly))
+ return;
+
+ initMembers();
+
+ QTextStream t(&f);
+ t.setCodec(QTextCodec::codecForName("utf8"));
+
+ QString s = t.readLine();
+ int parseMode = Parse_Nothing;
+
+ CardStack *curCardStack = 0;
+
+ int goEstate = 0;
+ int i;
+ for (i = 0; !t.atEnd();)
+ {
+ s = s.stripWhiteSpace();
+
+ if (s.isEmpty())
+ {
+ s = t.readLine();
+ continue;
+ }
+
+ QString name;
+
+ if (s.left(1) == "<")
+ {
+ if (s == "<General>")
+ parseMode = Parse_General;
+ else if (s == "<Board>")
+ parseMode = Parse_Board;
+ else if (s == "<EstateGroups>")
+ parseMode = Parse_EstateGroups;
+ else if (s == "<Cards>")
+ parseMode = Parse_Cards;
+ else if (s == "<Estates>")
+ parseMode = Parse_Estates;
+
+ s = t.readLine();
+ continue;
+ }
+
+ // this for outside-of-[]-settings
+ int eqSign = s.find("=");
+ if (eqSign >= 0)
+ {
+ QString key = s.left(eqSign);
+ QString value = s.right(s.length() - eqSign - 1);
+
+ if (parseMode == Parse_Cards)
+ {
+ if (key == "groupname")
+ {
+ cards.append(CardStack(value));
+ curCardStack = &cards.last();
+ }
+ }
+ else if (parseMode == Parse_General)
+ {
+ if (key == "name")
+ boardInfo.name = value;
+ else if (key == "description")
+ boardInfo.description = value;
+ else if (key == "version")
+ boardInfo.version = value;
+ else if (key == "url")
+ boardInfo.url = value;
+ else if (key == "authors")
+ boardInfo.authors = QStringList::split(",", value);
+ else if (key == "credits")
+ boardInfo.credits = QStringList::split(",", value);
+ }
+ else if (parseMode == Parse_Board)
+ {
+ if (key == "go")
+ goEstate = value.toInt();
+ else if (key == "bgcolor")
+ boardInfo.bgColor.setNamedColor(value);
+ }
+
+ s = t.readLine();
+ continue;
+ }
+
+ name = s.left(s.find("]"));
+ name = name.right(name.length() - name.find("[") - 1);
+
+ if (name.isEmpty())
+ name = i18n("No Name");
+
+ // for estates
+ int type = FreeParking;
+ QString group, takeCard;
+ int price = -1;
+ int rent[6] = {-1, -1, -1, -1, -1, -1};
+ int tax = -1;
+ int taxPercentage = -1;
+ int passMoney = -1;
+ QColor forceBg;
+
+ // for groups
+ QColor color, bgColor;
+ QString rentMath;
+ int housePrice = -1;
+ int globalPrice = -1;
+
+ // for cards
+ QStringList keys;
+ QValueList<int> values;
+
+ while (true)
+ {
+ if (t.atEnd())
+ break;
+
+ s = t.readLine().stripWhiteSpace();
+
+ if (s.left(1) == "[" || s.left(1) == "<")
+ break;
+
+ int eqSign = s.find("=");
+ if (eqSign < 0)
+ continue;
+
+ QString key = s.left(eqSign);
+ QString value = s.right(s.length() - eqSign - 1);
+
+ //////////////////////////////// ESTATES
+ if (parseMode == Parse_Estates)
+ {
+ if (key == "price")
+ price = value.toInt();
+ else if (key.left(4) == "rent")
+ {
+ int houses = key.right(1).toInt();
+ if (houses < 0 || houses > 5)
+ continue;
+
+ rent[houses] = value.toInt();
+ }
+ else if (key == "tax")
+ {
+ tax = value.toInt();
+ type = Tax;
+ }
+ else if (key == "taxpercentage")
+ taxPercentage = value.toInt();
+ else if (key == "group")
+ {
+ group = value;
+ type = Street;
+ }
+ else if (key == "tojail")
+ type = ToJail;
+ else if (key == "jail")
+ type = Jail;
+ else if (key == "freeparking")
+ type = FreeParking;
+ else if (key == "takecard")
+ {
+ takeCard = value;
+ type = Cards;
+ }
+ else if (key == "bgcolor")
+ forceBg = QColor(value);
+ else if (key == "passmoney")
+ passMoney = value.toInt();
+ }
+ else if (parseMode == Parse_EstateGroups)
+ {
+ if (key == "color")
+ color.setNamedColor(value);
+ else if (key == "bgcolor")
+ bgColor.setNamedColor(value);
+ else if (key == "houseprice")
+ housePrice = value.toInt();
+ else if (key == "price")
+ globalPrice = value.toInt();
+ else if (key == "rentmath")
+ rentMath = value;
+ }
+ else if (parseMode == Parse_Cards)
+ {
+ bool ok;
+ int v = value.toInt(&ok);
+ if (!ok)
+ continue;
+
+ if (key == "pay" && v < 0)
+ {
+ v *= -1;
+ key = "collect";
+ }
+ else if (key == "payeach" && v < 0)
+ {
+ v *= -1;
+ key = "collecteach";
+ }
+ else if (key == "advance" && v < 0)
+ {
+ v *= -1;
+ key = "goback";
+ }
+
+ keys.append(key);
+ values.append(v);
+ }
+ }
+
+ if (parseMode == Parse_Estates)
+ {
+ ConfigEstate *estate = new ConfigEstate(i);
+ estate->setName(name);
+ estate->setType(type);
+ if (!group.isEmpty())
+ estate->setGroup(group);
+ estate->setTakeCard(takeCard);
+ estate->setPrice(price);
+ for (int j = 0; j < 6; j++)
+ estate->setRent(j, rent[j]);
+ estate->setTax(tax);
+ estate->setTaxPercentage(taxPercentage);
+ estate->setForceBg(forceBg);
+ estate->setPassMoney(passMoney);
+ estates.append(estate);
+
+ connect(estate, SIGNAL(LMBClicked(Estate *)), this, SLOT(changeEstate(Estate *)));
+ connect(estate, SIGNAL(changed()), this, SLOT(modified()));
+ i++;
+ }
+ else if (parseMode == Parse_Cards)
+ {
+ Card card;
+ card.name = name;
+ card.keys = keys;
+ card.values = values;
+ if (curCardStack)
+ curCardStack->append(card);
+ }
+ else if (parseMode == Parse_EstateGroups)
+ {
+ bool found = false;
+ for (ConfigEstateGroupList::Iterator it = groups.begin(); it != groups.end(); ++it)
+ {
+ if ((*it).name() == name)
+ {
+ found = true;
+ break;
+ }
+ }
+
+ if (found)
+ continue;
+
+ ConfigEstateGroup group(name);
+ group.setHousePrice(housePrice);
+ group.setGlobalPrice(globalPrice);
+ group.setFgColor(color);
+ group.setBgColor(bgColor);
+ group.setRentMath(rentMath);
+ groups.append(group);
+ }
+ }
+
+ if (i < 8)
+ {
+ KMessageBox::detailedSorry(this, i18n("This board file is invalid; cannot open."), i18n("There are only %1 estates specified in this file.").arg(i));
+ if (this->filename.isNull())
+ close();
+ return;
+ }
+ max = i;
+
+ initBoard();
+ ConfigEstate *estate = 0;
+ for (estate = estates.first(); estate; estate = estates.next())
+ board->addEstateView(estate);
+
+ if (goEstate >= 0 && goEstate < max - 1)
+ estates.at(goEstate)->setGo(true);
+
+ groupsChanged();
+ updateBackground();
+ updateJumpMenu();
+
+ QTimer::singleShot(500, this, SLOT(setPlayerAtBeginning()));
+ doCaption(false);
+}
+
+void AtlanticDesigner::updateJumpMenu()
+{
+ QStringList estates;
+ for (int i = 1; i <= max; i++)
+ estates.append(i18n("Jump to Estate %1").arg(QString::number(i)));
+ estateAct->setItems(estates);
+}
+
+void AtlanticDesigner::setPlayerAtBeginning()
+{
+ ConfigEstate *go = 0;
+ for (go = estates.first(); go; go = estates.next())
+ if (go->go())
+ break;
+
+ if (!go)
+ go = estates.first();
+
+ movePlayer(go);
+ editor->setEstate(go);
+}
+
+void AtlanticDesigner::saveAs()
+{
+ QString oldfilename = filename;
+ filename = QString::null;
+
+ save();
+
+ if (filename.isNull())
+ {
+ filename = oldfilename;
+ return;
+ }
+ else
+ recentAct->addURL(KURL::fromPathOrURL( filename ));
+}
+
+void AtlanticDesigner::save()
+{
+ (void) editor->saveEstate();
+ QString oldfilename = filename;
+ if (filename.isNull())
+ filename = KFileDialog::getOpenFileName();
+
+ if (filename.isNull())
+ {
+ filename = oldfilename;
+ return;
+ }
+
+ QFile f(filename);
+ if (!f.open(IO_WriteOnly))
+ return;
+
+ QTextStream t(&f);
+ t.setCodec(QTextCodec::codecForName("utf8"));
+
+ t << "<General>" << endl << endl;
+ if (!boardInfo.name.isEmpty())
+ t << "name=" << boardInfo.name << endl;
+ if (!boardInfo.description.isEmpty())
+ t << "description=" << boardInfo.description << endl;
+ if (!boardInfo.url.isEmpty())
+ t << "url=" << boardInfo.url << endl;
+ if (!boardInfo.version.isEmpty())
+ t << "version=" << boardInfo.version << endl;
+ if (!boardInfo.authors.isEmpty())
+ t << "authors=" << boardInfo.authors.join(",") << endl;
+ if (!boardInfo.credits.isEmpty())
+ t << "credits=" << boardInfo.credits.join(",") << endl;
+
+ // FIXME: make configurable. Hardcoded defaults are still better than
+ // non-existant entries that would make the saved configs useless.
+ t << "minplayers=2" << endl;
+ t << "maxplayers=6" << endl;
+ t << "houses=32" << endl;
+ t << "hotels=16" << endl;
+ t << "startmoney=1500" << endl;
+
+ t << endl;
+ t << "<Board>" << endl << endl;
+
+ ConfigEstate *estate = 0;
+ bool hasGo = false;
+ for (estate = estates.first(); estate; estate = estates.next())
+ {
+ if (estate->go())
+ {
+ t << "go=" << estate->id() << endl;
+ hasGo = true;
+ break;
+ }
+ }
+ if (!hasGo)
+ t << "go=" << 0 << endl;
+
+ if (boardInfo.bgColor.isValid())
+ t << "bgcolor=" << boardInfo.bgColor.name() << endl;
+
+ t << endl << endl;
+
+ t << "<EstateGroups>" << endl;
+
+ // double-prevent duplicates
+ QStringList writtenGroups;
+
+ for (ConfigEstateGroupList::Iterator it = groups.begin(); it != groups.end(); ++it)
+ {
+ if (writtenGroups.contains((*it).name()) > 0)
+ continue;
+
+ if ((*it).name() == "Default")
+ {
+ bool containsDefault = false;
+ for (estate = estates.first(); estate; estate = estates.next())
+ {
+ if (estate->group() == "Default")
+ {
+ containsDefault = true;
+ break;
+ }
+ }
+
+ if (!containsDefault)
+ continue;
+ }
+
+ writtenGroups.append((*it).name());
+
+ t << endl << QString("[%1]").arg((*it).name()) << endl;
+
+ if ((*it).globalPrice() > 0)
+ t << "price=" << (*it).globalPrice() << endl;
+
+ if ((*it).fgColor().isValid())
+ t << "color=" << (*it).fgColor().name() << endl;
+ if ((*it).bgColor().isValid())
+ t << "bgcolor=" << (*it).bgColor().name() << endl;
+
+ if ((*it).housePrice() > 0)
+ t << "houseprice=" << (*it).housePrice() << endl;
+
+ if (!(*it).rentMath().isEmpty())
+ t << "rentmath=" << (*it).rentMath() << endl;
+ }
+
+ // now do the cards
+
+ for (QValueList<CardStack>::Iterator it = cards.begin(); it != cards.end(); ++it)
+ {
+ t << endl << endl;
+ t << "<Cards>" << endl << endl;
+ t << "groupname=" << (*it).name() << endl;
+
+ for (CardStack::Iterator cit = (*it).begin(); cit != (*it).end(); ++cit)
+ {
+ t << endl << "[" << (*cit).name << "]" << endl;
+ QValueList<int>::Iterator vit = (*cit).values.begin();
+ for (QStringList::Iterator it = (*cit).keys.begin(); it != (*cit).keys.end(); ++it, ++vit)
+ {
+ QString key = (*it);
+ int value = (*vit);
+
+ if (key == "collect")
+ {
+ value *= -1;
+ key = "pay";
+ }
+ else if (key == "collecteach")
+ {
+ value *= -1;
+ key = "payeach";
+ }
+ else if (key == "goback")
+ {
+ value *= -1;
+ key = "advance";
+ }
+
+ if (key == "outofjail" || key == "tojail" || key == "nextrr" || key == "nextutil")
+ value = 1;
+
+ if (key == "outofjail")
+ {
+ t << "canbeowned=" << 1 << endl;
+ }
+
+ t << key << "=" << value << endl;
+ }
+ }
+ }
+
+ t << endl << endl;
+
+ t << "<Estates>" << endl;
+
+ for (estate = estates.first(); estate; estate = estates.next())
+ {
+ t << endl << QString("[%1]").arg(estate->name()) << endl;
+
+ switch (estate->type())
+ {
+ case Street:
+ if (!estate->group().isNull())
+ t << "group=" << estate->group() << endl;
+
+ if (estate->price() > 0)
+ t << "price=" << estate->price() << endl;
+
+ for (int i = 0; i < 6; i++)
+ {
+ if (estate->rent(i) > 0)
+ t << "rent" << i << "=" << estate->rent(i) << endl;
+ }
+ break;
+
+ case Tax:
+ if (estate->tax() > 0)
+ t << "tax=" << estate->tax() << endl;
+ if (estate->taxPercentage() > 0)
+ t << "taxpercentage=" << estate->taxPercentage() << endl;
+ break;
+
+ case Jail:
+ t << "jail=1" << endl;
+ if (estate->forceBg().isValid())
+ t << "bgcolor=" << estate->forceBg().name() << endl;
+ break;
+
+ case ToJail:
+ t << "tojail=1" << endl;
+ if (estate->forceBg().isValid())
+ t << "bgcolor=" << estate->forceBg().name() << endl;
+ break;
+
+ case Cards:
+ t << "takecard=" << estate->takeCard() << endl;
+ break;
+
+ case FreeParking:
+ t << "freeparking=1" << endl;
+ if (estate->forceBg().isValid())
+ t << "bgcolor=" << estate->forceBg().name() << endl;
+ break;
+ }
+
+ if (estate->passMoney() > 0)
+ t << "passmoney=" << estate->passMoney() << endl;
+ }
+
+ f.flush();
+ doCaption(false);
+}
+
+void AtlanticDesigner::copy()
+{
+ copiedEstate = editor->theEstate();
+}
+
+void AtlanticDesigner::paste()
+{
+ ConfigEstate *estate = editor->theEstate();
+ for (int i = 0; i < 6; i++)
+ estate->setRent(i, copiedEstate->rent(i));
+ estate->setPrice(copiedEstate->price());
+ estate->setTax(copiedEstate->tax());
+ estate->setTaxPercentage(copiedEstate->taxPercentage());
+ estate->setGroup(copiedEstate->group());
+ estate->setTakeCard(copiedEstate->takeCard());
+ estate->setType(copiedEstate->type());
+ estate->setName(copiedEstate->name());
+ estate->setPassMoney(copiedEstate->passMoney());
+
+ editor->setEstate(estate);
+
+ groupsChanged();
+}
+
+void AtlanticDesigner::closeEvent(QCloseEvent *e)
+{
+ if (warnClose())
+ return;
+
+ saveMainWindowSettings(KGlobal::config(), "DesignerTopLevelWindow");
+ recentAct->saveEntries(KGlobal::config(), "Designer recent files");
+
+ e->accept();
+ kapp->quit();
+}
+
+void AtlanticDesigner::changeEstate(int index)
+{
+ if (index < 0 || index > max - 1)
+ return;
+
+ changeEstate(estates.at(index));
+}
+
+void AtlanticDesigner::changeEstate(Estate *estate)
+{
+ if (!estate)
+ return;
+
+ setFocus();
+
+ (void) editor->saveEstate();
+
+ editor->setEstate(static_cast<ConfigEstate *>(estate));
+ movePlayer(estate);
+}
+
+void AtlanticDesigner::movePlayer(Estate *estate)
+{
+ estateAct->setCurrentItem(estate->id());
+ board->setFocus();
+ m_player->setLocation(estate);
+ m_player->update();
+}
+
+// this will add a square to all sides
+void AtlanticDesigner::larger()
+{
+ max += 4;
+ int sideLen = max/4;
+
+ initBoard();
+
+ ConfigEstate *estate = 0;
+ for (int i = 0; i < max; ++i)
+ {
+ estate = estates.at(i);
+ estate->setEstateId(i);
+ board->addEstateView(estate);
+
+ // make a newEstate
+ if ((i % sideLen - 1) == 0 || i == 1)
+ {
+ newEstate(i);
+ }
+ }
+
+ updateJumpMenu();
+ groupsChanged();
+ updateBackground();
+
+ QTimer::singleShot(500, this, SLOT(setPlayerAtBeginning()));
+ doCaption(true);
+}
+
+void AtlanticDesigner::smaller()
+{
+ if (max < 12)
+ return;
+
+ max -= 4;
+ int sideLen = max/4;
+
+ initBoard();
+
+ bool remove = true;
+
+ ConfigEstate *estate = 0;
+ for (int i = 0; i < max; ++i)
+ {
+ // remove estate
+ if (((i % sideLen - 1) == 0 || i == 1) && remove)
+ {
+ estates.remove(i);
+ i--;
+ remove = false;
+ }
+ else
+ {
+ estate = estates.at(i);
+ estate->setEstateId(i);
+ board->addEstateView(estate);
+
+ remove = true;
+ }
+ }
+
+ updateJumpMenu();
+ groupsChanged();
+ updateBackground();
+ QTimer::singleShot(500, this, SLOT(setPlayerAtBeginning()));
+
+ doCaption(true);
+}
+
+void AtlanticDesigner::modified()
+{
+ doCaption(true);
+}
+
+void AtlanticDesigner::doCaption(bool modified)
+{
+ setCaption(filename.isNull()? i18n("Atlantik Gameboard Editor") : filename, modified);
+ isMod = modified;
+}
+
+void AtlanticDesigner::editGroups()
+{
+ if (groupEditor.isNull())
+ {
+ groupEditor = new GroupEditor(&groups, this);
+ groupEditor->show();
+
+ connect(groupEditor, SIGNAL(changed()), this, SLOT(modified()));
+ connect(groupEditor, SIGNAL(update()), this, SLOT(groupsChanged()));
+ connect(groupEditor, SIGNAL(update()), editor, SLOT(groupsChanged()));
+ }
+ else
+ groupEditor->raise();
+}
+
+void AtlanticDesigner::goChanged(int id)
+{
+ ConfigEstate *curEstate = 0;
+ for (curEstate = estates.first(); curEstate; curEstate = estates.next())
+ if (curEstate->go() && curEstate->id() != id)
+ curEstate->setGo(false);
+}
+
+void AtlanticDesigner::groupsChanged()
+{
+ ConfigEstate *curEstate = 0;
+ for (curEstate = estates.first(); curEstate; curEstate = estates.next())
+ {
+ for (ConfigEstateGroupList::Iterator it = groups.begin(); it != groups.end(); ++it)
+ {
+ if ((*it).name() == curEstate->group() && curEstate->type() == Street)
+ {
+ curEstate->setBgColor((*it).bgColor().isValid()? (*it).bgColor() : boardInfo.bgColor);
+ curEstate->setColor((*it).fgColor());
+ curEstate->update();
+ break;
+ }
+ }
+ }
+}
+
+void AtlanticDesigner::updateBackground()
+{
+ ConfigEstate *curEstate = 0;
+ for (curEstate = estates.first(); curEstate; curEstate = estates.next())
+ {
+ if (curEstate->type() != Street || (curEstate->type() == Street && curEstate->group().isNull()))
+ {
+ curEstate->setColor(QColor());
+ curEstate->setBgColor(boardInfo.bgColor);
+ }
+
+ if (curEstate->forceBg().isValid() && (curEstate->type() == FreeParking || curEstate->type() == Jail || curEstate->type() == ToJail))
+ {
+ curEstate->setBgColor(curEstate->forceBg());
+ }
+
+ curEstate->update();
+ }
+}
+
+void AtlanticDesigner::info()
+{
+ if (boardInfoDlg.isNull())
+ {
+ // non-modal
+ boardInfoDlg = new BoardInfoDlg(true, &boardInfo, this, "Board Information", false);
+ boardInfoDlg->show();
+
+ connect(boardInfoDlg, SIGNAL(okClicked()), this, SLOT(updateBackground()));
+ connect(boardInfoDlg, SIGNAL(okClicked()), this, SLOT(modified()));
+ }
+ else
+ boardInfoDlg->raise();
+}
+
+// now some fun functions ;)
+
+void AtlanticDesigner::up()
+{
+ if (editor->upArrow())
+ return;
+ int fourth = max / 4;
+ int estateId = editor->theEstate()->id() + 1;
+ int dest = estateId - 1;
+
+ if (estateId <= 2*fourth && estateId > fourth) // left side
+ dest++;
+ else if (estateId > (3*fourth + 1)) // right side
+ dest--;
+ else if (estateId == 1)
+ dest = max - 1;
+
+ changeEstate(dest);
+}
+
+void AtlanticDesigner::down()
+{
+ if (editor->downArrow())
+ return;
+ int fourth = max / 4;
+ int estateId = editor->theEstate()->id() + 1;
+ int dest = estateId - 1;
+
+ if (estateId <= (2*fourth + 1) && estateId > (fourth + 1)) // left side
+ dest--;
+ else if (estateId > 3*fourth && estateId < max) // right side
+ dest++;
+ else if (estateId == max)
+ dest = 0;
+
+ changeEstate(dest);
+}
+
+void AtlanticDesigner::left()
+{
+ if (editor->leftArrow())
+ return;
+ int fourth = max / 4;
+ int estateId = editor->theEstate()->id() + 1;
+ int dest = estateId - 1;
+
+ if (estateId <= fourth) // bottom
+ dest++;
+ else if (estateId > (2*fourth + 1) && estateId <= (3*fourth + 1)) // top
+ dest--;
+
+ changeEstate(dest);
+}
+
+void AtlanticDesigner::right()
+{
+ if (editor->rightArrow())
+ return;
+ int fourth = max / 4;
+ int estateId = editor->theEstate()->id() + 1;
+ int dest = estateId - 1;
+
+ if (estateId <= (fourth + 1) && estateId != 1) // bottom
+ dest--;
+ else if (estateId > 2*fourth && estateId <= 3*fourth) // top
+ dest++;
+
+ changeEstate(dest);
+}
+
+#include "designer.moc"
diff --git a/atlantikdesigner/designer/designer.h b/atlantikdesigner/designer/designer.h
new file mode 100644
index 0000000..91dd7b4
--- /dev/null
+++ b/atlantikdesigner/designer/designer.h
@@ -0,0 +1,106 @@
+#ifndef ATLANTK_DESIGNER_H
+#define ATLANTK_DESIGNER_H
+
+#include <qcolor.h>
+#include <qguardedptr.h>
+#include <qptrlist.h>
+#include <qstring.h>
+#include <qvaluelist.h>
+
+#include <kmainwindow.h>
+
+#include "boardinfo.h"
+#include "group.h"
+#include "editor.h"
+
+class EstateEdit;
+class QCloseEvent;
+class KListAction;
+class KRecentFilesAction;
+class Estate;
+class Player;
+class ConfigEstate;
+class AtlantikBoard;
+
+class AtlanticDesigner : public KMainWindow
+{
+ Q_OBJECT
+
+ public:
+ AtlanticDesigner(QWidget *parent = 0, const char *name = 0);
+ ~AtlanticDesigner();
+
+ protected:
+ void closeEvent(QCloseEvent *);
+
+ public slots:
+ void modified();
+
+ private slots:
+ void open();
+ void openRecent(const KURL &);
+ void openNew();
+ void save();
+ void saveAs();
+ void copy();
+ void paste();
+ void changeEstate(int);
+ void changeEstate(Estate *);
+ void movePlayer(Estate *);
+ void setPlayerAtBeginning();
+ void info();
+ void editGroups();
+ void groupsChanged();
+ void goChanged(int);
+ void updateBackground();
+
+ void up();
+ void down();
+ void left();
+ void right();
+
+ void smaller();
+ void larger();
+
+ void updateJumpMenu();
+
+ private:
+ void openFile(const QString &);
+ bool warnClose();
+ void initBoard();
+ void initMembers();
+ void initToken();
+ bool firstBoard;
+ ConfigEstate *newEstate(int);
+
+ QGuardedPtr<EstateEdit> editor;
+ QGuardedPtr<QVBoxLayout> layout;
+ QGuardedPtr<AtlantikBoard> board;
+ QGuardedPtr<GroupEditor> groupEditor;
+ QGuardedPtr<BoardInfoDlg> boardInfoDlg;
+ EstateList estates;
+ KListAction *estateAct;
+ KRecentFilesAction *recentAct;
+
+ QValueList<CardStack> cards;
+ BoardInfo boardInfo;
+ ConfigEstateGroupList groups;
+
+ QString filename;
+
+ ConfigEstate *copiedEstate;
+
+ void doCaption(bool);
+
+ int max;
+ QStringList types;
+
+ Player *m_player;
+
+ bool isMod;
+
+ QColor defaultFg;
+ QColor defaultBg;
+};
+
+#endif
diff --git a/atlantikdesigner/designer/editor.cpp b/atlantikdesigner/designer/editor.cpp
new file mode 100644
index 0000000..f092254
--- /dev/null
+++ b/atlantikdesigner/designer/editor.cpp
@@ -0,0 +1,938 @@
+#include <qcheckbox.h>
+#include <qevent.h>
+#include <qframe.h>
+#include <qhgroupbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlineedit.h>
+#include <qspinbox.h>
+#include <qstringlist.h>
+#include <qvaluelist.h>
+#include <qvbox.h>
+#include <qvgroupbox.h>
+
+#include <kcolorbutton.h>
+#include <kcombobox.h>
+#include <kdebug.h>
+#include <kdialog.h>
+#include <kdialogbase.h>
+#include <klineeditdlg.h>
+#include <klistbox.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kpushbutton.h>
+#include <kseparator.h>
+
+#include <atlantic/estate.h>
+
+#include "editor.h"
+
+ConfigEstate::ConfigEstate(int estateId) : Estate(estateId)
+{
+ m_rent[0] = m_rent[1] = m_rent[2] = m_rent[3] = m_rent[4] = m_rent[5] = 0;
+ m_type = m_price = m_tax = m_taxPercentage = m_passMoney = 0;
+ m_go = false;
+ m_group = "Default";
+ m_changed = false;
+}
+
+void ConfigEstate::setChanged(bool b)
+{
+ m_changed = b;
+}
+
+void ConfigEstate::setEstateId(const int estateId)
+{
+ if (m_id != estateId)
+ {
+ m_id = estateId;
+ m_changed = true;
+ }
+}
+
+void ConfigEstate::setType(const int type)
+{
+ if (m_type != type)
+ {
+ m_type = type;
+ m_changed = true;
+ }
+}
+
+void ConfigEstate::setGroup(const QString &group)
+{
+ if (m_group != group)
+ {
+ m_group = group;
+ m_changed = true;
+ }
+}
+
+void ConfigEstate::setPrice(int price)
+{
+ if (m_price != price)
+ {
+ m_price = price;
+ m_changed = true;
+ }
+}
+
+void ConfigEstate::setRent(const int houses, const int rent)
+{
+ if (m_rent[houses] != rent)
+ {
+ m_rent[houses] = rent;
+ m_changed = true;
+ }
+}
+
+void ConfigEstate::setTax(const int tax)
+{
+ if (m_tax != tax)
+ {
+ m_tax = tax;
+ m_changed = true;
+ }
+}
+
+void ConfigEstate::setTaxPercentage(const int taxPercentage)
+{
+ if (m_taxPercentage != taxPercentage)
+ {
+ m_taxPercentage = taxPercentage;
+ m_changed = true;
+ }
+}
+
+void ConfigEstate::setTakeCard(const QString &takeCard)
+{
+ if (m_takeCard != takeCard)
+ {
+ m_takeCard = takeCard;
+ m_changed = true;
+ }
+}
+
+void ConfigEstate::setForceBg(const QColor &forceBg)
+{
+ if (m_forceBg != forceBg)
+ {
+ m_forceBg = forceBg;
+ m_changed = true;
+ }
+}
+
+void ConfigEstate::setGo(const bool go)
+{
+ if (m_go != go)
+ {
+ m_go = go;
+ m_changed = true;
+ }
+}
+
+void ConfigEstate::setPassMoney(const int passMoney)
+{
+ if (m_passMoney != passMoney)
+ {
+ m_passMoney = passMoney;
+ m_changed = true;
+ }
+}
+
+///////////////////////////
+
+QStringList types;
+
+EstateEdit::EstateEdit(ConfigEstateGroupList *newGroups, EstateList *estates, QValueList<CardStack> *cards, QWidget *parent, const char *name)
+ : QWidget(parent, name)
+{
+ groups = newGroups;
+
+ types.append("pay");
+ types.append("payeach");
+ types.append("collect");
+ types.append("collecteach");
+ types.append("advanceto");
+ types.append("advance");
+ types.append("goback");
+ types.append("tojail");
+ types.append("outofjail");
+ types.append("nextutil");
+ types.append("nextrr");
+ types.append("payhouse");
+ types.append("payhotel");
+
+ oldType = -1;
+ estate = 0;
+ this->cards = cards;
+ this->estates = estates;
+ ready = false;
+ locked = false;
+
+ connect(this, SIGNAL(somethingChanged()), this, SLOT(saveEstate()));
+
+ layout = new QGridLayout(this, 7, 1, KDialog::marginHint(), KDialog::spacingHint());
+ nameEdit = new QLineEdit(this, "Name Edit");
+ layout->addWidget(nameEdit, 0, 0);
+ connect(nameEdit, SIGNAL(returnPressed()), this, SIGNAL(somethingChanged()));
+
+ confDlg = 0;
+
+ layout->setRowStretch(2, 2);
+
+ layout->addWidget(new KSeparator(this), 3, 0);
+
+ QHBoxLayout *typeLayout = new QHBoxLayout(KDialog::spacingHint());
+ layout->addLayout(typeLayout, 4, 0);
+
+ QLabel *typeLabel = new QLabel(i18n("Type:"), this);
+ typeLayout->addWidget(typeLabel);
+ typeCombo = new KComboBox(false, this, "Type Combo");
+ typeLayout->addWidget(typeCombo);
+ connect(typeCombo, SIGNAL(activated(int)), this, SIGNAL(somethingChanged()));
+ connect(typeCombo, SIGNAL(activated(int)), this, SIGNAL(updateBackground()));
+
+ goCheck = new QCheckBox(i18n("This estate is 'Go'"), this);
+ connect(goCheck, SIGNAL(toggled(bool)), this, SIGNAL(somethingChanged()));
+ connect(goCheck, SIGNAL(toggled(bool)), this, SLOT(goToggled(bool)));
+ layout->addWidget(goCheck, 5, 0);
+
+ QHBoxLayout *passMoneyLayout = new QHBoxLayout(KDialog::spacingHint());
+ layout->addLayout(passMoneyLayout, 6, 0);
+ QLabel *passMoneyLabel = new QLabel(i18n("Pass money:"), this);
+ passMoneyLayout->addWidget(passMoneyLabel);
+ passMoney = new QSpinBox(0, 3000, 10, this);
+ passMoney->setSpecialValueText(i18n("None"));
+ passMoney->setSuffix("$");
+ passMoneyLayout->addWidget(passMoney);
+
+ QStringList estateTypes(i18n("Street"));
+ estateTypes.append(i18n("Cards"));
+ estateTypes.append(i18n("Free Parking"));
+ estateTypes.append(i18n("Go to Jail"));
+ estateTypes.append(i18n("Tax"));
+ estateTypes.append(i18n("Jail"));
+ typeCombo->insertStringList(estateTypes);
+}
+
+void EstateEdit::aboutToDie()
+{
+ delete confDlg;
+ confDlg = 0;
+}
+
+void EstateEdit::setReady(bool ready)
+{
+ this->ready = ready;
+}
+
+void EstateEdit::resizeEvent(QResizeEvent *)
+{
+ emit resized();
+}
+
+void EstateEdit::setEstate(ConfigEstate *_estate)
+{
+ if (!_estate)
+ return;
+
+ // why the hell is this here? :-)
+ while (1)
+ if (!locked)
+ break;
+
+ estate = _estate;
+
+ ready = false;
+ nameEdit->setText(estate->name());
+ typeCombo->setCurrentItem(estate->type());
+ goCheck->setChecked(estate->go());
+ passMoney->setValue(estate->passMoney());
+
+ ready = true;
+
+ saveEstate(true);
+}
+
+ConfigEstate *EstateEdit::saveEstate(bool superficial)
+{
+ if (!estate || !ready)
+ return 0;
+
+ locked = true;
+
+ EstateType curType = (EstateType)typeCombo->currentItem();
+
+ if (!superficial)
+ {
+ confDlg->slotOk();
+
+ estate->setType(curType);
+ estate->setName(nameEdit->text());
+ estate->setGo(goCheck->isChecked());
+ estate->setPassMoney(passMoney->value());
+ }
+
+ if (curType != Street)
+ {
+ }
+
+ if (!superficial)
+ estate->update();
+
+ configure();
+
+ locked = false;
+
+ return estate;
+}
+
+void EstateEdit::configure()
+{
+ if (oldType == typeCombo->currentItem())
+ {
+ confDlg->slotUpdate(estate);
+ return;
+ }
+
+ delete confDlg;
+
+ switch (estate->type())
+ {
+ case Street:
+ confDlg = new StreetDlg(groups, this);
+ break;
+
+ case Tax:
+ confDlg = new TaxDlg(this);
+ break;
+
+ case Cards:
+ confDlg = new CardsDlg(estates, cards, this);
+ break;
+
+ case Jail:
+ case ToJail:
+ case FreeParking:
+ confDlg = new GenericDlg(this);
+ break;
+
+ default:
+ confDlg = new EstateDlg(this);
+ break;
+ }
+
+ confDlg->slotUpdate(estate);
+
+ connect(confDlg, SIGNAL(updateBackground()), this, SIGNAL(updateBackground()));
+
+ layout->addWidget(confDlg, 1, 0);
+ confDlg->show();
+
+ oldType = typeCombo->currentItem();
+}
+
+void EstateEdit::groupsChanged()
+{
+ confDlg->groupsChanged();
+}
+
+void EstateEdit::goToggled(bool on)
+{
+ if (on)
+ {
+ emit goChecked(estate->id());
+ }
+}
+
+bool EstateEdit::upArrow()const
+{
+ return (nameEdit->hasFocus() || typeCombo->hasFocus());
+}
+
+bool EstateEdit::downArrow()const
+{
+ return upArrow();
+}
+
+bool EstateEdit::leftArrow()const
+{
+ if (nameEdit->hasFocus())
+ {
+ nameEdit->setCursorPosition(nameEdit->cursorPosition() - 1);
+ return true;
+ }
+ return false;
+}
+
+bool EstateEdit::rightArrow()const
+{
+ if (nameEdit->hasFocus())
+ {
+ nameEdit->setCursorPosition(nameEdit->cursorPosition() + 1);
+ return true;
+ }
+ return false;
+}
+
+/////////////////////////////////
+
+TaxDlg::TaxDlg(QWidget *parent, char *name)
+ : EstateDlg(parent, name)
+{
+ QGridLayout *taxBox = new QGridLayout(this, 2, 2, KDialog::marginHint(), KDialog::spacingHint());
+ taxBox->addWidget(new QLabel(i18n("Fixed tax:"), this), 0, 0);
+ taxBox->addWidget(tax = new QSpinBox(0, 3000, 1, this), 0, 1);
+ tax->setSpecialValueText(i18n("None"));
+ tax->setSuffix("$");
+ taxBox->addWidget(new QLabel(i18n("Percentage tax:"), this), 1, 0);
+ taxBox->addWidget(taxPercentage = new QSpinBox(0, 100, 1, this), 1, 1);
+ taxPercentage->setSpecialValueText(i18n("None"));
+ taxPercentage->setSuffix("%");
+}
+
+void TaxDlg::save()
+{
+ estate->setTax(tax->value());
+ estate->setTaxPercentage(taxPercentage->value());
+}
+
+void TaxDlg::update()
+{
+ tax->setValue(estate->tax());
+ taxPercentage->setValue(estate->taxPercentage());
+}
+
+/////////////////////////////////
+
+GenericDlg::GenericDlg(QWidget *parent, char *name)
+ : EstateDlg(parent, name)
+{
+ QHBoxLayout *layout = new QHBoxLayout(this, KDialog::spacingHint());
+ layout->addWidget(new QLabel(i18n("Background:"), this));
+
+ col = new KColorButton(this);
+ layout->addWidget(col);
+}
+
+void GenericDlg::save()
+{
+ estate->setForceBg(col->color());
+ emit updateBackground();
+}
+
+void GenericDlg::update()
+{
+ col->setColor(estate->forceBg());
+}
+
+/////////////////////////////////
+
+CardsDlg::CardsDlg(EstateList *newEstates, QValueList<CardStack> *newCards, QWidget *parent, char *name)
+ : EstateDlg(parent, name)
+{
+ estates = newEstates;
+ stacks = newCards;
+
+ view = 0;
+
+ vlayout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+
+ QHBoxLayout *layout = new QHBoxLayout(vlayout, KDialog::spacingHint());
+
+ KPushButton *addB = new KPushButton(i18n("&New Stack"), this);
+ connect(addB, SIGNAL(clicked()), this, SLOT(addStack()));
+ layout->addWidget(addB);
+ layout->addStretch();
+
+ layout->addWidget(new QLabel(i18n("Cards from"), this));
+ QStringList cardNames;
+ for (QValueList<CardStack>::Iterator it = stacks->begin(); it != stacks->end(); ++it)
+ cardNames.append((*it).name());
+
+ cards = new QComboBox(this);
+ cards->insertStringList(cardNames);
+ layout->addWidget(cards);
+ connect(cards, SIGNAL(activated(const QString &)), this, SLOT(updateView(const QString &)));
+
+ vlayout->addWidget(new KSeparator(this));
+}
+
+void CardsDlg::addStack()
+{
+ bool ok;
+ QString name = KLineEditDlg::getText(i18n("Add Stack"), i18n("Enter the name of the new stack:"), QString::null, &ok, this);
+ if (ok)
+ {
+ for (QValueList<CardStack>::Iterator it = stacks->begin(); it != stacks->end(); ++it)
+ {
+ if ((*it).name() == name)
+ {
+ KMessageBox::information(this, i18n("That name is already on the list."));
+ return;
+ }
+ }
+
+ stacks->append(CardStack(name));
+ cards->insertItem(name);
+ cards->setCurrentText(name);
+ updateView(name);
+ }
+}
+
+void CardsDlg::updateView(const QString &curName)
+{
+ CardStack *curStack = 0;
+ for (QValueList<CardStack>::Iterator it = stacks->begin(); it != stacks->end(); ++it)
+ if ((*it).name() == curName)
+ curStack = &(*it);
+
+ if (!curStack)
+ return;
+
+ delete view;
+ view = new CardView(estates, curStack, this);
+ vlayout->addWidget(view);
+ view->show();
+}
+
+void CardsDlg::save()
+{
+ estate->setTakeCard(cards->currentText());
+}
+
+void CardsDlg::update()
+{
+ if (!estate->takeCard().isNull())
+ {
+ cards->setCurrentText(estate->takeCard());
+ updateView(estate->takeCard());
+ }
+ else
+ cards->setCurrentItem(-1);
+}
+
+/////////////////////////////////
+
+ChooseWidget::ChooseWidget(EstateList *estates, int id, Card *card, QWidget *parent, char *name)
+ : QWidget (parent, name)
+{
+ this->id = id;
+ this->card = card;
+ this->estates = estates;
+
+ value = 0;
+ estate = 0;
+ number = true;
+ prevNumber = true;
+ init = true;
+
+ value = 0;
+
+ hlayout = new QHBoxLayout(this, KDialog::spacingHint());
+ typeCombo = new KComboBox(this);
+ QStringList _types(i18n("Pay"));
+ _types.append(i18n("Pay Each Player"));
+ _types.append(i18n("Collect"));
+ _types.append(i18n("Collect From Each Player"));
+ _types.append(i18n("Advance To"));
+ _types.append(i18n("Advance"));
+ _types.append(i18n("Go Back"));
+ _types.append(i18n("Go to Jail"));
+ _types.append(i18n("Get out of Jail Free Card"));
+ _types.append(i18n("Advance to Nearest Utility"));
+ _types.append(i18n("Advance to Nearest Railroad"));
+ _types.append(i18n("Pay for Each House"));
+ _types.append(i18n("Pay for Each Hotel"));
+ typeCombo->insertStringList(_types);
+ hlayout->addWidget(typeCombo);
+ connect(typeCombo, SIGNAL(activated(int)), this, SLOT(typeChanged(int)));
+
+ hlayout->addStretch();
+}
+
+void ChooseWidget::valueChanged(int i)
+{
+ if (!value)
+ return;
+ (*card->values.at(id)) = i;
+ value->setValue(i);
+}
+
+void ChooseWidget::estateChanged(int i)
+{
+ if (!estate)
+ return;
+
+ (*card->values.at(id)) = i;
+ estate->setCurrentItem(i);
+}
+
+void ChooseWidget::typeChanged(int i)
+{
+ QString key = (*types.at(i));
+
+ (*card->keys.at(id)) = key;
+ typeCombo->setCurrentItem(i);
+
+ number = key != "advanceto";
+
+ if (prevNumber == number && !init)
+ goto Skipped;
+
+ if (number)
+ {
+ delete estate;
+ estate = 0;
+
+ value = new QSpinBox(0, 2000, (key == "advance" || key == "goback")? 1 : 5, this);
+
+ hlayout->addWidget(value);
+ connect(value, SIGNAL(valueChanged(int)), this, SLOT(valueChanged(int)));
+
+ value->show();
+ }
+ else
+ {
+ delete value;
+ value = 0;
+ estate = new KComboBox(this);
+ ConfigEstate *curestate = 0;
+ QStringList estateStrings;
+ for (curestate = estates->first(); curestate; curestate = estates->next())
+ estateStrings.append(curestate->name());
+ estate->insertStringList(estateStrings);
+ connect(estate, SIGNAL(activated(int)), this, SLOT(estateChanged(int)));
+
+ hlayout->addWidget(estate);
+ estate->show();
+ }
+
+ prevNumber = number;
+
+Skipped:
+ init = false;
+
+ if (!number)
+ return;
+
+ bool boolean = (key == "outofjail" || key == "tojail" || key == "nextrr" || key == "nextutil");
+ if (boolean)
+ {
+ value->setValue(1);
+ valueChanged(1);
+ }
+ value->setEnabled(!boolean);
+
+ QString suffix = "";
+ QString prefix = "";
+
+ // first four types are money, pay, payeach, collect, collecteach
+ if (i < 4 || key == "payhouse" || key == "payhotel")
+ suffix = "$";
+ else if (key == "advance" || key == "goback")
+ suffix = i18n("Estate(s)").prepend(" ");
+
+ value->setPrefix(prefix);
+ value->setSuffix(suffix);
+}
+
+/////////////////////////////////
+
+CardView::CardView(EstateList *estates, CardStack *stack, QWidget *parent, char *name) : QWidget(parent, name)
+{
+ card = 0;
+
+ this->stack = stack;
+ this->estates = estates;
+
+ choosies.setAutoDelete(true);
+
+ layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+ QHBoxLayout *hlayout = new QHBoxLayout(layout, KDialog::spacingHint());
+
+ addButton = new KPushButton(i18n("&Add Card..."), this);
+ connect(addButton, SIGNAL(clicked()), this, SLOT(add()));
+ hlayout->addWidget(addButton);
+ hlayout->addStretch();
+ renameButton = new KPushButton(i18n("&Rename..."), this);
+ connect(renameButton, SIGNAL(clicked()), this, SLOT(rename()));
+ hlayout->addWidget(renameButton);
+ hlayout->addStretch();
+ delButton = new KPushButton(i18n("&Delete"), this);
+ connect(delButton, SIGNAL(clicked()), this, SLOT(del()));
+ hlayout->addWidget(delButton);
+
+ List = new KListBox(this);
+ layout->addWidget(List);
+ connect(List, SIGNAL(highlighted(int)), this, SLOT(selected(int)));
+
+ // it gets very big (and won't shrink) otherwise
+ List->setMaximumHeight(90);
+
+ hlayout = new QHBoxLayout(layout, KDialog::spacingHint());
+ moreButton = new KPushButton(i18n("&More Properties"), this);
+ connect(moreButton, SIGNAL(clicked()), this, SLOT(more()));
+ hlayout->addWidget(moreButton);
+ hlayout->addStretch();
+ lessButton = new KPushButton(i18n("&Fewer Properties"), this);
+ connect(lessButton, SIGNAL(clicked()), this, SLOT(less()));
+ hlayout->addWidget(lessButton);
+
+ for (CardStack::Iterator it = stack->begin(); it != stack->end(); ++it)
+ List->insertItem((*it).name);
+
+ updateButtonsEnabled();
+}
+
+void CardView::more()
+{
+ if (!card)
+ return;
+
+ card->keys.append("pay");
+ card->values.append(0);
+ ChooseWidget *newChooseWidget = new ChooseWidget(estates, choosies.count(), card, this);
+ newChooseWidget->typeChanged(0);
+ newChooseWidget->valueChanged(0);
+
+ choosies.append(newChooseWidget);
+ layout->addWidget(newChooseWidget);
+
+ newChooseWidget->show();
+
+ updateButtonsEnabled();
+}
+
+void CardView::less()
+{
+ if (List->count() <= 0 || choosies.count() <= 0)
+ return;
+
+ choosies.removeLast();
+ card->keys.pop_back();
+ card->values.pop_back();
+
+ updateButtonsEnabled();
+}
+
+void CardView::add()
+{
+ bool ok = false;
+ QString name = KLineEditDlg::getText(i18n("Add Card"), i18n("Enter the name of the new card:"), QString::null, &ok, this);
+ if (ok)
+ List->insertItem(name, 0);
+
+ choosies.clear();
+
+ stack->prepend(Card(name));
+
+ List->setCurrentItem(0);
+
+ more();
+
+ updateButtonsEnabled();
+}
+
+void CardView::rename()
+{
+ int curItem = List->currentItem();
+ if (curItem < 0)
+ return;
+
+ bool ok = false;;
+ QString name = KLineEditDlg::getText(i18n("Add Card"), i18n("Enter the name of the new card:"), (*stack->at(curItem)).name, &ok, this);
+ if (ok)
+ {
+ (*stack->at(curItem)).name = name;
+ List->changeItem(name, curItem);
+ }
+
+ updateButtonsEnabled();
+}
+
+void CardView::del()
+{
+ int curItem = List->currentItem();
+
+ // for some reason, crashes if count == 0
+ if (curItem < 0 || List->count() <= 1)
+ return;
+
+ List->removeItem(curItem);
+ stack->remove(stack->at(curItem));
+ choosies.clear();
+
+ updateButtonsEnabled();
+}
+
+void CardView::selected(int i)
+{
+ choosies.clear();
+
+ card = &(*stack->at(i));
+ unsigned int num = card->keys.count();
+
+ QValueList<int>::Iterator vit = card->values.begin();
+ for (QStringList::Iterator it = card->keys.begin(); it != card->keys.end(); ++it)
+ {
+ ChooseWidget *newChooseWidget = new ChooseWidget(estates, choosies.count(), card, this);
+
+ choosies.append(newChooseWidget);
+ layout->addWidget(newChooseWidget);
+
+ newChooseWidget->show();
+
+ newChooseWidget->typeChanged(types.findIndex(*it));
+ newChooseWidget->valueChanged(*vit);
+ newChooseWidget->estateChanged(*vit);
+
+ ++vit;
+ }
+
+ if (num == 0)
+ {
+ card->values.clear();
+ more();
+ }
+
+ updateButtonsEnabled();
+}
+
+void CardView::updateButtonsEnabled()
+{
+ int curItem = List->currentItem();
+ int count = List->count();
+ delButton->setEnabled(!(curItem < 0 || count <= 1));
+ renameButton->setEnabled(!(curItem < 0));
+ moreButton->setEnabled(card);
+ lessButton->setEnabled(!(count <= 0 || choosies.count() <= 0));
+}
+
+/////////////////////////////////
+
+StreetDlg::StreetDlg(ConfigEstateGroupList *newGroups, QWidget *parent, char *name)
+ : EstateDlg(parent, name)
+{
+ groups = newGroups;
+
+ QVBoxLayout *bigbox = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+
+ QVGroupBox *RentPage = new QVGroupBox(i18n("&Rent by Number of Houses"), this);
+ RentPage->setInsideSpacing(KDialog::spacingHint());
+ RentPage->setInsideMargin(KDialog::marginHint());
+ bigbox->addWidget(RentPage);
+ QWidget *topRent = new QWidget(RentPage);
+ QGridLayout *rentBox = new QGridLayout(topRent, 3, 3, KDialog::spacingHint());
+ rentBox->addWidget(new QLabel(i18n("None:"), topRent), 0, 0);
+ rentBox->addWidget(new QLabel(i18n("One:"), topRent), 0, 1);
+ rentBox->addWidget(new QLabel(i18n("Two:"), topRent), 0, 2);
+ rentBox->addWidget(new QLabel(i18n("Three:"), topRent), 2, 0);
+ rentBox->addWidget(new QLabel(i18n("Four:"), topRent), 2, 1);
+ rentBox->addWidget(new QLabel(i18n("Hotel:"), topRent), 2, 2);
+
+ rentBox->addWidget(houses0 = new QSpinBox(0, 3000, 1, topRent), 1, 0);
+ rentBox->addWidget(houses1 = new QSpinBox(0, 3000, 1, topRent), 1, 1);
+ rentBox->addWidget(houses2 = new QSpinBox(0, 3000, 1, topRent), 1, 2);
+ rentBox->addWidget(houses3 = new QSpinBox(0, 3000, 1, topRent), 3, 0);
+ rentBox->addWidget(houses4 = new QSpinBox(0, 3000, 1, topRent), 3, 1);
+ rentBox->addWidget(houses5 = new QSpinBox(0, 3000, 1, topRent), 3, 2);
+ houses0->setSuffix(i18n("$"));
+ houses0->setSpecialValueText(i18n("None"));
+ houses1->setSuffix(i18n("$"));
+ houses1->setSpecialValueText(i18n("None"));
+ houses2->setSuffix(i18n("$"));
+ houses2->setSpecialValueText(i18n("None"));
+ houses3->setSuffix(i18n("$"));
+ houses3->setSpecialValueText(i18n("None"));
+ houses4->setSuffix(i18n("$"));
+ houses4->setSpecialValueText(i18n("None"));
+ houses5->setSuffix(i18n("$"));
+ houses5->setSpecialValueText(i18n("None"));
+
+ QGridLayout *pricesBox = new QGridLayout(bigbox, 2, 2, KDialog::spacingHint());
+ pricesBox->addWidget(new QLabel(i18n("Price:"), this), 0, 0);
+ pricesBox->addWidget(price = new QSpinBox(0, 3000, 25, this), 0, 1);
+ price->setSpecialValueText(i18n("None"));
+ price->setSuffix(i18n("$"));
+
+ QLabel *groupLabel = new QLabel(i18n("Group:"), this);
+ pricesBox->addWidget(groupLabel, 1, 0);
+ groupCombo = new KComboBox(this, "Group Combo");
+ groupUpdate();
+ connect(groupCombo, SIGNAL(activated(const QString &)), this, SLOT(groupChanged(const QString &)));
+
+ pricesBox->addWidget(groupCombo, 1, 1);
+}
+
+void StreetDlg::groupChanged(const QString &groupName)
+{
+ for (ConfigEstateGroupList::Iterator it = groups->begin(); it != groups->end(); ++it)
+ {
+ if ((*it).name() == groupName)
+ {
+ if ( (*it).fgColor().isValid() )
+ estate->setColor((*it).fgColor());
+ if ( (*it).bgColor().isValid() )
+ estate->setBgColor((*it).bgColor());
+ estate->update();
+
+ break;
+ }
+ }
+}
+
+void StreetDlg::groupUpdate()
+{
+ QString curGroupName = groupCombo->currentText();
+
+ QStringList newGroups;
+ for (ConfigEstateGroupList::Iterator it = groups->begin(); it != groups->end(); ++it)
+ newGroups.append((*it).name());
+
+ groupCombo->clear();
+ groupCombo->insertStringList(newGroups);
+
+ if (!curGroupName.isNull())
+ {
+ groupCombo->setCurrentText(curGroupName);
+ groupChanged(curGroupName);
+ }
+}
+
+void StreetDlg::save()
+{
+ estate->setRent(0, houses0->value());
+ estate->setRent(1, houses1->value());
+ estate->setRent(2, houses2->value());
+ estate->setRent(3, houses3->value());
+ estate->setRent(4, houses4->value());
+ estate->setRent(5, houses5->value());
+ estate->setPrice(price->value());
+ estate->setGroup(groupCombo->currentText());
+}
+
+void StreetDlg::update()
+{
+ houses0->setValue(estate->rent(0));
+ houses1->setValue(estate->rent(1));
+ houses2->setValue(estate->rent(2));
+ houses3->setValue(estate->rent(3));
+ houses4->setValue(estate->rent(4));
+ houses5->setValue(estate->rent(5));
+
+ price->setValue(estate->price());
+
+ if (estate->group().isEmpty())
+ {
+ groupCombo->setCurrentText("Default");
+ estate->setGroup("Default");
+ }
+ else
+ groupCombo->setCurrentText(estate->group());
+
+ groupChanged(estate->group());
+}
+
+#include "editor.moc"
diff --git a/atlantikdesigner/designer/editor.h b/atlantikdesigner/designer/editor.h
new file mode 100644
index 0000000..be6d63a
--- /dev/null
+++ b/atlantikdesigner/designer/editor.h
@@ -0,0 +1,310 @@
+#ifndef ATLANTIK_EDITOR_H
+#define ATLANTIK_EDITOR_H
+
+#include <kmainwindow.h>
+#include <qstring.h>
+#include <qcolor.h>
+#include <qstringlist.h>
+
+#include <atlantic/estate.h>
+
+#include "group.h"
+
+class QCheckBox;
+class QGridLayout;
+class QLineEdit;
+class QSpinBox;
+
+class KColorButton;
+class KComboBox;
+class KListBox;
+class KPushButton;
+
+enum EstateType { Street = 0, Cards, FreeParking, ToJail, Tax, Jail };
+
+class ConfigEstate : public Estate
+{
+ public:
+ ConfigEstate(int estateId);
+ void setEstateId(const int estateId);
+ int type()const { return m_type; }
+ void setType(const int type);
+ const QString &group() { return m_group; }
+ void setGroup(const QString &group);
+ int price()const { return m_price; }
+ void setPrice(int);
+ int rent(int _h)const { return m_rent[_h]; }
+ void setRent(const int, const int);
+ int tax()const { return m_tax; }
+ void setTax(const int);
+ int taxPercentage() { return m_taxPercentage; }
+ void setTaxPercentage(const int);
+ const QString &takeCard() { return m_takeCard; }
+ void setTakeCard(const QString &);
+ const QColor &forceBg() { return m_forceBg; }
+ void setForceBg(const QColor &);
+ bool go()const { return m_go; }
+ void setGo(const bool);
+ int passMoney()const { return m_passMoney; }
+ void setPassMoney(const int);
+
+ void setChanged(bool);
+
+ private:
+ int m_type;
+ QString m_group;
+ int m_rent[6];
+ int m_price;
+ int m_tax;
+ int m_taxPercentage;
+ QString m_takeCard;
+ QColor m_forceBg;
+ bool m_go;
+ int m_passMoney;
+};
+typedef QPtrList<ConfigEstate> EstateList;
+
+struct Card
+{
+ Card() {}
+ Card(const QString &newName) { name = newName; }
+ QString name;
+ QStringList keys;
+ QValueList<int> values;
+};
+class CardStack : public QValueList<Card>
+{
+ public:
+ CardStack() {}
+ CardStack(const QString &newName) { setName(newName); }
+ const QString &name() { return m_name; }
+ void setName(const QString &newName) { m_name = newName; }
+
+ private:
+ QString m_name;
+};
+
+class EstateDlg : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ EstateDlg(QWidget *parent = 0, char *name = 0) : QWidget(parent, name) { estate = 0; }
+
+ signals:
+ void updateBackground();
+
+ public slots:
+ virtual void slotOk() { save(); }
+ void slotUpdate(ConfigEstate *newEstate) { estate = newEstate; if (estate) update(); }
+ void groupsChanged() { groupUpdate(); }
+
+ protected:
+ virtual void update() {}
+ virtual void save() {}
+ virtual void groupUpdate() {}
+ ConfigEstate *estate;
+};
+
+class EstateEdit : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ EstateEdit(ConfigEstateGroupList *, EstateList *, QValueList<CardStack> *, QWidget *parent = 0, const char *name = 0);
+ ConfigEstate *theEstate() { return estate; }
+ bool upArrow()const;
+ bool downArrow()const;
+ bool leftArrow()const;
+ bool rightArrow()const;
+ void aboutToDie();
+ void setReady(bool);
+
+ public slots:
+ void setEstate(ConfigEstate *);
+ ConfigEstate *saveEstate(bool superficial = false);
+ void groupsChanged();
+
+ signals:
+ void somethingChanged();
+ void modified();
+ void updateBackground();
+ void goChecked(int id);
+ void resized();
+
+ protected:
+ void resizeEvent(QResizeEvent *);
+
+ private slots:
+ void configure();
+ void goToggled(bool);
+
+ private:
+ KComboBox *typeCombo;
+ QLineEdit *nameEdit;
+ QCheckBox *goCheck;
+ QSpinBox *passMoney;
+ QWidget *centerWidget;
+ QGridLayout *layout;
+
+ EstateList *estates;
+ QValueList<CardStack> *cards;
+ ConfigEstateGroupList *groups;
+
+ ConfigEstate *estate;
+
+ EstateDlg *confDlg;
+
+ int oldType;
+
+ bool ready;
+ bool locked;
+};
+
+class ChooseWidget : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ ChooseWidget(EstateList *, int id, Card *, QWidget *parent = 0, char *name = 0);
+
+ public slots:
+ void typeChanged(int);
+ void valueChanged(int);
+ void estateChanged(int);
+
+ private:
+ Card *card;
+ KComboBox *typeCombo;
+ QSpinBox *value;
+ KComboBox *estate;
+ bool number;
+ bool prevNumber;
+ bool init;
+ QHBoxLayout *hlayout;
+
+ EstateList *estates;
+
+ int id;
+};
+
+class CardView : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ CardView(EstateList *, CardStack *, QWidget *parent = 0, char *name = 0);
+
+ private slots:
+ void selected(int);
+ void add();
+ void del();
+ void rename();
+ void more();
+ void less();
+ void updateButtonsEnabled();
+
+ private:
+ KListBox *List;
+ KPushButton *addButton;
+ KPushButton *renameButton;
+ KPushButton *delButton;
+ KPushButton *moreButton;
+ KPushButton *lessButton;
+
+ EstateList *estates;
+
+ QVBoxLayout *layout;
+
+ Card *card;
+
+ CardStack *stack;
+ QPtrList<ChooseWidget> choosies;
+};
+
+class TaxDlg : public EstateDlg
+{
+ Q_OBJECT
+
+ public:
+ TaxDlg(QWidget *parent = 0, char *name = 0);
+
+ protected:
+ virtual void save();
+ virtual void update();
+
+ private:
+ QSpinBox *tax;
+ QSpinBox *taxPercentage;
+};
+
+class GenericDlg : public EstateDlg
+{
+ Q_OBJECT
+
+ public:
+ GenericDlg(QWidget *parent = 0, char *name = 0);
+
+ protected:
+ virtual void save();
+ virtual void update();
+
+ private:
+ KColorButton *col;
+};
+
+class CardsDlg : public EstateDlg
+{
+ Q_OBJECT
+
+ public:
+ CardsDlg(EstateList *, QValueList<CardStack> *, QWidget *parent = 0, char *name = 0);
+
+ protected:
+ virtual void save();
+ virtual void update();
+
+ private slots:
+ void addStack();
+ void updateView(const QString &);
+
+ private:
+ QValueList<CardStack> *stacks;
+ EstateList *estates;
+
+ QComboBox *cards;
+ CardView *view;
+ QVBoxLayout *vlayout;
+};
+
+class StreetDlg : public EstateDlg
+{
+ Q_OBJECT
+
+ public:
+ StreetDlg(ConfigEstateGroupList *, QWidget *parent = 0, char *name = 0);
+
+ protected:
+ virtual void save();
+ virtual void update();
+ virtual void groupUpdate();
+
+ private slots:
+ void groupChanged(const QString &);
+
+ private:
+ QSpinBox *houses0;
+ QSpinBox *houses1;
+ QSpinBox *houses2;
+ QSpinBox *houses3;
+ QSpinBox *houses4;
+ QSpinBox *houses5;
+ QSpinBox *price;
+ KComboBox *groupCombo;
+
+ ConfigEstateGroupList *groups;
+
+ ConfigEstateGroup *curGroup();
+};
+
+#endif
diff --git a/atlantikdesigner/designer/group.cpp b/atlantikdesigner/designer/group.cpp
new file mode 100644
index 0000000..41f7c6f
--- /dev/null
+++ b/atlantikdesigner/designer/group.cpp
@@ -0,0 +1,242 @@
+#include <qcombobox.h>
+#include <qframe.h>
+#include <qvgroupbox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qspinbox.h>
+#include <qstring.h>
+#include <qstringlist.h>
+
+#include <kcolorbutton.h>
+#include <kdebug.h>
+#include <klineedit.h>
+#include <klineeditdlg.h>
+#include <klistbox.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kpushbutton.h>
+#include <kseparator.h>
+
+#include "group.h"
+
+GroupEditor::GroupEditor(ConfigEstateGroupList *newList, QWidget *parent)
+ : KDialogBase(KDialogBase::Plain, i18n("Group Editor"), Ok|Apply|Cancel, Ok, parent, "Group Editor", false, true), mylist(*newList)
+{
+ setWFlags(WDestructiveClose);
+ list = newList;
+
+ QFrame *page = plainPage();
+ QHBoxLayout *hlayout = new QHBoxLayout(page, marginHint(), spacingHint());
+
+ groups = new KListBox(page);
+ hlayout->addWidget(groups);
+ connect(groups, SIGNAL(highlighted(QListBoxItem *)), this, SLOT(updateSettings(QListBoxItem *)));
+ QStringList newgroups;
+ for (ConfigEstateGroupList::Iterator it = list->begin(); it != list->end(); ++it)
+ newgroups.append((*it).name());
+ groups->insertStringList(newgroups);
+ connect(groups, SIGNAL(selectionChanged()), this, SLOT(selectionChanged()));
+
+ QVBoxLayout *vlayout = new QVBoxLayout(hlayout, spacingHint());
+ colorGroupBox = new QVGroupBox(i18n("&Colors"), page);
+ vlayout->addWidget(colorGroupBox);
+
+ (void) new QLabel(i18n("Foreground:"), colorGroupBox);
+ fgButton = new KColorButton(colorGroupBox, "Foreground Button");
+ connect(fgButton, SIGNAL(changed(const QColor &)), this, SLOT(fgChanged(const QColor &)));
+ connect(fgButton, SIGNAL(changed(const QColor &)), this, SIGNAL(changed()));
+
+ (void) new QLabel(i18n("Background:"), colorGroupBox);
+ bgButton = new KColorButton(colorGroupBox, "Background Button");
+ connect(bgButton, SIGNAL(changed(const QColor &)), this, SLOT(bgChanged(const QColor &)));
+ connect(bgButton, SIGNAL(changed(const QColor &)), this, SIGNAL(changed()));
+
+ pricesGroupBox = new QVGroupBox(i18n("&Prices"), page);
+ vlayout->addWidget(pricesGroupBox);
+
+ pricesWidget = new QWidget(pricesGroupBox);
+ QGridLayout *pricesLayout = new QGridLayout(pricesWidget, 2, 2, 0, spacingHint());
+ pricesLayout->addWidget(new QLabel(i18n("House price:"), pricesWidget), 0, 0);
+ pricesLayout->addWidget(housePrice = new QSpinBox(0, 3000, 25, pricesWidget), 0, 1);
+ housePrice->setSpecialValueText(i18n("None"));
+ housePrice->setSuffix(i18n("$"));
+ connect(housePrice, SIGNAL(valueChanged(int)), this, SLOT(housePriceChanged(int)));
+
+ pricesLayout->addWidget(new QLabel(i18n("Global price:"), pricesWidget), 1, 0);
+ pricesLayout->addWidget(globalPrice = new QSpinBox(0, 3000, 25, pricesWidget), 1, 1);
+ globalPrice->setSpecialValueText(i18n("None"));
+ globalPrice->setSuffix(i18n("$"));
+ connect(globalPrice, SIGNAL(valueChanged(int)), this, SLOT(globalPriceChanged(int)));
+
+ dynamicGroupBox = new QVGroupBox(i18n("&Dynamic Rent"), page);
+ vlayout->addWidget(dynamicGroupBox);
+
+ mathWidget = new QWidget(dynamicGroupBox);
+ QGridLayout *mathLayout = new QGridLayout(mathWidget, 2, 2, 0, spacingHint());
+ mathLayout->addWidget(new QLabel(i18n("Add rent variable:"), mathWidget), 0, 0);
+ mathLayout->addWidget(new QLabel(i18n("Expression:"), mathWidget), 1, 0);
+
+ QComboBox *rentVarCombo = new QComboBox(mathWidget);
+ QStringList vars;
+ vars << "DICE";
+ vars << "HOUSES";
+ vars << "GROUPOWNED";
+ rentVarCombo->insertStringList(vars);
+ mathLayout->addWidget(rentVarCombo, 0, 1);
+
+ rentMathEdit = new KLineEdit(mathWidget);
+ connect(rentMathEdit, SIGNAL(textChanged(const QString &)), this, SLOT(rentMathChanged(const QString &)));
+ connect(rentVarCombo, SIGNAL(activated(const QString &)), rentMathEdit, SLOT(insert(const QString &)));
+ mathLayout->addWidget(rentMathEdit, 1, 1);
+
+ QHBoxLayout *buttonlayout = new QHBoxLayout(vlayout, spacingHint());
+ KPushButton *addB = new KPushButton(i18n("&Add..."), page);
+ buttonlayout->addWidget(addB);
+ connect(addB, SIGNAL(clicked()), this, SLOT(add()));
+
+ removeB = new KPushButton(i18n("&Remove"), page);
+ buttonlayout->addWidget(removeB);
+ connect(removeB, SIGNAL(clicked()), this, SLOT(remove()));
+
+ selectionChanged();
+}
+
+void GroupEditor::add()
+{
+ bool ok;
+ QString name = KLineEditDlg::getText(i18n("Add Group"), i18n("Enter the name of the new group:"), QString::null, &ok, this);
+ if (ok)
+ {
+ for (ConfigEstateGroupList::Iterator it = mylist.begin(); it != mylist.end(); ++it)
+ {
+ if ((*it).name() == name)
+ {
+ KMessageBox::information(this, i18n("That group is already on the list."));
+ return;
+ }
+ }
+
+ mylist.append(ConfigEstateGroup(name));
+ groups->insertItem(name);
+
+ emit changed();
+ }
+}
+
+void GroupEditor::remove()
+{
+ QString curText = groups->currentText();
+ if (!curText.isNull())
+ {
+ groups->removeItem(groups->currentItem());
+ for (ConfigEstateGroupList::Iterator it = mylist.begin(); it != mylist.end(); ++it)
+ {
+ if ((*it).name() == curText)
+ {
+ mylist.remove(it);
+ break;
+ }
+ }
+
+ emit changed();
+ }
+}
+
+void GroupEditor::updateSettings(QListBoxItem *item)
+{
+ if (!mylist.size())
+ return;
+
+ if (!item)
+ return;
+
+ for (ConfigEstateGroupList::Iterator it = mylist.begin(); it != mylist.end() ; ++it)
+ {
+ if ((*it).name() == item->text())
+ {
+ fgButton->setColor((*it).fgColor());
+ bgButton->setColor((*it).bgColor());
+ housePrice->setValue((*it).housePrice());
+ globalPrice->setValue((*it).globalPrice());
+ rentMathEdit->setText((*it).rentMath());
+ break;
+ }
+ }
+}
+
+ConfigEstateGroup *GroupEditor::currentGroup()
+{
+ QListBoxItem *item = groups->item(groups->currentItem());
+ if (!item)
+ return 0;
+
+ for (ConfigEstateGroupList::Iterator it = mylist.begin(); it != mylist.end(); ++it)
+ if ((*it).name() == item->text())
+ return &(*it);
+
+ return 0;
+}
+
+void GroupEditor::fgChanged(const QColor &color)
+{
+ ConfigEstateGroup *group = currentGroup();
+ if (group)
+ group->setFgColor(color);
+}
+
+void GroupEditor::bgChanged(const QColor &color)
+{
+ ConfigEstateGroup *group = currentGroup();
+ if (group)
+ group->setBgColor(color);
+}
+
+void GroupEditor::housePriceChanged(int newValue)
+{
+ ConfigEstateGroup *group = currentGroup();
+ if (group)
+ group->setHousePrice(newValue);
+}
+
+void GroupEditor::globalPriceChanged(int newValue)
+{
+ ConfigEstateGroup *group = currentGroup();
+ if (group)
+ group->setGlobalPrice(newValue);
+}
+
+void GroupEditor::rentMathChanged(const QString &newValue)
+{
+ ConfigEstateGroup *group = currentGroup();
+ if (group)
+ {
+ group->setRentMath(newValue);
+ }
+}
+
+void GroupEditor::slotApply()
+{
+ *list = mylist;
+
+ KDialogBase::slotApply();
+
+ emit update();
+}
+
+void GroupEditor::slotOk()
+{
+ slotApply();
+
+ KDialogBase::slotOk();
+}
+
+void GroupEditor::selectionChanged()
+{
+ bool issel = groups->currentItem() >= 0;
+ colorGroupBox->setEnabled(issel);
+ pricesGroupBox->setEnabled(issel);
+ dynamicGroupBox->setEnabled(issel);
+ removeB->setEnabled(issel);
+}
+
+#include "group.moc"
diff --git a/atlantikdesigner/designer/group.h b/atlantikdesigner/designer/group.h
new file mode 100644
index 0000000..b1ebf99
--- /dev/null
+++ b/atlantikdesigner/designer/group.h
@@ -0,0 +1,99 @@
+#ifndef GROUP_H
+#define GROUP_H
+
+#include <qcolor.h>
+#include <qptrlist.h>
+
+#include <kdialogbase.h>
+
+#include <atlantic/estategroup.h>
+
+class KColorButton;
+class KLineEdit;
+class KListBox;
+class KPushButton;
+
+class QComboBox;
+class QListBoxItem;
+class QSpinBox;
+class QVGroupBox;
+
+class ConfigEstateGroup
+{
+ public:
+ ConfigEstateGroup() { init(); }
+ ConfigEstateGroup(const QString &name) { setName(name); init(); }
+ void init() { setHousePrice(0); setGlobalPrice(0); }
+
+ void setHousePrice(int newPrice) { m_housePrice = newPrice; }
+ int housePrice()const { return m_housePrice; }
+ void setGlobalPrice(int newGlobalPrice) { m_globalPrice = newGlobalPrice; }
+ int globalPrice()const { return m_globalPrice; }
+ const QString &rentMath() { return m_rentMath; }
+ void setRentMath(const QString &newMath) { m_rentMath = newMath; }
+ bool dynamicRent()const { return !m_rentMath.isEmpty(); }
+ void setName(const QString &name) { m_name = name; }
+ const QString &name() { return m_name; }
+
+ const QColor &fgColor() { return m_fgColor; }
+ void setFgColor(const QColor &color) { m_fgColor = color; }
+ const QColor &bgColor() { return m_bgColor; }
+ void setBgColor(const QColor &color) { m_bgColor = color; }
+
+ private:
+ QColor m_fgColor;
+ QColor m_bgColor;
+ QString m_rentMath;
+ int m_housePrice;
+ int m_globalPrice;
+ QString m_name;
+};
+typedef QValueList<ConfigEstateGroup> ConfigEstateGroupList;
+
+class GroupEditor : public KDialogBase
+{
+ Q_OBJECT
+
+ public:
+ GroupEditor(ConfigEstateGroupList *, QWidget *parent=0);
+
+ signals:
+ void changed();
+ void update();
+
+ protected slots:
+ virtual void slotOk();
+ virtual void slotApply();
+
+ private slots:
+ void updateSettings(QListBoxItem *item);
+ void fgChanged(const QColor &);
+ void bgChanged(const QColor &);
+ void housePriceChanged(int);
+ void globalPriceChanged(int);
+ void rentMathChanged(const QString &);
+ void add();
+ void remove();
+ void selectionChanged();
+
+ private:
+ KListBox *groups;
+ KLineEdit *rentMathEdit;
+ KColorButton *fgButton;
+ KColorButton *bgButton;
+ QWidget *pricesWidget;
+ QWidget *mathWidget;
+ QSpinBox *housePrice;
+ QSpinBox *globalPrice;
+ QVGroupBox *colorGroupBox;
+ QVGroupBox *pricesGroupBox;
+ QVGroupBox *dynamicGroupBox;
+ KPushButton *removeB;
+
+ ConfigEstateGroupList *list;
+ ConfigEstateGroupList mylist;
+
+ ConfigEstateGroup *currentGroup();
+};
+
+#endif
diff --git a/atlantikdesigner/designer/main.cpp b/atlantikdesigner/designer/main.cpp
new file mode 100644
index 0000000..b7dee10
--- /dev/null
+++ b/atlantikdesigner/designer/main.cpp
@@ -0,0 +1,37 @@
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <klocale.h>
+#include <kapplication.h>
+
+#include "designer.h"
+
+int main(int argc, char *argv[])
+{
+ KAboutData aboutData(
+ "atlantikdesigner",
+ I18N_NOOP("Atlantik Designer"), "1.1.0",
+ I18N_NOOP("Atlantik gameboard designer"),
+ KAboutData::License_GPL,
+ I18N_NOOP("(c) 2002 Jason Katz-Brown"),
+ 0,
+ "http://www.unixcode.org/atlantik/"
+ );
+
+ aboutData.addAuthor("Jason Katz-Brown", I18N_NOOP("main author"), "jason@katzbrown.com", "http://katzbrown.com/");
+ aboutData.addAuthor("Rob Kaper", I18N_NOOP("libatlantikui"), "cap@capsi.com", "http://capsi.com/");
+
+ KCmdLineArgs::init(argc, argv, &aboutData);
+
+ KApplication kapplication;
+
+ if (kapplication.isRestored())
+ RESTORE(AtlanticDesigner)
+ else
+ {
+ AtlanticDesigner *designer = new AtlanticDesigner;
+ designer->show();
+ }
+
+ return kapplication.exec();
+}
+
diff --git a/atlantikdesigner/pics/Makefile.am b/atlantikdesigner/pics/Makefile.am
new file mode 100644
index 0000000..82d6695
--- /dev/null
+++ b/atlantikdesigner/pics/Makefile.am
@@ -0,0 +1 @@
+KDE_ICON = atlantikdesigner
diff --git a/atlantikdesigner/pics/hi16-app-atlantikdesigner.png b/atlantikdesigner/pics/hi16-app-atlantikdesigner.png
new file mode 100644
index 0000000..8eb628b
--- /dev/null
+++ b/atlantikdesigner/pics/hi16-app-atlantikdesigner.png
Binary files differ
diff --git a/atlantikdesigner/pics/hi32-app-atlantikdesigner.png b/atlantikdesigner/pics/hi32-app-atlantikdesigner.png
new file mode 100644
index 0000000..881a148
--- /dev/null
+++ b/atlantikdesigner/pics/hi32-app-atlantikdesigner.png
Binary files differ
diff --git a/configure.in.in b/configure.in.in
new file mode 100644
index 0000000..0825d68
--- /dev/null
+++ b/configure.in.in
@@ -0,0 +1,4 @@
+#MIN_CONFIG
+
+AC_CHECK_SETENV
+CXXFLAGS="$CXXFLAGS $KDE_DEFAULT_CXXFLAGS"
diff --git a/doc/Makefile.am b/doc/Makefile.am
new file mode 100644
index 0000000..6812bd2
--- /dev/null
+++ b/doc/Makefile.am
@@ -0,0 +1,5 @@
+
+KDE_LANG = en
+KDE_DOCS = AUTO
+SUBDIRS = $(AUTODIRS)
+
diff --git a/doc/kate-plugins/Makefile.am b/doc/kate-plugins/Makefile.am
new file mode 100644
index 0000000..085981d
--- /dev/null
+++ b/doc/kate-plugins/Makefile.am
@@ -0,0 +1,4 @@
+
+KDE_LANG = en
+KDE_DOCS = AUTO
+
diff --git a/doc/kate-plugins/configure_insertcommand.png b/doc/kate-plugins/configure_insertcommand.png
new file mode 100644
index 0000000..af05441
--- /dev/null
+++ b/doc/kate-plugins/configure_insertcommand.png
Binary files differ
diff --git a/doc/kate-plugins/filetemplates.docbook b/doc/kate-plugins/filetemplates.docbook
new file mode 100644
index 0000000..74ee3cb
--- /dev/null
+++ b/doc/kate-plugins/filetemplates.docbook
@@ -0,0 +1,323 @@
+<chapter id="filetemplates">
+ <chapterinfo>
+
+ <title>File Templates</title>
+
+ <authorgroup>
+ <author>
+ <firstname>Anders</firstname>
+ <surname>Lund</surname>
+ <affiliation>
+ <address>&Anders.Lund.mail;</address>
+ </affiliation>
+ </author>
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+ </authorgroup>
+ <date>2006-01-10</date>
+ <releaseinfo>0.1</releaseinfo>
+
+ <keywordset>
+ <keyword>KDE</keyword>
+ <keyword>kate</keyword>
+ <keyword>kdeaddons</keyword>
+ <keyword>template</keyword>
+ <keyword>macro</keyword>
+ </keywordset>
+ </chapterinfo>
+
+ <title>Introduction</title>
+
+ <para>The File Templates plug-in allows you to create files based on other
+ files. You can use any file as a template, which will create a copy of the
+ file with an empty &URL;, or use a special template file which may contain
+ macros to fill in information like your name and email address, the
+ current date and so on, and position the cursor at a
+ convenient position in the new file.</para>
+ <para>Furthermore, templates located in the template folder will
+ be presented in the menu item
+ <menuchoice><guimenu>File</guimenu><guimenuitem>New from
+ Template</guimenuitem></menuchoice>.</para> <para>The plug-in also
+ provides a method to easily create a new template
+ from an open document.</para>
+ <para>The template folder is part of the &kde; file system, and
+ consists of at least
+ KDEDIR/share/applications/kate/plugins/katefiletemplates/templates and
+ KDEHOME/share/applications/kate/plugins/katefiletemplates/templates. If your
+ KDEDIRS environment variable contains additional directories, those are
+ searched for a similar subdirectory as well. If equally named templates are
+ found, the one in the local (KDEHOME) folder is chosen.</para>
+ <sect1 id="katefiletemplates-menu">
+ <title>Menu Structure</title>
+
+ <variablelist>
+ <varlistentry>
+ <term>
+ <menuchoice>
+ <guimenu>File</guimenu>
+ <guimenu>New From Template</guimenu>
+ <guimenuitem>Any File...</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem><para>Presents you with Open File dialog that allows
+ you to use any file as a template. If the chosen file has the
+ extension <filename>katetemplate</filename> it will be parsed
+ for template information and macros.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <menuchoice>
+ <guimenu>File</guimenu>
+ <guimenu>New From Template</guimenu>
+ <guimenuitem>Use Recent</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem><para>Presents a list of files recently used as
+ templates, represented by their &URL;.</para></listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <menuchoice>
+ <guimenu>File</guimenu>
+ <guimenuitem>New From Template</guimenuitem>
+ </menuchoice>
+ </term>
+ <listitem><para>The remainder of submenus contains links to
+ templates. Click a menuitem to create a file as described by
+ the menu item text.</para></listitem>
+ </varlistentry>
+
+ <!-- Settings menu -->
+
+ <varlistentry>
+ <term>
+ <menuchoice><guimenu>Settings</guimenu><guimenuitem>Manage
+ Templates...</guimenuitem></menuchoice></term>
+ <listitem><para>This will launch a dialog with a list of all templates
+ found within the template directories, along with options to add,
+ edit or remove templates.</para></listitem>
+ </varlistentry>
+ </variablelist>
+ </sect1>
+
+ <sect1 id="katefiletemplates-use">
+ <title>Using a &kate; Template</title>
+ <para>When creating a file from a template that contain template
+ macros, some macros appears as editable variables in the text. Such
+ variables appears as underlined words in the text.</para>
+ <para>The first variable will be selected, so you just have to type to edit
+ it.If the document text contains more instances of the same variable,
+ they are changed as you edit. To move to the next editable variable,
+ press the TAB key. When the last variable is edited, the list is
+ dropped, and your TAB key works as normal.</para>
+ </sect1>
+
+ <sect1 id="katefiletemplates-create">
+ <title>Creating your own templates</title>
+ <para>To create a new template, use the
+ <menuchoice><guimenu>Settings</guimenu>
+ <guimenuitem>Manage Templates</guimenuitem></menuchoice> Item to launch
+ the template management dialog. In that, click
+ <guibutton>New...</guibutton> to launch the File Template Wizard. You
+ will be asked for an optional file to turn into a template and prompted
+ for template information settings, and a template file will be created for
+ you.</para> <para>Alternatively, you can create a template manually by
+ adding template information to the top of any file, add text and macros,
+ and save it with the <filename>katetemplate</filename> extension.</para>
+ <para>The template menu gets automatically updated if you chose to store
+ your template in the template directory.</para>
+ </sect1>
+
+ <sect1 id="katefiletemplates-edit">
+ <title>Editing templates</title>
+ <para>To edit a template, use the
+ <menuchoice><guimenu>Settings</guimenu>
+ <guimenuitem>Manage Templates...</guimenuitem></menuchoice>. Select the
+ template you want to work on and click <guibutton>Edit...</guibutton>,
+ and the template file will be opened. Close the dialog, edit the template
+ file as desired, save it and close it. Changes to templates takes
+ immediate effect, you can activate the template to test your changes after
+ saving it.</para>
+ </sect1>
+
+ <sect1 id="katefiletemplates-format">
+ <title>The &kate; Template Format</title>
+ <para>If you use files with the extension
+ <filename>katetemplate</filename>, they will be parsed for template
+ information, macros and a cursor position.</para>
+
+ <sect2 id="katefiletemplates-template-info">
+ <title>Template information</title>
+ <para>While reading in the file, the parser keeps
+ lines beginning with the phrase
+ <constant>katetemplate:</constant> and searches them for
+ template information in the form VARIABLENAME=VALUE. The first line not
+ starting with <constant>katetemplate:</constant> will be taken as the
+ start of the template contents. VALUE may contain any character but
+ equal sign (=). Legal variable names are:
+ <variablelist>
+ <varlistentry>
+ <term><varname>Template</varname></term>
+ <listitem><para>This is the template name, displayed in the
+ <menuchoice><guimenu>File</guimenu><guimenuitem>New from
+ Template</guimenuitem></menuchoice> menu.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><varname>Group</varname></term>
+ <listitem><para>The group places the template in a submenu of
+ the <menuchoice><guimenu>File</guimenu><guimenuitem>New from
+ Template</guimenuitem></menuchoice> menu.</para></listitem>
+ </varlistentry>
+ <varlistentry><term><varname>Name</varname></term>
+ <listitem><para>This is the name that will be set for the
+ document, and displayed in the file list and title bar. If the
+ name contains <userinput>%N</userinput> that will be replaced
+ with a number, increasing if more documents has the same
+ name.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><varname>Highlight</varname></term>
+ <listitem><para>The plug-in will try to set the Highlight for
+ the new document to the value of this variable. The value
+ should be the name, as found in the
+ <menuchoice><guimenu>Tools</guimenu>
+ <guimenuitem>Highlighting</guimenuitem>
+ </menuchoice>.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry>
+ <term><varname>Description</varname></term>
+ <listitem><para>A short informative description of the
+ template. This is currently used to set a Whatsthis string for
+ the menu item, but may be used for more purposes in the
+ future.</para></listitem>
+ </varlistentry>
+ <varlistentry><term>Author</term>
+ <listitem><para>A string identifying the author, for example
+ in the form <userinput>Name &lt;email address&gt;</userinput>.
+ This is currently used to set a Whatsthis string for the menu
+ item, but may be used for more purposes in the
+ future.</para></listitem>
+ </varlistentry>
+ </variablelist>
+ </para>
+
+ </sect2>
+
+ <sect2 id="katetemplates-macros">
+ <title>Template Macros</title>
+
+ <para>While parsing the template contents, macros in the form
+ <userinput>%{NAME}</userinput> or <userinput>${NAME}</userinput> are
+ expanded. If you use the <userinput>$</userinput> prefix, the
+ expanded macro will be treated as a editable variable when a document
+ is created from the template, whereas if you use
+ <userinput>%</userinput> it is not, unless expanding failed.</para>
+ <para>The following macros are expanded:
+ <variablelist>
+ <varlistentry><term>time</term>
+ <listitem><para>Expands to the current time in your locale
+ format.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>date</term>
+ <listitem><para>Expands to the current date in short
+ format.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>datetime</term>
+ <listitem><para>Expands to the current date and time,
+ formatted as a string according to your
+ locale.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>year</term>
+ <listitem><para>The current year as a four digit
+ number.</para></listitem>
+ </varlistentry>
+ <varlistentry>
+ <term>month</term>
+ <listitem><para>The full name of the current month, according
+ to your locale.</para></listitem>
+ </varlistentry>
+ <varlistentry><term>day</term>
+ <listitem><para>Expands to the current day of the month.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>hostname</term>
+ <listitem><para>Expands to the 'hostname' of your computer.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>index</term>
+ <listitem><para>Expands to 'i'.</para></listitem>
+ </varlistentry>
+ <varlistentry><term>fullname</term>
+ <listitem><para>Expands to your full name, as defined by the
+ owner addressee in your standard &kde;
+ addressbook.</para></listitem>
+ </varlistentry>
+ <varlistentry><term>firstname</term>
+ <listitem><para>Expands to your first name, as defined in the owner
+ addressee in your standard &kde; addressbook.</para>
+ </listitem>
+ </varlistentry>
+ <varlistentry><term>lastname</term>
+ <listitem><para>Expands to your last name, as defined in the owner
+ addressee in your standard &kde; addressbook.</para>
+ </listitem>
+ </varlistentry>
+ <!-- <varlistentry>
+ <term>username</term>
+ <listitem><para>Expands to your username.</para></listitem>
+ </varlistentry> -->
+ <varlistentry>
+ <term>email</term>
+ <listitem><para>Expands to your email address, as defined by
+ the owner address in your standard &kde;
+ addressbook.</para></listitem>
+ </varlistentry>
+ <!--<varlistentry>
+ <term>organisation</term>
+ <listitem><para>This is your organisation, as defined by
+ the owner address in your standard KDE
+ addressbook.</para></listitem>
+ </varlistentry>-->
+ </variablelist>
+ </para>
+ <para>Any macro not in the above list is treated as a editable variable
+ no matter the prefix.
+ If the same variable occurs multiple times in the template, they can be
+ edited at once after creating a document from the template.</para>
+ </sect2>
+
+ <sect2 id="katefiletemplates-cursor">
+ <title>Setting the cursor position</title>
+ <para>The special macro <userinput>${cursor}</userinput> will be replaced
+ with a vertical bar and added to the end of the list of editable variables,
+ independent on its location in the text.</para>
+ </sect2>
+
+ </sect1>
+
+ <sect1 id="katefiletemplates-thanks-and-acknowledgements">
+ <title>Thanks and Acknowledgments</title>
+
+ <para>
+ &kate; Plug-in <quote>File Templates</quote> copyright 2004 &Anders.Lund;
+ &Anders.Lund.mail;.
+ </para>
+
+ <para>
+ Documentation copyright 2004 &Anders.Lund;
+ </para>
+
+ <!-- TRANS:CREDIT_FOR_TRANSLATORS -->
+
+ <!-- &underFDL; -->
+ &underGPL;
+
+ </sect1>
+</chapter>
+
+<!-- kate: word-wrap on; space-indent on; indent-width 2; --> \ No newline at end of file
diff --git a/doc/kate-plugins/htmltools.docbook b/doc/kate-plugins/htmltools.docbook
new file mode 100644
index 0000000..e8c48fa
--- /dev/null
+++ b/doc/kate-plugins/htmltools.docbook
@@ -0,0 +1,84 @@
+<chapter id="htmltools">
+<chapterinfo>
+
+<title><acronym>HTML</acronym> Tools </title>
+
+<authorgroup>
+<author>
+<firstname>Francis</firstname>
+<surname>Giannaros</surname>
+<affiliation>
+<address><email>francisg@gmail.com</email></address>
+</affiliation>
+</author>
+</authorgroup>
+<date>2002-05-15</date>
+<releaseinfo>1.00.00</releaseinfo>
+<abstract>
+<para>
+A plugin to help with the insertion of &HTML; elements.
+</para>
+</abstract>
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kate</keyword>
+<keyword>html</keyword>
+</keywordset>
+</chapterinfo>
+
+<title>Introduction</title>
+
+<para>This plugin will open a dialog which will prompt your for a &HTML;
+tag
+name.
+Attributes and values to be put in the opening tag should be entered
+<userinput><replaceable>attribute-name</replaceable>="<replaceable>attribute-value</replaceable>"</userinput>.
+After pressing &Enter;, the opening -- and respective closing -- tag
+will be placed into the document.</para>
+
+<sect1 id="htmltools-menu">
+<title>Menu Structure</title>
+
+<variablelist>
+<varlistentry>
+<term>
+<menuchoice>
+<guimenu>Tools</guimenu>
+<guimenuitem>HTML Tag...</guimenuitem>
+</menuchoice>
+</term>
+<listitem><para>This will open the dialogue as described above.</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect1>
+
+<sect1 id="htmltools-thanks-and-acknowledgements">
+<title>Thanks and Acknowledgments</title>
+
+<para>
+&kate; Plugin <quote>HTML Tools</quote> copyright 2002 Joseph Wenninger
+<email>kde@jowenn.at</email>.
+</para>
+
+<para>
+Documentation copyright 2005 Francis Giannaros
+</para>
+
+<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
+
+<!-- &underFDL; -->
+&underGPL;
+
+</sect1>
+
+</chapter>
+
+<!--
+Local Variables:
+mode: sgml
+sgml-omittag: nil
+sgml-shorttag: t
+End:
+-->
diff --git a/doc/kate-plugins/index.docbook b/doc/kate-plugins/index.docbook
new file mode 100644
index 0000000..e927cc9
--- /dev/null
+++ b/doc/kate-plugins/index.docbook
@@ -0,0 +1,131 @@
+<?xml version="1.0" ?>
+<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN"
+"dtd/kdex.dtd" [
+ <!ENTITY kappname "&kate;">
+ <!ENTITY doc-filetemplates SYSTEM "filetemplates.docbook">
+ <!ENTITY doc-htmltools SYSTEM "htmltools.docbook">
+ <!ENTITY doc-insertcommand SYSTEM "insertcommand.docbook">
+ <!ENTITY doc-openheader SYSTEM "openheader.docbook">
+ <!ENTITY doc-projectmanager SYSTEM "projectmanager.docbook">
+ <!ENTITY doc-textfilter SYSTEM "textfilter.docbook">
+ <!ENTITY doc-xmltools SYSTEM "xmltools.docbook">
+ <!ENTITY doc-xmlcheck SYSTEM "xmlcheck.docbook">
+ <!ENTITY % English "INCLUDE" > <!-- change language only here -->
+]>
+
+<book lang="&language;">
+<bookinfo>
+<title>The &kate; Plugins Handbook</title>
+
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+
+<date>2006-02-24</date>
+<releaseinfo>3.5.1</releaseinfo> <!-- Used KDE version here -->
+
+<copyright>
+<year>2001</year>
+<year>2002</year>
+<holder> </holder>
+</copyright>
+
+<legalnotice>&FDLNotice;</legalnotice>
+
+<abstract>
+<para>
+This is the handbook for the plugins for &kate;, &kde;'s Advanced Text
+Editor.
+</para>
+</abstract>
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kdeaddons</keyword>
+<keyword>Kate</keyword>
+<keyword>Plugins</keyword>
+</keywordset>
+
+</bookinfo>
+
+<chapter id="introduction">
+<title>&kate; plugins</title>
+
+<para>
+&kate; plugins are additional functions for the &kate; editor. They can
+add extra menus and shortcuts, and extend &kate;'s features. You can
+install as many or as few as you like, from within &kate;.
+Open &kate;'s configuration dialog with
+<menuchoice><guimenu>Settings</guimenu><guimenuitem>Configure &kate;...</guimenuitem></menuchoice>.
+Select <menuchoice><guimenu>Application</guimenu><guimenuitem>Plugins</guimenuitem></menuchoice> to
+choose the wanted plugins.
+</para>
+
+<para>
+More information on using &kate; and enabling the plugins you want is
+available in the &kate; handbook.
+</para>
+
+<para>
+The plugins installed in this handbook are:
+</para>
+
+<itemizedlist>
+<listitem>
+<para><link linkend="xmltools">&XML; Completion</link></para>
+</listitem>
+<listitem>
+<para><link linkend="xmlcheck">&XML; Validation</link></para>
+</listitem>
+<listitem>
+<para><link linkend="insertcommand">Insert Command</link></para>
+</listitem>
+<listitem>
+<para><link linkend="htmltools">&HTML; Tools</link></para>
+</listitem>
+<listitem>
+<para><link linkend="openheader">Open Header</link></para>
+</listitem>
+<listitem>
+<para><link linkend="textfilter">Text Filter</link></para>
+</listitem>
+<listitem>
+<para><link linkend="filetemplates">File Templates</link></para>
+</listitem>
+</itemizedlist>
+
+</chapter>
+
+&doc-xmltools;
+&doc-xmlcheck;
+&doc-insertcommand;
+&doc-htmltools;
+&doc-openheader;
+&doc-textfilter;
+&doc-filetemplates;
+
+<chapter id="credits">
+<title>Credits and License</title>
+
+<para>
+Copyrights for each applet is listed in the applicable chapter.
+</para>
+
+&underFDL;
+&underGPL;
+
+</chapter>
+
+<!--
+<appendix id="installation">
+<title>Installation</title>
+<para>To be written
+</para>
+</appendix>
+-->
+
+</book>
+
+<!--
+Local Variables:
+mode: sgml
+End:
+-->
diff --git a/doc/kate-plugins/insertcommand.docbook b/doc/kate-plugins/insertcommand.docbook
new file mode 100644
index 0000000..eeafe7e
--- /dev/null
+++ b/doc/kate-plugins/insertcommand.docbook
@@ -0,0 +1,150 @@
+<chapter id="insertcommand">
+<chapterinfo>
+
+<title>Insert Command</title>
+
+<authorgroup>
+<author>
+<firstname>Anders</firstname>
+<surname>Lund</surname>
+<affiliation>
+<address>&Anders.Lund.mail;</address>
+</affiliation>
+</author>
+</authorgroup>
+<date>2006-05-17</date>
+<releaseinfo>3.5.2</releaseinfo>
+<abstract>
+<para>
+The <quote>Insert Command</quote> plugin allows you to insert shell
+command output into a document open in &kate;.
+</para>
+</abstract>
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kate</keyword>
+<keyword>insert</keyword>
+</keywordset>
+</chapterinfo>
+
+<title>Introduction</title>
+
+<para>The <quote>Insert Command</quote> plugin allows you to insert
+shell command output into a document open in &kate;.</para>
+
+<para>First enable the <quote>Insert Command</quote> plugin by using the
+<menuchoice><guimenu>Settings</guimenu> <guimenuitem>Configure
+&kate;...</guimenuitem></menuchoice> dialog and checking <guilabel>&kate;
+InsertCommand</guilabel> in in the <guilabel>Application</guilabel>
+<guilabel>Plugins</guilabel> section and close the dialog.</para>
+
+<sect1 id="insertcommand-fund">
+<title>Onscreen Fundamentals</title>
+
+<para>
+<!-- Basics of using this plugin --> To use the plugin, select
+<guimenu>Insert Command...</guimenu> from the <guimenu>Tools</guimenu>
+menu, which will present you with a small dialog for entering the
+command, choosing a working folder and selecting whether to include
+errors (STDERR output) in the inserted text. You can also have the
+command string printed above the output.
+</para>
+
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="insertcommand.png"/></imageobject>
+<textobject>
+<phrase>The Insert Command Dialog</phrase>
+</textobject>
+</mediaobject>
+
+<para>The plugin can remember a number of commands as chosen in the
+configuration page. These are used for autocompletion, and can be
+selected from a list in the command entry. </para>
+
+<para>By default, the command will be run in the working folder of the
+kate process, which is usually your home folder. This can be changed
+in the configuration page for the plugin. </para>
+
+<para>Note that any shell command that requires user input (for
+example passwd) or uses a ncurses interface or something similar (for
+example top) will fail to produce the expected output. </para>
+
+</sect1>
+
+<sect1 id="insertcommand-config">
+<title>Configuration</title>
+
+<para>
+To configure the <quote>Insert Command</quote>
+plugin, open the &kate; configuration dialog from the
+<menuchoice><guimenu>Settings</guimenu><guimenuitem>Configure
+&kate;...</guimenuitem></menuchoice> menu and choose
+<menuchoice><guimenuitem>Plugins</guimenuitem><guilabel>Insert Command
+</guilabel></menuchoice>. </para>
+
+<mediaobject>
+<imageobject><imagedata format="PNG"
+fileref="configure_insertcommand.png"/></imageobject>
+<textobject>
+<phrase>The Insert Command Configuration Tab</phrase>
+</textobject>
+</mediaobject>
+
+<para>
+The following configuration options are available:
+</para>
+
+<variablelist>
+<varlistentry>
+<term><guilabel>Number of commands to remember</guilabel></term>
+<listitem>
+<para>This setting is presented as a spinbox which you can set to the
+number of commands to be remembered. Any number from 0 to 99 is
+legal. Default is 20.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guilabel>Default Working Folder</guilabel></term>
+<listitem>
+<para>This setting, presented as a set of radio buttons, allows you to
+decide how the working folder of a command is chosen. The options are
+the working folder of the &kate; process (usually your home folder when &kate; is started from the K menu), the folder of the document (if any, otherwise the
+above option is used) or the working folder of the last command run in
+the plugin. </para>
+</listitem>
+</varlistentry>
+
+</variablelist>
+
+
+</sect1>
+
+<sect1 id="insertcommand-thanks-and-acknowledgements">
+<title>Thanks and Acknowledgments</title>
+
+<para>
+&kate; Plugin <quote>Insert Command</quote> copyright 2001 Anders Lund
+&Anders.Lund.mail;.
+</para>
+
+<para>
+Documentation copyright 2001 &Anders.Lund; &Anders.Lund.mail;
+</para>
+
+<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
+
+<!-- &underFDL; -->
+&underGPL;
+
+</sect1>
+</chapter>
+
+<!--
+Local Variables:
+mode: sgml
+sgml-omittag: nil
+sgml-shorttag: t
+End:
+-->
+
diff --git a/doc/kate-plugins/insertcommand.png b/doc/kate-plugins/insertcommand.png
new file mode 100644
index 0000000..1d756be
--- /dev/null
+++ b/doc/kate-plugins/insertcommand.png
Binary files differ
diff --git a/doc/kate-plugins/openheader.docbook b/doc/kate-plugins/openheader.docbook
new file mode 100644
index 0000000..60aed58
--- /dev/null
+++ b/doc/kate-plugins/openheader.docbook
@@ -0,0 +1,49 @@
+<chapter id="openheader">
+<chapterinfo>
+
+<title>Open Header</title>
+
+<!--
+<authorgroup>
+<author>
+<firstname> </firstname>
+<surname> </surname>
+<affiliation>
+<address><email> </email></address>
+</affiliation>
+</author>
+</authorgroup>
+<date>2001-05-15</date>
+<releaseinfo>1.00.00</releaseinfo>
+<abstract>
+<para>
+Note about open header
+</para>
+</abstract>
+-->
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kate</keyword>
+<keyword>header</keyword>
+</keywordset>
+</chapterinfo>
+
+<title>Introduction</title>
+
+<para>
+The &kate; plugin <quote>Open Header</quote> currently has no
+documentation. If you are interested in rectifying that situation,
+please contact Lauri Watts <email>lauri@kde.org</email>, &kde;'s
+Documentation Team coordinator.
+</para>
+
+</chapter>
+
+<!--
+Local Variables:
+mode: sgml
+sgml-omittag: nil
+sgml-shorttag: t
+End:
+-->
+
diff --git a/doc/kate-plugins/textfilter.docbook b/doc/kate-plugins/textfilter.docbook
new file mode 100644
index 0000000..1d628c5
--- /dev/null
+++ b/doc/kate-plugins/textfilter.docbook
@@ -0,0 +1,50 @@
+<chapter id="textfilter">
+<chapterinfo>
+
+<title>Text Filter</title>
+
+<!--
+<authorgroup>
+<author>
+<firstname> </firstname>
+<surname> </surname>
+<affiliation>
+<address><email> </email></address>
+</affiliation>
+</author>
+</authorgroup>
+<date>2001-05-15</date>
+<releaseinfo>1.00.00</releaseinfo>
+<abstract>
+<para>
+Note about text filter plugin
+</para>
+</abstract>
+-->
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kate</keyword>
+<keyword>text</keyword>
+<keyword>filter</keyword>
+</keywordset>
+</chapterinfo>
+
+<title>Introduction</title>
+
+<para>
+The &kate; plugin <quote>Text Filer</quote> currently has no
+documentation. If you are interested in rectifying that situation,
+please contact Lauri Watts <email>lauri@kde.org</email>, &kde;'s
+Documentation Team coordinator.
+</para>
+
+</chapter>
+
+<!--
+Local Variables:
+mode: sgml
+sgml-omittag: nil
+sgml-shorttag: t
+End:
+-->
+
diff --git a/doc/kate-plugins/xmlcheck.docbook b/doc/kate-plugins/xmlcheck.docbook
new file mode 100644
index 0000000..0156509
--- /dev/null
+++ b/doc/kate-plugins/xmlcheck.docbook
@@ -0,0 +1,102 @@
+<chapter id="xmlcheck">
+<chapterinfo>
+
+<title>&XML; Validation</title>
+
+<authorgroup>
+<author>
+<firstname>Daniel</firstname>
+<surname>Naber</surname>
+<affiliation>
+<address>&Daniel.Naber.mail;</address>
+</affiliation>
+</author>
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+</authorgroup>
+<date>2006-05-17</date>
+<releaseinfo>3.5.2</releaseinfo>
+<abstract>
+
+<para>This plugin checks &XML; files for well-formedness and validity.</para>
+
+</abstract>
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kate</keyword>
+<keyword>xml</keyword>
+<keyword>DTD</keyword>
+</keywordset>
+</chapterinfo>
+
+<title>Introduction</title>
+
+<para>This plugin checks the current file. A list of warnings and errors
+will appears at the bottom of &kate;'s main window. You can click on an error message
+to jump to the corresponding place in the file. If the file has a <quote>DOCTYPE</quote>
+the DTD given with this doctype will be used to check the file for validity. The
+DTD is expected at a position relative to the current file, &eg; if the doctype
+refers to <quote>DTD/xhtml1-transitional.dtd</quote> and the file is <filename>/home/peter/test.xml</filename>
+the DTD is expected to be located at <filename>/home/peter/DTD/xhtml1-transitional.dtd</filename>.
+However, remote DTDs specified via http are supported.</para>
+
+<para>If the file has no doctype it will be checked for well-formedness.</para>
+
+<para>To learn more about &XML; check out the <ulink url="http://www.w3.org/XML/"> official W3C &XML; pages</ulink>.</para>
+
+<para>Internally this plugin calls the external command <command>xmllint</command>, which
+is part of libxml2. If this command is not correctly installed on your system, the plugin
+will not work.</para>
+
+<note><para>A temporary file needs to be written to the same folder as the file
+that should be checked, so you need to have write access to that folder.</para></note>
+
+<para>To load this plugin open &kate;s configuration dialog under <menuchoice><guimenu>Settings</guimenu>
+<guimenuitem>Configure &kate;...</guimenuitem></menuchoice>.
+Then select <guilabel>Kate XML Validation</guilabel> which will appear
+in the <guilabel>Application</guilabel>/<guilabel>Plugins</guilabel> section and close the dialog.
+</para>
+
+<sect1 id="xmlcheck-menu">
+<title>Menu Structure</title>
+
+<variablelist>
+<varlistentry>
+<term>
+<menuchoice>
+<guimenu>XML</guimenu>
+<guimenuitem>Validate XML</guimenuitem>
+</menuchoice>
+</term>
+<listitem><para>This will start the check, as described above.</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect1>
+
+<sect1 id="xmlcheck-thanks-and-acknowledgements">
+<title>Thanks and Acknowledgments</title>
+
+<para>
+&kate; Plugin <quote>XML Validation</quote> copyright 2002 &Daniel.Naber;
+&Daniel.Naber.mail;.
+</para>
+
+<para>
+Documentation copyright 2002 &Daniel.Naber;
+</para>
+
+<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
+<!-- &underFDL; -->
+&underGPL;
+
+</sect1>
+</chapter>
+
+<!--
+Local Variables:
+mode: sgml
+sgml-omittag: nil
+sgml-shorttag: t
+End:
+-->
+
diff --git a/doc/kate-plugins/xmltools.docbook b/doc/kate-plugins/xmltools.docbook
new file mode 100644
index 0000000..fcbadd2
--- /dev/null
+++ b/doc/kate-plugins/xmltools.docbook
@@ -0,0 +1,186 @@
+<chapter id="xmltools">
+<chapterinfo>
+
+<title>&XML; Completion</title>
+
+<authorgroup>
+<author>
+<firstname>Daniel</firstname>
+<surname>Naber</surname>
+<affiliation>
+<address>&Daniel.Naber.mail;</address>
+</affiliation>
+</author>
+</authorgroup>
+<date>2006-05-17</date>
+<releaseinfo>3.5.2</releaseinfo>
+<abstract>
+
+<para>This plugin supports writing &XML; files by listing allowed tags
+and more.</para>
+
+</abstract>
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kate</keyword>
+<keyword>xml</keyword>
+</keywordset>
+</chapterinfo>
+
+<title>Introduction</title>
+
+<para>This plugin gives hints about what is allowed at a certain position in
+an &XML; file, according to the file's DTD. It will list possible
+elements, attributes, attribute values or entities, depending on the
+cursor position (&eg; all entities are listed if the character on the left
+of the cursor is <quote>&amp;</quote>). It's also possible to close the nearest
+open tag on the left.</para>
+
+<para>The <acronym>DTD</acronym> must exist in &XML; format, as produced by the Perl program
+<command>dtdparse</command>. We will call a DTD in this format <quote>meta DTD</quote>.
+Some meta DTDs are supplied. They are installed in
+<filename class="directory">$KDEDIR/share/apps/katexmltools/</filename>,
+which is also the default folder when you choose
+<guimenuitem>Assign Meta DTD...</guimenuitem>.
+To produce your own meta DTDs, get <command>dtdparse</command> from
+<ulink url="http://dtdparse.sourceforge.net">http://dtdparse.sourceforge.net</ulink>.</para>
+
+<sect1 id="xmltools-how-to-use">
+<title>How to Use</title>
+
+<para>Start &kate; and open the configuration dialog under <menuchoice><guimenu>Settings</guimenu>
+<guimenuitem>Configure &kate;...</guimenuitem></menuchoice>.
+Then select <guilabel>Kate XML Completion</guilabel> which will appear
+in the <guilabel>Application</guilabel>/<guilabel>Plugins</guilabel> section and close the dialog. After
+that, select <menuchoice><guimenu>XML</guimenu><guimenuitem>Assign Meta DTD...</guimenuitem></menuchoice>.
+If your document contains no <quote>DOCTYPE</quote> or the doctype is unknown, you'll have to
+select a meta DTD from the file system. Otherwise the meta DTD that
+matches the current document's DOCTYPE will be loaded automatically.</para>
+
+<para>You can now use the plugin while typing your text:</para>
+
+<variablelist>
+
+<varlistentry>
+<term>&lt; (less than key)</term>
+<listitem><para>This will trigger a list of possible elements unless the
+cursor is inside a tag already. Note that you currently cannot use
+this to insert the top level element (&eg; <quote>&lt;html&gt;</quote>).</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>" (quote key)</term>
+<listitem><para>The quote key will trigger a list of possible attribute
+values (if there are some) if you are inside a tag.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>(space key)</term>
+<listitem><para>This key will trigger a list of possible attributes for the
+current element if you are inside a tag.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>&amp; (ampersand key)</term>
+<listitem><para>This key will trigger a list of named entities.</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect1>
+
+<sect1 id="xmltools-features-and-limitations">
+<title>Features and Limitations</title>
+
+<para>You can test all functions and limitations by loading
+<filename>$KDEDIR/share/apps/katexmltools/testcases.xml</filename>
+into &kate; and following the instructions. Note that working with
+more than one view per document is not yet correctly supported by
+this plugin.</para>
+
+</sect1>
+
+
+<sect1 id="xmltools-menu">
+<title>Menu Structure</title>
+
+<variablelist>
+<varlistentry>
+<term>
+<menuchoice>
+<shortcut>
+<keycombo action="simul">&Ctrl;<keycap>Return</keycap></keycombo>
+</shortcut>
+<guimenu>XML</guimenu>
+<guimenuitem>Insert Element...</guimenuitem>
+</menuchoice>
+</term>
+<listitem><para>This will open a dialog that lets you insert an &XML; element.
+The &lt;, &gt; characters and the closing tag will be inserted automatically.
+If you have selected text when this menu item is selected, the selected
+text will be surrounded by the opening and the closing tag.
+The dialog also offers completion of all elements that may be inserted
+at the current cursor position if you have assigned a meta DTD by
+using <guimenuitem>Assign Meta DTD...</guimenuitem>.
+</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+<menuchoice>
+<shortcut>
+<keycombo action="simul">&Ctrl;<keycap>&lt;</keycap></keycombo>
+</shortcut>
+<guimenu>XML</guimenu>
+<guimenuitem>Close Element</guimenuitem>
+</menuchoice>
+</term>
+<listitem><para>This will search your text for a tag that is not yet closed
+and will close it by inserting the corresponding closing tag.
+The search starts at the cursor position and goes left. If
+it cannot find an open tag nothing will happen.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+<menuchoice>
+<guimenu>XML</guimenu>
+<guimenuitem>Assign Meta DTD...</guimenuitem>
+</menuchoice>
+</term>
+<listitem><para>This will tell the plugin which meta DTD to use for the
+current document. Note that this assignment will not be saved.
+You will have to repeat it when you start &kate; the next time.</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect1>
+
+<sect1 id="xmltools-thanks-and-acknowledgements">
+<title>Thanks and Acknowledgments</title>
+
+<para>
+&kate; Plugin <quote>XML Completion</quote> copyright 2001,2002 &Daniel.Naber;
+&Daniel.Naber.mail;.
+</para>
+
+<para>
+Documentation copyright 2001,2002 &Daniel.Naber;
+</para>
+
+<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
+
+<!-- &underFDL; -->
+&underGPL;
+
+</sect1>
+</chapter>
+
+<!--
+Local Variables:
+mode: sgml
+sgml-omittag: nil
+sgml-shorttag: t
+End:
+-->
+
diff --git a/doc/kicker-applets/Makefile.am b/doc/kicker-applets/Makefile.am
new file mode 100644
index 0000000..085981d
--- /dev/null
+++ b/doc/kicker-applets/Makefile.am
@@ -0,0 +1,4 @@
+
+KDE_LANG = en
+KDE_DOCS = AUTO
+
diff --git a/doc/kicker-applets/index.docbook b/doc/kicker-applets/index.docbook
new file mode 100644
index 0000000..82a61a8
--- /dev/null
+++ b/doc/kicker-applets/index.docbook
@@ -0,0 +1,113 @@
+<?xml version="1.0" ?>
+<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN"
+"dtd/kdex.dtd" [
+ <!ENTITY doc-ktimemon SYSTEM "ktimemon.docbook">
+ <!ENTITY doc-kolourpicker SYSTEM "kolourpicker.docbook">
+ <!ENTITY ktimemon "<application>KTimemon</application>">
+ <!ENTITY kolourpicker "<application>KolourPicker</application>">
+<!ENTITY % English "INCLUDE" > <!-- change language only here -->
+]>
+
+<book lang="&language;">
+<bookinfo>
+<title>The &kicker; Applets Handbook</title>
+
+<authorgroup>
+<author>
+<firstname> </firstname>
+<surname> </surname>
+<affiliation><address><email>
+</email></address></affiliation>
+</author>
+</authorgroup>
+
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+
+<date>2001-05-12</date>
+<releaseinfo>2.20.00</releaseinfo> <!-- Used Kicker version here -->
+
+<copyright>
+<year>2001</year>
+<holder> </holder>
+</copyright>
+
+<legalnotice>&FDLNotice;</legalnotice>
+
+<abstract>
+<para>
+This is the handbook for the addon applets for &kicker;, &kde;'s panel.
+</para>
+</abstract>
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kdeaddons</keyword>
+<keyword>Kicker</keyword>
+<keyword>Applets</keyword>
+</keywordset>
+
+</bookinfo>
+
+<chapter id="introduction">
+<title>&kicker; applets</title>
+
+<para>
+Applets are small applications running inside of &kicker;. Almost
+everything besides the application starter buttons are applets. They can
+be added from the <guimenu>context</guimenu> menu or from the submenu
+<guisubmenu>Configure Panel</guisubmenu> by choosing
+<guisubmenu>Add</guisubmenu> and the <guimenuitem>Applet</guimenuitem>.
+</para>
+
+<para>
+More information on the use of &kicker; and on the base set of applets
+that come with &kicker;, can be found in the &kicker; handbook.
+</para>
+
+<para>
+The Applets described in this handbook are:
+</para>
+
+<itemizedlist>
+<listitem>
+<para><link linkend="kolourpicker">&kolourpicker;</link></para>
+</listitem>
+<listitem>
+<para><link linkend="ktimemon">&ktimemon;</link></para>
+</listitem>
+</itemizedlist>
+
+</chapter>
+
+&doc-kolourpicker;
+&doc-ktimemon;
+
+<chapter id="credits">
+<title>Credits and License</title>
+
+<para>
+Copyrights for each applet is listed in the applicable chapter.
+</para>
+
+&underFDL;
+&underGPL;
+
+</chapter>
+
+<appendix id="installation">
+<title>Installation</title>
+
+<para>
+To be written
+</para>
+
+</appendix>
+
+
+</book>
+
+<!--
+Local Variables:
+mode: sgml
+End:
+-->
diff --git a/doc/kicker-applets/kolourpicker.docbook b/doc/kicker-applets/kolourpicker.docbook
new file mode 100644
index 0000000..fcbd730
--- /dev/null
+++ b/doc/kicker-applets/kolourpicker.docbook
@@ -0,0 +1,56 @@
+<chapter id="kolourpicker">
+<chapterinfo>
+
+<title>&kolourpicker;</title>
+
+<authorgroup>
+<author>
+<firstname> </firstname>
+<surname> </surname>
+<affiliation>
+<address><email> </email></address>
+</affiliation>
+</author>
+</authorgroup>
+<date> </date>
+<releaseinfo> </releaseinfo>
+<abstract>
+<para>To be written</para>
+</abstract>
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>color</keyword>
+<keyword>selector</keyword>
+</keywordset>
+</chapterinfo>
+
+<title>Introduction</title>
+
+<para>
+The &kicker; plugin <quote>Kolourpicker</quote> currently has no
+documentation. If you are interested in rectifying that situation,
+please contact the kde-doc-english mailing list, which you can reach at
+<ulink url="http://master.kde.org/mailman/listinfo/kde-doc-english">
+http://master.kde.org/mailman/listinfo/kde-doc-english
+</ulink>.
+</para>
+
+<sect1 id="thanks-and-acknowledgements">
+<title>Thanks and Acknowledgments</title>
+
+<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
+
+&underGPL;
+
+</sect1>
+</chapter>
+
+<!--
+Local Variables:
+mode: sgml
+sgml-omittag: nil
+sgml-shorttag: t
+End:
+-->
+
diff --git a/doc/kicker-applets/ktimemon.docbook b/doc/kicker-applets/ktimemon.docbook
new file mode 100644
index 0000000..b7ce2d5
--- /dev/null
+++ b/doc/kicker-applets/ktimemon.docbook
@@ -0,0 +1,429 @@
+<chapter id="ktimemon">
+<chapterinfo>
+
+<title>&ktimemon;</title>
+
+<authorgroup>
+<author>
+<firstname>Martin</firstname>
+<surname>Maierhofer</surname>
+<affiliation>
+<address><email>m.maierhofer@tees.ac.uk</email></address>
+</affiliation>
+</author>
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+</authorgroup>
+<date>2001-11-29</date>
+<releaseinfo>0.03.01</releaseinfo>
+<abstract>
+<para>&ktimemon; is a system monitor for the K Desktop Environment</para>
+</abstract>
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>ktimemon</keyword>
+<keyword>system monitor</keyword>
+<keyword>timemon</keyword>
+</keywordset>
+</chapterinfo>
+
+<title>Introduction</title>
+
+<para>&ktimemon; is a small program to keep track of your computer's system
+usage. It can display bar graphs containing information about
+<acronym>CPU</acronym>, memory, and swap usage as well as disk usage and
+context switch activity. In keeping with the spirit of <ulink
+url="http://www.kde.org/">KDE</ulink>, it supports configuration via a
+graphical user interface. It also supports <emphasis>docking</emphasis>,
+&ie; it can display information in the system panel tray.</para>
+
+<note>
+<para>Currently, &ktimemon; only supports a limited number of systems:
+&Linux; based installations with the <filename>/proc</filename> file
+system, &Solaris; based installations with the
+<filename>kstat</filename> library, and Digital &UNIX; (formerly
+DEC/OSF1) based installations with the
+<command>table</command>(2) system call. Help with
+porting it to other platforms is most welcome.
+</para>
+</note>
+
+<para>
+&ktimemon; can be started from the command line or from the &kde;
+<guimenu>start</guimenu> menu (in the <guisubmenu>Utilities</guisubmenu>
+submenu). If you choose to start from the command line, &ktimemon;
+honors the usual &X-Window; program flags such as
+<option>-geometry</option>. &ktimemon; is
+<emphasis>session-aware</emphasis>, &ie; it keeps track of the current
+state (colors, &etc;) and restores it in the user's next session.
+</para>
+
+<sect1 id="fund">
+<title>Onscreen Fundamentals</title>
+
+<para>
+After starting &ktimemon; a small window will appear displaying
+information gathered from the operating system. If you move the mouse
+pointer over the &ktimemon; window and let it rest for a small amount of
+time, a <emphasis>tool-tip</emphasis> (&ie; a small transient window)
+will appear. The tool-tip contains numeric information about the system
+parameters displayed by the bar graphs. Tool-tips can be disabled (refer
+to <link linkend="config">Configuration</link>).
+</para>
+
+<sect2 id="modes">
+<title>Display Modes</title>
+
+<para>
+&ktimemon; can display two different sets of system information. As
+explained in the <link linkend="config">Configuration</link> chapter,
+mouse buttons can be bound to various actions. Per default, the left
+mouse button is bound to the mode switch action, &ie; by clicking the
+&LMB; mouse button anywhere in the &ktimemon; window, the displayed
+information switches from <guilabel>Normal Mode</guilabel> (the default)
+to <guilabel>Extended Mode</guilabel>, and vice versa.
+</para>
+
+<sect3 id="normalmode">
+<title>Normal Mode</title>
+
+<para>After starting &ktimemon; for the first time, it will show
+information about the current CPU activity, as well as memory and swap
+usage. Three bar graphs are used to show this information; they are
+updated regularly (the default sample interval is 0.5s, but it can be
+changed, see <link linkend="config">Configuration</link>). The three bar
+graphs represent (from left to right):
+<variablelist>
+<varlistentry>
+<term><acronym>CPU</acronym> usage.</term>
+<listitem>
+<para>&ktimemon; shows the bar in three different colors, representing
+<acronym>CPU</acronym> time spent in various modes. From bottom to top
+they are: kernel mode, user mode, and user mode with lowered priority
+(<emphasis>nice</emphasis>) - since &Solaris; does not seem to support
+statistics for nice mode, the topmost part of the bar represents time
+spent in the <emphasis>wait</emphasis> state on such systems. The gap
+from the top of the bar to the top of the window represents the
+percentage the <acronym>CPU</acronym> idle time.</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term>Memory usage.</term>
+<listitem>
+<para>Similar to the <acronym>CPU</acronym> usage bar, this bar is
+composed of three sub fields, representing (from bottom to top):
+memory allocated by processes, memory used for I/O buffering, and
+memory used for file caching. For Digital &UNIX; based systems, the
+middle section represents <quote>inactive</quote> memory (&ie; memory
+allocated and not used for a certain amount of time), and for
+&Solaris; based systems, the middle section of the bar is not used,
+and the topmost section represents the amount of memory used by the
+kernel. Again, the gap from the top of the bar to the top of the
+window represents free memory.</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term>Swap usage.</term>
+<listitem>
+<para>This bar consists of a single field representing
+the current swap usage relative to the system's total amount of swap
+space. </para>
+</listitem>
+</varlistentry>
+</variablelist>
+</para>
+
+<para>Clicking the mouse button bound to <quote>mode switch</quote> in
+the &ktimemon; window switches to <quote>Extended Mode</quote>.</para>
+
+</sect3>
+
+<sect3 id="xtndmode">
+<title>Extended Mode </title>
+
+<para>In this mode, the three bar graphs are used to display a different
+set of system information. Again from left to right, they show:</para>
+
+<variablelist>
+<varlistentry>
+<term>Paging activity.</term>
+<listitem>
+<para>This bar consists of two parts, the lower half
+of which shows the number of memory pages written to secondary
+storage in the last sample interval. Similarly, the upper half
+indicates the number of pages read from secondary storage.</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term>Swapping activity.</term>
+<listitem>
+<para>The second bar displays the analog
+information for swap activity.</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term>Context switches.</term>
+<listitem>
+<para>Again, this bar graph consists of a single
+field which indicates the number of context switches in the last
+sample interval.</para>
+</listitem>
+</varlistentry>
+</variablelist>
+
+<para>Since there is no <quote>natural</quote> way of scaling the
+information shown in <quote>Extended Mode</quote>, by default
+&ktimemon; uses <emphasis>autoscaling</emphasis> (explained in the
+<link linkend="autoscaling">Common Questions Section</link>). There
+is, however, the possibility of specifying the scaling information,
+see the <link linkend="config">Configuration</link> section.</para>
+
+<para>Note that the two sets of bar graphs share the same colors, &ie;
+the colors setup for <quote>Normal Mode</quote> is also used for
+displaying information in <quote>Extended Mode</quote> (see also <link
+linkend="config">Configuration</link> on how to change the color
+scheme).</para>
+</sect3>
+</sect2>
+ </sect1>
+
+<sect1 id="menu">
+<title>Menu Structure</title>
+
+<para>
+By default, the &RMB; mouse button is bound to the <quote>menu
+pop-up</quote> action, &ie; clicking the right mouse button anywhere in
+the &ktimemon; window brings up a menu, which is discussed in the
+following sections.
+</para>
+
+<sect2 id="config-menu">
+<title><guimenuitem>Settings...</guimenuitem></title>
+
+<para>The <guimenuitem>Settings...</guimenuitem> menu item is used to
+pop up the configuration dialog. Configuration options are discussed in
+section <link linkend="config">Configuration</link>.
+</para>
+</sect2>
+
+<sect2 id="docked-in-panel">
+<title><guimenuitem>Docked In Panel</guimenuitem></title>
+
+<para>
+By selecting the <guimenuitem>Docked In Panel</guimenuitem> menu item,
+&ktimemon; switches between its standard display (&ie; a normal window)
+and the panelized state, where the &ktimemon; window disappears and a
+smaller version is displayed in the system panel. Apart from the
+reduction in size, the <quote>panelized</quote> &ktimemon; behaves
+exactly like its big brother.
+</para>
+</sect2>
+
+<sect2 id="help">
+<title><guimenu>Help</guimenu></title>
+
+&help.menu.documentation;
+
+</sect2>
+
+<sect2 id="horizontal-bars">
+<title><guimenuitem>Horizontal Bars</guimenuitem></title>
+
+<para>By selecting the <guimenuitem>Horizontal Bars</guimenuitem> menu
+entry, &ktimemon; switches from vertical bars to horizontal bars and
+vice versa. Not very useful, but it was easy to implement ;-)
+</para>
+</sect2>
+
+<sect2 id="quit">
+<title><guimenuitem>Quit</guimenuitem></title>
+
+<para>
+The <guimenuitem>Quit</guimenuitem> menu item - surprise, surprise
+-- is used to terminate &ktimemon;. It will save the current state
+(&eg; the color scheme, window size, whether it is displayed in the
+panel) and restore the state in the next invocation.
+</para>
+
+<para>
+The configuration information is saved in the file
+<filename>$<envar>HOME</envar>/.kde/share/config/ktimemonrc</filename>,
+where <filename class="directory">$<envar>HOME</envar></filename> refers
+to the user's home folder. If this file is deleted, &ktimemon; will
+start in its default state in the next invocation.
+</para>
+</sect2>
+</sect1>
+
+<sect1 id="config">
+<title>Configuration</title>
+
+<para>
+&ktimemon; can be configured via a straight-forward dialog (see also the
+discussion of the <link linkend="config-menu">Configuration
+Menu</link>). On the <guilabel>General</guilabel> page, the sample
+interval can be specified as well as scaling information (see also the
+discussion of the <link linkend="xtndmode">extended mode</link>). If the
+<guilabel>Autoscaling</guilabel> check box is ticked (autoscaling is
+explained in the <link linkend="autoscaling">FAQ</link> section), the
+scaling factors cannot be edited, since &ktimemon; determines them
+automatically.
+</para>
+
+<para>
+The <guilabel>Colors</guilabel> page can be used to tailor the colors of
+the bar graph to individual preferences. A small sample bar graph gives
+immediate feedback.
+</para>
+
+<para>
+In the <guilabel>Interaction</guilabel> page, mouse bindings can be
+adapted. Clicking a mouse button on the &ktimemon; window can be
+ignored, trigger a mode switch (see also <link
+linkend="modes">Modes</link>), invoke the context menu (see also <link
+linkend="menu">Menu</link>), or invoke an external process. The command
+line specified for external processes is interpreted by the standard
+shell, &ie; shell commands, environment variables, redirection &etc; can
+be used.</para>
+
+<para>The <guilabel>Interaction</guilabel> page also contains a check
+box which can be used to disable to automatic appearance of tool-tips
+with numeric information about the bar graphs (compare <link
+linkend="fund">Onscreen Fundamentals</link>).</para>
+</sect1>
+
+<sect1 id="faq">
+<title>Common Questions and Answers </title>
+
+<qandaset>
+<qandaentry>
+<question>
+<para>Which operating systems does &ktimemon; support?</para>
+</question>
+<answer>
+<para>
+&ktimemon; supports &Linux; based systems with the <filename
+class="devicefile">/proc</filename> file system, &Solaris; based
+systems with the <filename>kstat</filename> library, and Digital
+&UNIX; (formerly DEC/OSF1) systems with the
+<command>table</command>(2) system call interface. Only the &Linux;
+version has been thoroughly tested, if you experience any problems
+with the &Solaris;/Digital &UNIX; port, please do not hesitate to
+contact me.
+</para>
+
+<para>
+Also, contributions to &ktimemon; to adapt it to other platforms are
+most welcome. Please contact me at
+<email>m.maierhofer@tees.ac.uk</email> if you intend to port &ktimemon;
+to other flavors of &UNIX;.
+</para>
+</answer>
+
+</qandaentry>
+
+<qandaentry id="autoscaling">
+<question>
+<para>
+How does autoscaling work?
+</para>
+</question>
+<answer>
+<para>
+Glad you asked. Since there is no sensible predetermined scaling factor
+for paging/swapping operations and context switches (unlike &eg; memory
+utilization, where you can take the total memory size as baseline),
+&ktimemon; uses a semi-intelligent (well, ...) autoscaling
+mechanism. Autoscaling works as follows:
+</para>
+
+<itemizedlist>
+<listitem>
+<para>
+Each of the three bar graphs as described in the <link
+linkend="xtndmode">extended mode section</link> has an associated
+scaling factor. The initial values of these factors are set to some
+predetermined value.
+</para>
+</listitem>
+<listitem>
+<para>
+Each time a new sample is displayed, the respective value is tentatively
+scaled with the corresponding factor. If the value can be displayed in
+the scale chosen by the factor, no change occurs (&ie; small changes in
+the activity are reflected by a changing height of the bar).
+</para>
+</listitem>
+<listitem>
+<para>
+If the scaled value would be either too large or too small to be
+displayed with the current scaling factor, the scaling is adjusted so
+that the new value displayed is roughly halfway up the bar graph. Thus,
+subsequent changes should have a good chance of getting displayed
+relative to the current value, without having to change the scale again.
+</para>
+</listitem>
+</itemizedlist>
+</answer>
+</qandaentry>
+
+<qandaentry>
+<question>
+<para>
+Why does a message box with <errorname>diagnostic output from child
+command</errorname> pop up?
+</para>
+</question>
+<answer>
+<para>
+If you bind a mouse button to an external command as described in the
+<link linkend="config">Configuration</link> chapter, &ktimemon; does
+not check for a valid command name. Instead a command shell is invoked
+to execute the statement, so shell commands, environment variables and
+more can be used. To allow some feedback to the user, &ktimemon;
+monitors the <systemitem>stderr</systemitem> output of the command
+shell, and reports it in this message box.
+</para>
+
+<para>
+While this scheme can be helpful in case a command is not found, it can
+be quite annoying if the invoked command prints harmless diagnostic
+information on <systemitem>stderr</systemitem>. A simple and elegant
+solution to this problem is to add <userinput>2&gt;/dev/null</userinput>
+at the end of the command specification. This redirects diagnostic
+messages to message nirvana, and stops the message box popping up.
+</para>
+</answer>
+</qandaentry>
+
+</qandaset>
+</sect1>
+
+<sect1 id="ktimemon-thanks-and-acknowledgements">
+<title>Thanks and Acknowledgments</title>
+
+<para>&ktimemon; is based on an Xt version by my brother.</para>
+
+<para>Thanks to Tobe Toben,
+<email>ttoben@artis.uni-oldenburg.de</email>, Cristian Tibirna
+<email>ctibirna@gch.ulaval.ca</email>, Dirk A. Mueller
+<email>dmuell@rhrk.uni-kl.de</email>, Mark Krischer
+<email>krischem@amp.com</email>, and Lubos Lunak
+<email>l.lunak@sh.cvut.cz</email> for bug reports, patches, comments,
+suggestions.
+</para>
+
+<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
+
+&underGPL;
+
+</sect1>
+</chapter>
+
+<!--
+Local Variables:
+mode: sgml
+sgml-omittag: nil
+sgml-shorttag: t
+End:
+-->
+
diff --git a/doc/konq-plugins/Makefile.am b/doc/konq-plugins/Makefile.am
new file mode 100644
index 0000000..3f4b33a
--- /dev/null
+++ b/doc/konq-plugins/Makefile.am
@@ -0,0 +1,6 @@
+SUBDIRS = $(AUTODIRS)
+
+KDE_LANG = en
+KDE_DOCS = AUTO
+
+
diff --git a/doc/konq-plugins/babel/Makefile.am b/doc/konq-plugins/babel/Makefile.am
new file mode 100644
index 0000000..92a0127
--- /dev/null
+++ b/doc/konq-plugins/babel/Makefile.am
@@ -0,0 +1,6 @@
+SUBDIRS = $(AUTODIRS)
+
+KDE_LANG = en
+KDE_DOCS = konq-plugins/babel
+
+
diff --git a/doc/konq-plugins/babel/index.docbook b/doc/konq-plugins/babel/index.docbook
new file mode 100644
index 0000000..fdc5728
--- /dev/null
+++ b/doc/konq-plugins/babel/index.docbook
@@ -0,0 +1,95 @@
+<?xml version="1.0" ?>
+<!DOCTYPE article PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN"
+"dtd/kdex.dtd" [
+<!ENTITY % addindex "IGNORE">
+<!ENTITY % English "INCLUDE" > <!-- change language only here -->
+]>
+
+<article lang="&language;">
+
+<sect1 id="babel">
+<sect1info>
+
+<authorgroup>
+<author>
+<firstname>Lauri</firstname>
+<surname>Watts</surname>
+<affiliation><address>&Lauri.Watts.mail;</address></affiliation>
+</author>
+
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+</authorgroup>
+
+<date>2006-02-26</date>
+<releaseinfo>3.5.1</releaseinfo> <!-- Used KDE version -->
+
+<abstract>
+<para>The Babel &konqueror; plugin gives you quick access to the
+Babelfish translation service.</para>
+</abstract>
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kdeaddons</keyword>
+<keyword>konqueror</keyword>
+<keyword>plugins</keyword>
+<keyword>babelfish</keyword>
+<keyword>translate</keyword>
+</keywordset>
+</sect1info>
+
+<title>The Babel &konqueror; plugin</title>
+
+<sect2>
+<title>Using the Babelfish plugin</title>
+
+<para>Babelfish is a machine translation service provided by <ulink
+url="http://babel.altavista.com/">AltaVista</ulink>.</para>
+
+<para>The plugin allows you to automatically translate web pages
+between several languages.</para>
+
+<para>The Babelfish plugin can be accessed in the &konqueror; menubar
+under <menuchoice><guimenu>Tools</guimenu>
+<guimenuitem>Translate Web Page</guimenuitem></menuchoice>.
+Select from the list that drops down the language to translate from
+and the language to translate to.</para>
+
+<para>If you have a portion of the text on the page selected, that
+will be translated instead of the entire &URL;.</para>
+
+<para>Not all languages are available from the Babelfish service.</para>
+
+<important>
+<para>Machine translation is not a perfect science! Babelfish will at
+best give you a rough translation, and at worst will give you a very
+funny read. Don't base important decisions on things you have read
+from a Babelfish translated page, without confirming that the
+translation is indeed accurate.</para>
+</important>
+
+<note>
+<para>You may only translate web pages that are accessible on the
+world wide web. To translate any other text, you should go directly
+to the Babelfish site itself, where you are able to paste in text for
+translation.</para>
+</note>
+
+</sect2>
+
+<sect2>
+<title>Credits</title>
+
+<para>The Babelfish plugin is copyright (C)
+2001 &Kurt.Granroth;
+
+&Kurt.Granroth.mail;</para>
+
+<para>Documentation Copyright 2002 &Lauri.Watts;
+&Lauri.Watts.mail;</para>
+
+<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
+
+</sect2>
+</sect1>
+</article>
diff --git a/doc/konq-plugins/crashes/Makefile.am b/doc/konq-plugins/crashes/Makefile.am
new file mode 100644
index 0000000..07b6370
--- /dev/null
+++ b/doc/konq-plugins/crashes/Makefile.am
@@ -0,0 +1,6 @@
+SUBDIRS = $(AUTODIRS)
+
+KDE_LANG = en
+KDE_DOCS = konq-plugins/crashes
+
+
diff --git a/doc/konq-plugins/crashes/index.docbook b/doc/konq-plugins/crashes/index.docbook
new file mode 100644
index 0000000..2918c2f
--- /dev/null
+++ b/doc/konq-plugins/crashes/index.docbook
@@ -0,0 +1,58 @@
+<?xml version="1.0" ?>
+<!DOCTYPE article PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN"
+"dtd/kdex.dtd" [
+<!ENTITY % addindex "IGNORE">
+<!ENTITY % English "INCLUDE" > <!-- change language only here -->
+]>
+
+<article lang="&language;">
+
+<sect1 id="crashesplugin">
+<sect1info>
+
+<authorgroup>
+<author>
+<firstname>Gardner</firstname>
+<surname>Bell</surname>
+<affiliation><address><email>gbell72@rogers.com</email></address></affiliation>
+</author>
+
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+</authorgroup>
+
+<date>2004-07-21</date>
+<releaseinfo>3.10.00</releaseinfo>
+
+<abstract>
+<para>The crashes plugin bookmarks a list of websites that &konqueror; has crashed on.</para>
+</abstract>
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kdeaddons</keyword>
+<keyword>konqueror</keyword>
+<keyword>plugins</keyword>
+<keyword></keyword>
+</keywordset>
+
+</sect1info>
+
+<title>The Crashes Plugin</title>
+
+<sect2>
+<title>Using the Crashes Plugin</title>
+
+<para>To use the crashes plugin point &konqueror; to <menuchoice><guimenu>Tools</guimenu><guimenuitem>Crashes</guimenuitem></menuchoice>. Here you can select to view the site that &konqueror; has crashed on or clear the list of crashes, if any.</para>
+
+</sect2>
+
+<sect2>
+<title>Credits</title>
+
+<para>The crashesplugin is Copyright &copy;
+2002-2003 Alexander Kellett
+<email>lypanov@kde.org</email>.</para>
+</sect2>
+
+</sect1>
+</article>
diff --git a/doc/konq-plugins/dirfilter/Makefile.am b/doc/konq-plugins/dirfilter/Makefile.am
new file mode 100644
index 0000000..4e18760
--- /dev/null
+++ b/doc/konq-plugins/dirfilter/Makefile.am
@@ -0,0 +1,6 @@
+SUBDIRS = $(AUTODIRS)
+
+KDE_LANG = en
+KDE_DOCS = konq-plugins/dirfilter
+
+
diff --git a/doc/konq-plugins/dirfilter/index.docbook b/doc/konq-plugins/dirfilter/index.docbook
new file mode 100644
index 0000000..11e4b89
--- /dev/null
+++ b/doc/konq-plugins/dirfilter/index.docbook
@@ -0,0 +1,61 @@
+<?xml version="1.0" ?>
+<!DOCTYPE article PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN"
+"dtd/kdex.dtd" [
+<!ENTITY % addindex "IGNORE">
+<!ENTITY % English "INCLUDE" > <!-- change language only here -->
+]>
+
+<article lang="&language;">
+
+<sect1 id="dirfilter">
+<sect1info>
+
+<authorgroup>
+<author>
+<firstname>Gardner</firstname>
+<surname>Bell</surname>
+<affiliation><address><email>gbell72@rogers.com</email></address></affiliation>
+</author>
+
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+</authorgroup>
+
+<date>2004-09-15</date>
+<releaseinfo>3.10.00</releaseinfo>
+
+<abstract>
+<para>The directory view filter allows you to choose which items are displayed in a directory.</para>
+</abstract>
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kdeaddons</keyword>
+<keyword>konqueror</keyword>
+<keyword>plugins</keyword>
+<keyword>dirfilter</keyword>
+</keywordset>
+
+</sect1info>
+
+<title>The View Filter</title>
+
+<sect2>
+<title>Using the View Filter</title>
+
+<para>The View Filter plugin (also known as <quote>dirfilter</quote>)
+can be accessed in the &konqueror; menubar under
+<menuchoice><guimenu>Tools</guimenu><guimenuitem>View
+Filter</guimenuitem></menuchoice>. This plugin allows you to filter
+&konqueror;'s current working directory in a variety of ways.</para>
+
+</sect2>
+
+<sect2>
+<title>Credits</title>
+
+<para>The dirfilter plugin is copyright &copy;
+2000-2002 Dawit Alemayehu <email>adawit@kde.org</email>.</para>
+</sect2>
+
+</sect1>
+</article>
diff --git a/doc/konq-plugins/domtreeviewer/Makefile.am b/doc/konq-plugins/domtreeviewer/Makefile.am
new file mode 100644
index 0000000..aad8af0
--- /dev/null
+++ b/doc/konq-plugins/domtreeviewer/Makefile.am
@@ -0,0 +1,6 @@
+SUBDIRS = $(AUTODIRS)
+
+KDE_LANG = en
+KDE_DOCS = konq-plugins/domtreeviewer
+
+
diff --git a/doc/konq-plugins/domtreeviewer/index.docbook b/doc/konq-plugins/domtreeviewer/index.docbook
new file mode 100644
index 0000000..17421b3
--- /dev/null
+++ b/doc/konq-plugins/domtreeviewer/index.docbook
@@ -0,0 +1,62 @@
+<?xml version="1.0" ?>
+<!DOCTYPE article PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN"
+"dtd/kdex.dtd" [
+<!ENTITY % addindex "IGNORE">
+<!ENTITY % English "INCLUDE" > <!-- change language only here -->
+]>
+
+<article lang="&language;">
+
+<sect1 id="domtreeviewer">
+<sect1info>
+
+<authorgroup>
+<author>
+<firstname>Gardner</firstname>
+<surname>Bell</surname>
+<affiliation><address><email>gbell72@rogers.com</email></address></affiliation>
+</author>
+
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+</authorgroup>
+
+<date>2006-02-26</date>
+<releaseinfo>3.5.1</releaseinfo>
+
+<abstract>
+<para>The <acronym>DOM</acronym> Tree Viewer allows a developer to view the styles, attributes and elements of a web document.</para>
+</abstract>
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kdeaddons</keyword>
+<keyword>konqueror</keyword>
+<keyword>plugins</keyword>
+<keyword>DOMTreeViewer</keyword>
+</keywordset>
+
+</sect1info>
+
+<title>The <acronym>DOM</acronym> Tree Viewer</title>
+
+<sect2>
+<title>Using the <acronym>DOM</acronym> Tree Viewer</title>
+
+<para>To begin using The <acronym>DOM</acronym> Tree Viewer in &konqueror;, select <menuchoice><guimenu>Tools</guimenu><guimenuitem>Show DOM Tree</guimenuitem></menuchoice>. This will open a new window which displays the <acronym>DOM</acronym> of the current web page you are viewing. By default the display starts at the root node of the document, example: <quote>documentElement</quote>, all other nodes that you will see are children or descendants of the root node.</para>
+
+<para>If you wish to manipulate the <acronym>DOM</acronym> tree in any way you will have to use an external script to do so.</para>
+
+</sect2>
+
+<sect2>
+<title>Credits</title>
+
+<para>The domtreeviewer plugin is Copyright &copy;
+2001 The Kafka Team/Andreas Schlapbach
+
+<email>kde-kafka@master.kde.org</email>
+<email>schlpbch@unibe.ch</email></para>
+</sect2>
+
+</sect1>
+</article>
diff --git a/doc/konq-plugins/fsview/Makefile.am b/doc/konq-plugins/fsview/Makefile.am
new file mode 100644
index 0000000..23e96f9
--- /dev/null
+++ b/doc/konq-plugins/fsview/Makefile.am
@@ -0,0 +1,6 @@
+SUBDIRS = $(AUTODIRS)
+
+KDE_LANG = en
+KDE_DOCS = konq-plugins/fsview
+
+
diff --git a/doc/konq-plugins/fsview/index.docbook b/doc/konq-plugins/fsview/index.docbook
new file mode 100644
index 0000000..60ceef1
--- /dev/null
+++ b/doc/konq-plugins/fsview/index.docbook
@@ -0,0 +1,182 @@
+<?xml version="1.0" ?>
+<!DOCTYPE article PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN"
+"dtd/kdex.dtd" [
+<!ENTITY fsview "<application>FSView</application>">
+<!ENTITY % addindex "IGNORE">
+<!ENTITY % English "INCLUDE" > <!-- change language only here -->
+]>
+
+<article lang="&language;">
+
+<sect1 id="fsview">
+<sect1info>
+
+<authorgroup>
+<author>
+<personname><firstname>Josef</firstname>
+<surname>Weidendorfer</surname></personname>
+<address><email>Josef.Weidendorfer@gmx.de</email></address>
+</author>
+
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+</authorgroup>
+
+<date>2006-02-24</date>
+<releaseinfo>3.5.1</releaseinfo>
+
+<abstract>
+<para>The &fsview; Plugin for &konqueror; is another view mode for
+objects of mimetype <literal>inode/directory</literal> for local
+files. It can be viewed as an alternative to the various iconviews and
+listviews for browsing the content of your local file system.</para>
+</abstract>
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kdeaddons</keyword>
+<keyword>konqueror</keyword>
+<keyword>plugins</keyword>
+<keyword></keyword>
+</keywordset>
+
+</sect1info>
+
+<title>&fsview; - the File System View</title>
+
+<sect2>
+<title>Introduction</title>
+
+<para>The &fsview; Plugin for &konqueror; is another view mode for
+objects of mimetype <literal>inode/directory</literal> for local
+files. It can be viewed as an alternative to the various iconviews and
+listviews for browsing the content of your local file system.</para>
+
+<para>The unique property of &fsview; is its ability to show whole
+nested folder hierarchies using a so-called tree map for graphical
+visualization. Tree maps allow for displaying metrics of objects in
+nested structures: each object is represented by a rectangle whose
+area is proportional to its metric. The sum of the children's metrics must be
+equal to or smaller than the parent object's metric.</para>
+
+<para>For &fsview;, sizes of files and folders are choosen as
+metric, where the the size of a folder is defined to be the sum of the
+sizes of its subitems. This way, big files even deep down in the
+folder hierarchy can be spotted easily be looking for large
+rectangles. So &fsview; can be looked at as a graphical and interactive
+version of the &UNIX; <command>du</command> command.</para>
+
+<para>The integration of &fsview; as part of Konqueror allows it to
+use the standard features like context file menus, and mime type
+sensitive actions. But it was choosen not to implement automatical
+update of file system changes by watching: if you delete a file shown
+in &fsview; outside of &konqueror;, you have to update manually by
+&eg; pressing <keycap>F5</keycap>. The reason for this decision is
+the potentially huge amount of files which would have to be watched
+for changes, and thus, could put an unreasonable pressure on system
+resources for a small feature.</para>
+
+</sect2>
+
+<sect2>
+<title>Visualization Features</title>
+
+<para>This section explains the graphical visualization of &fsview;
+in detail.</para>
+
+<sect3>
+<title>Item Drawing Options</title>
+
+<para>In &fsview;, an item of the tree map visualization is a rectangle
+representing a file or folder of your file system. For easier navigation,
+rectangles have a meaningful coloring and labeling options.</para>
+
+<para>The color of a rectangle, switchable via menu item
+<menuchoice><guimenu>View</guimenu><guisubmenu>Color
+Mode</guisubmenu></menuchoice> can be either
+<guimenuitem>Depth</guimenuitem> for easy detection of the nesting, or
+a color mapping of different file attributes like name, owner, group,
+or mime type.</para>
+
+<para>A rectangle can be labeled with the various attributes
+of the corresponding file or folder. For an attribute, you can
+choose, whether it should be shown at all, only if space is available,
+or if space should be taken from children (thus introducing
+errors to pure tree map drawing constrains). Additionally, you can choose
+the relative location of the label in the rectangle.</para>
+
+</sect3>
+
+<sect3>
+<title>TreeMap Drawing Algorithms</title>
+
+<para>For drawing algorithms in tree maps, the rule that the area
+is proportional to the metric of an item should hold true.
+With the tree map in &fsview;, this goal isn't always met: we draw borders
+to show the nesting of items, and this border takes space for a item
+which is possible lost for the areas of child items. Note that
+less space is lost for the border if the rectangle is quadratic.</para>
+
+<para>Similar, it is good for a better overview to let all rectangles
+at least have its name as label, taking space, too. It is an option to
+always force space for labels, or only to draw labels when empty space
+is available. In the latter case, the tool tips appearing when the
+mouse is kept over an item for some time, can help a lot. They show
+information for the item the mouse is currently over, together with
+its parent relations up to the root item of the tree map.</para>
+
+<para>How the space of an item is split into subareas for children is
+left to the implementation. It is always better to try to split areas
+in such a way that rectangles are as quadratic as possible, both for
+labeling and less space lost by borders. The best methods in this
+regard are <guilabel>Rows</guilabel>, <guilabel>Columns</guilabel>, or
+<guilabel>Recursive Bisection</guilabel>.</para>
+
+<para>You can choose the minimal area of items to be drawn via the
+menu item <menuchoice><guimenu>View</guimenu><guimenuitem>Stop at
+Area</guimenuitem></menuchoice>. Instead, a hash pattern will be drawn
+over the parents area to signal that this space is in fact occupied by
+a child.</para>
+
+</sect3>
+
+</sect2>
+
+<sect2>
+<title>User Interface</title>
+
+<para>&fsview; supports multiple selection of items, similar to the
+iconview and listview. This allows for actions to be done
+simultaneously to a set of files. A simple mouse click always selects
+a single item below the mouse pointer. Use a mouse click in
+combination with pressing the &Shift; key for range selection or the
+&Ctrl; Key for selection toggle. Note that by selecting an item, subitems can no
+longer be selected. Selecting an item will also clear the selection of all its
+parent items before.</para>
+
+<para>There is keyboard navigation available in tree maps: use
+<keycap>Left Arrow</keycap> and <keycap>Right Arrow</keycap> keys to
+move the current item between siblings, and the <keycap>Up
+Arrow</keycap> and <keycap>Down Arrow</keycap> keys to go up and down
+the nesting hierarchy. <keycap>Space</keycap> selects the item, in
+conjunction with &Shift; does range selection, and with the &Ctrl; key
+hold down simultaneously, toggles selection of the current item. Press
+<keycap>Return</keycap> to run the open action onto the current item.</para>
+
+</sect2>
+
+<sect2>
+<title>Credits and License</title>
+
+<para>Originally, &fsview; was meant as a small test application and
+usage tutorial for the TreeMap widget developed within
+<application>KCachegrind</application>.</para>
+
+<para>Copyright by Josef Weidendorfer, licensed using GPL V2.</para>
+
+&underGPL;
+&underFDL;
+
+</sect2>
+
+</sect1>
+</article>
diff --git a/doc/konq-plugins/imgallery/Makefile.am b/doc/konq-plugins/imgallery/Makefile.am
new file mode 100644
index 0000000..9524b61
--- /dev/null
+++ b/doc/konq-plugins/imgallery/Makefile.am
@@ -0,0 +1,6 @@
+SUBDIRS = $(AUTODIRS)
+
+KDE_LANG = en
+KDE_DOCS = konq-plugins/imgallery
+
+
diff --git a/doc/konq-plugins/imgallery/folders.png b/doc/konq-plugins/imgallery/folders.png
new file mode 100644
index 0000000..8cce375
--- /dev/null
+++ b/doc/konq-plugins/imgallery/folders.png
Binary files differ
diff --git a/doc/konq-plugins/imgallery/index.docbook b/doc/konq-plugins/imgallery/index.docbook
new file mode 100644
index 0000000..517bb99
--- /dev/null
+++ b/doc/konq-plugins/imgallery/index.docbook
@@ -0,0 +1,207 @@
+<?xml version="1.0" ?>
+<!DOCTYPE article PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN"
+"dtd/kdex.dtd" [
+<!ENTITY % addindex "IGNORE">
+<!ENTITY % English "INCLUDE" > <!-- change language only here -->
+]>
+
+<article lang="&language;">
+
+<sect1 id="kimgalleryplugin">
+<sect1info>
+
+<authorgroup>
+<author>
+<firstname>Mike</firstname>
+<surname>Diehl</surname>
+<affiliation><address><email>madpenguin8@yahoo.com</email></address></affiliation>
+</author>
+
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+</authorgroup>
+
+<date>2006-02-24</date>
+<releaseinfo>3.00.00</releaseinfo>
+
+<abstract>
+<para>The Image Gallery &konqueror; plugin creates image gallery html pages from a selected directory.</para>
+</abstract>
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kdeaddons</keyword>
+<keyword>konqueror</keyword>
+<keyword>plugins</keyword>
+</keywordset>
+
+</sect1info>
+
+<title>The Image Gallery Plugin</title>
+
+<sect2>
+<title>Using the Image Gallery Plugin</title>
+
+<para>The Image Gallery plugin can be accessed in the &konqueror; menubar under <menuchoice><guimenu>Tools</guimenu><guimenuitem>Create Image Gallery</guimenuitem></menuchoice>, or with <keycombo>&Ctrl;<keycap>I</keycap></keycombo>.</para>
+
+<para>When you start the Image Gallery plugin a dialog opens allowing you to adjust the way the gallery is created.</para>
+</sect2>
+</sect1>
+
+<sect1 id="page_look_dialog">
+<title>Page Look</title>
+
+<screenshot>
+<screeninfo>Look Dialog Screenshot</screeninfo>
+<mediaobject>
+<imageobject>
+<imagedata fileref="look.png" format="PNG"/>
+</imageobject>
+<textobject>
+<phrase>Screenshot</phrase>
+</textobject>
+</mediaobject>
+</screenshot>
+
+<para>The Look dialog is for adjusting the appearance of the gallery page.</para>
+
+<variablelist>
+
+<varlistentry>
+<term><guimenuitem>Page title</guimenuitem></term>
+<listitem><para>The Page title option has a text input box for changing the title of the image gallery page.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Images per row</guimenuitem></term>
+<listitem><para>The Images per row option has a slider and a spin box for adjusting the number of thumbnails that are in a single row in the gallery.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Show image file name</guimenuitem></term>
+<listitem><para>The Show image file name check box allows you to turn on or off the use of the filenames below the gallery thumbnails.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Show image file size</guimenuitem></term>
+<listitem><para>The Show image filesize check box allows you to turn on or off the use of the filesizes below the gallery thumbnails.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Show image dimensions</guimenuitem></term>
+<listitem><para>The Show image dimensions check box allows you to turn on or off the use of the image dimensions in pixels below the gallery thumbnails.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Font name</guimenuitem></term>
+<listitem><para>The Font name combo box provides you with a choice of which font to use in creating the gallery.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Font size</guimenuitem></term>
+<listitem><para>The Font size spin box is for changing the size of the font you selected.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Foreground color</guimenuitem></term>
+<listitem><para>The Foreground color option has a selector for choosing the foreground color of the gallery, this includes the text areas.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Background color</guimenuitem></term>
+<listitem><para>The Background color option has a selector for choosing the background color of the gallery.</para></listitem>
+</varlistentry>
+
+</variablelist>
+</sect1>
+
+<sect1 id="folders_dialog">
+<title>Folders</title>
+
+<screenshot>
+<screeninfo>Folders Dialog Screenshot</screeninfo>
+<mediaobject>
+<imageobject>
+<imagedata fileref="folders.png" format="PNG"/>
+</imageobject>
+<textobject>
+<phrase>Screenshot</phrase>
+</textobject>
+</mediaobject>
+</screenshot>
+
+
+<para>The Folders dialog is used for choosing where to save the gallery. This dialog is also used to configure what folders are used.</para>
+
+<variablelist>
+
+<varlistentry>
+<term><guimenuitem>Save to HTML file</guimenuitem></term>
+<listitem><para>The Save to file selector decides where you want to save you image gallery html page.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Recurse subfolders</guimenuitem></term>
+<listitem><para>The Recurse subfolders check box enables recursing of subdirectories. If the check box is enabled, a slider and spin box are enabled to select the recursion depth.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Copy original files</guimenuitem></term>
+<listitem><para>The Copy original files check box creates an image folder storing copies of the original images used in the gallery.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Use comment file</guimenuitem></term>
+<listitem><para>The use comment file check box enables a file selector to choose a comments file to use with your gallery.</para></listitem>
+</varlistentry>
+
+</variablelist>
+</sect1>
+
+<sect1 id="thumbnails_dialog">
+<title>Thumbnails</title>
+
+<screenshot>
+<screeninfo>Thumbnails Dialog Screenshot</screeninfo>
+<mediaobject>
+<imageobject>
+<imagedata fileref="thumbnails.png" format="PNG"/>
+</imageobject>
+<textobject>
+<phrase>Screenshot</phrase>
+</textobject>
+</mediaobject>
+</screenshot>
+
+<para>The thumbnails dialog is used for adjusting the properties of the thumbnails in the gallery.</para>
+
+<variablelist>
+
+<varlistentry>
+<term><guimenuitem>Image format for the thumbnails</guimenuitem></term>
+<listitem><para>The image format combo box allows you to choose what format is used for the thumbnail images.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Thumbnail size</guimenuitem></term>
+<listitem><para>The thumbnail size option provides a slider and spin box for adjusting the size of the thumbnails used in the gallery.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Set different color depth</guimenuitem></term>
+<listitem><para>The set different color depth check box enables a combo box for selecting a different color depth for the thumbnails if you wish to use a color depth other than the depth used in the original image.</para></listitem>
+</varlistentry>
+
+</variablelist>
+
+<sect2>
+<title>Credits</title>
+
+<para> Copyright &copy; 2001,2003 Lukas Tinkl <email>lukas@kde.org</email></para>
+<para> Andreas Schlapbach <email>schlpbch@iam.unibe.ch</email></para>
+
+<para>Documentation Copyright 2004 Mike Diehl <email>madpenguin8@yahoo.com</email></para>
+</sect2>
+
+</sect1>
+
+</article>
diff --git a/doc/konq-plugins/imgallery/look.png b/doc/konq-plugins/imgallery/look.png
new file mode 100644
index 0000000..e06c6c4
--- /dev/null
+++ b/doc/konq-plugins/imgallery/look.png
Binary files differ
diff --git a/doc/konq-plugins/imgallery/thumbnails.png b/doc/konq-plugins/imgallery/thumbnails.png
new file mode 100644
index 0000000..c1a7c0c
--- /dev/null
+++ b/doc/konq-plugins/imgallery/thumbnails.png
Binary files differ
diff --git a/doc/konq-plugins/index.docbook b/doc/konq-plugins/index.docbook
new file mode 100644
index 0000000..d105e5c
--- /dev/null
+++ b/doc/konq-plugins/index.docbook
@@ -0,0 +1,158 @@
+<?xml version="1.0" ?>
+<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN"
+"dtd/kdex.dtd" [
+ <!ENTITY kappname "&konqueror; Plugins">
+ <!ENTITY package "kdeaddons">
+ <!ENTITY % English "INCLUDE" > <!-- change language only here -->
+]>
+
+<book lang="&language;">
+<bookinfo>
+<title>The &konqueror; Plugins Handbook</title>
+
+<authorgroup>
+<author>
+<firstname>Lauri</firstname>
+<surname>Watts</surname>
+<affiliation><address>&Lauri.Watts.mail;</address></affiliation>
+</author>
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+</authorgroup>
+
+
+<date>2006-05-20</date>
+<releaseinfo>3.5.2</releaseinfo> <!-- Used KDE version here -->
+
+<copyright>
+<year>2002</year>
+<holder>&Lauri.Watts;</holder>
+</copyright>
+
+<legalnotice>&FDLNotice;</legalnotice>
+
+<abstract>
+<para>
+This is the handbook for the additional plugins for &konqueror; the
+&kde; file manager and web browser.
+</para>
+</abstract>
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kdeaddons</keyword>
+<keyword>Konqueror</keyword>
+<keyword>Plugins</keyword>
+</keywordset>
+
+</bookinfo>
+
+<chapter id="introduction">
+<title>Introduction</title>
+
+<para>
+The &package; package contains several plugins for &konqueror;.
+Despite their small size, they provide additional functions and ease
+the use of some of the functions &konqueror; already contains, by
+making them more accessible.
+</para>
+
+<para>
+More information on the use of &konqueror; and it's built in
+functionality, can be found in the &konqueror; handbook.
+</para>
+
+<para>
+To load these plugins from within &konqueror;, select
+<menuchoice><guimenu>Settings</guimenu><guimenuitem>Configure Extensions...</guimenuitem></menuchoice>.
+Go to the <guilabel>Tools</guilabel> tab and choose the wanted plugins.
+</para>
+
+<para>
+This is a list of the <emphasis>standard</emphasis> configuration
+modules provided by the <application role="package">&kde; addons</application>
+package. Please note that there may be many more modules on your system if you
+have installed additional software.
+</para>
+
+<itemizedlist>
+<listitem>
+<para><ulink url="help:/konq-plugins/babel/index.html">Babelfish</ulink></para>
+</listitem>
+<listitem>
+<para><ulink url="help:/konq-plugins/domtreeviewer/index.html">The <acronym>DOM</acronym> tree
+viewer</ulink></para>
+</listitem>
+<listitem>
+<para><ulink url="help:/konq-plugins/imgallery/index.html">The &konqueror; image
+gallery</ulink></para>
+</listitem>
+<listitem>
+<para><ulink url="help:/konq-plugins/mediaplayer/index.html">The Embedded Media
+Player</ulink></para>
+</listitem>
+<listitem>
+<para><ulink url="help:/konq-plugins/validators/index.html">The
+Validators</ulink></para>
+</listitem>
+<listitem>
+<para><ulink url="help:/konq-plugins/kuick/index.html">Kuick</ulink></para>
+</listitem>
+<listitem>
+<para><ulink url="help:/konq-plugins/dirfilter/index.html">The Folder
+Filter</ulink></para>
+</listitem>
+<listitem>
+<para><ulink url="help:/konq-plugins/khtmlsettings/index.html">KHTMLSettings</ulink></para>
+</listitem>
+<listitem>
+<para><ulink url="help:/konq-plugins/uachanger/index.html">The User Agent Changer</ulink></para>
+</listitem>
+<listitem>
+<para><ulink url="help:/konq-plugins/webarchiver/index.html">The Web
+Archiver</ulink></para>
+</listitem>
+<listitem>
+<para><ulink url="help:/konq-plugins/crashes/index.html">The Crashes
+Plugin</ulink></para>
+</listitem>
+<listitem>
+<para><ulink url="help:/konq-plugins/fsview/index.html">FSView - the File
+System View</ulink></para>
+</listitem>
+</itemizedlist>
+
+</chapter>
+
+<chapter id="credits">
+<title>Credits and License</title>
+
+<para>
+Copyrights for each plugin are listed in the applicable chapter.
+</para>
+
+<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
+&underFDL;
+&underGPL;
+
+</chapter>
+
+<appendix id="installation">
+<title>Installation</title>
+
+&install.intro.documentation;
+
+<para>You should install the kdebase package which contains
+&konqueror; before attempting to compile this package.</para>
+
+&install.compile.documentation;
+
+</appendix>
+
+
+</book>
+
+<!--
+Local Variables:
+mode: sgml
+End:
+-->
diff --git a/doc/konq-plugins/khtmlsettings/Makefile.am b/doc/konq-plugins/khtmlsettings/Makefile.am
new file mode 100644
index 0000000..047e57d
--- /dev/null
+++ b/doc/konq-plugins/khtmlsettings/Makefile.am
@@ -0,0 +1,6 @@
+SUBDIRS = $(AUTODIRS)
+
+KDE_LANG = en
+KDE_DOCS = konq-plugins/khtmlsettings
+
+
diff --git a/doc/konq-plugins/khtmlsettings/index.docbook b/doc/konq-plugins/khtmlsettings/index.docbook
new file mode 100644
index 0000000..f86999d
--- /dev/null
+++ b/doc/konq-plugins/khtmlsettings/index.docbook
@@ -0,0 +1,114 @@
+<?xml version="1.0" ?>
+<!DOCTYPE article PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN"
+"dtd/kdex.dtd" [
+<!ENTITY % addindex "IGNORE">
+<!ENTITY % English "INCLUDE" > <!-- change language only here -->
+]>
+
+<article lang="&language;">
+
+<sect1 id="khtmlsettings">
+<sect1info>
+
+<authorgroup>
+<author>
+<firstname>Mike</firstname>
+<surname>Diehl</surname>
+<affiliation><address><email>madpenguin8@yahoo.com</email></address></affiliation>
+</author>
+
+<author>
+<firstname>Lauri</firstname>
+<surname>Watts</surname>
+<affiliation><address>&Lauri.Watts.mail;</address></affiliation>
+</author>
+
+
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+</authorgroup>
+
+<date>2006-01-10</date>
+<releaseinfo>3.5.1</releaseinfo>
+
+<abstract>
+<para>The &HTML; Settings plugin provides an easy way to access the common &HTML; settings for &konqueror;.</para>
+</abstract>
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kdeaddons</keyword>
+<keyword>konqueror</keyword>
+<keyword>plugins</keyword>
+</keywordset>
+
+</sect1info>
+
+<title>KHTMLSettings</title>
+
+<sect2>
+<title>Using KHTMLSettings</title>
+
+<para>The &HTML; settings plugin can be accessed in the &konqueror; menubar under <menuchoice><guimenu>Tools</guimenu><guimenuitem>HTML Settings</guimenuitem></menuchoice>. Below is a list of the settings and a short description of each one.</para>
+
+<variablelist>
+<varlistentry>
+<term><guimenuitem>JavaScript</guimenuitem></term>
+<listitem><para>Allows you to turn the use of JavaScript in &konqueror; on or off.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Java</guimenuitem></term>
+<listitem><para>Allows you to turn the use of &Java; in &konqueror; on or off.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Cookies</guimenuitem></term>
+<listitem><para>Allows you to turn the use of Cookies in &konqueror; on or off.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Plugins</guimenuitem></term>
+<listitem><para>Allows you to turn the use of the &konqueror; plugins you have installed on or off.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Autoload Images</guimenuitem></term>
+<listitem><para>Allows you to turn on or off the loading of images in web pages.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Enable Proxy</guimenuitem></term>
+<listitem><para>Allows you to enable or disable the use of a proxy in the &konqueror; browser.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Enable Cache</guimenuitem></term>
+<listitem><para>Allows you to enable or disable the use of cache in the &konqueror; browser.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Cache Policy</guimenuitem></term>
+<listitem>
+<para>The Cache Policy submenu provides you with a way to configure the how
+&konqueror; uses cache. The possible uses include:</para>
+<itemizedlist>
+<listitem><para>Keep Cache in Sync</para></listitem>
+<listitem><para>Use Cache if Possible</para></listitem>
+<listitem><para>Offline Browsing Mode</para></listitem>
+</itemizedlist>
+</listitem>
+</varlistentry>
+</variablelist>
+
+</sect2>
+
+<sect2>
+<title>Credits</title>
+
+<para> Copyright &copy; 2001 &Carsten.Pfeiffer; &Carsten.Pfeiffer.mail;</para>
+
+<para>Documentation Copyright 2004 Mike Diehl <email>madpenguin8@yahoo.com</email></para>
+</sect2>
+
+</sect1>
+</article>
diff --git a/doc/konq-plugins/kuick/Makefile.am b/doc/konq-plugins/kuick/Makefile.am
new file mode 100644
index 0000000..7edba19
--- /dev/null
+++ b/doc/konq-plugins/kuick/Makefile.am
@@ -0,0 +1,6 @@
+SUBDIRS = $(AUTODIRS)
+
+KDE_LANG = en
+KDE_DOCS = konq-plugins/kuick
+
+
diff --git a/doc/konq-plugins/kuick/index.docbook b/doc/konq-plugins/kuick/index.docbook
new file mode 100644
index 0000000..0b28852
--- /dev/null
+++ b/doc/konq-plugins/kuick/index.docbook
@@ -0,0 +1,116 @@
+<?xml version="1.0" ?>
+<!DOCTYPE article PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN"
+"dtd/kdex.dtd" [
+<!ENTITY % addindex "IGNORE">
+<!ENTITY % English "INCLUDE" > <!-- change language only here -->
+]>
+
+<article lang="&language;">
+
+<sect1 id="kuick">
+<sect1info>
+
+<authorgroup>
+<author>
+<firstname>Burkhard</firstname>
+<surname>Lück</surname>
+<affiliation><address>
+<email>lueck@hube-lueck.de</email></address></affiliation>
+</author>
+
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+</authorgroup>
+
+<date>2006-03-11</date>
+<releaseinfo>3.5.2</releaseinfo> <!-- Used KDE version -->
+
+<abstract>
+<para>Kuick allows you to move and copy files quickly from a context menu in &konqueror;.</para>
+</abstract>
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kdeaddons</keyword>
+<keyword>konqueror</keyword>
+<keyword>plugins</keyword>
+<keyword>kuick</keyword>
+</keywordset>
+
+</sect1info>
+
+<title>The Kuick &konqueror; plugin</title>
+
+<sect2 id="intro">
+<title>Introduction</title>
+
+<para>
+Kuick offers a quick and easy way to copy or move files to another folder.
+Open the context menu with a &RMB; click on a file or a selection of files.
+Select <guimenu>Copy To</guimenu> or <guimenu>Move To</guimenu> to show a list with
+these options:
+</para>
+
+<variablelist>
+
+<varlistentry>
+<term><guimenuitem>Home Folder</guimenuitem></term>
+<listitem><para>Copy or Move the selection to the home folder or subfolders</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Root Folder</guimenuitem></term>
+<listitem><para>Copy or Move the selection to the root folder or subfolders</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Contact</guimenuitem></term>
+<listitem><para>To be written</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Browse...</guimenuitem></term>
+<listitem><para>Opens a dialog to choose a target folder or create a
+<guibutton>New Folder</guibutton>.</para></listitem>
+</varlistentry>
+
+</variablelist>
+
+</sect2>
+
+<sect2 id="kcm-kuick">
+<title>The Kuick &kcontrolcenter; module</title>
+
+<para>In the &kcontrolcenter; select <menuchoice><guimenu>KDE Components</guimenu>
+<guimenuitem>File Manager</guimenuitem></menuchoice>. Configure the options of Kuick on the
+<guilabel>Quick Copy &amp; Move</guilabel> tab:</para>
+
+<para>Check <guilabel>Show "Copy To" and "Move To" entries in context menu</guilabel>
+to enable the Kuick module.</para>
+
+<para>In the sections <guilabel>Copy Operations</guilabel> and <guilabel>Move Operations</guilabel>
+you can set the number of the last cached folder with the spinbox <guilabel>Cache the last folders</guilabel>
+to a value between 1 and 6. Default is 5.</para>
+
+<para>If you want to remove all cached entries, click on the <guibutton>Clear List</guibutton> button.
+</para>
+
+</sect2>
+
+<sect2>
+<title>Credits and Licenses</title>
+
+<para>Kuick is Copyright (C) 2001 Holger Freyther
+<email>freyther@yahoo.com</email></para>
+
+<para>Documentation written by Burkhard Lück
+<email>lueck@hube-lueck.de</email>, 2006</para>
+
+<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
+&underFDL;
+&underGPL;
+
+</sect2>
+
+</sect1>
+
+</article>
diff --git a/doc/konq-plugins/mediaplayer/Makefile.am b/doc/konq-plugins/mediaplayer/Makefile.am
new file mode 100644
index 0000000..852d6e5
--- /dev/null
+++ b/doc/konq-plugins/mediaplayer/Makefile.am
@@ -0,0 +1,6 @@
+SUBDIRS = $(AUTODIRS)
+
+KDE_LANG = en
+KDE_DOCS = konq-plugins/mediaplayer
+
+
diff --git a/doc/konq-plugins/mediaplayer/index.docbook b/doc/konq-plugins/mediaplayer/index.docbook
new file mode 100644
index 0000000..1fa5b4a
--- /dev/null
+++ b/doc/konq-plugins/mediaplayer/index.docbook
@@ -0,0 +1,59 @@
+<?xml version="1.0" ?>
+<!DOCTYPE article PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN"
+"dtd/kdex.dtd" [
+<!ENTITY % addindex "IGNORE">
+<!ENTITY % English "INCLUDE" > <!-- change language only here -->
+]>
+
+<article lang="&language;">
+
+<sect1 id="sidebar-mediaplayer">
+<sect1info>
+
+<authorgroup>
+<author>
+<firstname>Gardner</firstname>
+<surname>Bell</surname>
+<affiliation><address><email>gbell72@rogers.com</email></address></affiliation>
+</author>
+
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+</authorgroup>
+
+<date>2004-09-09</date>
+<releaseinfo>3.10.00</releaseinfo>
+
+<abstract>
+<para>The sidebar-mediaplayer allows you to play your music files directly in &konqueror;.</para>
+</abstract>
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kdeaddons</keyword>
+<keyword>konqueror</keyword>
+<keyword>plugins</keyword>
+<keyword>sidebar-mediaplayer</keyword>
+</keywordset>
+
+</sect1info>
+
+<title>The Sidebar Media Player</title>
+
+<sect2>
+<title>Using the Sidebar Media Player</title>
+
+<para>The Sidebar Media Player can be accessed in the &konqueror; menubar under<menuchoice><guimenu>Window</guimenu><guimenuitem>Show Navigation Panel</guimenuitem></menuchoice> or by using the <keycap>F9</keycap> shortcut.</para>
+
+<para>To use, click the <inlinemediaobject><imageobject><imagedata fileref="cr22-app-konqsidebar_mediaplayer.png" format="PNG" width="22"/></imageobject></inlinemediaobject> on the navigation panel in &konqueror;, and drag-and-drop any music files you wish to listen to into the mediaplayer.</para>
+
+</sect2>
+
+<sect2>
+<title>Credits</title>
+
+<para>The Sidebar Media Player is copyright &copy;
+2001 Joseph Wenninger <email>jowenn@kde.org</email>.</para>
+</sect2>
+
+</sect1>
+</article>
diff --git a/doc/konq-plugins/uachanger/Makefile.am b/doc/konq-plugins/uachanger/Makefile.am
new file mode 100644
index 0000000..f1f502b
--- /dev/null
+++ b/doc/konq-plugins/uachanger/Makefile.am
@@ -0,0 +1,6 @@
+SUBDIRS = $(AUTODIRS)
+
+KDE_LANG = en
+KDE_DOCS = konq-plugins/uachanger
+
+
diff --git a/doc/konq-plugins/uachanger/index.docbook b/doc/konq-plugins/uachanger/index.docbook
new file mode 100644
index 0000000..a40b392
--- /dev/null
+++ b/doc/konq-plugins/uachanger/index.docbook
@@ -0,0 +1,102 @@
+<?xml version="1.0" ?>
+<!DOCTYPE article PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN"
+"dtd/kdex.dtd" [
+<!ENTITY % addindex "IGNORE">
+<!ENTITY % English "INCLUDE" > <!-- change language only here -->
+]>
+
+<article lang="&language;">
+
+<sect1 id="uachanger">
+<sect1info>
+
+<authorgroup>
+<author>
+<firstname>Gardner</firstname>
+<surname>Bell</surname>
+<affiliation><address><email>gbell72@rogers.com</email></address></affiliation>
+</author>
+
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+</authorgroup>
+
+<date>2004-07-13</date>
+<releaseinfo>3.10.00</releaseinfo>
+
+<abstract>
+<para>The uachanger adds a menu to &konqueror; that allows you to
+change the Browser and Operating System identification on a
+domain-by-domain basis. This is useful when browsing websites that
+limit access to those using a particular web browser.</para>
+</abstract>
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kdeaddons</keyword>
+<keyword>konqueror</keyword>
+<keyword>plugins</keyword>
+<keyword>uachanger</keyword>
+</keywordset>
+
+</sect1info>
+
+<title>The User Agent Changer</title>
+
+<sect2>
+<title>Using the User Agent Changer</title>
+
+<para>The &konqueror; uachanger plugin can be accessed in the menubar under <menuchoice><guimenu>Tools</guimenu><guimenuitem>Change Browser Identification</guimenuitem></menuchoice></para>
+<!-- ************************************ -->
+<!-- We probably need an entity for Mozilla, and I should check about -->
+<!-- trademark stuff for the MS browsers (Phil)-->
+<!-- ************************************ -->
+<variablelist>
+<varlistentry>
+<term><guimenuitem>Default Identification</guimenuitem></term>
+<listitem><para>The default User Agent header for &konqueror; is Mozilla/5.0(compatible;Konqueror/3.2)(KHTML, like Gecko). If you come across a site that refuses this browser access, change your User Agent to one of the options below.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Internet Explorer</guimenuitem></term>
+<listitem><para>Allows you to change your User Agent header to MSIE for sites that refuse <application>Mozilla</application>-based browsers entry. You will most likely need to use one of the MSIE User Agents if you wish to use &konqueror; to access Hotmail.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Mozilla</guimenuitem></term>
+<listitem><para>Allows you to change the User Agent header in &konqueror; to appear as <application>Mozilla</application> version 1.2.1 through 1.6</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Netscape Navigator</guimenuitem></term>
+<listitem><para>Pages that don't comply with W3C recommendations, or were written using proprietary &HTML; elements and attributes will render correctly if you choose to send the User Agent of these old browsers.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Other</guimenuitem></term>
+<listitem><para>This section contains miscellaneous browsers that you can use to change your User Agent.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Apply To Entire Site</guimenuitem></term>
+<listitem><para>This option allows you to specify that the defined User Agent applies across every page on the site you are visiting.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Configure</guimenuitem></term>
+<listitem><para>Selecting <guimenuitem>Configure</guimenuitem> allows you to fine tune the amount of information you wish to reveal about the browser and operating system being used.</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect2>
+
+<sect2>
+<title>Credits</title>
+
+<para>The User Agent Changer plugin is Copyright &copy;
+2001 Dawit Alemayehu.
+
+<email>adawit@kde.org</email></para>
+</sect2>
+
+</sect1>
+</article>
diff --git a/doc/konq-plugins/validators/Makefile.am b/doc/konq-plugins/validators/Makefile.am
new file mode 100644
index 0000000..265a69c
--- /dev/null
+++ b/doc/konq-plugins/validators/Makefile.am
@@ -0,0 +1,6 @@
+SUBDIRS = $(AUTODIRS)
+
+KDE_LANG = en
+KDE_DOCS = konq-plugins/validators
+
+
diff --git a/doc/konq-plugins/validators/index.docbook b/doc/konq-plugins/validators/index.docbook
new file mode 100644
index 0000000..47b08bf
--- /dev/null
+++ b/doc/konq-plugins/validators/index.docbook
@@ -0,0 +1,87 @@
+<?xml version="1.0" ?>
+<!DOCTYPE article PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN"
+"dtd/kdex.dtd" [
+<!ENTITY % addindex "IGNORE">
+<!ENTITY % English "INCLUDE" > <!-- change language only here -->
+]>
+
+<article lang="&language;">
+
+<sect1 id="validators">
+<sect1info>
+
+<authorgroup>
+<author>
+<firstname>Gardner</firstname>
+<surname>Bell</surname>
+<affiliation><address><email>gbell72@rogers.com</email></address></affiliation>
+</author>
+
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+</authorgroup>
+
+<date>2006-01-10</date>
+<releaseinfo>3.5.1</releaseinfo>
+
+<abstract>
+<para>The &konqueror; validator plugin checks your &CSS; and &HTML; documents
+for conformance to W3C recommendations and other standards.</para>
+</abstract>
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kdeaddons</keyword>
+<keyword>konqueror</keyword>
+<keyword>plugins</keyword>
+<keyword>validators</keyword>
+</keywordset>
+
+</sect1info>
+
+<title>The Validators Plugin</title>
+
+<sect2>
+<title>Using the Validators Plugin</title>
+
+<para>The validator plugin can be accessed in the &konqueror; menubar under
+<menuchoice><guimenu>Tools</guimenu><guimenuitem>Validate Web Page</guimenuitem></menuchoice>.
+A description of each subitem can be found below.</para>
+
+<variablelist>
+<varlistentry>
+<term><guimenuitem>Validate &HTML;</guimenuitem></term>
+<listitem><para>The validate &HTML; option allows you to compare your &HTML; document to the defined syntax of &HTML; and reports any errors found. Validating your &HTML; will ensure that your pages display properly on all browsers.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Validate CSS</guimenuitem></term>
+<listitem><para>Allows you to validate your &CSS; style sheet that is embedded in an &HTML; or &XHTML;
+document. Having valid &CSS; is critical to ensuring that your web site maintains a consistent look regardless of the browser that is being used.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Validate Links</guimenuitem></term>
+<listitem><para>Allows you to confirm that the links on your site contain no redirects or broken links. This tool recursively checks all links on a site.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><guimenuitem>Configure Validator</guimenuitem></term>
+<listitem><para>The configure validator item allows you to view the preset validators you can use
+to validate your &HTML; and &CSS;.</para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect2>
+
+<sect2>
+<title>Credits</title>
+
+<para>The validators plugin is Copyright &copy;
+2001 Richard Moore and Andreas Schlapbach
+
+&Richard.J.Moore.mail;
+<email>schlpbch@iam.unibe.ch</email></para>
+</sect2>
+
+</sect1>
+</article>
diff --git a/doc/konq-plugins/webarchiver/Makefile.am b/doc/konq-plugins/webarchiver/Makefile.am
new file mode 100644
index 0000000..5d00374
--- /dev/null
+++ b/doc/konq-plugins/webarchiver/Makefile.am
@@ -0,0 +1,6 @@
+SUBDIRS = $(AUTODIRS)
+
+KDE_LANG = en
+KDE_DOCS = konq-plugins/webarchiver
+
+
diff --git a/doc/konq-plugins/webarchiver/index.docbook b/doc/konq-plugins/webarchiver/index.docbook
new file mode 100644
index 0000000..12e561f
--- /dev/null
+++ b/doc/konq-plugins/webarchiver/index.docbook
@@ -0,0 +1,62 @@
+<?xml version="1.0" ?>
+<!DOCTYPE article PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN"
+"dtd/kdex.dtd" [
+<!ENTITY % addindex "IGNORE">
+<!ENTITY % English "INCLUDE" > <!-- change language only here -->
+]>
+
+<article lang="&language;">
+
+<sect1 id="webarchiver">
+<sect1info>
+
+<authorgroup>
+<author>
+<firstname>Gardner</firstname>
+<surname>Bell</surname>
+<affiliation><address><email>gbell72@rogers.com</email></address></affiliation>
+</author>
+
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+</authorgroup>
+
+<date>2004-07-14</date>
+<releaseinfo>3.10.00</releaseinfo>
+
+<abstract>
+<para>The webarchiver plugin for &konqueror; allows for archiving of
+web pages, documents and images in <literal role="extension">.war</literal> format.</para>
+</abstract>
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kdeaddons</keyword>
+<keyword>konqueror</keyword>
+<keyword>plugins</keyword>
+<keyword>webarchiver</keyword>
+</keywordset>
+
+</sect1info>
+
+<title>Web Archiver</title>
+
+<sect2>
+<title>Using the Web Archiver</title>
+
+<para>To access the webarchiver point your mouse to <menuchoice><guimenu>Tools</guimenu><guimenuitem>Archive Web Page...</guimenuitem></menuchoice>. A dialog will appear allowing you to save the current website being viewed.</para>
+
+</sect2>
+
+<sect2>
+<title>Credits</title>
+
+<para>The webarchiver plugin is Copyright &copy;
+2001-2003 Andreas Schlapbach, Antonio Larossa and Malte Starostik
+
+<email>schlpbch@iam.unibe.ch</email>
+<email>larossa@kde.org</email>
+<email>malte@kde.org</email></para>
+</sect2>
+
+</sect1>
+</article>
diff --git a/doc/ksig/Makefile.am b/doc/ksig/Makefile.am
new file mode 100644
index 0000000..1a8064c
--- /dev/null
+++ b/doc/ksig/Makefile.am
@@ -0,0 +1,2 @@
+KDE_LANG = en
+KDE_DOCS = AUTO
diff --git a/doc/ksig/index.docbook b/doc/ksig/index.docbook
new file mode 100644
index 0000000..85879cf
--- /dev/null
+++ b/doc/ksig/index.docbook
@@ -0,0 +1,431 @@
+<?xml version="1.0" ?>
+<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN"
+"dtd/kdex.dtd" [
+ <!ENTITY ksig "<application>KSig</application>">
+ <!ENTITY kappname "&ksig;">
+ <!ENTITY package "kdeaddons">
+ <!ENTITY % addindex "IGNORE">
+ <!ENTITY % English "INCLUDE">
+]>
+<book lang="&language;">
+
+<!-- This header contains all of the meta-information for the document such
+as Authors, publish date, the abstract, and Keywords -->
+
+<bookinfo>
+<title>The &ksig; Handbook</title>
+
+<authorgroup>
+<author>
+<personname>
+<firstname>Richard</firstname>
+<othername>A.</othername>
+<surname>Johnson</surname>
+</personname>
+<email>nixternal@ubuntu.com</email>
+</author>
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+</authorgroup>
+
+<copyright>
+<year>2006</year>
+<holder>Richard A. Johnson</holder>
+</copyright>
+<!-- Translators: put here the copyright notice of the translation -->
+
+<legalnotice>&FDLNotice;</legalnotice>
+
+<date>2007-01-06</date>
+<releaseinfo>1.01.00</releaseinfo>
+
+<abstract>
+<para>
+&ksig; is an application specially designed to manage multiple email signatures
+graphically.
+</para>
+</abstract>
+
+<keywordset>
+<keyword>KSig</keyword>
+<keyword>kdeaddons</keyword>
+<keyword>signature</keyword>
+<keyword>kmail</keyword>
+<keyword>plugin</keyword>
+</keywordset>
+
+</bookinfo>
+
+<!-- CHAPTER: INTRODUCTION -->
+<chapter id="introduction">
+<title>Introduction</title>
+<para>
+&ksig; is a graphical tool for keeping track of many different email signatures.
+The signatures themselves can be edited through &ksig;&apos;s graphical user
+interface. A command-line interface is then available for generating random or
+daily signatures from a list. The command-line interface makes a suitable plugin
+for generating signatures in external mail clients such as &kmail;.
+</para>
+<para>
+Random signatures will pull signatures from the &ksig; signature file randomly.
+You can make every email more exiciting and uniqe than the previous by creating
+multiple signatures with varying quotes, styles, and information.
+</para>
+<para>
+Daily signatures will pull signatures from the &ksig; signature file only using
+one signature for an entire day. Every day will provide a different signature,
+and just like the random signatures provide uniqueness to your emails.
+</para>
+<para>
+ Please report any problems or feature requests to the &kde; mailing lists.
+</para>
+</chapter>
+
+<chapter id="using-ksig">
+<title>Using &ksig;</title>
+<para>
+Go to
+<menuchoice><guimenu>KMenu</guimenu><guisubmenu>Utilities</guisubmenu>
+<guisubmenu>PIM</guisubmenu><guimenuitem>&ksig; Signature Editor</guimenuitem></menuchoice></para>
+
+<para>
+<screenshot>
+<screeninfo>Here's a screenshot of &ksig;</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="screenshot.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+</para>
+
+<sect1 id="ksig-newsig">
+<title>Creating a new signature</title>
+<para>To create a new signature, go to <menuchoice> <shortcut> <keycombo
+action="simul">&Ctrl;<keycap>N</keycap></keycombo> </shortcut>
+<guimenu>File</guimenu>
+<guimenuitem>New</guimenuitem> </menuchoice>. This will create an
+<guilabel>&lt;empty signature&gt;</guilabel> in the
+<guilabel>Signatures</guilabel> section. <mousebutton>Left</mousebutton> click
+the &lt;empty signature&gt; and in the bottom section type in your new
+signature.
+<example>
+<title>Signature example</title>
+<screen>
+Mr. Konqi
+konqi@kde.org
+http://www.kde.org
+</screen>
+</example>
+Once you have completed your signature, save it by going to <menuchoice>
+<shortcut> <keycombo
+action="simul">&Ctrl;<keycap>S</keycap></keycombo> </shortcut>
+<guimenu>File</guimenu>
+<guimenuitem>Save</guimenuitem> </menuchoice>, or by pressing the
+<guibutton>Save</guibutton> button (floppy disc icon).
+</para>
+
+<para>You can create as many signatures as you would like. Doing so provides you
+with a list of signatures to use in email applications such as &kmail;, so no
+matter how informal or professional you need to be, there will always be an
+available signature.</para>
+
+</sect1>
+
+<sect1 id="ksig-delsig">
+<title>Deleting a signature</title>
+<para>To remove a signature first select the signature that you want to remove
+and then click
+<menuchoice><guimenu>File</guimenu><guimenuitem>Remove</guimenuitem></menuchoice
+>, or by clicking the <guibutton>Remove</guibutton> button with the red x icon in the
+toolbar.
+</para>
+</sect1>
+
+<sect1 id="ksig-kmail-daily">
+<title>Adding daily signatures to &kmail;</title>
+<para>Adding a daily signature is pretty straight forward. Open &kmail; by
+pressing <keycombo>&Alt;<keycap>F2</keycap></keycombo>. Enter
+<command>kmail</command> in the text box and then press
+<guibutton>Run</guibutton>. Once inside &kmail;, go to
+<menuchoice><guimenu>Settings</guimenu><guimenuitem>Configure
+KMail...</guimenuitem></menuchoice>. In the <guilabel>Identities</guilabel>
+selection, highlight the identity to add the signature to and then press the
+<guibutton>Modify...</guibutton> button on the right-hand side of the window. Select
+the <guilabel>Signature</guilabel> tab. Check the <guilabel>Enable
+signature</guilabel> box. From the <guilabel>Obtain signature text
+from</guilabel> drop down, select <guimenuitem>Output of Command</guimenuitem>.
+In the <guilabel>Specify command</guilabel> text box, enter <command>ksig
+--daily</command> and then press the <guibutton>OK</guibutton> button.
+</para>
+</sect1>
+
+<sect1 id="ksig-kmail-random">
+<title>Adding random signatures to &kmail;</title>
+<para>Adding a random signature, just like the daily signature, is pretty
+straight forward. Open &kmail; by pressing
+<keycombo>&Alt;<keycap>F2</keycap></keycombo>. Enter <command>kmail</command> in
+the text box and then press <guibutton>Run</guibutton>. Once inside &kmail;, go
+to <menuchoice><guimenu>Settings</guimenu><guimenuitem>Configure
+KMail...</guimenuitem></menuchoice>. In the <guilabel>Identities</guilabel>
+selection, highlight the identity to add the signature to and then press the
+<guibutton>Modify...</guibutton> button on the right-hand side of the window. Select
+the <guilabel>Signature</guilabel> tab. Check the <guilabel>Enable
+signature</guilabel> box. From the <guilabel>Obtain signature text
+from</guilabel> drop down, select <guimenuitem>Output of Command</guimenuitem>.
+In the <guilabel>Specify command</guilabel> text box, enter <command>ksig
+--random</command> and then press the <guibutton>OK</guibutton> button.
+</para>
+</sect1>
+</chapter>
+
+<chapter id="commands">
+<title>Command Reference</title>
+
+<!-- (OPTIONAL, BUT RECOMMENDED) This chapter should list all of the
+application windows and their menubar and toolbar commands for easy reference.
+Also include any keys that have a special function but have no equivalent in the
+menus or toolbars. This may not be necessary for small apps or apps with no tool
+or menu bars. -->
+
+<sect1 id="filemenu">
+<title>The <guilabel>File</guilabel> Menu</title>
+
+<variablelist>
+<varlistentry>
+<term><menuchoice> <shortcut> <keycombo
+action="simul">&Ctrl;<keycap>N</keycap></keycombo> </shortcut>
+<guimenu>File</guimenu>
+<guimenuitem>New</guimenuitem> </menuchoice></term>
+<listitem>
+<para><action>Creates a new signature.</action></para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term><menuchoice> <shortcut> <keycombo
+action="simul">&Ctrl;<keycap>S</keycap></keycombo> </shortcut>
+<guimenu>File</guimenu>
+<guimenuitem>Save</guimenuitem> </menuchoice></term>
+<listitem>
+<para><action>Saves the signature.</action></para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term><menuchoice>
+<guimenu>File</guimenu>
+<guimenuitem>Remove</guimenuitem> </menuchoice></term>
+<listitem>
+<para><action>Removes a signature.</action></para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term><menuchoice> <shortcut> <keycombo
+action="simul">&Ctrl;<keycap>Q</keycap></keycombo> </shortcut>
+<guimenu>File</guimenu>
+<guimenuitem>Quit</guimenuitem> </menuchoice></term>
+<listitem>
+<para><action>Quits &ksig;.</action></para>
+</listitem>
+</varlistentry>
+
+</variablelist>
+</sect1>
+
+<sect1 id="editmenu">
+<title>The <guilabel>Edit</guilabel> Menu</title>
+
+<variablelist>
+<varlistentry>
+<term><menuchoice> <shortcut> <keycombo
+action="simul">&Ctrl;<keycap>X</keycap></keycombo> </shortcut>
+<guimenu>Edit</guimenu>
+<guimenuitem>Cut</guimenuitem> </menuchoice></term>
+<listitem>
+<para><action>Cuts the current selection.</action></para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term><menuchoice> <shortcut> <keycombo
+action="simul">&Ctrl;<keycap>C</keycap></keycombo> </shortcut>
+<guimenu>Edit</guimenu>
+<guimenuitem>Copy</guimenuitem> </menuchoice></term>
+<listitem>
+<para><action>Copies the current selection.</action></para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term><menuchoice> <shortcut> <keycombo
+action="simul">&Ctrl;<keycap>V</keycap></keycombo> </shortcut>
+<guimenu>Edit</guimenu>
+<guimenuitem>Paste</guimenuitem> </menuchoice></term>
+<listitem>
+<para><action>Pastes the current &klipper; content.</action></para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term><menuchoice>
+<guimenu>Edit</guimenu>
+<guimenuitem>Clear</guimenuitem> </menuchoice></term>
+<listitem>
+<para><action>Clears the current selection.</action></para>
+</listitem>
+</varlistentry>
+</variablelist>
+
+</sect1>
+
+<sect1 id="settingsmenu">
+<title>The <guilabel>Settings</guilabel> Menu</title>
+
+<variablelist>
+<varlistentry>
+<term><menuchoice>
+<guimenu>Settings</guimenu>
+<guimenuitem>Toolbars</guimenuitem> </menuchoice></term>
+<listitem>
+<para><action>Toggles whether the <guimenuitem>Main Toolbar
+(&ksig;)</guimenuitem> or the <guimenuitem>Search Toolbar (&ksig;)</guimenuitem>
+is displayed.</action></para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term><menuchoice>
+<guimenu>Settings</guimenu>
+<guimenuitem>Show/Hide Statusbar</guimenuitem> </menuchoice></term>
+<listitem>
+<para><action>Toggles whether the status bar is displayed.</action></para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term><menuchoice>
+<guimenu>Settings</guimenu>
+<guimenuitem>Edit Standard Header</guimenuitem> </menuchoice></term>
+<listitem>
+<para><action>Edits the <guilabel>Standard signature
+header.</guilabel></action></para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term><menuchoice>
+<guimenu>Settings</guimenu>
+<guimenuitem>Edit Standard Footer</guimenuitem> </menuchoice></term>
+<listitem>
+<para><action>Edits the <guilabel>Standard signature
+footer.</guilabel></action></para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term><menuchoice>
+<guimenu>Settings</guimenu>
+<guimenuitem>Configure Shortcuts...</guimenuitem> </menuchoice></term>
+<listitem>
+<para><action>Displays the <guilabel>Configure Shortcuts</guilabel> dialog box.
+This lets you choose shortcut keys for various menu items. To change a shortcut,
+select an action from the list, and then choose which keystroke to use. Clicking
+on the bottom right <guibutton>Custom</guibutton> button lets you choose which
+specific key to use. Just press the new key or key combo.</action></para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term><menuchoice>
+<guimenu>Settings</guimenu>
+<guimenuitem>Configure Toolbars...</guimenuitem> </menuchoice></term>
+<listitem>
+<para><action>Displays a &kde; standard dialog where you can configure the
+toolbar icons.</action></para>
+</listitem>
+</varlistentry>
+</variablelist>
+
+</sect1>
+
+<sect1 id="helpmenu">
+<title>The <guilabel>Help</guilabel> Menu</title>
+
+&help.menu.documentation;
+
+</sect1>
+</chapter>
+
+<chapter id="credits">
+<title>Credits and License</title>
+
+<para>
+&ksig;
+</para>
+<para>
+Program copyright 2002 &Scott.Wheeler; &Scott.Wheeler.mail;
+</para>
+
+<para>
+Documentation Copyright &copy; 2006 Richard A. Johnson
+<email>nixternal@ubuntu.com</email>
+</para>
+
+<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
+
+&underFDL; <!-- FDL: do not remove -->
+
+&underGPL; <!-- GPL License -->
+
+</chapter>
+
+<appendix id="installation">
+<title>Installation</title>
+
+<sect1 id="getting-kapp">
+<title>How to obtain &ksig;</title>
+
+&install.intro.documentation;
+
+</sect1>
+
+<sect1 id="requirements">
+<title>Requirements</title>
+
+<para>
+In order to successfully use &ksig;, you need &kde; 3.5. To apply a signature to
+your emails you will also need a client such as &kmail; or any other client that
+can obtain the signature text from the output of a command.
+</para>
+
+</sect1>
+
+<sect1 id="compilation">
+<title>Compilation and Installation</title>
+
+&install.compile.documentation;
+
+</sect1>
+
+
+</appendix>
+
+&documentation.index;
+</book>
+
+<!--
+Local Variables:
+mode: xml
+sgml-minimize-attributes:nil
+sgml-general-insert-case:lower
+sgml-indent-step:0
+sgml-indent-data:nil
+End:
+
+vim:tabstop=2:shiftwidth=2:expandtab
+kate: space-indent on; indent-width 2; tab-width 2; indent-mode none;
+-->
diff --git a/doc/ksig/screenshot.png b/doc/ksig/screenshot.png
new file mode 100644
index 0000000..69be819
--- /dev/null
+++ b/doc/ksig/screenshot.png
Binary files differ
diff --git a/kaddressbook-plugins/Makefile.am b/kaddressbook-plugins/Makefile.am
new file mode 100644
index 0000000..070c955
--- /dev/null
+++ b/kaddressbook-plugins/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = xxports
diff --git a/kaddressbook-plugins/configure.in.in b/kaddressbook-plugins/configure.in.in
new file mode 100644
index 0000000..6913868
--- /dev/null
+++ b/kaddressbook-plugins/configure.in.in
@@ -0,0 +1,7 @@
+KADDRESSBOOK_SUBDIR=
+KDE_CHECK_HEADER(kaddressbook/xxport.h, KADDRESSBOOK_SUBDIR=kaddressbook-plugins)
+
+if test -z "$KADDRESSBOOK_SUBDIR"; then
+ dnl dir will only be compiled conditionally
+ DO_NOT_COMPILE="$DO_NOT_COMPILE kaddressbook-plugins"
+fi
diff --git a/kaddressbook-plugins/xxports/Makefile.am b/kaddressbook-plugins/xxports/Makefile.am
new file mode 100644
index 0000000..7501d2a
--- /dev/null
+++ b/kaddressbook-plugins/xxports/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = kworldclock gmx
diff --git a/kaddressbook-plugins/xxports/gmx/Makefile.am b/kaddressbook-plugins/xxports/gmx/Makefile.am
new file mode 100644
index 0000000..facdd37
--- /dev/null
+++ b/kaddressbook-plugins/xxports/gmx/Makefile.am
@@ -0,0 +1,18 @@
+INCLUDES = $(all_includes)
+
+kde_module_LTLIBRARIES = libkaddrbk_gmx_xxport.la
+
+servicedir = $(kde_servicesdir)/kaddressbook
+service_DATA = gmx_xxport.desktop
+
+libkaddrbk_gmx_xxport_la_SOURCES = gmx_xxport.cpp
+libkaddrbk_gmx_xxport_la_LDFLAGS = -module $(KDE_PLUGIN) $(KDE_RPATH) $(all_libraries) -no-undefined
+libkaddrbk_gmx_xxport_la_LIBADD = $(LIB_KDEUI) -lkabc -lkabinterfaces
+libkaddrbk_gmx_xxport_la_METASOURCES = AUTO
+
+rc_DATA = gmx_xxportui.rc
+rcdir = $(kde_datadir)/kaddressbook
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/libkaddrbk_gmx_xxport.pot
+
diff --git a/kaddressbook-plugins/xxports/gmx/gmx_xxport.cpp b/kaddressbook-plugins/xxports/gmx/gmx_xxport.cpp
new file mode 100644
index 0000000..524ad70
--- /dev/null
+++ b/kaddressbook-plugins/xxports/gmx/gmx_xxport.cpp
@@ -0,0 +1,346 @@
+/*
+ This file is part of KAddressbook.
+ Copyright (c) 2003 - 2004 Helge Deller <deller@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2 as
+ published by the Free Software Foundation.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+
+
+ Description:
+ This import/export filter reads and writes addressbook entries in the
+ gmx format which is natively used by the german freemail provider GMX.
+ The big advantage of this format is, that it stores it's information
+ very consistent and makes parsing pretty simple. Furthermore, most
+ information needed by KABC is available when compared to other formats.
+ For further information please visit http://www.gmx.com
+*/
+
+#include <qfile.h>
+#include <qmap.h>
+
+#include <kfiledialog.h>
+#include <kio/netaccess.h>
+#include <klocale.h>
+#include <kmdcodec.h>
+#include <kmessagebox.h>
+#include <ktempfile.h>
+#include <kurl.h>
+
+#include <kdebug.h>
+
+#include "gmx_xxport.h"
+
+K_EXPORT_KADDRESSBOOK_XXFILTER_CATALOG( libkaddrbk_gmx_xxport, GMXXXPort, "libkaddrbk_gmx_xxport" )
+
+#define GMX_FILESELECTION_STRING "*.gmxa|" + i18n( "GMX addressbook file (*.gmxa)" )
+
+GMXXXPort::GMXXXPort( KABC::AddressBook *ab, QWidget *parent, const char *name )
+ : KAB::XXPort( ab, parent, name )
+{
+ createImportAction( i18n( "Import GMX Address Book..." ) );
+ createExportAction( i18n( "Export GMX Address Book..." ) );
+}
+
+static bool checkDateTime( const QString &dateStr, QDateTime &dt )
+{
+ if (dateStr.isEmpty())
+ return false;
+ dt = QDateTime::fromString(dateStr, Qt::ISODate);
+ if (dt.isValid() && dt.date().year()>1901)
+ return true;
+ dt.setDate(QDate());
+ return false;
+}
+
+/* import */
+
+KABC::AddresseeList GMXXXPort::importContacts( const QString& ) const
+{
+ KABC::AddresseeList addrList;
+
+ QString fileName = KFileDialog::getOpenFileName( ":xxport_gmx",
+ GMX_FILESELECTION_STRING, 0 );
+ if ( fileName.isEmpty() )
+ return addrList;
+
+ QFile file( fileName );
+ if ( !file.open( IO_ReadOnly ) ) {
+ QString msg = i18n( "<qt>Unable to open <b>%1</b> for reading.</qt>" );
+ KMessageBox::error( parentWidget(), msg.arg( fileName ) );
+ return addrList;
+ }
+
+ QDateTime dt;
+ QTextStream gmxStream( &file );
+ gmxStream.setEncoding( QTextStream::Latin1 );
+ QString line, line2;
+ line = gmxStream.readLine();
+ line2 = gmxStream.readLine();
+ if (!line.startsWith("AB_ADDRESSES:") || !line2.startsWith("Address_id")) {
+ KMessageBox::error( parentWidget(), i18n("%1 is not a GMX address book file.").arg(fileName) );
+ return addrList;
+ }
+
+ QStringList strList;
+ typedef QMap<QString, KABC::Addressee *> AddressMap;
+ AddressMap addrMap;
+
+ // "Address_id,Nickname,Firstname,Lastname,Title,Birthday,Comments,Change_date,Status,Address_link_id,Categories"
+ line = gmxStream.readLine();
+ while (!line.startsWith("####") && !gmxStream.atEnd()) {
+ while (1) {
+ strList = QStringList::split('#', line, true);
+ if (strList.count() >= 11)
+ break;
+ line.append('\n');
+ line.append(gmxStream.readLine());
+ };
+
+ KABC::Addressee *addr = new KABC::Addressee;
+ addr->setNickName(strList[1]);
+ addr->setGivenName(strList[2]);
+ addr->setFamilyName(strList[3]);
+ addr->setTitle(strList[4]);
+
+ if (addr->formattedName().isEmpty())
+ addr->setFormattedName(addr->realName());
+
+ if (checkDateTime(strList[5],dt)) addr->setBirthday(dt);
+ addr->setNote(strList[6]);
+ if (checkDateTime(strList[7],dt)) addr->setRevision(dt);
+ // addr->setStatus(strList[8]); Status
+ // addr->xxx(strList[9]); Address_link_id
+ // addr->setCategory(strList[10]); Categories
+ addrMap[strList[0]] = addr;
+
+ line = gmxStream.readLine();
+ }
+
+ // now read the address records
+ line = gmxStream.readLine();
+ if (!line.startsWith("AB_ADDRESS_RECORDS:")) {
+ kdWarning() << "Could not find address records!\n";
+ return addrList;
+ }
+ // Address_id,Record_id,Street,Country,Zipcode,City,Phone,Fax,Mobile,Mobile_type,Email,
+ // Homepage,Position,Comments,Record_type_id,Record_type,Company,Department,Change_date,Preferred,Status
+ line = gmxStream.readLine();
+ line = gmxStream.readLine();
+
+ while (!line.startsWith("####") && !gmxStream.atEnd()) {
+ while (1) {
+ strList = QStringList::split('#', line, true);
+ if (strList.count() >= 21)
+ break;
+ line.append('\n');
+ line.append(gmxStream.readLine());
+ };
+
+ KABC::Addressee *addr = addrMap[strList[0]];
+ if (addr) {
+ for ( QStringList::Iterator it = strList.begin(); it != strList.end(); ++it )
+ *it = (*it).simplifyWhiteSpace();
+ // strList[1] = Record_id (numbered item, ignore here)
+ int id = strList[14].toInt(); // Record_type_id (0=work,1=home,2=other)
+ int type = (id==0) ? KABC::Address::Work : KABC::Address::Home;
+ if (!strList[19].isEmpty() && strList[19].toInt()!=0)
+ type |= KABC::Address::Pref; // Preferred address (seems to be bitfield for telephone Prefs)
+ KABC::Address adr = addr->address(type);
+ adr.setStreet(strList[2]);
+ adr.setCountry(strList[3]);
+ adr.setPostalCode(strList[4]);
+ adr.setLocality(strList[5]);
+ addr->insertPhoneNumber( KABC::PhoneNumber(strList[6], KABC::PhoneNumber::Home) );
+ addr->insertPhoneNumber( KABC::PhoneNumber(strList[7], KABC::PhoneNumber::Fax) );
+ int celltype = KABC::PhoneNumber::Cell;
+ // strList[9]=Mobile_type // always 0 or -1(default phone).
+ if (strList[9].toInt()) celltype |= KABC::PhoneNumber::Pref;
+ addr->insertPhoneNumber( KABC::PhoneNumber(strList[8], celltype) );
+ addr->insertEmail(strList[10]);
+ if (!strList[11].isEmpty()) addr->setUrl(strList[11]);
+ if (!strList[12].isEmpty()) addr->setRole(strList[12]);
+ // strList[13]=Comments
+ // strList[14]=Record_type_id (0,1,2) - see above
+ // strList[15]=Record_type (name of this additional record entry)
+ if (!strList[16].isEmpty()) addr->setOrganization(strList[16]); // Company
+ if (!strList[17].isEmpty()) addr->insertCustom(
+ "KADDRESSBOOK", "X-Department", strList[17]); // Department
+ if (checkDateTime(strList[18],dt)) addr->setRevision(dt); // Change_date
+ // strList[19]=Preferred (see above)
+ // strList[20]=Status (should always be "1")
+ addr->insertAddress(adr);
+ } else {
+ kdWarning() << "unresolved line: " << line << endl;
+ }
+
+ line = gmxStream.readLine();
+ }
+
+ // now add the addresses to to addrList
+ for ( AddressMap::Iterator it = addrMap.begin(); it != addrMap.end(); ++it ) {
+ KABC::Addressee *addr = it.data();
+ addrList.append(*addr);
+ delete addr;
+ }
+
+ file.close();
+ return addrList;
+}
+
+
+/* export */
+
+bool GMXXXPort::exportContacts( const KABC::AddresseeList &list, const QString& )
+{
+ KURL url = KFileDialog::getSaveURL( ":xxport_gmx", GMX_FILESELECTION_STRING );
+ if ( url.isEmpty() )
+ return true;
+
+ if ( !url.isLocalFile() ) {
+ KTempFile tmpFile;
+ if ( tmpFile.status() != 0 ) {
+ QString txt = i18n( "<qt>Unable to open file <b>%1</b>.%2.</qt>" );
+ KMessageBox::error( parentWidget(), txt.arg( url.url() )
+ .arg( strerror( tmpFile.status() ) ) );
+ return false;
+ }
+
+ doExport( tmpFile.file(), list );
+ tmpFile.close();
+
+ return KIO::NetAccess::upload( tmpFile.name(), url, parentWidget() );
+ } else {
+ QString filename = url.path();
+ QFile file( filename );
+
+ if ( !file.open( IO_WriteOnly ) ) {
+ QString txt = i18n( "<qt>Unable to open file <b>%1</b>.</qt>" );
+ KMessageBox::error( parentWidget(), txt.arg( filename ) );
+ return false;
+ }
+
+ doExport( &file, list );
+ file.close();
+
+ return true;
+ }
+}
+
+static const QString dateString( const QDateTime &dt )
+{
+ if (!dt.isValid())
+ return QString::fromLatin1("1000-01-01 00:00:00");
+ QString d(dt.toString(Qt::ISODate));
+ d[10] = ' '; // remove the "T" in the middle of the string
+ return d;
+}
+
+void GMXXXPort::doExport( QFile *fp, const KABC::AddresseeList &list )
+{
+ if (!fp || !list.count())
+ return;
+
+ QTextStream t( fp );
+ t.setEncoding( QTextStream::Latin1 );
+
+ KABC::AddresseeList::ConstIterator it;
+ typedef QMap<int, const KABC::Addressee *> AddressMap;
+ AddressMap addrMap;
+ const KABC::Addressee *addr;
+
+ t << "AB_ADDRESSES:\n";
+ t << "Address_id,Nickname,Firstname,Lastname,Title,Birthday,Comments,"
+ "Change_date,Status,Address_link_id,Categories\n";
+
+ int no = 0;
+ const QChar DELIM('#');
+ for ( it = list.begin(); it != list.end(); ++it ) {
+ addr = &(*it);
+ if (addr->isEmpty())
+ continue;
+ addrMap[++no] = addr;
+ t << no << DELIM // Address_id
+ << addr->nickName() << DELIM // Nickname
+ << addr->givenName() << DELIM // Firstname
+ << addr->familyName() << DELIM // Lastname
+ << addr->title() << DELIM // Title
+ << dateString(addr->birthday()) << DELIM // Birthday
+ << addr->note() /*.replace('\n',"\r\n")*/ << DELIM // Comments
+ << dateString(addr->revision()) << DELIM // Change_date
+ << "1##0\n"; // Status, Address_link_id, Categories
+ }
+
+ t << "####\n";
+ t << "AB_ADDRESS_RECORDS:\n";
+ t << "Address_id,Record_id,Street,Country,Zipcode,City,Phone,Fax,Mobile,"
+ "Mobile_type,Email,Homepage,Position,Comments,Record_type_id,Record_type,"
+ "Company,Department,Change_date,Preferred,Status\n";
+
+ no = 1;
+ while ( (addr = addrMap[no]) != NULL ) {
+ for (unsigned int record_id=0; record_id<3; record_id++) {
+
+ KABC::Address address;
+ KABC::PhoneNumber phone, fax, cell;
+
+
+ if (record_id == 0) {
+ address = addr->address(KABC::Address::Work);
+ phone = addr->phoneNumber(KABC::PhoneNumber::Work);
+ fax = addr->phoneNumber(KABC::PhoneNumber::Fax);
+ cell = addr->phoneNumber(KABC::PhoneNumber::Work | KABC::PhoneNumber::Cell);
+ } else {
+ address = addr->address(KABC::Address::Home);
+ phone = addr->phoneNumber(KABC::PhoneNumber::Home);
+ cell = addr->phoneNumber(KABC::PhoneNumber::Cell);
+ }
+
+ const QStringList emails = addr->emails();
+ QString email;
+ if (emails.count()>record_id) email = emails[record_id];
+
+ t << no << DELIM // Address_id
+ << record_id << DELIM // Record_id
+ << address.street() << DELIM // Street
+ << address.country() << DELIM // Country
+ << address.postalCode() << DELIM // Zipcode
+ << address.locality() << DELIM // City
+ << phone.number() << DELIM // Phone
+ << fax.number() << DELIM // Fax
+ << cell.number() << DELIM // Mobile
+ << ((cell.type()&KABC::PhoneNumber::Pref)?-1:0) << DELIM // Mobile_type
+ << email << DELIM // Email
+ << ((record_id==0)?addr->url().url():QString::null) << DELIM // Homepage
+ << ((record_id==0)?addr->role():QString::null) << DELIM // Position
+ << DELIM // Comments
+ << record_id << DELIM // Record_type_id (0,1,2) - see above
+ << DELIM // Record_type (name of this additional record entry)
+ << ((record_id==0)?addr->organization():QString::null) << DELIM // Company
+ << ((record_id==0)?addr->custom("KADDRESSBOOK", "X-Department"):QString::null) << DELIM // Department
+ << dateString(addr->revision()) << DELIM // Change_date
+ << 5 << DELIM // Preferred
+ << 1 << endl; // Status (should always be "1")
+ }
+
+ ++no;
+ };
+
+ t << "####";
+}
+
+#include "gmx_xxport.moc"
+
diff --git a/kaddressbook-plugins/xxports/gmx/gmx_xxport.desktop b/kaddressbook-plugins/xxports/gmx/gmx_xxport.desktop
new file mode 100644
index 0000000..1b31521
--- /dev/null
+++ b/kaddressbook-plugins/xxports/gmx/gmx_xxport.desktop
@@ -0,0 +1,109 @@
+[Desktop Entry]
+X-KDE-Library=libkaddrbk_gmx_xxport
+Name=KAB GMX XXPort Plugin
+Name[br]=Lugent XXPorzh GMX KAB
+Name[ca]=Connector GMX XXPort per a KAB
+Name[cs]=KAB GMX XXPort modul
+Name[de]=GMX Adressbuchmodul
+Name[el]=Πρόσθετο KAB GMX XXPort
+Name[eo]=KAB GMX porta kromaĵo
+Name[es]=Complemento KAB KWorldClock XXPort
+Name[et]=KAB GMX eksport/importplugin
+Name[eu]=KAB GMX XXPort plugina
+Name[fa]=وصلۀ KAB GMX XXPort
+Name[fi]=KAB-GMX XXPort-liitännäinen
+Name[fr]=Module d'XXportation GMX KAB
+Name[fy]=KAB GMX XXPort-plugin
+Name[ga]=Breiseán KAB GMX XXPort
+Name[gl]=Plugin XXPort GMX de KAB
+Name[he]= תוסיף יבוא/ייצוא של KAB GMX
+Name[hi]=केएबी जीएमएक्स एक्सएक्स-पोर्ट प्लगइन
+Name[hr]=KAB GMX XXPort dodatak
+Name[hu]=KAB GMX XXPort bővítőmodul
+Name[is]=KAB GMX XXPort íforrit
+Name[it]=Plugin per KAB GMX XXPort
+Name[ja]=KAB KWorldClock XXPort プラグイン
+Name[ka]=KAB GMX XXPort მოდული
+Name[kk]=KAB GMX XXPort плагин модулі
+Name[km]=កម្មវិធី​ជំនួយ KAB GMX XXPort
+Name[lt]=KAB GMX XXPort priedas
+Name[mk]=Приклучок KAB GMX XXPort
+Name[nb]=Programtillegg for KAB GMX XXPort
+Name[nds]=GMX-Moduul för KAdressbook
+Name[ne]=KAB GMX XX पोर्ट प्लगइन
+Name[nl]=KAB GMX XXPort-plugin
+Name[nn]=Programtillegg KAB GMX XXPort
+Name[pa]=KAB GMX XXPort ਪਲੱਗਇਨ
+Name[pl]=Wtyczka KAB GMX XXPort
+Name[pt]='Plugin' XXPort GMX do KAB
+Name[pt_BR]=Plug-in GMX para o Livro de Endereços
+Name[ru]=Модуль KAB GMX XXPort
+Name[sk]=KAB GMX XXPort modul
+Name[sl]=Vstavek KAB GMX XXPort
+Name[sr]=XXPort прикључак KAB-а за GMX
+Name[sr@Latn]=XXPort priključak KAB-a za GMX
+Name[sv]=Adressbokens överföringsinsticksprogram för GMX
+Name[ta]=KAB GMX XXமுனைய சொருகுப்பொருள்
+Name[tr]=KAB GMX XXPort Eklentisi
+Name[uk]=Втулок KAB GMX XXPort
+Name[uz]=KAB GMX XXPort plagini
+Name[uz@cyrillic]=KAB GMX XXPort плагини
+Name[vi]=Bổ sung XXPort GMX KAB
+Name[zh_CN]=KAB GMX XXPort 插件
+Name[zh_TW]=KAB GMX XXPort 外掛程式
+Comment=Plugin to import and export contacts in GMX's addressbook format
+Comment[bg]=Приставка за импортиране и експортиране на контакти от адресник във формат GMX
+Comment[ca]=Connector per a importar i exportar contactes en el format de llibreta d'adreces GMX
+Comment[cs]=Modul pro export kontaktů v adresářovém formátu GMX
+Comment[da]=Plugin til at importere og eksportere kontakter i GMX's adressebogsformat
+Comment[de]=Modul zum Import und Export von Kontaktdaten im Adressbuchformat von GMX
+Comment[el]=Πρόσθετο για εισαγωγή και εξαγωγή επαφών στη μορφή του βιβλίου διευθύνσεων του GMX
+Comment[eo]=Kromaĵo por enporti kaj elporti kontaktojn en GMX-a adreslibra formato
+Comment[es]=Complemento para importar y exportar contactos en el formato GMX de la libreta de direcciones
+Comment[et]=Plugin, mis impordib ja ekspordib kontakte GMX aadressiraamatu vormingust/vormingusse
+Comment[eu]=GMX formatuan dauden helbide liburuxkak inportatu eta esportatzeko plugina
+Comment[fa]=وصله برای واردات و صادرات تماسها در قالب کتاب نشانی GMX
+Comment[fi]=Sovelma GMX-osoitekirjamuodossa olevien tietueiden tuontiin ja vientiin
+Comment[fr]=Module externe permettant d'importer et d'exporter des contacts avec le format du carnet d'adresses GMX
+Comment[fy]=Plugin foar it ym-en eksportearjen fan kontakten út it adresboekformaat fan GMX
+Comment[ga]=Breiseán chun teagmhálacha i bhformáid leabhair seoltaí GMX a iompórtáil agus a easpórtáil
+Comment[gl]=Un plugin para importar e exportar contactos no formato de libro de enderezos GMX
+Comment[he]= תוסף לייבוא וייצוא של אנשי קשר בפורמט פנקס הכתובות של GMX
+Comment[hi]=जीएमएक्स पता पुस्तिका फार्मेट में सम्पर्कों को आयात और निर्यात करने का प्लगइन
+Comment[hr]=Dodatak za uvoz i izvoz kontakata u oblikovanju GMX adresara
+Comment[hu]=Bővítőmodul GMX formátumú névjegyek importálásához és exportálásához
+Comment[is]=Íforrit sem flytur inn og út tengiliði í GMX vistfangasniði
+Comment[it]=Plugin per importare ed esportare contatti in formato GXM
+Comment[ja]=KWorldClock の旗を GMX 形式の地図データでインポート、エクスポートするプラグイン
+Comment[ka]=GMX's მისამართთა წიგნის ფორმატში კონტაქტების იმპორტის და ექსპორტის მოდული
+Comment[kk]=GMX адрестік кітапша пішіміне контакттарды импорт және экспорттау
+Comment[km]=កម្មវិធី​ជំនួយ​ដើម្បី​នាំ​ចូល​ និង​នាំ​ចេញ​ទំនាក់ទំនង​នៅ​ក្នុង​ទ្រង់ទ្រាយ​សៀវភៅ​អាសយដ្ឋាន​របស់ GMX
+Comment[lt]=Priedas GMX formato adresų knygutės eksportavimui ir importavimui
+Comment[mk]=Приклучок за внесување и изнесување на контакти во GMX-формат на адресар
+Comment[ms]=Plugin akan mengimport dan mengeksport hubungan dalam format buku alamat GMX
+Comment[nb]=Modul som eksporterer kontakter i adressebok-formatet til GMX
+Comment[nds]=Moduul för't Im- un Exporteren vun Kontakten in GMX-Adressbookformaat
+Comment[ne]=जीएमएक्सको ठेगाना पुस्तक ढाँचामा सम्पर्क आयात र निर्यात गर्ने प्लगइन
+Comment[nl]=Plugin voor het im-en exporteren van contacten uit het adresboekformaat van GMX
+Comment[nn]=Programtillegg for å importera og eksportera kontaktar i GMX-adressebokformatet
+Comment[pl]=Wtyczka do importu i eksportu kontaktów z formatu książki adresowej GMX
+Comment[pt]=Um 'plugin' para importar e exportar contactos no formato de livro de endereços GMX
+Comment[pt_BR]=Plug-in para exportar e importar contatos usando o formato de livro de endereços GMX
+Comment[ru]=Модуль для экспорта и импорта контактов в формат адресной книги GMX
+Comment[sk]=Modul pre import a export kontaktov v GMX formáte adresára
+Comment[sl]=Vstavek za uvoz in izvoz stikov v obliko adresarja GMX
+Comment[sr]=Прикључак за увоз и извоз контаката у формату GMX-овог адресара
+Comment[sr@Latn]=Priključak za uvoz i izvoz kontakata u formatu GMX-ovog adresara
+Comment[sv]=Insticksprogram för import och export av kontakter med GMX adressboksformat
+Comment[ta]=GMX's முகவரிப்புத்தக வடிவத்தில் உள்ள தொடர்புகளை ஏற்ற, இறக்க சொருகுப்பொருள்
+Comment[tr]=GMX'in adresdefteri biçimindeki bağlantıları ekleme ve oluşturma eklentisi
+Comment[uk]=Втулок для імпортування та експортування контактів у форматі адресної книги GMX
+Comment[uz]=Aloqalarni GMX manzillar daftari formatida eksport-import qilish vositasi
+Comment[uz@cyrillic]=Алоқаларни GMX манзиллар дафтари форматида экспорт-импорт қилиш воситаси
+Comment[vi]=Bổ sung nhập/xuất khẩu liên lạc định dạng sổ địa chỉ của GMX
+Comment[zh_CN]=以 GMX 的地址簿格式导入和导出联系人
+Comment[zh_TW]=匯入/匯出 GMX 通訊錄格式的外掛程式
+Type=Service
+ServiceTypes=KAddressBook/XXPort
+X-KDE-KAddressBook-XXPortPluginVersion=1
+
diff --git a/kaddressbook-plugins/xxports/gmx/gmx_xxport.h b/kaddressbook-plugins/xxports/gmx/gmx_xxport.h
new file mode 100644
index 0000000..9ced4da
--- /dev/null
+++ b/kaddressbook-plugins/xxports/gmx/gmx_xxport.h
@@ -0,0 +1,47 @@
+/*
+ This file is part of KAddressbook.
+ Copyright (c) 2000 - 2003 Oliver Strutynski <olistrut@gmx.de>
+ Tobias Koenig <tokoe@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+*/
+
+#ifndef GMX_XXPORT_H
+#define GMX_XXPORT_H
+
+#include <kaddressbook/xxport.h>
+
+class GMXXXPort : public KAB::XXPort
+{
+ Q_OBJECT
+
+ public:
+ GMXXXPort( KABC::AddressBook *ab, QWidget *parent, const char *name = 0 );
+
+ QString identifier() const { return "gmx"; }
+
+ public slots:
+ bool exportContacts( const KABC::AddresseeList &list, const QString &data );
+ KABC::AddresseeList importContacts( const QString &data ) const;
+
+ private:
+ void doExport( QFile *fp, const KABC::AddresseeList &list );
+};
+
+#endif
diff --git a/kaddressbook-plugins/xxports/gmx/gmx_xxportui.rc b/kaddressbook-plugins/xxports/gmx/gmx_xxportui.rc
new file mode 100644
index 0000000..9239d6b
--- /dev/null
+++ b/kaddressbook-plugins/xxports/gmx/gmx_xxportui.rc
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<!DOCTYPE gui>
+<gui name="gmx_xxport" version="1">
+<MenuBar>
+ <Menu name="file"><text>&amp;File</text>
+ <Menu name="file_import"><text>&amp;Import</text>
+ <Action name="file_import_gmx"/>
+ </Menu>
+ <Menu name="file_export"><text>&amp;Export</text>
+ <Action name="file_export_gmx"/>
+ </Menu>
+ </Menu>
+</MenuBar>
+</gui>
diff --git a/kaddressbook-plugins/xxports/kworldclock/Makefile.am b/kaddressbook-plugins/xxports/kworldclock/Makefile.am
new file mode 100644
index 0000000..ee28aa6
--- /dev/null
+++ b/kaddressbook-plugins/xxports/kworldclock/Makefile.am
@@ -0,0 +1,17 @@
+INCLUDES = $(all_includes)
+
+kde_module_LTLIBRARIES = libkaddrbk_geo_xxport.la
+
+servicedir = $(kde_servicesdir)/kaddressbook
+service_DATA = geo_xxport.desktop
+
+libkaddrbk_geo_xxport_la_SOURCES = geo_xxport.cpp
+libkaddrbk_geo_xxport_la_LDFLAGS = -module $(KDE_PLUGIN) $(KDE_RPATH) $(all_libraries)
+libkaddrbk_geo_xxport_la_LIBADD = $(LIB_KDEUI) -lkabc -lkabinterfaces
+libkaddrbk_geo_xxport_la_METASOURCES = AUTO
+
+rc_DATA = geo_xxportui.rc
+rcdir = $(kde_datadir)/kaddressbook
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/libkaddrbk_geo_xxport.pot
diff --git a/kaddressbook-plugins/xxports/kworldclock/geo_xxport.cpp b/kaddressbook-plugins/xxports/kworldclock/geo_xxport.cpp
new file mode 100644
index 0000000..a2440aa
--- /dev/null
+++ b/kaddressbook-plugins/xxports/kworldclock/geo_xxport.cpp
@@ -0,0 +1,114 @@
+/*
+ This file is part of KAddressbook.
+ Copyright (c) 2003 Tobias Koenig <tokoe@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+*/
+
+#include <kconfig.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+
+#include <float.h>
+
+#include "geo_xxport.h"
+
+class FlagInfo
+{
+ public:
+ double latitude;
+ double longitude;
+ QColor color;
+};
+
+K_EXPORT_KADDRESSBOOK_XXFILTER_CATALOG( libkaddrbk_geo_xxport, GeoXXPort, "libkaddrbk_geo_xxport" )
+
+GeoXXPort::GeoXXPort( KABC::AddressBook *ab, QWidget *parent, const char *name )
+ : KAB::XXPort( ab, parent, name )
+{
+ createExportAction( i18n( "Export Geo Data..." ) );
+}
+
+bool GeoXXPort::exportContacts( const KABC::AddresseeList &list, const QString& )
+{
+ KConfig config( "kworldclockrc" );
+
+ // At first we read all exiting flags and compare it with ours to
+ // avoid duplicated flags
+ int flags = config.readNumEntry( "Flags", 0 );
+ QValueList<FlagInfo> availableFlags;
+
+ if ( flags != 0 ) {
+ for ( int i = 0; i < flags; ++i ) {
+ FlagInfo info;
+ info.latitude = config.readDoubleNumEntry( QString( "Flag_%1_Latitude" ).arg( i ) );
+ info.longitude = config.readDoubleNumEntry( QString( "Flag_%1_Longitude" ).arg( i ) );
+ info.color = config.readColorEntry( QString( "Flag_%1_Color" ).arg( i ) );
+
+ availableFlags.append( info );
+ }
+ }
+
+
+ QValueList<FlagInfo> flagList;
+ KABC::AddresseeList::ConstIterator addrIt;
+ for ( addrIt = list.begin(); addrIt != list.end(); ++addrIt ) {
+ KABC::Geo geo( (*addrIt).geo() );
+ if ( !geo.isValid() )
+ continue;
+
+ bool available = false;
+ QValueList<FlagInfo>::Iterator it;
+ for ( it = availableFlags.begin(); it != availableFlags.end(); ++it ) {
+ if ( !( KABS( (*it).latitude - geo.latitude() ) > DBL_EPSILON ) &&
+ !( KABS( (*it).longitude - geo.longitude() ) > DBL_EPSILON ) ) {
+ available = true;
+ break;
+ }
+ }
+
+ if ( !available ) {
+ FlagInfo info;
+ info.latitude = geo.latitude();
+ info.longitude = geo.longitude();
+ info.color = QColor( 0, 255, 0 );
+
+ flagList.append( info );
+ }
+ }
+
+ if ( flagList.count() == 0 ) // nothing to export
+ return true;
+
+ flagList += availableFlags;
+
+ int startVal = 0;
+ QValueList<FlagInfo>::Iterator it;
+ for ( it = flagList.begin(); it != flagList.end(); ++it, ++startVal ) {
+ config.writeEntry( QString( "Flag_%1_Color" ).arg( startVal ), (*it).color );
+ config.writeEntry( QString( "Flag_%1_Latitude" ).arg( startVal ), (*it).latitude );
+ config.writeEntry( QString( "Flag_%1_Longitude" ).arg( startVal ), (*it).longitude );
+ }
+ config.writeEntry( "Flags", startVal );
+
+ return true;
+}
+
+#include "geo_xxport.moc"
diff --git a/kaddressbook-plugins/xxports/kworldclock/geo_xxport.desktop b/kaddressbook-plugins/xxports/kworldclock/geo_xxport.desktop
new file mode 100644
index 0000000..9202d85
--- /dev/null
+++ b/kaddressbook-plugins/xxports/kworldclock/geo_xxport.desktop
@@ -0,0 +1,112 @@
+[Desktop Entry]
+X-KDE-Library=libkaddrbk_geo_xxport
+Name=KAB KWorldClock XXPort Plugin
+Name[az]=KAB KWorldClock XXPort Əlavəsi
+Name[br]=Lugent KAB KWorldClock XXPort
+Name[ca]=Connector KWorldClock XXPort per a KAB
+Name[cs]=Exportní modul do KWorldClock
+Name[cy]=Ategyn XXPort KClocByd KAB
+Name[de]=Adressbuch/Weltuhr-Exportmodul
+Name[el]=Πρόσθετο KAB KWorldClock XXPort
+Name[eo]=KAB KMondhorloĝo porta kromaĵo
+Name[es]=Complemento KAB KWorldClock XXPort
+Name[et]=KAB KWorldClock eksportplugin
+Name[eu]=KAB KWorldClock XXPort plugina
+Name[fa]=وصلۀ KAB KWorldClock XXPort
+Name[fi]=KAB-maailmakellon XXPort-liitännäinen
+Name[fr]=Module d'export KAB vers KWorldClock
+Name[fy]=KAB KWorldClock XXPort-plugin
+Name[ga]=Breiseán KAB KWorldClock XXPort
+Name[gl]=Plugin de XXPort de KWorldClock para KAB
+Name[he]=תוסף XXPort של KAB עבור KWorldClock
+Name[hi]=केएबी के-वर्ल्डक्लॉक XXपोर्ट प्लगइन
+Name[hr]=KAB KWorldClock XXPort dodatak
+Name[hu]=KAB KWorldClock XXPort bővítőmodul
+Name[is]=KAB KWorldClock XXPort íforrit
+Name[it]=Plugin per KAB KWorldClock XXPort
+Name[ja]=KAB KWorldClock XXPort プラグイン
+Name[ka]=KAB KWorldClock XXPort მოდული
+Name[kk]=KAB KWorldClock XXPort плагин модулі
+Name[km]=កម្មវិធី​ជំនួយ KAB KWorldClock XXPort
+Name[lt]=KAB KWorldClock XXPort priedas
+Name[mk]=Приклучок KAB KWorldClock XXPort
+Name[nds]=KWorldClock-Moduul för KAdressbook
+Name[ne]=KAB KWorldClock XXपोर्ट प्लगइन
+Name[nl]=KAB KWorldClock XXPort-plugin
+Name[nn]=Programtillegg KAB KWorldClock XXPort
+Name[pa]=KAB KWorldClock XXPort ਪਲੱਗਇਨ
+Name[pl]=Wtyczka eksportu danych KAB do KWorldClock
+Name[pt]='Plugin' de XXPort do KWorldClock para o KAB
+Name[pt_BR]=Plug-Ins do KWorldClock do Kab
+Name[ro]=Modul de exportare KAB-KWorldClock
+Name[ru]=Модуль KAB KWorldClock XXPort
+Name[sk]=Module KWorldClock pre KAB
+Name[sl]=Vstavek za KAB v KWorldClock XXPort
+Name[sr]=XXPort прикључак KAB-а за KWorldClock
+Name[sr@Latn]=XXPort priključak KAB-a za KWorldClock
+Name[sv]=Adressbokens överföringsinsticksprogram för Världsklockan
+Name[ta]=KAB கேஉலக கடிகாரம் XXPort சொருகு சாதனம்
+Name[tg]=Модули KAB KWorldClock XXPort
+Name[tr]=KAB Dünya Saati XXPort Plugin'i
+Name[uk]=Втулок KAB KWorldClock XXPort
+Name[uz]=KAB KWorldClock XXPort plagini
+Name[uz@cyrillic]=KAB KWorldClock XXPort плагини
+Name[vi]=Bổ sung XXPort KWorldClock KAB
+Name[zh_CN]=KAB KWorldClock XXPort 插件
+Name[zh_TW]=KAB KWorldClock XXPort 外掛程式
+Comment=Plugin to export the geo data of contacts as flags in KWorldClock
+Comment[az]=KWorldClock-da əlaqələrin geo mə'lumatını ixrac etmək üçün əlavə
+Comment[bg]=Приставка за експортиране на геодезни данни от адресника като флагове на KWorldClock
+Comment[ca]=Connector per a exportar les dades geogràfiques de contactes en kworldclock com a banderes
+Comment[cs]=Modul pro export geo dat kontaktů jako značek pro KWorldClock
+Comment[cy]=Ategyn i allforio data daearyddol cysylltau fel baneri yn KClocByd
+Comment[da]=Plugin til at eksportere geo-data af kontakter som flag til KWorldClock
+Comment[de]=Modul zum Export der Standortpositionen der Kontakte als Flaggen in KWorldClock
+Comment[el]=Πρόσθετο για εξαγωγή των γεωγραφικών δεδομένων των επαφών σαν σημαίες στο KWorldClock
+Comment[es]=Complemento para exportar datos geográficos de los contactos como banderas en KWorldClock
+Comment[et]=Plugin, mis ekspordib KWorldClocki aadressiraamatus leiduvate isikute asukoha lipukestena
+Comment[eu]=KWorldClock-eko kontaktuen datu geografikoak bandera gisa esportatzeko plugina
+Comment[fa]=وصله برای صادرات داده‌های جغرافیایی تماسها به عنوان پرچمهای KWorldClock
+Comment[fi]=Liitännäinen maantieteellisten koordinaattien siirtämiseen KWorldClock sovellukseen
+Comment[fr]=Module externe pour exporter les données géographiques des contacts sous forme de drapeaux dans KWorldClock
+Comment[fy]=Plugin foar it eksportearjen fan de geografyske gegevens fan kontakten as flaggen yn KWorldClock
+Comment[ga]=Breiseán a easpórtálann na sonraí geografacha de theagmhálacha mar bhratacha i KWorldClock
+Comment[gl]=Un plugin para exportar os dados xeográficos dos contactos como bandeiras en KWorldClock
+Comment[hi]=कान्टेक्ट के भौगोलिक डाटा को के-वर्ल्डक्लॉक में फ्लेग्स की तरह निर्यात करने का प्लगइन
+Comment[hr]=Dodatak za izvoz geografskih podataka kontakata u obliku zastava u KWorldClock
+Comment[hu]=Bővítőmodul a névjegyek földrajzi adatainak KWorldClock-ba való exportálásához (jelzők formájában)
+Comment[is]=Íforrit sem flytur út landupplýsingar um staðsetningar fyrir KWorldClock
+Comment[it]=Plugin per esportare geo data dei contatti come bandiere in KWorldClock
+Comment[ja]=KWorldClock の旗を地図データの接点にエクスポートするプラグイン
+Comment[ka]=geo მონაცემების დასაექსპორტებელი მოდული, როგორიცაა KWorldClock-ში დროშები
+Comment[kk]=Контакттардың географикалық мәліметтерін KWorldClock-тың жалауша түрінде экспорттайтын плагин модулі
+Comment[km]=កម្មវិធី​ជំនួយ​ដើម្បី​នាំ​ចេញ​ទិន្ន័យ​​ភូមិសាស្ត្រ​​នៃ​ទំនាក់ទំនង​ជា​ទង់​នៅ​ក្នុង KWorldClock
+Comment[lt]=Priedas kontaktų geografinių duomenų eksportavimui KWorldClock
+Comment[mk]=Приклучок за изнесување на географски податоци на контактите како знамиња во KWorldClock
+Comment[ms]=Plug masuk intuk eksport data geo hubungan sebagai tanda dalam KWorldClock
+Comment[nb]=Modul som eksporterer geografiske data om kontakter som flagg i KWorldClock
+Comment[nds]=Moduul för't Exporteren vun Kontakten-Standöörd as Flaggen binnen "KWorldClock"
+Comment[ne]=KWorldClock मा झण्डा अनुरुपका सम्पर्कका geo डाट निर्यात गर्ने प्लगइन
+Comment[nl]=Plugin voor het exporteren van de geografische gegevens van contacten als vlaggen in KWorldClock
+Comment[nn]=Programtillegg for å eksportera geografiske data frå kontaktar til flagg i KWorldClock
+Comment[pl]=Wtyczka do eksportu danych geograficznych z wizytówek jako flag w KWorldClock
+Comment[pt]=Um 'plugin' para exportar os dados geográficos dos contactos como bandeiras no KWorldClock
+Comment[pt_BR]=Plugin para exportar dados geográficos de contatos, como sinais no Kworldclock
+Comment[ro]=Modul care exportă datele geografice din adresele de contact ca fanioane în KWorldClock
+Comment[ru]=Модуль для экспорта географических координат контактов как флагов в KWorldClock
+Comment[sk]=Modul pre export geografických dát kontaktov ako vlajok pre KWorldClock
+Comment[sl]=Vstavek za izvoz zemljepisnih podatkov iz naslovov kot zastavice v KWorldClock
+Comment[sr]=Прикључак за извоз географских података контаката као застава у KWorldClock-у
+Comment[sr@Latn]=Priključak za izvoz geografskih podataka kontakata kao zastava u KWorldClock-u
+Comment[sv]=Insticksprogram för export av geografisk data som flaggor i Världsklockan
+Comment[ta]=கேஉலக கடிகாரத்தில் கொடிகளாக உள்ள தொடர்புகளின் ஜியோ தகவலை ஏற்றுவதற்கு சொருகு சாதனம்
+Comment[tg]=Модул барои содироти маълумотҳои алоқаи ҷуғрофӣ мисли байрақчаҳо дар KWorldClock
+Comment[tr]=KWorldClock'taki bayrakların geo veri bağlantılarını ihraç etmek için Plugin
+Comment[uk]=Втулок для експортування географічних даних контактів як прапорці в KWorldClock
+Comment[vi]=Bổ sung xuất khẩu dữ liệu địa lý của liên lạc dạng cờ trong đồng hồ thế giới KWorldClock
+Comment[zh_CN]=将联系人的地理数据导出为 KWorldClock 中旗帜的插件
+Comment[zh_TW]=匯出 GEO 聯絡人資料為 KWorldClock 旗標
+Type=Service
+ServiceTypes=KAddressBook/XXPort
+X-KDE-KAddressBook-XXPortPluginVersion=1
+
diff --git a/kaddressbook-plugins/xxports/kworldclock/geo_xxport.h b/kaddressbook-plugins/xxports/kworldclock/geo_xxport.h
new file mode 100644
index 0000000..d3b560a
--- /dev/null
+++ b/kaddressbook-plugins/xxports/kworldclock/geo_xxport.h
@@ -0,0 +1,42 @@
+/*
+ This file is part of KAddressbook.
+ Copyright (c) 2003 Tobias Koenig <tokoe@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+*/
+
+#ifndef GEO_XXPORT_H
+#define GEO_XXPORT_H
+
+#include <kaddressbook/xxport.h>
+
+class GeoXXPort : public KAB::XXPort
+{
+ Q_OBJECT
+
+ public:
+ GeoXXPort( KABC::AddressBook *ab, QWidget *parent, const char *name = 0 );
+
+ QString identifier() const { return "geo"; }
+
+ public slots:
+ bool exportContacts( const KABC::AddresseeList &list, const QString &data );
+};
+
+#endif
diff --git a/kaddressbook-plugins/xxports/kworldclock/geo_xxportui.rc b/kaddressbook-plugins/xxports/kworldclock/geo_xxportui.rc
new file mode 100644
index 0000000..4b5ead3
--- /dev/null
+++ b/kaddressbook-plugins/xxports/kworldclock/geo_xxportui.rc
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<!DOCTYPE gui>
+<gui name="geo_xxport" version="1">
+<MenuBar>
+ <Menu name="file"><text>&amp;File</text>
+ <Menu name="file_export"><text>&amp;Export</text>
+ <Action name="file_export_geo"/>
+ </Menu>
+ </Menu>
+</MenuBar>
+</gui>
diff --git a/kate/Makefile.am b/kate/Makefile.am
new file mode 100644
index 0000000..31e51a9
--- /dev/null
+++ b/kate/Makefile.am
@@ -0,0 +1,5 @@
+SUBDIRS = scripts htmltools kpybrowser modeline openheader textfilter xmltools \
+ xmlcheck filelistloader cppsymbolviewer tabbarextension filetemplates \
+ snippets insertcommand make helloworld
+
+
diff --git a/kate/cppsymbolviewer/Makefile.am b/kate/cppsymbolviewer/Makefile.am
new file mode 100644
index 0000000..8bf46f0
--- /dev/null
+++ b/kate/cppsymbolviewer/Makefile.am
@@ -0,0 +1,17 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = katecppsymbolviewerplugin.la
+
+katecppsymbolviewerplugin_la_SOURCES = cpp_parser.cpp tcl_parser.cpp plugin_katesymbolviewer.cpp
+katecppsymbolviewerplugin_la_LIBADD = -lkateinterfaces
+katecppsymbolviewerplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+pluginsdir = $(kde_datadir)/kate/plugins/katecppsymbolviewer
+plugins_DATA = ui.rc
+
+kde_services_DATA = katecppsymbolviewer.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/katecppsymbolviewer.pot
diff --git a/kate/cppsymbolviewer/cpp_parser.cpp b/kate/cppsymbolviewer/cpp_parser.cpp
new file mode 100644
index 0000000..01ee919
--- /dev/null
+++ b/kate/cppsymbolviewer/cpp_parser.cpp
@@ -0,0 +1,335 @@
+/***************************************************************************
+ cpp_parser.cpp - description
+ -------------------
+ begin : Apr 2 2003
+ author : 2003 Massimo Callegari
+ email : massimocallegari@yahoo.it
+ ***************************************************************************/
+ /***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+#include "plugin_katesymbolviewer.h"
+
+void KatePluginSymbolViewerView::parseCppSymbols(void)
+{
+ if (!win->viewManager()->activeView())
+ return;
+
+ QString cl; // Current Line
+ QString stripped;
+ uint i, j, tmpPos = 0;
+ int par = 0, graph = 0, retry = 0;
+ char mclass = 0, block = 0, comment = 0; // comment: 0-no comment 1-inline comment 2-multiline comment 3-string
+ char macro = 0, macro_pos = 0, func_close = 0;
+ bool structure = false;
+ QPixmap cls( ( const char** ) class_xpm );
+ QPixmap sct( ( const char** ) struct_xpm );
+ QPixmap mcr( ( const char** ) macro_xpm );
+ QPixmap mtd( ( const char** ) method_xpm );
+ QListViewItem *node = NULL;
+ QListViewItem *mcrNode = NULL, *sctNode = NULL, *clsNode = NULL, *mtdNode = NULL;
+ QListViewItem *lastMcrNode = NULL, *lastSctNode = NULL, *lastClsNode = NULL, *lastMtdNode = NULL;
+
+
+ Kate::Document *kv = win->viewManager()->activeView()->getDoc();
+ //kdDebug(13000)<<"Lines counted :"<<kv->numLines()<<endl;
+ if(treeMode)
+ {
+ mcrNode = new QListViewItem(symbols, symbols->lastItem(), i18n("Macros"));
+ sctNode = new QListViewItem(symbols, symbols->lastItem(), i18n("Structures"));
+ clsNode = new QListViewItem(symbols, symbols->lastItem(), i18n("Functions"));
+ mcrNode->setPixmap(0, (const QPixmap &)mcr);
+ sctNode->setPixmap(0, (const QPixmap &)sct);
+ clsNode->setPixmap(0, (const QPixmap &)cls);
+ if (expanded_on)
+ {
+ mcrNode->setOpen(TRUE);
+ sctNode->setOpen(TRUE);
+ clsNode->setOpen(TRUE);
+ }
+ lastMcrNode = mcrNode;
+ lastSctNode = sctNode;
+ lastClsNode = clsNode;
+ mtdNode = clsNode;
+ lastMtdNode = clsNode;
+ symbols->setRootIsDecorated(1);
+ }
+ else symbols->setRootIsDecorated(0);
+
+ for (i=0; i<kv->numLines(); i++)
+ {
+ cl = kv->textLine(i);
+ cl = cl.stripWhiteSpace();
+ func_close = 0;
+ if(cl.at(0) == '/' && cl.at(1) == '/') continue;
+ if(cl.find("/*") == 0 && (cl.find("*/") == ((signed)cl.length() - 2)) && graph == 0) continue; // workaround :(
+ if(cl.find("/*") >= 0 && graph == 0) comment = 1;
+ if(cl.find("*/") >= 0 && graph == 0) comment = 0;
+ if(cl.find("#") >= 0 && graph == 0 ) macro = 1;
+ if (comment != 1)
+ {
+ /* *********************** MACRO PARSING *****************************/
+ if(macro == 1)
+ {
+ //macro_pos = cl.find("#");
+ for (j = 0; j < cl.length(); j++)
+ {
+ if(cl.at(j)=='/' && cl.at(j+1)=='/') { macro = 4; break; }
+ if( (uint)cl.find("define") == j &&
+ !((uint)cl.find("defined") == j))
+ {
+ macro = 2;
+ j += 6; // skip the word "define"
+ }
+ if(macro == 2 && cl.at(j) != ' ') macro = 3;
+ if(macro == 3)
+ {
+ if (cl.at(j) >= 0x20) stripped += cl.at(j);
+ if (cl.at(j) == ' ' || j == cl.length() - 1)
+ macro = 4;
+ }
+ //kdDebug(13000)<<"Macro -- Stripped : "<<stripped<<" macro = "<<macro<<endl;
+ }
+ // I didn't find a valid macro e.g. include
+ if(j == cl.length() && macro == 1) macro = 0;
+ if(macro == 4)
+ {
+ //stripped.replace(0x9, " ");
+ stripped = stripped.stripWhiteSpace();
+ if (macro_on == true)
+ {
+ if (treeMode)
+ {
+ node = new QListViewItem(mcrNode, lastMcrNode, stripped);
+ lastMcrNode = node;
+ }
+ else node = new QListViewItem(symbols, symbols->lastItem(), stripped);
+ node->setPixmap(0, (const QPixmap &)mcr);
+ node->setText(1, QString::number( i, 10));
+ }
+ macro = 0;
+ macro_pos = 0;
+ stripped = "";
+ //kdDebug(13000)<<"Macro -- Inserted : "<<stripped<<" at row : "<<i<<endl;
+ if (cl.at(cl.length() - 1) == '\\') macro = 5; // continue in rows below
+ continue;
+ }
+ }
+ if (macro == 5)
+ {
+ if (cl.at(cl.length() - 1) != '\\')
+ macro = 0;
+ continue;
+ }
+
+ /* ******************************************************************** */
+
+ if ((cl.find("class") >= 0 && graph == 0 && block == 0))
+ {
+ mclass = 1;
+ for (j = 0; j < cl.length(); j++)
+ {
+ if(cl.at(j)=='/' && cl.at(j+1)=='/') { mclass = 2; break; }
+ if(cl.at(j)=='{') { mclass = 4; break;}
+ stripped += cl.at(j);
+ }
+ if(func_on == true)
+ {
+ if (treeMode)
+ {
+ node = new QListViewItem(clsNode, lastClsNode, stripped);
+ if (expanded_on) node->setOpen(TRUE);
+ lastClsNode = node;
+ mtdNode = lastClsNode;
+ lastMtdNode = lastClsNode;
+ }
+ else node = new QListViewItem(symbols, symbols->lastItem(), stripped);
+ node->setPixmap(0, (const QPixmap &)cls);
+ node->setText(1, QString::number( i, 10));
+ stripped = "";
+ if (mclass == 1) mclass = 3;
+ }
+ continue;
+ }
+ if (mclass == 3)
+ {
+ if (cl.find('{') >= 0)
+ {
+ cl = cl.right(cl.find('{'));
+ mclass = 4;
+ }
+ }
+
+ if(cl.find("(") >= 0 && cl.at(0) != '#' && block == 0 && comment != 2)
+ { structure = false; block = 1; }
+ if((cl.find("typedef") >= 0 || cl.find("struct") >= 0) &&
+ graph == 0 && block == 0)
+ { structure = true; block = 2; stripped = ""; }
+ //if(cl.find(";") >= 0 && graph == 0)
+ // block = 0;
+
+ if(block > 0 && mclass != 1 )
+ {
+ for (j = 0; j < cl.length(); j++)
+ {
+ if (cl.at(j) == '/' && (cl.at(j + 1) == '*')) comment = 2;
+ if (cl.at(j) == '*' && (cl.at(j + 1) == '/')) { comment = 0; j+=2; }
+ // Handles a string. Those are freaking evilish !
+ if (cl.at(j) == '"' && comment == 3) { comment = 0; j++; }
+ else if (cl.at(j) == '"' && comment == 0) comment = 3;
+ if(cl.at(j)=='/' && cl.at(j+1)=='/' && comment == 0)
+ { if(block == 1 && stripped.isEmpty()) block = 0; break; }
+ if (comment != 2 && comment != 3)
+ {
+ if (block == 1 && graph == 0 )
+ {
+ if(cl.at(j) >= 0x20) stripped += cl.at(j);
+ if(cl.at(j) == '(') par++;
+ if(cl.at(j) == ')')
+ {
+ par--;
+ if(par == 0)
+ {
+ stripped = stripped.stripWhiteSpace();
+ stripped.remove("static ");
+ //kdDebug(13000)<<"Function -- Inserted : "<<stripped<<" at row : "<<i<<endl;
+ block = 2;
+ tmpPos = i;
+ }
+ }
+ } // BLOCK 1
+ if(block == 2 && graph == 0)
+ {
+ if(cl.at(j)=='/' && cl.at(j+1)=='/' && comment == 0) break;
+ //if(cl.at(j)==':' || cl.at(j)==',') { block = 1; continue; }
+ if(cl.at(j)==':') { block = 1; continue; }
+ if(cl.at(j)==';')
+ {
+ stripped = "";
+ block = 0;
+ structure = false;
+ break;
+ }
+
+ if(cl.at(j)=='{' && structure == false && cl.find(";") < 0 ||
+ cl.at(j)=='{' && structure == false && cl.find('}') > (int)j)
+ {
+ stripped.replace(0x9, " ");
+ if(func_on == true)
+ {
+ if (types_on == false)
+ {
+ while (stripped.find('(') >= 0)
+ stripped = stripped.left(stripped.find('('));
+ while (stripped.find("::") >= 0)
+ stripped = stripped.mid(stripped.find("::") + 2);
+ stripped = stripped.stripWhiteSpace();
+ while (stripped.find(0x20) >= 0)
+ stripped = stripped.mid(stripped.find(0x20, 0) + 1);
+ }
+ //kdDebug(13000)<<"Function -- Inserted: "<<stripped<<" at row: "<<tmpPos<<" mclass: "<<(uint)mclass<<endl;
+ if (treeMode)
+ {
+ if (mclass == 4)
+ {
+ node = new QListViewItem(mtdNode, lastMtdNode, stripped);
+ lastMtdNode = node;
+ }
+ else
+ {
+ node = new QListViewItem(clsNode, lastClsNode, stripped);
+ lastClsNode = node;
+ }
+ }
+ else
+ node = new QListViewItem(symbols, symbols->lastItem(), stripped);
+ if (mclass == 4) node->setPixmap(0, (const QPixmap &)mtd);
+ else node->setPixmap(0, (const QPixmap &)cls);
+ node->setText(1, QString::number( tmpPos, 10));
+ }
+ stripped = "";
+ retry = 0;
+ block = 3;
+ }
+ if(cl.at(j)=='{' && structure == true)
+ {
+ block = 3;
+ tmpPos = i;
+ }
+ if(cl.at(j)=='(' && structure == true)
+ {
+ retry = 1;
+ block = 0;
+ j = 0;
+ //kdDebug(13000)<<"Restart from the beginning of line..."<<endl;
+ stripped = "";
+ break; // Avoid an infinite loop :(
+ }
+ if(structure == true && cl.at(j) >= 0x20) stripped += cl.at(j);
+ } // BLOCK 2
+
+ if (block == 3)
+ {
+ // A comment...there can be anything
+ if(cl.at(j)=='/' && cl.at(j+1)=='/' && comment == 0) break;
+ if(cl.at(j)=='{') graph++;
+ if(cl.at(j)=='}')
+ {
+ graph--;
+ if (graph == 0 && structure == false) { block = 0; func_close = 1; }
+ if (graph == 0 && structure == true) block = 4;
+ }
+ } // BLOCK 3
+
+ if (block == 4)
+ {
+ if(cl.at(j) == ';')
+ {
+ //stripped.replace(0x9, " ");
+ stripped.remove('{');
+ stripped.replace('}', " ");
+ if(struct_on == true)
+ {
+ if (treeMode)
+ {
+ node = new QListViewItem(sctNode, lastSctNode, stripped);
+ lastSctNode = node;
+ }
+ else node = new QListViewItem(symbols, symbols->lastItem(), stripped);
+ node->setPixmap(0, (const QPixmap &)sct);
+ node->setText(1, QString::number( tmpPos, 10));
+ }
+ //kdDebug(13000)<<"Structure -- Inserted : "<<stripped<<" at row : "<<i<<endl;
+ stripped = "";
+ block = 0;
+ structure = false;
+ //break;
+ continue;
+ }
+ if (cl.at(j) >= 0x20) stripped += cl.at(j);
+ } // BLOCK 4
+ } // comment != 2
+ //kdDebug(13000)<<"Stripped : "<<stripped<<" at row : "<<i<<endl;
+ } // End of For cycle
+ } // BLOCK > 0
+ if (mclass == 4 && block == 0 && func_close == 0)
+ {
+ if (cl.find('}') >= 0)
+ {
+ cl = cl.right(cl.find('}'));
+ mclass = 0;
+ }
+ }
+ } // Comment != 1
+ } // for kv->numlines
+
+ //for (i= 0; i < (symbols->itemIndex(node) + 1); i++)
+ // kdDebug(13000)<<"Symbol row :"<<positions.at(i) <<endl;
+}
+
+
diff --git a/kate/cppsymbolviewer/katecppsymbolviewer.desktop b/kate/cppsymbolviewer/katecppsymbolviewer.desktop
new file mode 100644
index 0000000..77716b4
--- /dev/null
+++ b/kate/cppsymbolviewer/katecppsymbolviewer.desktop
@@ -0,0 +1,115 @@
+[Desktop Entry]
+Type=Service
+ServiceTypes=Kate/Plugin
+X-KDE-Library=katecppsymbolviewerplugin
+X-Kate-Version=2.5
+Name=Kate C/C++ Symbol Viewer
+Name[ar]=مستعرض الرموز C/C++ لِــ Kate
+Name[br]=Gweller an arouezoù C/C++ evit Kate
+Name[bs]=Kate C/C++ preglednik simbola
+Name[ca]=Visor de símbols C/C++ per a Kate
+Name[cs]=Prohlížeč symbolů C/C++ pro Kate
+Name[da]=Kate C/C++ symbolfremviser
+Name[de]=C/C++-Symbolbetrachter für Kate
+Name[el]=Προβολέας συμβόλων Kate C/C++
+Name[eo]=Kodredaktila C/C++ simbolvidilo
+Name[es]=Visor de símbolos de Kate C/C++
+Name[et]=Kate C/C++ sümbolite näitaja
+Name[eu]=Kateren C/C++ sinbolo ikustailea
+Name[fa]=مشاهده‌گر نماد Kate C/C++
+Name[fi]=Katen C/C++-symboleiden näyttäjä
+Name[fr]=Visualiseur de symboles C/C++ pour Kate
+Name[fy]=Kate C/C++ symboalen-werjefteprogramma
+Name[ga]=Amharcán Siombailí C/C++ le haghaidh Kate
+Name[gl]=Visor de Símbolos C/C++ para Kate
+Name[he]=מציג סמלים של C/C++ עבור Kate
+Name[hi]=के-एटीई C/C++ प्रतीक प्रदर्शक
+Name[hr]=Kate C/C++ preglednik znakova
+Name[hu]=Kate-bővítőmodul C/C++-szimbólumok megjelenítéséhez
+Name[is]=Kate C/C++ táknabirtir
+Name[it]=Visualizzatore Kate per simboli C/C++
+Name[ja]=Kate C/C++ シンボルビューア
+Name[ka]=Kate C/C++სიმბოლოთა მხილველი
+Name[kk]=Kate C/C++ карап-шығушысы
+Name[km]=កម្មវិធី​មើល​និមិត្ត​សញ្ញា Kate C/C++
+Name[lt]=Kate C/C++ simbolių žiūryklė
+Name[mk]=Прегледувач на C/C++ симболи за Кате
+Name[ms]=Kate C/C++ Pemapar Simbol
+Name[nb]=Kate C/C++ symbolviser
+Name[nds]=C/C++-Symboolkieker för Kate
+Name[ne]=केट C/C++ सङ्केत दर्शक
+Name[nl]=Kate C/C++ symbolen-weergaveprogramma
+Name[nn]=Kate C/C++-symbolvisar
+Name[pa]=ਕੇਟ C/C++ ਨਿਸ਼ਾਨ ਦਰਸ਼ਕ
+Name[pl]=Przeglądarka symboli C/C++ dla Kate
+Name[pt]=Visualizador de Símbolos C/C++ do Kate
+Name[pt_BR]=Visualizador de símbolos C/C++ do Kate
+Name[ru]=Вывод идентификаторов C/C++
+Name[sk]=Prehliadač symbolov C/C++ pre Kate
+Name[sl]=Pregledovalnik simbolov C/C++ v Kate
+Name[sr]=Прегледање C/C++ симбола за Kate
+Name[sr@Latn]=Pregledanje C/C++ simbola za Kate
+Name[sv]=Kate C/C++-symbolvisning
+Name[ta]=Kate C/C++ குறி பார்வையாளர்
+Name[tg]=Хориҷи нишондиҳандаҳои C/C++
+Name[tr]=Kate C/C++ Sembol Görüntüleyici
+Name[uk]=Kate переглядач символів C/C++
+Name[vi]=Bộ xem ký hiệu C/C++ Kate
+Name[zh_CN]=Kate C/C++ 符号查看器
+Name[zh_TW]=Kate C/C++ 符號檢視器
+Comment=This plugin extracts and shows C/C++ symbols from source
+Comment[ar]=هذا الملحق يستخرج و يعرض الرموز C/C++ من المصدرية
+Comment[az]=Bu əlavə mənbədəki C/C++ simvollarını açır və göstərir
+Comment[bg]=Приставка за извличане и показване на символите C/C++ от изходния код
+Comment[bs]=Ovaj plugin raspakuje i prikazuje C/C++ simbole iz izvornog koda
+Comment[ca]=Aquest connector extrau i mostra els símbols C/C++ des de la font
+Comment[cs]=Tento modul extrahuje a ukazuje C/C++ symboly ze zdroje
+Comment[cy]=Alldynna'r ategyn yma symbolau C/C++ o darddiad a'u dangos.
+Comment[da]=Dette plugin trækker C/C++ symboler ud fra kilde og viser dem
+Comment[de]=Dieses Modul liest C/C++-Symbole vom Quelltext ein und zeigt sie an.
+Comment[el]=Αυτό το πρόσθετο εξάγει και εμφανίζει σύμβολα C/C++ από τον πηγαίο κώδικα
+Comment[eo]=Tiu kromaĵo eltiras kaj montras C/C++ simbolojn el fonto
+Comment[es]=Este complemento extrae y muestra símbolos C/C++ desde los fuentes
+Comment[et]=See plugin leiab lähtetekstist C/C++ sümbolid ja näitab neid
+Comment[eu]=Plugin honek C/C++ sinboloak iturburutik atera eta erakutsi egiten ditu
+Comment[fa]=این وصله نمادهای C/C++ را از متن استخراج کرده و نمایش می‌دهد
+Comment[fi]=Tämä liitännäinen hakee ja näyttää C/C++-symbolit lähdekoodista
+Comment[fr]=Ce module extrait et affiche les symboles C/C++ du source
+Comment[fy]=Dizze plugin hellet de C/C++-symboalen út de boarnekoade en toant se
+Comment[ga]=Baineann an breiseán seo siombailí C/C++ as cód foinseach agus taispeánann sé iad
+Comment[gl]=Este plugin extrai e mostra símbolos C/C++ do código fonte
+Comment[he]= תוסף זה מוציא ומראה סמלים מתוך קבצי C/C++
+Comment[hi]=यह प्लगइन स्रोत में से C/C++ प्रतीकों को उद्धृत कर प्रदर्शित करता है
+Comment[hr]=Dodatak za izvlačenje i prikazivanje simbola C/C++ iz izvornog koda
+Comment[hu]=Ezzel a bővítőmodullal C/C++-os forrásfájlokból lehet kilistázni a szimbólumokat
+Comment[is]=Þetta íforrit sækir og birtir C/C++ tákn úr frumkóða
+Comment[it]=Questo plugin estrae e mostra simboli C/C++ dal sorgente
+Comment[ja]=ソースから C/C++ のシンボルを抽出して表示します
+Comment[ka]=ეს მოდული წყაროდან იღებს და აჩვენებს C/C++ სიმბოლოებს
+Comment[kk]=C/C++ идентификаторларды мәтінде бөліп көрсететін плагин модулі
+Comment[km]=កម្មវិធី​ជំនួយ​នេះស្រង់ចេញ ​និង​បង្ហាញ​និមិត្ត​សញ្ញា C/C++ ពី​ប្រភព
+Comment[lt]=Šis priedas iš šaltinių ištraukia ir parodo C/C++ simbolius
+Comment[mk]=Овој приклучок извлекува и прикажува C/C++ симболи од изворен код
+Comment[ms]=Plug masuk ekstrak dan papar simbol C/C++ dari sumber
+Comment[nb]=Denne modulen finner og viser C/C++-symboler fra kildekoden
+Comment[nds]=Dit Moduul treckt Symbolen ut C/C++-Bornkode rut un wiest disse
+Comment[ne]=यो प्लगइनले निष्कर्षण गर्दछ र स्रोतबाट C/C++ सङ्केत देखाउछ
+Comment[nl]=Deze plugin haalt de C/C++-symbolen uit de broncode en toont deze
+Comment[nn]=Dette programtillegget hentar ut og viser C/C++-symbol frå kjeldekode
+Comment[pl]=Ta wtyczka pokazuje symbole C/C++ znalezione w pliku źródłowym
+Comment[pt]=Este 'plugin' extrai e mostra símbolos C/C++ do código fonte
+Comment[pt_BR]=Este plugin extrai e exibe símbolos C/C++ do código-fonte
+Comment[ro]=Acest modul extrage şi afişează simbolurile C/C++ din fişierele sursă
+Comment[ru]=Извлекает и показывает идентификаторы C/C++ из исходного кода
+Comment[sk]=Tento modul získa a zobrazí symboly C/C++ zo zdrojového kódu
+Comment[sl]=Ta vstavek izvleče in prikaže simbole C/C++ iz izvorne kode
+Comment[sr]=Овај прикључак извлачи и приказује C/C++ симболе из извора
+Comment[sr@Latn]=Ovaj priključak izvlači i prikazuje C/C++ simbole iz izvora
+Comment[sv]=Insticksprogram som hämtar och visar C/C++-symboler från källkoden
+Comment[ta]= இந்த சொருகுபொருள் மூலத்தில் இருந்து C/C++ குறீயீடுகளை சுருக்கி காட்டும்
+Comment[tg]=Бароварда ва нишон додани нишондиҳандаҳои C/C++ аз коди баромад
+Comment[tr]=Bu plugini seçip çıkarır ve C/C++ simge kaynağını gösterir
+Comment[uk]=Цей втулок добуває і показує символи коду джерела C/C++
+Comment[vi]=Bổ sung này rút và hiển thị các ký hiệu C/C++ từ nguồn
+Comment[zh_CN]=此插件将从源代码中提取并显示 C/C++ 符号
+Comment[zh_TW]=此外掛程式展開並顯示源碼中的 C/C++ 符號。
diff --git a/kate/cppsymbolviewer/plugin_katesymbolviewer.cpp b/kate/cppsymbolviewer/plugin_katesymbolviewer.cpp
new file mode 100644
index 0000000..3e18097
--- /dev/null
+++ b/kate/cppsymbolviewer/plugin_katesymbolviewer.cpp
@@ -0,0 +1,337 @@
+/***************************************************************************
+ * plugin_katesymbolviewer.cpp - description
+ * -------------------
+ * begin : Apr 2 2003
+ * author : 2003 Massimo Callegari
+ * email : massimocallegari@yahoo.it
+ *
+ * Changes:
+ * Nov 09 2004 v.1.3 - For changelog please refer to KDE CVS
+ * Nov 05 2004 v.1.2 - Choose parser from the current highlight. Minor i18n changes.
+ * Nov 28 2003 v.1.1 - Structured for multilanguage support
+ * Added preliminary Tcl/Tk parser (thanks Rohit). To be improved.
+ * Various bugfixing.
+ * Jun 19 2003 v.1.0 - Removed QTimer (polling is Evil(tm)... )
+ * - Captured documentChanged() event to refresh symbol list
+ * - Tooltips vanished into nowhere...sigh :(
+ * May 04 2003 v 0.6 - Symbol List becomes a KListView object. Removed Tooltip class.
+ * Added a QTimer that every 200ms checks:
+ * * if the list width has changed
+ * * if the document has changed
+ * Added an entry in the popup menu to switch between List and Tree mode
+ * Various bugfixing.
+ * Apr 24 2003 v 0.5 - Added three check buttons in popup menu to show/hide symbols
+ * Apr 23 2003 v 0.4 - "View Symbol" moved in Settings menu. "Refresh List" is no
+ * longer in Kate menu. Moved into a popup menu activated by a
+ * mouse right button click. + Bugfixing.
+ * Apr 22 2003 v 0.3 - Added macro extraction + several bugfixing
+ * Apr 19 2003 v 0.2 - Added to CVS. Extract functions and structures
+ * Apr 07 2003 v 0.1 - First version.
+ *
+ ***************************************************************************/
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "plugin_katesymbolviewer.h"
+#include "plugin_katesymbolviewer.moc"
+
+#include <kaction.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kgenericfactory.h>
+#include <kfiledialog.h>
+
+#include <qlayout.h>
+#include <qgroupbox.h>
+
+K_EXPORT_COMPONENT_FACTORY( katecppsymbolviewerplugin, KGenericFactory<KatePluginSymbolViewer>( "katesymbolviewer" ) )
+
+KatePluginSymbolViewerView::KatePluginSymbolViewerView(Kate::MainWindow *w)
+{
+ KGlobal::locale()->insertCatalogue("katecppsymbolviewer");
+ KToggleAction* act = new KToggleAction ( i18n("Hide Symbols"), 0, this, SLOT( slotInsertSymbol() ), actionCollection(), "view_insert_symbolviewer" );
+ act->setCheckedState(i18n("Show Symbols"));
+
+ setInstance (new KInstance("kate"));
+ setXMLFile("plugins/katecppsymbolviewer/ui.rc");
+ w->guiFactory()->addClient (this);
+ win = w;
+ symbols = 0;
+
+ m_Active = false;
+ popup = new QPopupMenu();
+ popup->insertItem(i18n("Refresh List"), this, SLOT(slotRefreshSymbol()));
+ popup->insertSeparator();
+ m_macro = popup->insertItem(i18n("Show Macros"), this, SLOT(toggleShowMacros()));
+ m_struct = popup->insertItem(i18n("Show Structures"), this, SLOT(toggleShowStructures()));
+ m_func = popup->insertItem(i18n("Show Functions"), this, SLOT(toggleShowFunctions()));
+ popup->insertSeparator();
+ popup->insertItem(i18n("List/Tree Mode"), this, SLOT(slotChangeMode()));
+ m_sort = popup->insertItem(i18n("Enable sorting"), this, SLOT(slotEnableSorting()));
+
+ popup->setItemChecked(m_macro, true);
+ popup->setItemChecked(m_struct, true);
+ popup->setItemChecked(m_func, true);
+ macro_on = true;
+ struct_on = true;
+ func_on = true;
+ slotInsertSymbol();
+}
+
+KatePluginSymbolViewerView::~KatePluginSymbolViewerView()
+{
+ win->guiFactory()->removeClient (this);
+ delete dock;
+ delete popup;
+}
+
+void KatePluginSymbolViewerView::toggleShowMacros(void)
+{
+ bool s = !popup->isItemChecked(m_macro);
+ popup->setItemChecked(m_macro, s);
+ macro_on = s;
+ slotRefreshSymbol();
+}
+
+void KatePluginSymbolViewerView::toggleShowStructures(void)
+{
+ bool s = !popup->isItemChecked(m_struct);
+ popup->setItemChecked(m_struct, s);
+ struct_on = s;
+ slotRefreshSymbol();
+}
+
+void KatePluginSymbolViewerView::toggleShowFunctions(void)
+{
+ bool s = !popup->isItemChecked(m_func);
+ popup->setItemChecked(m_func, s);
+ func_on = s;
+ slotRefreshSymbol();
+}
+
+void KatePluginSymbolViewerView::slotInsertSymbol()
+{
+ QPixmap cls( ( const char** ) class_xpm );
+
+ if (m_Active == false)
+ {
+ dock = win->toolViewManager()->createToolView("kate_plugin_cppsymbolviewer", Kate::ToolViewManager::Left, cls, i18n("Symbol List"));
+
+ symbols = new KListView(dock);
+ treeMode = 0;
+
+ connect(symbols, SIGNAL(executed(QListViewItem *)), this, SLOT(goToSymbol(QListViewItem *)));
+ connect(symbols, SIGNAL(rightButtonClicked(QListViewItem *, const QPoint&, int)),
+ SLOT(slotShowContextMenu(QListViewItem *, const QPoint&, int)));
+ connect(win->viewManager(), SIGNAL(viewChanged()), this, SLOT(slotDocChanged()));
+ //connect(symbols, SIGNAL(resizeEvent(QResizeEvent *)), this, SLOT(slotViewChanged(QResizeEvent *)));
+
+ m_Active = true;
+ //symbols->addColumn(i18n("Symbols"), symbols->parentWidget()->width());
+ symbols->addColumn(i18n("Symbols"));
+ symbols->addColumn(i18n("Position"));
+ symbols->setColumnWidthMode(1, QListView::Manual);
+ symbols->setColumnWidth ( 1, 0 );
+ symbols->setSorting(-1, FALSE);
+ symbols->setRootIsDecorated(0);
+ symbols->setTreeStepSize(10);
+ symbols->setShowToolTips(TRUE);
+
+ /* First Symbols parsing here...*/
+ parseSymbols();
+ }
+ else
+ {
+ delete dock;
+ dock = 0;
+ symbols = 0;
+ m_Active = false;
+ }
+}
+
+void KatePluginSymbolViewerView::slotRefreshSymbol()
+{
+ if (!symbols)
+ return;
+ symbols->clear();
+ parseSymbols();
+}
+
+void KatePluginSymbolViewerView::slotChangeMode()
+{
+ treeMode = !treeMode;
+ symbols->clear();
+ parseSymbols();
+}
+
+void KatePluginSymbolViewerView::slotEnableSorting()
+{
+ lsorting = !lsorting;
+ popup->setItemChecked(m_sort, lsorting);
+ symbols->clear();
+ if (lsorting == TRUE)
+ symbols->setSorting(0, TRUE);
+ else
+ symbols->setSorting(-1, FALSE);
+
+ parseSymbols();
+}
+
+void KatePluginSymbolViewerView::slotDocChanged()
+{
+ //kdDebug(13000)<<"Document changed !!!!"<<endl;
+ slotRefreshSymbol();
+}
+
+void KatePluginSymbolViewerView::slotViewChanged(QResizeEvent *)
+{
+ kdDebug(13000)<<"View changed !!!!"<<endl;
+ symbols->setColumnWidth(0, symbols->parentWidget()->width());
+}
+
+void KatePluginSymbolViewerView::slotShowContextMenu(QListViewItem *, const QPoint &p, int)
+{
+ popup->popup(p);
+}
+
+void KatePluginSymbolViewerView::parseSymbols(void)
+{
+ unsigned int hlMode = 0;
+
+ if (!win->viewManager()->activeView())
+ return;
+
+ Kate::Document *kv = win->viewManager()->activeView()->getDoc();
+
+ // be sure we have some document around !
+ if (!kv)
+ return;
+
+ /** Get the current highlighting mode */
+ hlMode = kv->hlMode();
+ QString hlModeName = kv->hlModeName(hlMode);
+
+ //QListViewItem mcrNode = new QListViewItem(symbols, symbols->lastItem(), hlModeName);
+
+ if (hlModeName == "C++" || hlModeName == "C")
+ parseCppSymbols();
+ else if (hlModeName == "Tcl/Tk")
+ parseTclSymbols();
+ else if (hlModeName == "Java")
+ parseCppSymbols();
+}
+
+void KatePluginSymbolViewerView::goToSymbol(QListViewItem *it)
+{
+ Kate::View *kv = win->viewManager()->activeView();
+
+ // be sure we really have a view !
+ if (!kv)
+ return;
+
+ kdDebug(13000)<<"Slot Activated at pos: "<<symbols->itemIndex(it) <<endl;
+ kv->gotoLineNumber(it->text(1).toInt(NULL, 10) + 10);
+ kv->setFocus();
+ kv->gotoLineNumber(it->text(1).toInt(NULL, 10));
+}
+
+KatePluginSymbolViewer::KatePluginSymbolViewer( QObject* parent, const char* name, const QStringList& )
+ : Kate::Plugin ( (Kate::Application*)parent, name ),
+ pConfig("katecppsymbolviewerpluginrc")
+{
+ pConfig.setGroup("global");
+}
+
+KatePluginSymbolViewer::~KatePluginSymbolViewer()
+{
+ pConfig.sync();
+}
+
+void KatePluginSymbolViewer::addView (Kate::MainWindow *win)
+{
+ KatePluginSymbolViewerView *view = new KatePluginSymbolViewerView (win);
+ m_views.append (view);
+ view->types_on = pConfig.readBoolEntry("view_types", true);
+ view->expanded_on = pConfig.readBoolEntry("expand_tree", false);
+}
+
+void KatePluginSymbolViewer::removeView(Kate::MainWindow *win)
+{
+ for (uint z=0; z < m_views.count(); z++)
+ if (m_views.at(z)->win == win)
+ {
+ KatePluginSymbolViewerView *view = m_views.at(z);
+ m_views.remove (view);
+ pConfig.writeEntry("view_types", view->types_on);
+ pConfig.writeEntry("expand_tree", view->expanded_on);
+ delete view;
+ return;
+ }
+}
+
+Kate::PluginConfigPage* KatePluginSymbolViewer::configPage(
+ uint, QWidget *w, const char* /*name*/)
+{
+ KatePluginSymbolViewerConfigPage* p = new KatePluginSymbolViewerConfigPage(this, w);
+ initConfigPage( p );
+ connect( p, SIGNAL(configPageApplyRequest(KatePluginSymbolViewerConfigPage*)),
+ SLOT(applyConfig(KatePluginSymbolViewerConfigPage *)) );
+ return (Kate::PluginConfigPage*)p;
+}
+
+void KatePluginSymbolViewer::initConfigPage( KatePluginSymbolViewerConfigPage* p )
+{
+ p->viewReturns->setChecked(pConfig.readBoolEntry("view_types", true));
+ p->expandTree->setChecked(pConfig.readBoolEntry("expand_tree", false));
+}
+
+void KatePluginSymbolViewer::applyConfig( KatePluginSymbolViewerConfigPage* p )
+{
+ for (uint z=0; z < m_views.count(); z++)
+ {
+ m_views.at(z)->types_on = p->viewReturns->isChecked();
+ m_views.at(z)->expanded_on = p->expandTree->isChecked();
+ //kdDebug(13000)<<"KatePluginSymbolViewer: Configuration applied.("<<m_SymbolView->types_on<<")"<<endl;
+ m_views.at(z)->slotRefreshSymbol();
+ }
+
+ pConfig.writeEntry("view_types", p->viewReturns->isChecked());
+ pConfig.writeEntry("expand_tree", p->expandTree->isChecked());
+}
+
+// BEGIN KatePluginSymbolViewerConfigPage
+KatePluginSymbolViewerConfigPage::KatePluginSymbolViewerConfigPage(
+ QObject* /*parent*/ /*= 0L*/, QWidget *parentWidget /*= 0L*/)
+ : Kate::PluginConfigPage( parentWidget )
+{
+ QVBoxLayout* top = new QVBoxLayout(this, 0,
+ KDialogBase::spacingHint());
+
+ QGroupBox* gb = new QGroupBox( i18n("Parser Options"),
+ this, "cppsymbolviewer_config_page_layout" );
+ gb->setColumnLayout(1, Qt::Horizontal);
+ gb->setInsideSpacing(KDialogBase::spacingHint());
+ viewReturns = new QCheckBox(i18n("Display functions parameters"), gb);
+ expandTree = new QCheckBox(i18n("Automatically expand nodes in tree mode"), gb);
+
+ top->add(gb);
+ top->addStretch(1);
+// throw signal changed
+ connect(viewReturns, SIGNAL(toggled(bool)), this, SIGNAL(changed()));
+ connect(expandTree, SIGNAL(toggled(bool)), this, SIGNAL(changed()));
+}
+
+KatePluginSymbolViewerConfigPage::~KatePluginSymbolViewerConfigPage() {}
+
+void KatePluginSymbolViewerConfigPage::apply()
+{
+ emit configPageApplyRequest( this );
+}
+// END KatePluginSymbolViewerConfigPage
+
diff --git a/kate/cppsymbolviewer/plugin_katesymbolviewer.h b/kate/cppsymbolviewer/plugin_katesymbolviewer.h
new file mode 100644
index 0000000..f20f097
--- /dev/null
+++ b/kate/cppsymbolviewer/plugin_katesymbolviewer.h
@@ -0,0 +1,300 @@
+/***************************************************************************
+ plugin_katesymbolviewer.h - description
+ -------------------
+ begin : Apr 2 2003
+ author : 2003 Massimo Callegari
+ email : massimocallegari@yahoo.it
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _PLUGIN_KATE_SYMBOLVIEWER_H_
+#define _PLUGIN_KATE_SYMBOLVIEWER_H_
+
+#include <kate/application.h>
+#include <kate/documentmanager.h>
+#include <kate/document.h>
+#include <kate/mainwindow.h>
+#include <kate/plugin.h>
+#include <kate/view.h>
+#include <kate/viewmanager.h>
+#include <kate/toolviewmanager.h>
+#include <kate/pluginconfiginterface.h>
+#include <kate/pluginconfiginterfaceextension.h>
+
+#include <kdebug.h>
+#include <qmemarray.h>
+#include <qpopupmenu.h>
+#include <qevent.h>
+#include <qcheckbox.h>
+//#include <qprocess.h>
+#include <qregexp.h>
+#include <klibloader.h>
+#include <klocale.h>
+#include <klistview.h>
+#include <kiconloader.h>
+#include <kconfig.h>
+
+
+class KatePluginSymbolViewerView : public QObject, public KXMLGUIClient
+{
+ Q_OBJECT
+
+ public:
+ KatePluginSymbolViewerView (Kate::MainWindow *w);
+ virtual ~KatePluginSymbolViewerView ();
+
+ void parseSymbols(void);
+
+ public slots:
+ void slotInsertSymbol();
+ void slotRefreshSymbol();
+ void slotChangeMode();
+ void slotEnableSorting();
+ void slotDocChanged();
+ void goToSymbol(QListViewItem *);
+ void slotShowContextMenu(QListViewItem *, const QPoint&, int);
+ void toggleShowMacros(void);
+ void toggleShowStructures(void);
+ void toggleShowFunctions(void);
+ protected:
+ void slotViewChanged(QResizeEvent *e);
+ private:
+ QPopupMenu *popup;
+ KListView *symbols;
+ QWidget *dock;
+ bool m_Active;
+ int m_macro, m_struct, m_func, m_sort;
+ bool macro_on, struct_on, func_on;
+ bool treeMode, lsorting;
+ void parseCppSymbols(void);
+ void parseTclSymbols(void);
+ public:
+ Kate::MainWindow *win;
+ bool types_on;
+ bool expanded_on;
+};
+
+/**
+ * Plugin's config page
+ */
+class KatePluginSymbolViewerConfigPage : public Kate::PluginConfigPage
+{
+ Q_OBJECT
+
+ friend class KatePluginSymbolViewer;
+
+ public:
+ KatePluginSymbolViewerConfigPage (QObject* parent = 0L, QWidget *parentWidget = 0L);
+ ~KatePluginSymbolViewerConfigPage ();
+
+ /**
+ * Reimplemented from Kate::PluginConfigPage
+ * just emits configPageApplyRequest( this ).
+ */
+ virtual void apply();
+
+ virtual void reset () { ; }
+ virtual void defaults () { ; }
+
+ signals:
+ /**
+ * Ask the plugin to set initial values
+ */
+ void configPageApplyRequest( KatePluginSymbolViewerConfigPage* );
+
+ /**
+ * Ask the plugin to apply changes
+ */
+ void configPageInitRequest( KatePluginSymbolViewerConfigPage* );
+
+ private:
+ QCheckBox* viewReturns;
+ QCheckBox* expandTree;
+};
+
+class KatePluginSymbolViewer : public Kate::Plugin, Kate::PluginViewInterface, Kate::PluginConfigInterfaceExtension
+{
+ Q_OBJECT
+
+ public:
+ KatePluginSymbolViewer( QObject* parent = 0, const char* name = 0, const QStringList& = QStringList() );
+ virtual ~KatePluginSymbolViewer();
+
+ void addView (Kate::MainWindow *win);
+ void removeView (Kate::MainWindow *win);
+
+ uint configPages () const { return 1; }
+ Kate::PluginConfigPage *configPage (uint , QWidget *w, const char *name=0);
+ QString configPageName(uint) const { return i18n("Symbol Viewer"); }
+ QString configPageFullName(uint) const { return i18n("Symbol Viewer Configuration Page"); }
+ QPixmap configPagePixmap (uint , int ) const { return 0L; }
+
+ public slots:
+ void applyConfig( KatePluginSymbolViewerConfigPage* );
+
+ private:
+ void initConfigPage( KatePluginSymbolViewerConfigPage* );
+
+ private:
+ QPtrList<KatePluginSymbolViewerView> m_views;
+ KConfig pConfig;
+};
+
+/* XPM */
+static const char* const class_xpm[] = {
+"16 16 10 1",
+" c None",
+". c #000000",
+"+ c #A4E8FC",
+"@ c #24D0FC",
+"# c #001CD0",
+"$ c #0080E8",
+"% c #C0FFFF",
+"& c #00FFFF",
+"* c #008080",
+"= c #00C0C0",
+" .. ",
+" .++.. ",
+" .+++@@. ",
+" .@@@@@#... ",
+" .$$@@##.%%.. ",
+" .$$$##.%%%&&. ",
+" .$$$#.&&&&&*. ",
+" ...#.==&&**. ",
+" .++..===***. ",
+" .+++@@.==**. ",
+" .@@@@@#..=*. ",
+" .$$@@##. .. ",
+" .$$$###. ",
+" .$$$##. ",
+" ..$#. ",
+" .. "};
+static const char * const class_int_xpm[] = {
+"16 16 10 1",
+" c None",
+". c #000000",
+"+ c #B8B8B8",
+"@ c #8A8A8A",
+"# c #212121",
+"$ c #575757",
+"% c #CCCCCC",
+"& c #9A9A9A",
+"* c #4D4D4D",
+"= c #747474",
+" .. ",
+" .++.. ",
+" .+++@@. ",
+" .@@@@@#... ",
+" .$$@@##.%%.. ",
+" .$$$##.%%%&&. ",
+" .$$$#.&&&&&*. ",
+" ...#.==&&**. ",
+" .++..===***. ",
+" .+++@@.==**. ",
+" .@@@@@#..=*. ",
+" .$$@@##. .. ",
+" .$$$###. ",
+" .$$$##. ",
+" ..$#. ",
+" .. "};
+
+static const char* const struct_xpm[] = {
+"16 16 14 1",
+" c None",
+". c #000000",
+"+ c #C0FFC0",
+"@ c #00FF00",
+"# c #008000",
+"$ c #00C000",
+"% c #C0FFFF",
+"& c #00FFFF",
+"* c #008080",
+"= c #00C0C0",
+"- c #FFFFC0",
+"; c #FFFF00",
+"> c #808000",
+", c #C0C000",
+" .. ",
+" .++.. ",
+" .+++@@. ",
+" .@@@@@#... ",
+" .$$@@##.%%.. ",
+" .$$$##.%%%&&. ",
+" .$$$#.&&&&&*. ",
+" ...#.==&&**. ",
+" .--..===***. ",
+" .---;;.==**. ",
+" .;;;;;>..=*. ",
+" .,,;;>>. .. ",
+" .,,,>>>. ",
+" .,,,>>. ",
+" ..,>. ",
+" .. "};
+
+static const char* const macro_xpm[] = {
+"16 16 14 1",
+" c None",
+". c #000000",
+"+ c #FF7FE5",
+"@ c #FF00C7",
+"# c #7F0066",
+"$ c #BC0096",
+"% c #C0FFFF",
+"& c #00FFFF",
+"* c #008080",
+"= c #00C0C0",
+"- c #D493FF",
+"; c #A100FF",
+"> c #470082",
+", c #6B00B7",
+" .. ",
+" .++.. ",
+" .+++@@. ",
+" .@@@@@#... ",
+" .$$@@##.%%.. ",
+" .$$$##.%%%&&. ",
+" .$$$#.&&&&&*. ",
+" ...#.==&&**. ",
+" .--..===***. ",
+" .---;;.==**. ",
+" .;;;;;>..=*. ",
+" .,,;;>>. .. ",
+" .,,,>>>. ",
+" .,,,>>. ",
+" ..,>. ",
+" .. "};
+
+static const char* const method_xpm[] = {
+ "16 16 5 1",
+ " c None",
+ ". c #000000",
+ "+ c #FCFC80",
+ "@ c #E0BC38",
+ "# c #F0DC5C",
+ " ",
+ " ",
+ " ",
+ " .. ",
+ " .++.. ",
+ " .+++++. ",
+ " .+++++@. ",
+ " .. .##++@@. ",
+ " .++..###@@@. ",
+ " .+++++.##@@. ",
+ " .+++++@..#@. ",
+ " .##++@@. .. ",
+ " .###@@@. ",
+ " .###@@. ",
+ " ..#@. ",
+ " .. "
+};
+
+#endif
diff --git a/kate/cppsymbolviewer/tcl_parser.cpp b/kate/cppsymbolviewer/tcl_parser.cpp
new file mode 100644
index 0000000..ff51e60
--- /dev/null
+++ b/kate/cppsymbolviewer/tcl_parser.cpp
@@ -0,0 +1,150 @@
+/***************************************************************************
+ tcl_parser.cpp - description
+ -------------------
+ begin : Apr 2 2003
+ author : 2003 Massimo Callegari
+ email : massimocallegari@yahoo.it
+ ***************************************************************************/
+ /***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "plugin_katesymbolviewer.h"
+
+void KatePluginSymbolViewerView::parseTclSymbols(void)
+{
+ if (!win->viewManager()->activeView())
+ return;
+
+ QString currline, prevline;
+ bool prevComment = false;
+ QString varStr("set ");
+ QString procStr("proc");
+ QString stripped;
+ uint i, j, args_par = 0, graph = 0;
+ char block = 0, parse_func = 0;
+
+ QListViewItem *node = NULL;
+ QListViewItem *mcrNode = NULL, *clsNode = NULL;
+ QListViewItem *lastMcrNode = NULL, *lastClsNode = NULL;
+
+ QPixmap mcr( ( const char** ) macro_xpm );
+ QPixmap cls( ( const char** ) class_xpm );
+
+ if(treeMode)
+ {
+ clsNode = new QListViewItem(symbols, symbols->lastItem(), i18n("Functions"));
+ mcrNode = new QListViewItem(symbols, symbols->lastItem(), i18n("Globals"));
+ lastMcrNode = mcrNode;
+ lastClsNode = clsNode;
+ if (expanded_on)
+ {
+ clsNode->setOpen(TRUE);
+ mcrNode->setOpen(TRUE);
+ }
+ symbols->setRootIsDecorated(1);
+ }
+ else
+ symbols->setRootIsDecorated(0);
+
+ Kate::Document *kDoc = win->viewManager()->activeView()->getDoc();
+
+ //positions.resize(kDoc->numLines() + 3); // Maximum symbols number o.O
+ //positions.fill(0);
+
+ for (i = 0; i<kDoc->numLines(); i++)
+ {
+ currline = kDoc->textLine(i);
+ currline = currline.stripWhiteSpace();
+ bool comment = false;
+ kdDebug(13000)<<currline<<endl;
+ if(currline.at(0) == '#') comment = true;
+
+ if(i > 0)
+ {
+ prevline = kDoc->textLine(i-1);
+ if(prevline.endsWith("\\") && prevComment) comment = true;
+ }
+ prevComment = comment;
+
+ if(!comment)
+ {
+ if(currline.startsWith(varStr) && block == 0)
+ {
+ if (macro_on == true) // not really a macro, but a variable
+ {
+ stripped = currline.right(currline.length() - 3);
+ stripped = stripped.simplifyWhiteSpace();
+ int fnd = stripped.find(' ');
+ //fnd = stripped.find(";");
+ if(fnd > 0) stripped = stripped.left(fnd);
+
+ if (treeMode)
+ {
+ node = new QListViewItem(mcrNode, lastMcrNode, stripped);
+ lastMcrNode = node;
+ }
+ else
+ node = new QListViewItem(symbols, symbols->lastItem(), stripped);
+
+ node->setPixmap(0, (const QPixmap &)mcr);
+ node->setText(1, QString::number( i, 10));
+ stripped = "";
+ }//macro
+ } // starts with "set"
+
+ else if(currline.startsWith(procStr)) { parse_func = 1; }
+
+ if (parse_func == 1)
+ {
+ for (j = 0; j < currline.length(); j++)
+ {
+ if (block == 1)
+ {
+ if(currline.at(j)=='{') graph++;
+ if(currline.at(j)=='}')
+ {
+ graph--;
+ if (graph == 0) { block = 0; parse_func = 0; continue; }
+ }
+ }
+ if (block == 0)
+ {
+ stripped += currline.at(j);
+ if(currline.at(j) == '{') args_par++;
+ if(currline.at(j) == '}')
+ {
+ args_par--;
+ if (args_par == 0)
+ {
+ //stripped = stripped.simplifyWhiteSpace();
+ if(func_on == true)
+ {
+ if (treeMode)
+ {
+ node = new QListViewItem(clsNode, lastClsNode, stripped);
+ lastClsNode = node;
+ }
+ else
+ node = new QListViewItem(symbols, symbols->lastItem(), stripped);
+ node->setPixmap(0, (const QPixmap &)cls);
+ node->setText(1, QString::number( i, 10));
+ }
+ stripped = "";
+ block = 1;
+ }
+ }
+ } // block = 0
+ } // for j loop
+ }//func_on
+ } // not a comment
+ } //for i loop
+
+ //positions.resize(symbols->itemIndex(node) + 1);
+}
+
diff --git a/kate/cppsymbolviewer/testfile.c b/kate/cppsymbolviewer/testfile.c
new file mode 100644
index 0000000..8f5f959
--- /dev/null
+++ b/kate/cppsymbolviewer/testfile.c
@@ -0,0 +1,59 @@
+/** Test File...very demoniac for parsing... **/
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef (_cplusplus)
+{
+#define VALUE 5
+
+#define MACRO(x) (x^2)
+
+# define abs_float(x) \
+ ( ((x)<0) ? -(x) : (x) )
+
+
+typedef struct
+ {
+ pTest *pNext;
+ pTest *pPrev;
+ }
+ Another_test, *pTest;
+
+typedef struct xauth
+{
+ unsigned short family;
+ char *address;
+} Xauth;
+
+typedef struct {
+ color to_move;
+ occupant board[8][8];
+ } game;
+
+typedef game gt_data;
+
+/*
+ A comment with a function hello() { }
+*/
+// Continued...
+
+RockType *
+ MyMusicFunction(
+ void *Red,
+ int Hot, // Comment double slash
+ char Chili, /* Comment inline */
+ unsigned long Peppers)
+// A comment..just to make some noise...
+{
+ // Passed first stage ???
+ // Ok..get ready for the second one !
+ if(I_Have_Failed() >= 0 && /* comments everywhere :} */
+ This_Appears() == 1)
+ {
+ printf("Damn !!! Better going to bed :((");
+ if ( vs ) // here you are ;}
+ activateSpace( vs->currentView() );
+ }
+}
+
+ }
diff --git a/kate/cppsymbolviewer/ui.rc b/kate/cppsymbolviewer/ui.rc
new file mode 100644
index 0000000..7827306
--- /dev/null
+++ b/kate/cppsymbolviewer/ui.rc
@@ -0,0 +1,9 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="katesymbolviewer" library="libkatesymbolviewerplugin" version="2">
+<MenuBar>
+ <Menu name="view"><Text>&amp;Settings</Text>
+ <Separator />
+ <Action name="view_insert_symbolviewer" />
+ </Menu>
+</MenuBar>
+</kpartplugin>
diff --git a/kate/filelistloader/Makefile.am b/kate/filelistloader/Makefile.am
new file mode 100644
index 0000000..8b47569
--- /dev/null
+++ b/kate/filelistloader/Makefile.am
@@ -0,0 +1,34 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+#KDE_ICON = textfilter
+
+# Install this plugin in the KDE modules directory
+#kde_module_LTLIBRARIES = katefll_initplugin.la katefll_plugin.la
+kde_module_LTLIBRARIES = katefll_plugin.la
+
+# This is all standard. Remove the LIB_KHTML reference if you are not
+# using the KHTML Part
+#katefll_initplugin_la_SOURCES = katefll_initplugin.cpp
+#katefll_initplugin_la_LIBADD = -lkateinterfaces
+#katefll_initplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+katefll_plugin_la_SOURCES = katefll_plugin.cpp
+katefll_plugin_la_LIBADD = -lkateinterfaces
+katefll_plugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+# Install the .rc file in the Part's directory (in this case, the part
+# is KHTMLPart)
+pluginsdir = $(kde_datadir)/kate/plugins/katefll
+plugins_DATA = ui.rc
+
+#kde_services_DATA = katefll_initplugin.desktop katefll_plugin.desktop
+kde_services_DATA = katefll_plugin.desktop
+
+kdelnk_DATA = katefll.desktop
+kdelnkdir = $(kde_appsdir)/.hidden
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/katefll_initplugin.pot
+ $(XGETTEXT) *.cpp -o $(podir)/katefll_plugin.pot
+
diff --git a/kate/filelistloader/katefll.desktop b/kate/filelistloader/katefll.desktop
new file mode 100644
index 0000000..0a5e58b
--- /dev/null
+++ b/kate/filelistloader/katefll.desktop
@@ -0,0 +1,83 @@
+[Desktop Entry]
+GenericName=Text Editor /FLL
+GenericName[ar]=محرر نصوص /FLL
+GenericName[az]=Mətn Editoru /FLL
+GenericName[br]=Aozer skrid /FLL
+GenericName[bs]=Tekst editor/FLL
+GenericName[ca]=Editor de text /FLL
+GenericName[cs]=Textový editor /FLL
+GenericName[cy]=Golygydd Testun/FLL
+GenericName[da]=Teksteditor/FLL
+GenericName[de]=Texteditor /Dateilistenlader
+GenericName[el]=Επεξεργαστής κειμένου /FLL
+GenericName[eo]=Tekstredaktilo
+GenericName[es]=Editor de texto /FLL
+GenericName[et]=Tekstiredaktor /failinimekiri
+GenericName[eu]=/FLL testu editorea
+GenericName[fa]=ویرایشگر متن /FLL
+GenericName[fi]=Tekstieditori /FLL
+GenericName[fo]=Tekstritil/FLL
+GenericName[fr]=Éditeur de texte / FLL
+GenericName[fy]=Teksteditor /FLL
+GenericName[ga]=Eagarthóir Téacs /FLL
+GenericName[gl]=Lista de Ficheiros do Editor de Texto
+GenericName[he]=עורך טקסט \FLL
+GenericName[hi]=पाठ सम्पादक /एफएलएल
+GenericName[hr]=Uređivač teksta / FLL
+GenericName[hu]=Szövegszerkesztő /FLL
+GenericName[is]=Textaritill /FLL
+GenericName[it]=Editor di testi /FLL
+GenericName[ja]=テキストエディタ/FLL
+GenericName[ka]=ტექსტის რედაქტორი /FLL
+GenericName[kk]=Мәтін редакторы/FLL
+GenericName[km]=កម្មវិធី​និពន្ធ /FLL
+GenericName[lt]=Teksto redaktorius /FLL
+GenericName[mk]=Уредувач на текст /FLL
+GenericName[ms]=Penyunting Teks /FLL
+GenericName[mt]=Editur tat-test /FLL
+GenericName[nb]=Tekstredigerer / Fillaster
+GenericName[nds]=Texteditor /Dateilistlader
+GenericName[ne]=पाठ सम्पादक /एफएलएल
+GenericName[nl]=Teksteditor /FLL
+GenericName[nn]=Skriveprogram/FLL
+GenericName[nso]=/FLL ya Mofetosi wa Sengwalwana
+GenericName[pa]=ਪਾਠ ਸੰਪਾਦਕ /FLL
+GenericName[pl]=Edytor tekstu /Wczytywanie listy plików
+GenericName[pt]=Lista de Ficheiros do Editor de Texto
+GenericName[pt_BR]=Editor de Texto /FLL
+GenericName[ro]=Editor de text / FFL
+GenericName[ru]=Текстовый редактор/FLL
+GenericName[sk]=Textový editor /FLL
+GenericName[sl]=Urejevalnik besedil /FLL
+GenericName[sr]=Уређивач текста /FLL
+GenericName[sr@Latn]=Uređivač teksta /FLL
+GenericName[sv]=Texteditor /FLL
+GenericName[ta]=உரைதொகுப்பான்/FLL
+GenericName[tg]=Муҳаррири матнӣ/FLL
+GenericName[tr]=Metin Düzenleyici / FLL
+GenericName[uk]=Редактор текстів /FLL
+GenericName[vi]=Trình soạn thảo văn bản/FLL
+GenericName[xh]= Umhleli wombhalo /FLL
+GenericName[zh_CN]=文本编辑器 /FLL
+GenericName[zh_TW]=文字編輯器 /FLL
+Name=KateFLL
+Name[de]=Kate Dateilistenlader
+Name[eo]=Dosierlista ŝargilo por Kodredaktilo
+Name[et]=Kate failinimekiri
+Name[fy]=Kate FLL
+Name[hi]=के-एटीईएफएलएल
+Name[ne]=केट एफएलएल
+Name[nl]=Kate FLL
+Name[pa]=ਕੇਟFLL
+Name[pl]=Program wczytujący listę plików do Kate
+Name[ro]=KateFFL
+Name[sv]=Kate FLL
+MimeType=text/x-katefilelist
+Exec=kate --initplugin katefll_initplugin %u
+NoDisplay=true
+Icon=kate
+Path=
+DocPath=kate/index.html
+Type=Application
+Terminal=false
+X-DCOP-ServiceType=Multi
diff --git a/kate/filelistloader/katefll_initplugin.cpp b/kate/filelistloader/katefll_initplugin.cpp
new file mode 100644
index 0000000..4eb116f
--- /dev/null
+++ b/kate/filelistloader/katefll_initplugin.cpp
@@ -0,0 +1,96 @@
+/***************************************************************************
+ katefll_initplugin.cpp - description
+ -------------------
+ begin : FRE July 12th 2002
+ copyright : (C) 2002 by Joseph Wenninger
+ email : jowenn@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "katefll_initplugin.h"
+#include "katefll_initplugin.moc"
+
+#include <kate/pluginmanager.h>
+
+#include <qfileinfo.h>
+#include <kgenericfactory.h>
+#include <kaction.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <kurl.h>
+#include <kio/netaccess.h>
+
+K_EXPORT_COMPONENT_FACTORY( katefll_initplugin, KGenericFactory<InitPluginKateFileListLoader>( "katefll_loader" ) )
+
+InitPluginKateFileListLoader::InitPluginKateFileListLoader (QObject * parent, const char *name, const QStringList datalist)
+ :InitPlugin((Kate::Application*)parent,name)
+{
+}
+
+
+InitPluginKateFileListLoader:: ~InitPluginKateFileListLoader()
+{
+}
+
+
+int InitPluginKateFileListLoader::actionsKateShouldNotPerformOnRealStartup()
+{
+ return 0x1;
+}
+
+int InitPluginKateFileListLoader::initKate()
+{
+ QString tmpFile;
+ KURL tmpURL;
+ if( KIO::NetAccess::download( configScript(), tmpFile ) )
+ {
+ QFile file(tmpFile);
+ file.open(IO_ReadOnly);
+
+ QTextStream t(&file);
+
+ bool somethingOpened=false;
+
+ application()->documentManager()->closeAllDocuments();
+ while (!t.eof())
+ {
+ somethingOpened=true;
+// application()->activeMainWindow()->viewManager()->openURL(KURL(t.readLine()));
+ application()->documentManager()->openURL(tmpURL=KURL(t.readLine()));
+ }
+ if (!somethingOpened) application()->documentManager()->openURL(KURL());
+ else if (application()->activeMainWindow())
+ application()->activeMainWindow()->viewManager()->openURL(tmpURL);
+
+ file.close();
+
+ KIO::NetAccess::removeTempFile( tmpFile );
+
+ } else application()->documentManager()->openURL(KURL());
+
+ Kate::Plugin *pl=application()->pluginManager()->plugin("katefll_plugin");
+ if (pl)
+ {
+ connect(this,SIGNAL(updateInit()),pl,SLOT(updateInit()));
+ updateInit();
+ disconnect(this,SIGNAL(updateInit()),pl,SLOT(updateInit()));
+
+/* int id = pl->metaObject()->findSlot( SLOT(updateInit()) );
+ if ( id != -1 )
+ {
+ kdDebug()<<"Action slot was found, it will be called now"<<endl;
+ QUObject o[ 1 ];
+ mod->module->qt_invoke( id, o );
+ } */
+ }
+ return 0;
+}
+
diff --git a/kate/filelistloader/katefll_initplugin.desktop b/kate/filelistloader/katefll_initplugin.desktop
new file mode 100644
index 0000000..472a9ad
--- /dev/null
+++ b/kate/filelistloader/katefll_initplugin.desktop
@@ -0,0 +1,112 @@
+[Desktop Entry]
+Type=Service
+ServiceTypes=Kate/InitPlugin
+X-KDE-Library=katefll_initplugin
+X-Kate-Version=2.5
+Name=Kate FLL Init Plugin
+Name[bs]=Kate FLL init plugin
+Name[ca]=Connector per iniciar FLL per a Kate
+Name[cs]=Kate FLL init plugin
+Name[de]=Kate Initialisierungsmodul für Dateilistenlader
+Name[el]=Πρόσθετο αρχικοποίησης FLL του Kate
+Name[eo]=Komenca kromaĵo por Kodredaktilo
+Name[es]=Complemento Kate FLL Init
+Name[et]=Kate failinimekirja lähtestamise plugin
+Name[eu]=Kate FLL init plugina
+Name[fa]=وصلۀ آغازین Kate FLL
+Name[fi]=Kate FLL alustussovelma
+Name[fr]=Module externe FLL d'initialisation pour Kate
+Name[fy]=Kate FLL inisjalisaasjeplugin
+Name[ga]=Breiseán Túsaithe FLL le haghaidh Kate
+Name[gl]=Plugin de Lista de Ficheiros para Kate
+Name[he]=תוסף אתחול FLL ל־Kate
+Name[hi]=के-एटीई एफएलएल इनिट प्लगइन
+Name[hr]=Kate FLL inicijalizacijski dodatak
+Name[hu]=Kate FLL inicializálási bővítőmodul
+Name[is]=Kate FLL ræsiviðbætur
+Name[it]=Plugin di inizializzazione di Kate FLL
+Name[ja]=Kate FLL 初期化プラグイン
+Name[ka]=Kate FLL Init მოდული
+Name[kk]=Kate FLL инициализациялау плагин модулі
+Name[km]=កម្មវិធី​ជំនួយ Kate FLL Init
+Name[lt]=Kate FLL Init priedas
+Name[mk]=Приклучок за иницијализација на Kate FLL
+Name[ms]=Plugin Kate FLL Init
+Name[nb]=Kate FLL init-programtillegg
+Name[nds]=KateFLL-Init-Moduul
+Name[ne]=केट एफएफएल Init प्लगइन
+Name[nl]=Kate FLL initialisatieplugin
+Name[nn]=Kate FLL-oppstartstillegg
+Name[pl]=Wtyczka FLL Init dla Kate
+Name[pt]='Plugin' de Lista de Ficheiros do Kate
+Name[pt_BR]=Plugin FLL Init do Kate
+Name[ru]=Модуль инициализации Kate FLL
+Name[sk]=Kate FLL inicializačný modul
+Name[sl]=Vstavek za FLL v Kate
+Name[sr]=Прикључак Kate за иницијализацију FLL
+Name[sr@Latn]=Priključak Kate za inicijalizaciju FLL
+Name[sv]=Kate FLL-initieringsinsticksprogram
+Name[ta]=Kate FLL init சொருகுப்பொருள்
+Name[tg]=Модули инисиализатсиякунонии Kate FLL
+Name[tr]=Kate FLL İlklendirme Eklentisi
+Name[uk]=Втулок ініціалізації FLL для Kate
+Name[vi]=Bổ sung Init FLL Kate
+Name[zh_CN]=Kate FLL 初始插件
+Name[zh_TW]=Kate FLL 初始化外掛程式
+Comment=Initializes Kate's opened files list with those URLs stored within an "init script"
+Comment[ar]=تبدأ قوائم ملفات Kate المفتوحة مع العناوين المحفوظة في "initscrips"
+Comment[az]=Kate-in açıq fayllar siyahısını "init script"dəki URL-lərlə yoxlayır.
+Comment[bg]=Инициализиране на списъка от отворени файлове с адресите, които се намират в инициализиращ скрипт
+Comment[bs]=Inicijalizira listu otvorenih Kate datoteka sa tim URL-ovima smještenim u "init skripti"
+Comment[ca]=Inicialitza el llistat de fitxers oberts de Kate amb aquests URL desats en un "script d'inici"
+Comment[cs]=Inicializuje otevřené soubory Kate pomocí URL uloženého v "init skriptu"
+Comment[cy]=Ymgychwyn rhestr ffeiliau agored Kate efo'r URLs sydd wedi eu storio mewn "sgript init"
+Comment[da]=Initialiserer Kates liste over åbne filer med de URL'er som er gemt i et "init-script"
+Comment[de]=Initialisiert die Liste der von Kate geöffneten Dateien mit den Datei-Adressen aus einem "Init-Skript"
+Comment[el]=Αρχικοποιεί τη λίστα ανοιγμένων αρχείων του Kate με αυτά τα URL που είναι αποθηκευμένα σε ένα "αρχείο εντολών αρχικοποίησης"
+Comment[en_GB]=Initialises Kate's opened files list with those URLs stored within an "init script"
+Comment[eo]=Komencas la liston de malfermitaj dosieraj de Kodredaktilo per la URLoj konservataj en « komenca skriptaĵo »
+Comment[es]=Inicializa la lista de los archivos de Kate abiertos con los URL guardados en un «programa de inicio»
+Comment[et]=Lähtestab Kate avatud failide nimekirja URLidega, mis on salvestatud "init script"-is
+Comment[eu]=Katek irekita dituen fitxategien zerrenda hasieratzen du euren URLak "hasierako script" batean gordeta dituelarik.
+Comment[fa]=فهرست پرونده‌های باز Kate را با آن نشانیهای وب ذخیره‌شده درون یک «init script»، مقداردهی اولیه می‌کند.
+Comment[fi]=Alustaa Katen avattujen tiedostojen listan URL:la jotka on tallennettu "alustusskriptiin"
+Comment[fr]=Initialise la liste des fichiers de Kate ouverts avec les URL enregistrées dans un « init script »
+Comment[fy]=inisjalisearret de list mei fanút Kate iepene triemmen mei byhearrende URL-adressen opslein yn in "init script"
+Comment[gl]=Inicializa a lista de ficheiros abertos en Kate cos URLs guardados nun script inicial
+Comment[he]=אתחול רשימת הקבצים הפתוחים של Kate עם כתובות השמורות ב"תסריט אתחול"
+Comment[hi]=के-एटीई के फ़ाइल खोलें सूची इनिशियलाइज़ करता है जो कि उन यूआरएल के साथ एक "इनिट स्क्रिप्ट" में होते हैं
+Comment[hr]=Inicijalizira popis otvorenih datoteka aplikacije Kate s URL adresama pohranjenim unutar skripte "init script"
+Comment[hu]=Feltölti a Kate-ben a megnyitott fájlok listáját azokkal az URL-ekkel, melyek a megadott "inicializációs szkriptben" találhatók
+Comment[is]=Frumstillir opnar skrár Kate með lista af þeim slóðum sem eru geymdar í "init script"
+Comment[it]=Inizializza la lista dei file aperti da Kate con gli URL salvati in uno script di inizializzazione
+Comment[ja]=Kate のファイルリストを「初期化スクリプト」に保存されている URL で初期化します
+Comment[ka]=Kate-ს ღია ფაილთა სიის ინიციალიზაციას აკეთებს იმ URLებით რომლებიც "init script"-ში ინახება
+Comment[kk]=Kate-те ашылған файлдар тізімін "инициализациялау скриптінде" сақталғаны бойынша инициализациялайды
+Comment[km]=ចាប់​ផ្ដើម​បញ្ជី​ឯកសារដែល​បាន​បើក​របស់ Kate ជា​មួយ​នឹង URLs ទាំង​នោះ​​ដែល​បាន​ទុក​ក្នុង "ស្គ្រីប init​"
+Comment[lt]=Sužadina Kate atvertų bylų sąrašą su tais URL, kurie išsaugoti „sužadinimo scenarijuje“
+Comment[mk]=Ја иницијализира листата на отворени датотеки на Кате со URL-ата зачувани во „init script“
+Comment[ms]=Memulakan senarai fail terbuka Kate dengan fail yang distor oleh URL dalam "skrip init"
+Comment[nb]=Initialiserer de åpne fil-listene i Kate med URLene i et «init skript»
+Comment[nds]=Maakt Kate ehr List vun opmaakte Dateien mit de Adressen ut en "Init-Skript" torecht
+Comment[ne]=एउटा "init script" मा भण्डारण गरिएका यूआरएलबाट केटका खुला फाइलहरू सुरुआत गर्छ
+Comment[nl]=initialiseert de lijst met vanuit Kate geopende bestanden met bijhorende URL-adressen opgeslagen in een "init script"
+Comment[nn]=Fyller fillista i Kate med URL-ar frå eit oppstartsskript
+Comment[pl]=Inicjalizuje listę otwartych plików Kate zgodnie z URL-ami zapisanymi w "skrypcie inicjalizacyjnym"
+Comment[pt]=Inicializa a lista de ficheiros abertos do Kate com os URLs guardados num 'script' inicial
+Comment[pt_BR]=Inicializa os arquivos abertos do Kate com as URLs armazenadas dentro de um "init script"
+Comment[ro]=Iniţializează lista de fişiere deschide de Kate cu URL-urile salvate într-un "script de iniţializare"
+Comment[ru]=Инициализирует список открытых файлов Kate по их адресам через скрипт
+Comment[sk]=Inicializuje otvorené súbory Kate s týmy URL uloženýmy v "init script"
+Comment[sl]=Inicializira seznam odprtih datotek v Kate z naslovi URL znotraj le-teh»skripta init«
+Comment[sr]=Иницијализује листу отворених фајлова у Kate са URL-овима похрањеним унутар „скрипте за иницијализацију“
+Comment[sr@Latn]=Inicijalizuje listu otvorenih fajlova u Kate sa URL-ovima pohranjenim unutar „skripte za inicijalizaciju“
+Comment[sv]=Initierar Kates öppnade fillista med webbadresserna lagrade inuti ett "init-skript"
+Comment[ta]="init script"ல் சேமிக்கப்பட்டுள்ள வலைமனைகளுடன் கேட்ஸ்சின் திறந்துள்ள கோப்புகளின் பட்டியலை துவக்குகிறது
+Comment[tg]=Ҳамаи рӯйхати файлҳои кушодаи Kate -ро бо суроғаҳояш аз дастнавис инисиалӣ мекунад
+Comment[tr]=Kate'in açılan dosyalar listesini bir "ilklendirme betiği"nde saklanan URL'lerle oluşturur
+Comment[uk]=Ініціалізує список фалів, відкритий Kate значеннями URL, що зберігаються в "init script"
+Comment[vi]=Khởi tạo danh sách các tập tin mở của Kate bằng những địa chi URL được cất giữ bên trong một « văn lệnh khởi tạo »
+Comment[xh]=Inika inani kuluhlu lweefayile ezivulekileyo kunye nezo ze URLs ezigcinwe phakathi kwi "init ushicilelo lwaphantsi"
+Comment[zh_CN]=使用存储在“init script”中的 URL 来初始 Kate 的打开文件列表
+Comment[zh_TW]=初始化 Kate 開啟的檔案清單
diff --git a/kate/filelistloader/katefll_initplugin.h b/kate/filelistloader/katefll_initplugin.h
new file mode 100644
index 0000000..7bfd955
--- /dev/null
+++ b/kate/filelistloader/katefll_initplugin.h
@@ -0,0 +1,46 @@
+ /***************************************************************************
+ katefll_initplugin.h - description
+ -------------------
+ begin : FRE July 12th 2002
+ copyright : (C) 2002 by Joseph Wenninger
+ email : jowenn@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _PLUGIN_KATE_FLL_H
+#define _PLUGIN_KATE_FLL_H
+
+#include <qstring.h>
+
+#include <kate/plugin.h>
+#include <kate/application.h>
+#include <kate/view.h>
+#include <kate/document.h>
+#include <kate/documentmanager.h>
+#include <kate/mainwindow.h>
+#include <kate/viewmanager.h>
+
+class InitPluginKateFileListLoader : public Kate::InitPlugin
+{
+ Q_OBJECT
+
+ public:
+ InitPluginKateFileListLoader (QObject * =0, const char * =0, const QStringList =QStringList());
+ virtual ~InitPluginKateFileListLoader();
+ virtual int actionsKateShouldNotPerformOnRealStartup();
+ virtual int initKate();
+
+ signals:
+ void updateInit();
+
+};
+
+#endif // _PLUGIN_KATE_FLL_H
diff --git a/kate/filelistloader/katefll_plugin.cpp b/kate/filelistloader/katefll_plugin.cpp
new file mode 100644
index 0000000..bbb91a3
--- /dev/null
+++ b/kate/filelistloader/katefll_plugin.cpp
@@ -0,0 +1,241 @@
+/***************************************************************************
+ katefll_plugin.cpp - description
+ -------------------
+ begin : FRE July 12th 2002
+ copyright : (C) 2002 by Joseph Wenninger
+ email : jowenn@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "katefll_plugin.h"
+#include "katefll_plugin.moc"
+
+#include <kate/pluginmanager.h>
+
+#include <qfileinfo.h>
+#include <kgenericfactory.h>
+#include <kaction.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <kurl.h>
+#include <kio/netaccess.h>
+#include <kfiledialog.h>
+#include <ktempfile.h>
+#include <kmessagebox.h>
+
+K_EXPORT_COMPONENT_FACTORY( katefll_plugin, KGenericFactory<PluginKateFileListLoader>( "katefll_loader" ) )
+
+class PluginView : public KXMLGUIClient
+{
+ friend class PluginKateFileListLoader;
+
+ public:
+ Kate::MainWindow *win;
+ KRecentFilesAction *recentFiles;
+};
+
+PluginKateFileListLoader::PluginKateFileListLoader (QObject * parent, const char *name, const QStringList)
+ : Plugin((Kate::Application*)parent,name), PluginViewInterface(),
+ m_config( new KConfig("katefilelistpluginrc") )
+{
+ m_config->setGroup("General");
+ updateInit();
+}
+
+
+PluginKateFileListLoader:: ~PluginKateFileListLoader()
+{
+ m_config->sync();
+ delete m_config;
+}
+
+
+void PluginKateFileListLoader::updateInit()
+{
+ /*if (application()->initPluginManager()->initPlugin())
+ {
+ if (application()->initPluginManager()->initPlugin()->qt_cast("InitPluginKateFileListLoader")) //That's needed, if the plugin is loaded during a configuration change
+ m_saveURL=application()->initPluginManager()->initScript();
+ }
+ else*/ m_saveURL=KURL();
+ m_oldInitURL="";//application()->initPluginManager()->initScript();
+ m_saveAs=false;
+}
+
+void PluginKateFileListLoader::addView(Kate::MainWindow *win)
+{
+ PluginView *view = new PluginView ();
+
+ (void) new KAction( i18n("Open File List..."), 0,
+ this, SLOT( slotOpenList() ),
+ view->actionCollection(), "file_kfllopen" );
+
+ view->recentFiles = new KRecentFilesAction( i18n("Open Recent"), KShortcut::null(),
+ this, SLOT(slotOpenList(const KURL&)), view->actionCollection(),
+ "file_kfllopenrecent");
+ view->recentFiles->loadEntries(m_config, "Recent Files");
+
+ (void) new KAction( i18n("Save File List"), 0,
+ this, SLOT( slotSaveList() ),
+ view->actionCollection(), "file_kfllsave" );
+
+ (void) new KAction( i18n("Save File List As..."), 0,
+ this, SLOT( slotSaveListAs() ),
+ view->actionCollection(), "file_kfllsaveas" );
+
+ view->setInstance (new KInstance("kate"));
+ view->setXMLFile( "plugins/katefll/ui.rc" );
+ win->guiFactory()->addClient (view);
+ view->win = win;
+
+ m_views.append (view);
+}
+
+void PluginKateFileListLoader::removeView(Kate::MainWindow *win)
+{
+ if (m_views.count() == 1) // yeah baby, last view! So save filelist
+ m_views.at(0)->recentFiles->saveEntries(m_config, "Recent Files");
+
+ for (uint z=0; z < m_views.count(); z++)
+ if (m_views.at(z)->win == win)
+ {
+ PluginView *view = m_views.at(z);
+ m_views.remove (view);
+ win->guiFactory()->removeClient (view);
+ delete view;
+ }
+}
+
+void PluginKateFileListLoader::addURLToList(const KURL& url)
+{
+ // add url to all views to make sure all are synced
+ for (uint a = 0; a < m_views.count(); ++a)
+ {
+ m_views.at(a)->recentFiles->addURL(url);
+ }
+}
+
+void PluginKateFileListLoader::removeURLFromList(const KURL& url)
+{
+ // remove url from all views to make sure all are synced
+ for (uint a = 0; a < m_views.count(); ++a) {
+ m_views.at(a)->recentFiles->removeURL(url);
+ }
+}
+
+void PluginKateFileListLoader::slotOpenList()
+{
+ KURL url = KFileDialog::getOpenURL(QString::null,
+ "*.katefl|Kate File List (*.katefl)");
+ if (url.isValid()) // cancel pressed?
+ slotOpenList(url);
+}
+
+void PluginKateFileListLoader::slotOpenList(const KURL& url)
+{
+ if ( url.isValid() && KIO::NetAccess::exists(url, false, 0) )
+ {
+ addURLToList( url );
+ if ( KMessageBox::questionYesNo (0,
+ i18n("Do you want to close all other files first?"),
+ i18n("Kate Filelist Loader"),
+ KStdGuiItem::close(), i18n("Do Not Close"),
+ "kate-filelist-loader-close-other" ) == KMessageBox::Yes )
+ application()->documentManager()->closeAllDocuments();
+
+ QString tmpFile;
+ if( KIO::NetAccess::download( url, tmpFile, 0 ) )
+ {
+ QFile file(tmpFile);
+ file.open(IO_ReadOnly);
+
+ QTextStream t(&file);
+ KURL tmp;
+ while (!t.eof()) {
+ if ( ! tmp.isEmpty() )
+ application()->documentManager()->openURL( tmp );
+
+ tmp = KURL(t.readLine());
+// application()->activeMainWindow()->viewManager()->openURL(KURL(t.readLine()));
+ }
+
+ file.close();
+ if ( ! tmp.isEmpty() )
+ application()->activeMainWindow()->viewManager()->openURL(tmp);
+
+ KIO::NetAccess::removeTempFile( tmpFile );
+ } else application()->documentManager()->openURL(KURL());
+ }
+ else
+ {
+ KMessageBox::error(0, i18n("The selected filelist does not exist or is invalid."));
+ // url not valid -> remove from list
+ removeURLFromList(url);
+ }
+}
+
+void PluginKateFileListLoader::slotSaveList()
+{
+ if (m_saveURL.isValid())
+ {
+ if (m_saveAs)
+ {
+ /* if (m_oldInitURL!=application()->initPluginManager()->initScript())
+ {
+ switch (KMessageBox::questionYesNoCancel(0,i18n("<qt>Since the last time you saved the file list, Kate has been reinitialized by another plugin other than the <B>File List Loader</B>. Do you still want to save the list to %1?</qt>").arg(m_saveURL.prettyURL()),QString::null,KStdGuiItem::save(),KStdGuiItem::discard()))
+ {
+ case KMessageBox::Yes: save(); break;
+ case KMessageBox::No: slotSaveListAs(); break;
+ default: break;
+ }
+ }
+ else*/ save();
+ }
+ else
+ {
+ /*if (m_saveURL!=application()->initPluginManager()->initScript())
+ {
+ switch (KMessageBox::questionYesNoCancel(0,i18n("<qt>Kate has been reinitialized by another plugin other than the <B>File List Loader</B>. Do you still want to save the list to %1?</qt>").arg(m_saveURL.prettyURL()),QString::null,KStdGuiItem::save(),KStdGuiItem::discard()))
+ {
+ case KMessageBox::Yes: save(); break;
+ case KMessageBox::No: slotSaveListAs(); break;
+ default: break;
+ }
+ }
+ else */save();
+ }
+ } else slotSaveListAs();
+}
+
+void PluginKateFileListLoader::save()
+{
+ KTempFile file(locateLocal("tmp", "kate"), "katefll");
+ for (uint i=0;i<application()->documentManager()->documents();i++)
+ {
+ *file.textStream()<<application()->documentManager()->document(i)->url().url()<<endl;
+ }
+ file.close();
+ KIO::NetAccess::upload(file.name(), m_saveURL, 0);
+ file.unlink();
+ addURLToList( m_saveURL );
+}
+
+void PluginKateFileListLoader::slotSaveListAs()
+{
+ KURL url=KFileDialog::getSaveURL(QString::null,"*.katefl|Kate File List (*.katefl)");
+ if (url.isValid())
+ {
+ m_oldInitURL="";//application()->initPluginManager()->initScript();
+ m_saveURL=url;
+ m_saveAs=true;
+ save();
+ }
+}
diff --git a/kate/filelistloader/katefll_plugin.desktop b/kate/filelistloader/katefll_plugin.desktop
new file mode 100644
index 0000000..7c7858b
--- /dev/null
+++ b/kate/filelistloader/katefll_plugin.desktop
@@ -0,0 +1,125 @@
+[Desktop Entry]
+Type=Service
+ServiceTypes=Kate/Plugin
+X-KDE-Library=katefll_plugin
+X-Kate-Version=2.5
+Name=Kate File List Loader
+Name[af]=Kate Lêer Lys Laaier
+Name[ar]=محمّل قوائم ملفات Kate
+Name[az]=Kate Fayl Siyahısı Yükləyicisi
+Name[br]=Karger ar roll restr Kate
+Name[ca]=Carregador de la llista de fitxers per a Kate
+Name[cy]=Llwythydd Rhestr Ffeiliau am Kate
+Name[da]=Kate Fillisteindlæser
+Name[de]=Kate-Dateilistenlader
+Name[el]=Φορτωτής λίστας αρχείων για το Kate
+Name[eo]=Dosierlista ŝargilo por Kodredaktilo
+Name[es]=Cargador de la lista de archivos de Kate
+Name[et]=Kate failinimekirja avaja
+Name[eu]=Kateren fitxategi zerrendaren kargatzailea
+Name[fa]=بارکنندۀ فهرست پروندۀ Kate
+Name[fi]=Kate tiedostolistalatain
+Name[fr]=Chargeur de liste de fichiers pour Kate
+Name[fy]=Kate-triemlistlader
+Name[ga]=Luchtóir Liostaí Comhad Kate
+Name[gl]=Leitor da Lista de Ficheiros para Kate
+Name[he]=טוען רשימות הקבצים של Kate
+Name[hi]=के-एटीई फ़ाइल सूची लोड करने वाला
+Name[hr]=Kate učitavač popisa datoteka
+Name[hu]=Kate fájllista-betöltő
+Name[is]=Kate skráarlistar
+Name[it]=Caricatore di Liste di File (FLL) di Kate
+Name[ja]=Kate ファイルリストローダ
+Name[ka]=Kate ფაილთა სიის ჩამტვირთავი
+Name[kk]=Kate файл тізімін жүктеуіші
+Name[km]=កម្មវិធី​ផ្ទុក​បញ្ជី​ឯកសារ​របស់ Kate
+Name[lt]=Kate bylų sąrašo pakrovėjas
+Name[mk]=Вчитувач на листа на датотеки за Кате
+Name[ms]=Pemuat Senarai Fail Kate
+Name[nb]=Kate Filliste-laster
+Name[nds]=Kate-Dateilistlader
+Name[ne]=केट फाइल सूची लोडर
+Name[nl]=Kate-bestandenlijstlader
+Name[nn]=Fillistelastar for Kate
+Name[nso]=Molaisi wa Palo ya Faele ya Kate
+Name[pa]=ਕੇਟ ਫਾਇਲ ਸੂਚੀ ਲੋਡਰ
+Name[pl]=Program wczytujący listę plików do Kate
+Name[pt]=Leitor da Lista de Ficheiros do Kate
+Name[pt_BR]=Carregador de Lista de Arquivos do Kate
+Name[ro]=Încărcător listă de fişiere Kate
+Name[ru]=Загрузчик списка файлов Kate
+Name[sk]=Kate nahrávač zoznamu súborov
+Name[sl]=Nalagalnik seznama datotek v Kate
+Name[sr]=Учитавач листе фајлова за Kate
+Name[sr@Latn]=Učitavač liste fajlova za Kate
+Name[sv]=Kates fillistladdare
+Name[ta]=கேட் கோப்புப் பட்டியல் உள்ளிடுபவர்
+Name[tg]=Пурборкунандаи рӯйхати файлҳои Kate
+Name[tr]=Kate Dosya Listesi Yükleyici
+Name[uk]=Завантажувач списку файлів Kate
+Name[uz]=Kate fayllar roʻyxatini yuklovchisi
+Name[uz@cyrillic]=Kate файллар рўйхатини юкловчиси
+Name[vi]=Bộ nạp danh sách tập tin Kate
+Name[xh]=Umlayishi Woluhlu Lwefayile ye Kate
+Name[zh_CN]=Kate 文件列表载入器
+Name[zh_TW]=Kate 文字清單載入器
+Comment=Store Kate's file list on disc
+Comment[ar]=تحفظ قوائم ملفات Kate على القرص
+Comment[az]=Store Kate-in disk üstündəki fayl siyahısı
+Comment[bg]=Запис на списъка от отворени файлове на диска
+Comment[bs]=Snima listu datoteka programa Kate na disk
+Comment[ca]=Desa la llista de fitxers de Kate al disc
+Comment[cs]=Uloží seznam souborů Kate na disk
+Comment[cy]=Cadw rhestr ffeiliau Kate ar ddisg
+Comment[da]=Gem Kates filliste på disken
+Comment[de]=Dateiliste von Kate auf Festplatte speichern
+Comment[el]=Αποθήκευση της λίστας αρχείων του Kate στο δίσκο
+Comment[eo]=Konservas dosierliston de Kodredaktilo en disko
+Comment[es]=Guarda en disco una lista de archivos de Kate
+Comment[et]=Salvestab Kate failinimekirja kõvakettale
+Comment[eu]=Gorde Kateren fitxategi zerrenda diskoan
+Comment[fa]=فهرست پروندۀ Kate را بر روی دیسک ذخیره می‌کند.
+Comment[fi]=Tallenna Katen tiedostolista levylle
+Comment[fr]=Enregistrement de la liste des fichiers de Kate sur le disque
+Comment[fy]=triemlist fan Kate op de skiif opslaan
+Comment[ga]=Stóráil an liosta comhad Kate ar an diosca
+Comment[gl]=Guarda a lista de ficheiros para Kate no disco
+Comment[he]=שמירת רשימת הקבצים של Kate על גבי הכונן
+Comment[hi]=डिस्क पर के-एटीई की फ़ाइल सूची भंडारित करता है
+Comment[hr]=Spremanje Kate popisa datoteka na disk
+Comment[hu]=A Kate fájllista elmentése lemezre
+Comment[is]=Geyma skráarlista Kate á diski
+Comment[it]=Salva la lista di file di Kate su disco
+Comment[ja]=Kate のファイルリストをディスクに保存します
+Comment[ka]=ინახავს დისკზე Kate-ის ფაილთა სიას
+Comment[kk]=Kate файлдар тізімін дискіде сақтау
+Comment[km]=​ទុក​បញ្ជី​ឯកសារ​របស់ Kate នៅ​ក្នុង​​ថាស
+Comment[lt]=Išsaugoja Kate bylų sąrašą diske
+Comment[mk]=Ја зачувува листата на датотеки на Кате на диск
+Comment[ms]=Simpan senarai fail Kate atas cakera
+Comment[nb]=Lagre fillistene fra Kate på disken
+Comment[nds]=Sekert de Dateilist vun Kate op de Fastplaat
+Comment[ne]=डिस्कमा केटको फाइल सूची भण्डारण गर्छ
+Comment[nl]=Sla Kate's bestandenlijst op de schijf op
+Comment[nn]=Lagra fillista i Kate
+Comment[nso]=Boloka dipalo tsa faele ya Kate go disc
+Comment[pl]=Zapisanie listy plików Kate na dysku
+Comment[pt]=Guarda a lista de ficheiros do Kate no disco
+Comment[pt_BR]=Armazena Lista de arquivos do Kate no disco
+Comment[ro]=Salvează lista de fişiere Kate pe disc
+Comment[ru]=Сохранить список файлов Kate на диске
+Comment[sk]=Uloží zoznam súborov Kate na disk
+Comment[sl]=Shrani seznam datotek v Kate na disk
+Comment[sr]=Похраните листу фајлова из Kate на диск
+Comment[sr@Latn]=Pohranite listu fajlova iz Kate na disk
+Comment[sv]=Lagra Kates fillista på disk
+Comment[ta]= கேட்ஸ்சின் கோப்புப்பட்டியலை வட்டில் சேமி
+Comment[tg]=Захира кардани рӯйхати файлҳои Kate ба диск
+Comment[tr]=Kate'in dosya listesini diske kaydeder
+Comment[uk]=Запис списку файлів Kate на диск
+Comment[uz]=Kate fayllar roʻyxatini diskda saqlash
+Comment[uz@cyrillic]=Kate файллар рўйхатини дискда сақлаш
+Comment[vi]=Cất giữ danh sách tập tin của Kate trên đĩa
+Comment[xh]=Gcina uluhlu lodweliso lwefayile ye Kate kwi disc
+Comment[zh_CN]=在磁盘上存储 Kate 的文件列表
+Comment[zh_TW]=儲存 Kate 檔案清單於磁碟中
diff --git a/kate/filelistloader/katefll_plugin.h b/kate/filelistloader/katefll_plugin.h
new file mode 100644
index 0000000..81b7bb8
--- /dev/null
+++ b/kate/filelistloader/katefll_plugin.h
@@ -0,0 +1,67 @@
+ /***************************************************************************
+ katefll_plugin.h - description
+ -------------------
+ begin : FRE July 12th 2002
+ copyright : (C) 2002 by Joseph Wenninger
+ email : jowenn@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _PLUGIN_KATE_FLL_H
+#define _PLUGIN_KATE_FLL_H
+
+#include <qstring.h>
+
+#include <kate/plugin.h>
+#include <kate/application.h>
+#include <kate/view.h>
+#include <kate/document.h>
+#include <kate/documentmanager.h>
+#include <kate/mainwindow.h>
+#include <kate/viewmanager.h>
+
+#include <kstandarddirs.h>
+
+class PluginKateFileListLoader : public Kate::Plugin, Kate::PluginViewInterface
+{
+ Q_OBJECT
+
+ public:
+ PluginKateFileListLoader (QObject * =0, const char * =0, const QStringList =QStringList());
+ virtual ~PluginKateFileListLoader();
+
+ void addView (Kate::MainWindow *win);
+ void removeView (Kate::MainWindow *win);
+
+ public slots:
+ void updateInit();
+
+ protected:
+ void addURLToList(const KURL& url);
+ void removeURLFromList(const KURL& url);
+
+ protected slots:
+ void slotOpenList();
+ void slotOpenList(const KURL& url);
+ void slotSaveList();
+ void slotSaveListAs();
+ void save();
+
+ private:
+ QPtrList<class PluginView> m_views;
+ KRecentFilesAction *m_recentFiles;
+ KConfig* m_config;
+ KURL m_oldInitURL;
+ KURL m_saveURL;
+ bool m_saveAs;
+};
+
+#endif // _PLUGIN_KATE_FLL_H
diff --git a/kate/filelistloader/ui.rc b/kate/filelistloader/ui.rc
new file mode 100644
index 0000000..dc7e569
--- /dev/null
+++ b/kate/filelistloader/ui.rc
@@ -0,0 +1,13 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="katefilelistloader" library="libkatefll_plugin" version="3">
+<MenuBar>
+<Menu name="file"><Text>&amp;File</Text>
+ <Menu name="filelistloader" group="print_merge"><Text>&amp;Filelist</Text>
+ <Action name="file_kfllopen" />
+ <Action name="file_kfllopenrecent" />
+ <Action name="file_kfllsave" />
+ <Action name="file_kfllsaveas" />
+ </Menu>
+</Menu>
+</MenuBar>
+</kpartplugin>
diff --git a/kate/filetemplates/Makefile.am b/kate/filetemplates/Makefile.am
new file mode 100644
index 0000000..706d062
--- /dev/null
+++ b/kate/filetemplates/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = plugin templates
diff --git a/kate/filetemplates/katefiletemplates.kateproject b/kate/filetemplates/katefiletemplates.kateproject
new file mode 100644
index 0000000..c7506d8
--- /dev/null
+++ b/kate/filetemplates/katefiletemplates.kateproject
@@ -0,0 +1,15 @@
+[Dir plugin]
+Dirs=
+Files=filetemplates.cpp/filetemplates.h/katefiletemplates.desktop/katetemplate.xml/Makefile.am/ui.rc
+
+[Dir templates]
+Dirs=
+Files=cppgpl.cpp.katetemplate/cppgpl.hh.katetemplate/cpplgpl.cpp.katetemplate/cpplgpl.hh.katetemplate/docbookchapter.xml.katetemplate/html.katetemplate/language.xml.katetemplate/Makefile.am
+
+[Project Dir]
+Dirs=plugin/templates
+Files=Makefile.am
+
+[Project File]
+Name=katefiletemplates
+Type=Default
diff --git a/kate/filetemplates/plugin/Makefile.am b/kate/filetemplates/plugin/Makefile.am
new file mode 100644
index 0000000..7963916
--- /dev/null
+++ b/kate/filetemplates/plugin/Makefile.am
@@ -0,0 +1,25 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+subdirs=src templates
+
+#KDE_ICON = filetemplates
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = katefiletemplates.la
+
+katefiletemplates_la_SOURCES = filetemplates.cpp
+katefiletemplates_la_LIBADD = -lkateinterfaces -lktexteditor $(LIB_KNEWSTUFF)
+katefiletemplates_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+pluginsdir = $(kde_datadir)/kate/plugins/katefiletemplates
+plugins_DATA = ui.rc
+
+syntaxdir = $(kde_datadir)/katepart/syntax
+syntax_DATA = katetemplate.xml
+
+kde_services_DATA = katefiletemplates.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/katefiletemplates.pot
+
diff --git a/kate/filetemplates/plugin/filetemplates.cpp b/kate/filetemplates/plugin/filetemplates.cpp
new file mode 100644
index 0000000..e1eb847
--- /dev/null
+++ b/kate/filetemplates/plugin/filetemplates.cpp
@@ -0,0 +1,1254 @@
+/*
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+ ---
+ Copyright (C) 2004, Anders Lund <anders@alweb.dk>
+ */
+
+//BEGIN Includes
+#include "filetemplates.h"
+
+#include <kate/document.h>
+
+#include <kaboutdata.h>
+#include <kaction.h>
+#include <kactioncollection.h>
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdialogbase.h>
+#include <kdirwatch.h>
+#include <kfiledialog.h>
+#include <kglobal.h>
+#include <kicondialog.h>
+#include <kiconloader.h>
+#include <kio/netaccess.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <knewstuff/knewstuff.h>
+#include <knewstuff/entry.h>
+#include <kprocess.h>
+#include <kstandarddirs.h>
+#include <kstandarddirs.h>
+#include <ktempfile.h>
+#include <kurlrequester.h>
+#include <kuser.h>
+#include <kxmlguifactory.h>
+
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qcursor.h>
+#include <qdatetime.h>
+#include <qdict.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlineedit.h>
+#include <qpopupmenu.h>
+#include <qpushbutton.h>
+#include <qradiobutton.h>
+#include <qregexp.h>
+#include <qstyle.h>
+#include <qwhatsthis.h>
+
+#include <stdlib.h>
+
+#include <kdebug.h>
+#include <ktexteditor/templateinterface.h>
+//END Includes
+
+//BEGIN plugin + factory stuff
+class PluginView : public KXMLGUIClient
+{
+ friend class KateFileTemplates;
+
+ public:
+ Kate::MainWindow *win;
+};
+
+extern "C"
+{
+ void* init_katefiletemplates()
+ {
+ KGlobal::locale()->insertCatalogue("katefiletemplates");
+ return new KatePluginFactory;
+ }
+}
+
+KatePluginFactory::KatePluginFactory()
+{
+ s_instance = new KInstance( "kate" );
+}
+
+KatePluginFactory::~KatePluginFactory()
+{
+ delete s_instance;
+}
+
+QObject* KatePluginFactory::createObject( QObject* parent, const char* name, const char*, const QStringList & )
+{
+ return new KateFileTemplates( parent, name );
+}
+
+KInstance* KatePluginFactory::s_instance = 0L;
+//END
+
+//BEGIN TemplateInfo
+class TemplateInfo
+{
+ public:
+ TemplateInfo( const QString& fn, const QString &t, const QString &g )
+ : filename( fn ), tmplate ( t ), group( g ) { ; }
+ ~TemplateInfo() { ; }
+
+ QString filename;
+ QString tmplate;
+ QString group;
+ QString description;
+ QString author;
+ QString highlight;
+ QString icon;
+};
+//END TemplateInfo
+
+//BEGIN KateFileTemplates
+KateFileTemplates::KateFileTemplates( QObject* parent, const char* name )
+ : Kate::Plugin ( (Kate::Application*)parent, name ),
+ m_actionCollection( new KActionCollection( this, "template_actions", new KInstance("kate") ) )
+{
+ // create actions, so that they are shared.
+ // We plug them into each view's menus, and update them centrally, so that
+ // new plugins can automatically become visible in all windows.
+ (void) new KAction ( i18n("Any File..."), 0, this,
+ SLOT( slotAny() ), m_actionCollection,
+ "file_template_any" );
+ // recent templates
+ m_acRecentTemplates = new KRecentFilesAction( i18n("&Use Recent"), 0, this,
+ SLOT(slotOpenTemplate(const KURL &)),
+ m_actionCollection,
+ "file_templates_recent" );
+ m_acRecentTemplates->loadEntries( kapp->config(), "Recent Templates" );
+
+ // template menu
+ m_dw = new KDirWatch( this, "template_dirwatch" );
+ QStringList dirs = KGlobal::dirs()->findDirs("data", "kate/plugins/katefiletemplates/templates");
+ for ( QStringList::Iterator it = dirs.begin(); it != dirs.end(); ++it )
+ {
+ m_dw->addDir( *it, true );
+ }
+
+ connect( m_dw, SIGNAL(dirty(const QString&)),
+ this, SLOT(updateTemplateDirs(const QString&)) );
+ connect( m_dw, SIGNAL(created(const QString&)),
+ this, SLOT(updateTemplateDirs(const QString&)) );
+ connect( m_dw, SIGNAL(deleted(const QString&)),
+ this, SLOT(updateTemplateDirs(const QString&)) );
+
+ m_templates.setAutoDelete( true );
+ updateTemplateDirs();
+
+ m_user = 0;
+ m_emailstuff = 0;
+}
+
+/**
+ * Called whenever the template dir is changed. Recreates the templates list.
+ */
+void KateFileTemplates::updateTemplateDirs(const QString &d)
+{
+ kdDebug()<<"updateTemplateDirs called with arg "<<d<<endl;
+
+ QStringList templates = KGlobal::dirs()->findAllResources(
+ "data","kate/plugins/katefiletemplates/templates/*.katetemplate",
+ false,true);
+
+ m_templates.clear();
+
+ QRegExp re( "\\b(\\w+)\\s*=\\s*(.+)(?:\\s+\\w+=|$)" );
+ re.setMinimal( true );
+
+ KConfig *config = kapp->config();
+ QStringList hidden;
+ config->readListEntry( "Hidden", hidden, ';' );
+
+ for ( QStringList::Iterator it=templates.begin(); it != templates.end(); ++it )
+ {
+ QFile _f( *it );
+ if ( _f.open( IO_ReadOnly ) )
+ {
+ QString fname = (*it).section( '/', -1 );
+
+ // skip if hidden
+ if ( hidden.contains( fname ) )
+ continue;
+
+ // Read the first line of the file, to get the group/name
+ TemplateInfo *tmp = new TemplateInfo( *it, fname, "Other" );
+ bool trymore ( true );
+ QTextStream stream(&_f);
+ while ( trymore )
+ {
+ QString _line = stream.readLine();
+ trymore = _line.startsWith( "katetemplate:" );
+ if ( ! trymore ) break;
+
+ int pos ( 0 );
+ while ( ( ( pos = re.search( _line, pos ) ) >= 0 ) )
+ {
+ pos += re.cap( 1 ).length();
+ if ( re.cap( 1 ).lower() == "template" )
+ tmp->tmplate = re.cap( 2 );
+ if ( re.cap( 1 ).lower() == "group" )
+ tmp->group = re.cap( 2 );
+ if ( re.cap( 1 ).lower() == "description" )
+ tmp->description = re.cap( 2 );
+ if ( re.cap( 1 ).lower() == "author" )
+ tmp->author = re.cap( 2 );
+ if ( re.cap( 1 ).lower() == "highlight" )
+ tmp->highlight = re.cap( 2 );
+ if ( re.cap( 1 ) == "icon" )
+ tmp->icon = re.cap( 2 );
+ }
+ }
+
+ m_templates.append( tmp );
+ _f.close();
+ }
+ }
+
+ // update the menus of all views
+ for (uint z=0; z < m_views.count(); z++)
+ {
+ PluginView *view = m_views.at(z);
+ refreshMenu( view );
+ }
+}
+
+KateFileTemplates::~KateFileTemplates()
+{
+ m_acRecentTemplates->saveEntries( kapp->config(), "Recent Templates" );
+ delete m_emailstuff;
+ delete m_user;
+}
+
+void KateFileTemplates::addView(Kate::MainWindow *win)
+{
+ PluginView *view = new PluginView ();
+
+ (void) new KAction( i18n("&Manage Templates..."), 0,
+ this, SLOT(slotEditTemplate()),
+ view->actionCollection(), "settings_manage_templates" );
+
+ (void)new KActionMenu( i18n("New From &Template"), "make",
+ view->actionCollection(), "file_new_fromtemplate" );
+ refreshMenu( view );
+
+ view->setInstance (new KInstance("kate"));
+ view->setXMLFile("plugins/katefiletemplates/ui.rc");
+ win->guiFactory()->addClient (view);
+ view->win = win;
+
+ m_views.append (view);
+}
+
+void KateFileTemplates::removeView(Kate::MainWindow *win)
+{
+ for (uint z=0; z < m_views.count(); z++)
+ if (m_views.at(z)->win == win)
+ {
+ PluginView *view = m_views.at(z);
+ m_views.remove (view);
+ win->guiFactory()->removeClient (view);
+ delete view;
+ }
+}
+
+QStringList KateFileTemplates::groups()
+{
+ QStringList l;
+ QString s;
+
+ for ( uint i = 0; i < m_templates.count(); i++ )
+ {
+ s = m_templates.at( i )->group;
+ if ( ! l.contains( s ) )
+ l.append( s );
+ }
+
+ return l;
+}
+
+void KateFileTemplates::refreshMenu( PluginView *v )
+{
+ QPopupMenu *m = (QPopupMenu*)(((KActionMenu*)(v->actionCollection()->action("file_new_fromtemplate")))->popupMenu());
+
+ // clear the menu for templates
+ m->clear();
+
+ // restore it
+ m_actionCollection->action( "file_template_any" )->plug( m );
+ m_acRecentTemplates->plug( m );
+ m->insertSeparator();
+
+ QDict<QPopupMenu> submenus; // ### QMAP
+ for ( uint i = 0; i < m_templates.count(); i++ )
+ {
+ if ( ! submenus[ m_templates.at( i )->group ] )
+ {
+ QPopupMenu *sm = new QPopupMenu();
+ submenus.insert( m_templates.at( i )->group, sm );
+ m->insertItem( m_templates.at( i )->group, sm );
+ }
+ kdDebug()<<"=== ICON: '"<<m_templates.at( i )->icon<<"'"<<endl;
+ if ( ! m_templates.at( i )->icon.isEmpty() )
+ submenus[m_templates.at( i )->group]->insertItem(
+ SmallIconSet( m_templates.at( i )->icon ),
+ m_templates.at( i )->tmplate, this, SLOT(slotOpenTemplate( int )), 0, i );
+ else
+ submenus[m_templates.at( i )->group]->insertItem(
+ m_templates.at( i )->tmplate, this, SLOT(slotOpenTemplate( int )), 0, i );
+
+ // add whatsthis containing the description and author
+ QString w ( m_templates.at( i )->description );
+ if( ! m_templates.at( i )->author.isEmpty() )
+ {
+ w.append( "<p>Author: " );
+ w.append( m_templates.at( i )->author );
+ }
+ if ( ! w.isEmpty() )
+ w.prepend( "<p>" );
+
+ if ( ! w.isEmpty() )
+ submenus[m_templates.at( i )->group]->findItem( i )->setWhatsThis( w );
+ }
+}
+
+/**
+ * Action slot: use any file as a template.
+ * Get a URL and pass it on.
+ */
+void KateFileTemplates::slotAny()
+{
+ if (!application()->activeMainWindow())
+ return;
+
+ // get a URL and pass that to slotOpenTemplate
+ QString fn = KFileDialog::getOpenFileName(
+ "katefiletemplate",
+ QString::null,
+ application()->activeMainWindow()->viewManager()->activeView(),
+ i18n("Open as Template") );
+ if ( ! fn.isEmpty() )
+ slotOpenTemplate( KURL( fn ) );
+}
+
+/**
+ * converts template [index] to a URL and passes that
+ */
+void KateFileTemplates::slotOpenTemplate( int index )
+{
+ kdDebug()<<"slotOpenTemplate( "<<index<<" )"<<endl;
+ if ( index < 0 || (uint)index > m_templates.count() ) return;
+ slotOpenTemplate( KURL( m_templates.at( index )->filename ) );
+}
+
+void KateFileTemplates::slotOpenTemplate( const KURL &url )
+{
+ // check if the file can be opened
+ QString tmpfile;
+ QString filename = url.fileName();
+ kdDebug()<<"file: "<<filename<<endl;
+ if ( KIO::NetAccess::download( url, tmpfile, 0L ) )
+ {
+ bool isTemplate ( filename.endsWith( ".katetemplate" ) );
+ QString docname;
+
+ // open the file and parse for template variables and macros
+ QFile file(tmpfile);
+ if ( ! file.open( IO_ReadOnly ) )
+ {
+ KMessageBox::sorry( application()->activeMainWindow()->viewManager()->activeView(),
+ i18n("<qt>Error opening the file<br><strong>%1</strong><br>for reading. The document will not be created.</qt>").arg(filename),
+ i18n("Template Plugin"), 0 );
+ KIO::NetAccess::removeTempFile( tmpfile );
+ return;
+ }
+
+ // this may take a moment..
+ kapp->setOverrideCursor( QCursor(QCursor::WaitCursor) );
+
+ // create a new document
+ application()->activeMainWindow()->viewManager()->openURL( KURL() );
+ Kate::View *view = application()->activeMainWindow()->viewManager()->activeView();
+ Kate::Document *doc = view->getDoc();
+
+
+ QTextStream stream(&file);
+ QString str, tmp;
+ uint numlines = 0;
+ uint doneheader = 0;
+ while ( !stream.eof() ) {
+ tmp = stream.readLine();
+ if ( ! numlines && isTemplate && tmp.startsWith( "katetemplate:" ) )
+ {
+ // look for document name, highlight
+ if ( ! (doneheader & 1) )
+ {
+ QRegExp reName( "\\bdocumentname\\s*=\\s*(.+)(?:\\s+\\w+\\s*=|$)", false );
+ reName.setMinimal( true );
+ if ( reName.search( tmp ) > -1 )
+ {
+ docname = reName.cap( 1 );
+ docname = docname.replace( "%N", "%1" );
+ doneheader |= 1;
+ }
+ }
+
+ if ( ! (doneheader & 2) )
+ {
+ QRegExp reHl( "\\bhighlight\\s*=\\s*(.+)(?:\\s+\\w+\\s*=|$)", false );
+ reHl.setMinimal( true );
+ kdDebug()<<"looking for a hl mode"<<endl;
+ if ( reHl.search( tmp ) > -1 )
+ {
+ kdDebug()<<"looking for a hl mode -- "<<reHl.cap()<<endl;
+ // this is overly complex, too bad the interface is
+ // not providing a resonable method..
+ QString hlmode = reHl.cap( 1 );
+ uint _i = 0;
+ while ( _i < doc->hlModeCount() )
+ {
+ if ( doc->hlModeName( _i ) == hlmode )
+ {
+ doc->setHlMode( _i );
+ break;
+ }
+ _i++;
+ }
+
+ doneheader |= 2;
+ }
+ }
+
+ continue; // skip this line
+ }
+ if ( numlines )
+ str += "\n";
+ str += tmp;
+ numlines++;
+ }
+ file.close();
+ KIO::NetAccess::removeTempFile( tmpfile );
+
+ uint line, col;
+ line = col = 0;
+
+ if ( ! isTemplate )
+ {
+ int d = filename.findRev('.');
+ docname = i18n("Untitled %1");
+ if ( d > 0 ) docname += filename.mid( d );
+ } else if ( docname.isEmpty() )
+ docname = filename.left( filename.length() - 13 );
+
+ // check for other documents matching this naming scheme,
+ // and do a count before chosing a name for this one
+ QString p = docname;
+ p.replace( "%1", "\\d+" );
+ p.replace( ".", "\\." );
+ p.prepend( "^" );
+ p.append( "$" );
+ QRegExp reName( p );
+
+ int count = 1;
+ for ( uint i=0; i < application()->documentManager()->documents(); i++ )
+ if ( ( reName.search ( application()->documentManager()->document( i )->docName() ) > -1 ) )
+ count++;
+
+ if ( docname.contains( "%1" ) )
+ docname = docname.arg( count );
+
+ doc->setDocName( docname );
+
+ doc->setModified( false );
+
+ kapp->restoreOverrideCursor();
+ m_acRecentTemplates->addURL( url );
+
+ // clean up
+ delete m_user;
+ m_user = 0;
+ delete m_emailstuff;
+ m_emailstuff = 0;
+ if (isTemplate) {
+ KTextEditor::TemplateInterface *ti=KTextEditor::templateInterface(doc);
+ ti->insertTemplateText(0,0,str,QMap<QString,QString>());
+ } else {
+ doc->insertText( 0, 0, str );
+ view->setCursorPosition( line, col );
+ }
+ }
+}
+
+
+QWidget *KateFileTemplates::parentWindow()
+{
+ return dynamic_cast<QWidget*>(application()->activeMainWindow());
+}
+
+// The next part are tools to aid the creation and editing of templates
+// /////////////////////////////////////////////////////////////////////
+// Steps to produce a template
+// * Choose a file to start from (optional)
+// * Ask for a location to store the file -- suggesting either the file
+// directory, or the local template directory.
+// Set the URL
+// * Get the template properties -- provide a dialog, which has filled in what
+// we already know -- the author name, list of known groups
+//
+// Combine those data into the editor, and tell the user to position the cursor
+// and edit the file as she wants to...
+void KateFileTemplates::slotCreateTemplate()
+{
+ KateTemplateWizard w( parentWindow(), this );
+ w.exec();
+
+ updateTemplateDirs();
+}
+
+// Tools for editing the existing templates
+// Editing a template:
+// * Select the template to edit
+// * Open the template
+// * Set the URL to a writable one if required
+void KateFileTemplates::slotEditTemplate()
+{
+ KDialogBase dlg( parentWindow(), "templatemanager", false, i18n("Manage File Templates"), KDialogBase::Close);
+ dlg.setMainWidget( new KateTemplateManager( this, &dlg ) );
+ dlg.exec();
+}
+//END KateFileTemplates
+
+//BEGIN KateTemplateInfoWidget
+// This widget can be used to change the data of a TemplateInfo object
+KateTemplateInfoWidget::KateTemplateInfoWidget( QWidget *parent, TemplateInfo *info, KateFileTemplates *kft )
+ : QWidget( parent ),
+ info( info ),
+ kft( kft )
+{
+ QGridLayout *lo = new QGridLayout( this, 6, 2 );
+ lo->setAutoAdd( true );
+ lo->setSpacing( KDialogBase::spacingHint() );
+
+ QLabel *l = new QLabel( i18n("&Template:"), this );
+ QHBox *hb = new QHBox( this );
+ hb->setSpacing( KDialogBase::spacingHint() );
+ leTemplate = new QLineEdit( hb );
+ l->setBuddy( leTemplate );
+ QWhatsThis::add( leTemplate, i18n("<p>This string is used as the template's name "
+ "and is displayed, for example, in the Template menu. It should describe the "
+ "meaning of the template, for example 'HTML Document'.</p>") );
+ ibIcon = new KIconButton( hb );
+ QWhatsThis::add( ibIcon, i18n(
+ "Press to select or change the icon for this template") );
+
+ l = new QLabel( i18n("&Group:"), this );
+ cmbGroup = new QComboBox( true, this );
+ cmbGroup->insertStringList( kft->groups() );
+ l->setBuddy( cmbGroup );
+ QWhatsThis::add( cmbGroup, i18n("<p>The group is used for chosing a "
+ "submenu for the plugin. If it is empty, 'Other' is used.</p>"
+ "<p>You can type any string to add a new group to your menu.</p>") );
+
+ l = new QLabel( i18n("Document &name:"), this );
+ leDocumentName = new QLineEdit( this );
+ l->setBuddy( leDocumentName );
+ QWhatsThis::add( leDocumentName, i18n("<p>This string will be used to set a name "
+ "for the new document, to display in the title bar and file list.</p>"
+ "<p>If the string contains '%N', that will be replaced with a number "
+ "increasing with each similarly named file.</p><p> For example, if the "
+ "Document Name is 'New shellscript (%N).sh', the first document will be "
+ "named 'New shellscript (1).sh', the second 'New shellscipt (2).sh', and "
+ "so on.</p>") );
+
+ l = new QLabel( i18n( "&Highlight:"), this );
+ btnHighlight = new QPushButton( i18n("None"), this );
+ l->setBuddy( btnHighlight );
+ QWhatsThis::add( btnHighlight, i18n("<p>Select the highlight to use for the "
+ "template. If 'None' is chosen, the property will not be set.</p>") );
+
+ l = new QLabel( i18n("&Description:"), this );
+ leDescription = new QLineEdit( this );
+ l->setBuddy( leDescription );
+ QWhatsThis::add( leDescription, i18n("<p>This string is used, for example, as "
+ "context help for this template (such as the 'whatsthis' help for the "
+ "menu item.)</p>") );
+
+ l = new QLabel( i18n("&Author:"), this );
+ leAuthor = new QLineEdit( this );
+ l->setBuddy( leAuthor );
+ QWhatsThis::add( leAuthor, i18n("<p>You can set this if you want to share your "
+ "template with other users.</p>"
+ "<p>the recommended form is like an Email "
+ "address: 'Anders Lund &lt;anders@alweb.dk&gt;'</p>") );
+
+ // if we have a object ! null
+ if ( info )
+ {
+ if ( ! info->icon.isEmpty() )
+ ibIcon->setIcon( info->icon );
+ leTemplate->setText( info->tmplate );
+ cmbGroup->setCurrentText( info->group );
+ leDescription->setText( info->description );
+ leAuthor->setText( info->author );
+ if ( ! info->highlight.isEmpty() )
+ btnHighlight->setText( info->highlight );
+ }
+
+ // fill in the Hl menu
+ Kate::Document *doc = kft->application()->documentManager()->activeDocument();
+ if ( doc )
+ {
+ QPopupMenu *m = new QPopupMenu( btnHighlight );
+ connect( m, SIGNAL( activated( int ) ), this, SLOT( slotHlSet( int ) ) );
+ QDict<QPopupMenu> submenus;
+ for ( uint n = 0; n < doc->hlModeCount(); n++ )
+ {
+ // create the sub menu if it does not exist
+ QString text( doc->hlModeSectionName( n ) );
+ if ( ! text.isEmpty() )
+ {
+ if ( ! submenus[ text ] )
+ {
+ QPopupMenu *sm = new QPopupMenu();
+ submenus.insert( text, sm );
+ connect( sm, SIGNAL( activated( int ) ), this, SLOT( slotHlSet( int ) ) );
+ m->insertItem( text, sm );
+ }
+
+ // create the item
+ submenus[ text ]->insertItem( doc->hlModeName( n ), n );
+ }
+ else
+ m->insertItem( doc->hlModeName( n ), n );
+ }
+
+ btnHighlight->setPopup( m );
+ }
+}
+
+void KateTemplateInfoWidget::slotHlSet( int id )
+{
+ btnHighlight->setText(
+ kft->application()->documentManager()->activeDocument()->hlModeName( id ) );
+}
+//END KateTemplateInfoWidget
+
+//BEGIN KateTemplateWizard
+// A simple wizard to help create a new template :-)
+KateTemplateWizard::KateTemplateWizard( QWidget *parent, KateFileTemplates *kft )
+ : KWizard( parent ),
+ kft( kft )
+{
+ // Hide the help button for now
+ helpButton()->hide();
+
+ // 1) Optionally choose a file or existing template to start from
+ QWidget *page = new QWidget( this );
+ QGridLayout *glo = new QGridLayout( page );
+ //lo->setAutoAdd( true );
+ glo->setSpacing( KDialogBase::spacingHint() );
+
+ glo->addMultiCellWidget( new QLabel( i18n("<p>If you want to base this "
+ "template on an existing file or template, select the appropriate option "
+ "below.</p>"), page ), 1, 1, 1, 2);
+ bgOrigin = new QButtonGroup( page );
+ bgOrigin->hide();
+ bgOrigin->setRadioButtonExclusive( true );
+
+ QRadioButton *rb = new QRadioButton( i18n("Start with an &empty document" ), page );
+ bgOrigin->insert( rb, 1 );
+ glo->addMultiCellWidget( rb, 2, 2, 1, 2 );
+ rb->setChecked( true );
+
+ rb = new QRadioButton( i18n("Use an existing file:"), page );
+ bgOrigin->insert( rb, 2 );
+ glo->addMultiCellWidget( rb, 3, 3, 1, 2 );
+ int marg = rb->style().subRect( QStyle::SR_RadioButtonIndicator, rb ).width();
+ glo->addItem( new QSpacerItem( marg, 1, QSizePolicy::Fixed ), 4, 1 );
+ urOrigin = new KURLRequester( page );
+ glo->addWidget( urOrigin, 4, 2 );
+
+ rb = new QRadioButton( i18n("Use an existing template:"), page );
+ bgOrigin->insert( rb, 3 );
+ glo->addMultiCellWidget( rb, 5, 5, 1, 2 );
+ glo->addItem( new QSpacerItem( marg, 1, QSizePolicy::Fixed ), 6, 1 );
+ btnTmpl = new QPushButton( page );
+ glo->addWidget( btnTmpl, 6, 2 );
+ QPopupMenu *m = new QPopupMenu( btnTmpl );
+ connect( m, SIGNAL( activated( int ) ), this, SLOT( slotTmplateSet( int ) ) );
+
+ QDict<QPopupMenu> submenus;
+ for ( uint i = 0; i < kft->templates().count(); i++ )
+ {
+ if ( ! submenus[ kft->templates().at( i )->group ] )
+ {
+ QPopupMenu *sm = new QPopupMenu();
+ connect( sm, SIGNAL( activated( int ) ), this, SLOT( slotTmplateSet( int ) ) );
+ submenus.insert( kft->templates().at( i )->group, sm );
+ m->insertItem( kft->templates().at( i )->group, sm );
+ }
+
+ submenus[kft->templates().at( i )->group]->insertItem(
+ kft->templates().at( i )->tmplate, i );
+ }
+ btnTmpl->setPopup( m );
+
+ connect( bgOrigin, SIGNAL(clicked(int)), this, SLOT(slotStateChanged(int)) );
+ connect( urOrigin, SIGNAL(textChanged(const QString&)), this, SLOT(slotStateChanged(const QString&)) );
+
+ glo->addMultiCell( new QSpacerItem( 1, 1, QSizePolicy::Expanding, QSizePolicy::Expanding ), 7, 7, 1, 2 );
+
+ addPage( page, i18n("Choose Template Origin") );
+ kdDebug()<<"=== Adding template origin page at "<<page<<endl;
+ // 2) edit the template properties
+ kti = new KateTemplateInfoWidget( this, 0, kft );
+ kdDebug()<<"=== Adding template info page at "<<kti<<endl;
+ addPage( kti, i18n("Edit Template Properties") );
+ // get liekly values from KTE
+ QMap<QString, QString> map;
+ map[ "fullname" ] = "";
+ map[ "email" ] = "";
+
+ KTextEditor::TemplateInterface::expandMacros( map, parent );
+ QString sFullname = map["fullname"];
+ QString sEmail = map["email"];
+ QString _s = sFullname;
+ if ( ! sEmail.isEmpty() )
+ _s += " <" + sEmail + ">";
+ kti->leAuthor->setText( _s );
+
+ // 3) choose a location - either the template directory (default) or
+ // a custom location
+ page = new QWidget( this );
+ glo = new QGridLayout( page, 7, 2 );
+ glo->setSpacing( KDialogBase::spacingHint() );
+
+ glo->addMultiCellWidget( new QLabel( i18n("<p>Choose a location for the "
+ "template. If you store it in the template directory, it will "
+ "automatically be added to the template menu.</p>"), page ), 1, 1, 1, 2);
+
+ bgLocation = new QButtonGroup( page );
+ bgLocation->hide();
+ bgLocation->setRadioButtonExclusive( true );
+
+ rb = new QRadioButton( i18n("Template directory"), page );
+ bgLocation->insert( rb, 1 );
+ glo->addMultiCellWidget( rb, 2, 2, 1, 2 );
+ rb->setChecked( true );
+
+ glo->addMultiCell( new QSpacerItem( marg, 1, QSizePolicy::Fixed ), 3, 4, 1, 1 );
+ leTemplateFileName = new QLineEdit( page );
+ QLabel *l = new QLabel( leTemplateFileName, i18n("Template &file name:"), page );
+
+ glo->addWidget( l, 3, 2 );
+ glo->addWidget( leTemplateFileName, 4, 2 );
+
+ rb = new QRadioButton( i18n("Custom location:"), page );
+ bgLocation->insert( rb, 2 );
+ glo->addMultiCellWidget( rb, 5, 5, 1, 2 );
+
+ glo->addItem( new QSpacerItem( marg, 1, QSizePolicy::Fixed ), 6, 1 );
+ urLocation = new KURLRequester( page );
+ glo->addWidget( urLocation, 6, 2 );
+
+ connect( bgLocation, SIGNAL(clicked(int)), this, SLOT(slotStateChanged(int)) );
+ connect( urLocation, SIGNAL(textChanged(const QString&)), this, SLOT(slotStateChanged(const QString&)) );
+ connect( leTemplateFileName, SIGNAL(textChanged(const QString &)), this, SLOT(slotStateChanged(const QString &)) );
+
+ glo->addMultiCell( new QSpacerItem( 1, 1, QSizePolicy::Expanding, QSizePolicy::Expanding ), 7, 7, 1, 2 );
+
+ addPage( page, i18n("Choose Location") );
+ kdDebug()<<"=== Adding location page at "<<page<<endl;
+ // 4) Should we edit the text to add some macros, replacing username etc?
+ // This is *only* relevant if the origin is a non-template file.
+ page = new QWidget( this );
+ QVBoxLayout *lo = new QVBoxLayout( page );
+ lo->setSpacing( KDialogBase::spacingHint() );
+
+ lo->addWidget(
+ new QLabel( i18n( "<p>You can replace certain strings in the text with "
+ "template macros.<p>If any of the data below is incorrect or missing, "
+ "edit the data in the KDE email information."), page ) );
+
+ cbRRealname = new QCheckBox( i18n("Replace full name '%1' with the "
+ "'%{fullname}' macro").arg( sFullname ), page );
+ cbRRealname->setEnabled( ! sFullname.isEmpty() );
+ lo->addWidget( cbRRealname );
+
+ cbREmail = new QCheckBox( i18n("Replace email address '%1' with the "
+ "'%email' macro").arg( sEmail ), page);
+ cbREmail->setEnabled( ! sEmail.isEmpty() );
+ lo->addWidget( cbREmail );
+
+ lo->addStretch();
+
+ addPage( page, i18n("Autoreplace Macros") );
+ kdDebug()<<"=== Adding autoreplace page at "<<page<<endl;
+ // 5) Display a summary
+ page = new QWidget( this );
+ lo = new QVBoxLayout( page );
+ lo->setSpacing( KDialogBase::spacingHint() );
+
+ QString s = i18n("<p>The template will now be created and saved to the chosen "
+ "location. To position the cursor put a caret ('^') character where you "
+ "want it in files created from the template.</p>");
+
+ lo->addWidget( new QLabel( s, page ) );
+
+ cbOpenTemplate = new QCheckBox( i18n("Open the template for editing"), page );
+
+ lo->addWidget( cbOpenTemplate );
+
+ lo->addStretch();
+
+ addPage( page, i18n("Create Template") );
+ kdDebug()<<"=== Adding summary page at "<<endl;
+ connect( this, SIGNAL(selected(const QString&)), this, SLOT(slotStateChanged(const QString&)) );
+}
+
+void KateTemplateWizard::slotTmplateSet( int idx )
+{
+ btnTmpl->setText( kft->templates().at( idx )->tmplate );
+ selectedTemplateIdx = idx;
+ slotStateChanged();
+}
+
+/**
+ * When the state of any button in any setup page is changed, set the
+ * enabled state of the next button accordingly.
+ *
+ * Origin:
+ * if file is chosen, the URLRequester must have a valid URL in it
+ * if template is chosen, one must be selected in the menu button.
+ *
+ * Props:
+ * anything goes, but if the user wants to store the template in the template
+ * directory, she should be encouraged to fill in information.
+*/
+void KateTemplateWizard::slotStateChanged()
+{
+ bool sane( true );
+ switch ( indexOf( currentPage() ) )
+ {
+ case 0: // origin
+ {
+ int _t = bgOrigin->selectedId();
+ sane = ( _t == 1 ||
+ ( _t == 2 && ! urOrigin->url().isEmpty() ) ||
+ ( _t == 3 && ! btnTmpl->text().isEmpty() ) );
+ setAppropriate( page(3), _t == 2 );
+ }
+ break;
+ case 1: // template properties
+ // if origin is a existing template, let us try setting some of the properties
+ if ( bgOrigin->selectedId() == 3 )
+ {
+ TemplateInfo *info = kft->templateInfo( selectedTemplateIdx );
+ kti->cmbGroup->setCurrentText( info->group );
+ }
+ break;
+ case 2: // location
+ {
+ // If there is a template name, and the user did not enter text into
+ // the template file name entry, we will construct the name from the
+ // template name.
+ int _t = bgLocation->selectedId();
+ sane = ( ( _t == 1 && (! leTemplateFileName->text().isEmpty() || ! kti->leTemplate->text().isEmpty() ) ) ||
+ ( _t == 2 && ! urLocation->url().isEmpty() ) );
+ }
+ break;
+ case 4: // summary
+ setFinishEnabled( currentPage(), true );
+ break;
+ default:
+ break;
+ }
+ nextButton()->setEnabled( sane );
+}
+
+/**
+ * This will create the new template based on the collected information.
+ */
+void KateTemplateWizard::accept()
+{
+ // TODO check that everything is kosher, so that we can get a save location
+ // etc.
+
+ // check that we can combine a valid URL
+ KURL templateUrl;
+ if ( bgLocation->selectedId() == 1 )
+ {
+ QString suggestion;
+ if ( ! leTemplateFileName->text().isEmpty() )
+ suggestion = leTemplateFileName->text();
+ else
+ suggestion = kti->leTemplate->text();
+
+ suggestion.replace(" ", "");
+
+ if ( ! suggestion.endsWith(".katetemplate") )
+ suggestion.append(".katetemplate");
+
+ QString dir = KGlobal::dirs()->saveLocation( "data", "kate/plugins/katefiletemplates/templates/", true );
+
+ templateUrl = dir + suggestion;
+
+ if ( QFile::exists( templateUrl.path() ) )
+ {
+ if ( KMessageBox::warningContinueCancel( this, i18n(
+ "<p>The file <br><strong>'%1'</strong><br> already exists; if you "
+ "do not want to overwrite it, change the template file name to "
+ "something else.").arg( templateUrl.prettyURL() ),
+ i18n("File Exists"), i18n("Overwrite") )
+ == KMessageBox::Cancel )
+ return;
+ }
+ }
+ else
+ {
+ templateUrl = urLocation->url();
+ }
+
+ QWizard::accept();
+ // The following must be done:
+ // 1) add the collected template information to the top
+ uint ln = 0;
+ QString s, str;
+ if ( ! kti->leTemplate->text().isEmpty() )
+ s += " Template=" + kti->leTemplate->text();
+ if ( ! kti->cmbGroup->currentText().isEmpty() )
+ s += " Group=" + kti->cmbGroup->currentText();
+ if ( ! kti->leDocumentName->text().isEmpty() )
+ s += " Documentname=" + kti->leDocumentName->text();
+ if ( ! kti->ibIcon->icon().isEmpty() )
+ s += " Icon=" + kti->ibIcon->icon();
+ if ( ! kti->btnHighlight->text().isEmpty() )
+ s += " Highlight=" + kti->btnHighlight->text();
+
+ str = "katetemplate:" + s;
+
+ if ( ! (s = kti->leAuthor->text()).isEmpty() )
+ str += "\nkatetemplate: Author=" + s;
+
+ if ( ! (s = kti->leDescription->text()).isEmpty() )
+ str += "\nkatetemplate: Description=" + s;
+
+ // 2) If a file or template is chosen, open that. and fill the data into a string
+ int toid = bgOrigin->selectedId(); // 1 = blank, 2 = file, 3 = template
+ kdDebug()<<"=== create template: origin type "<<toid<<endl;
+ if ( toid > 1 )
+ {
+ KURL u;
+ if ( toid == 2 ) // file
+ u = KURL( urOrigin->url() );
+ else // template
+ u = KURL( kft->templates().at( selectedTemplateIdx )->filename );
+
+ QString tmpfile, tmp;
+ if ( KIO::NetAccess::download( u, tmpfile, 0L ) )
+ {
+ QFile file(tmpfile);
+ if ( ! file.open( IO_ReadOnly ) )
+ {
+ KMessageBox::sorry( this, i18n(
+ "<qt>Error opening the file<br><strong>%1</strong><br>for reading. "
+ "The document will not be created</qt>").arg(u.prettyURL()),
+ i18n("Template Plugin"), 0 );
+
+ KIO::NetAccess::removeTempFile( tmpfile );
+ return;
+ }
+
+ QTextStream stream(&file);
+ QString ln;
+ bool trymore = true;
+ while ( !stream.eof() )
+ {
+ // skip template headers
+ ln = stream.readLine();
+ if ( trymore && ln.startsWith("katetemplate:") )
+ continue;
+
+ trymore = false;
+ tmp += "\n" + ln;
+ }
+
+ file.close();
+ KIO::NetAccess::removeTempFile( tmpfile );
+ }
+
+ if ( toid == 2 ) // file
+ {
+ // 3) if the file is not already a template, escape any "%" and "^" in it,
+ // and try do do some replacement of the authors username, name and email.
+ tmp.replace( QRegExp("%(?=\\{[^}]+\\})"), "\\%" );
+ tmp.replace( QRegExp("\\$(?=\\{[^}]+\\})"), "\\$" );
+ //tmp.replace( "^", "\\^" );
+
+ if ( cbRRealname->isChecked() && ! sFullname.isEmpty() )
+ tmp.replace( sFullname, "%{realname}" );
+
+
+ if ( cbREmail->isChecked() && ! sEmail.isEmpty() )
+ tmp.replace( sEmail, "%{email}" );
+ }
+
+ str += tmp;
+ }
+
+ // 4) Save the document to the suggested URL if possible
+
+ bool succes = false;
+
+ if ( templateUrl.isValid() )
+ {
+ if ( templateUrl.isLocalFile() )
+ {
+ QFile file( templateUrl.path() );
+ if ( file.open(IO_WriteOnly) )
+ {
+ kdDebug()<<"file opened with succes"<<endl;
+ QTextStream stream( &file );
+ stream << str;
+ file.close();
+ succes = true;
+ }
+ }
+ else
+ {
+ KTempFile tmp;
+ QString fn = tmp.name();
+ QTextStream stream( tmp.file() );
+ stream << str;
+ tmp.close();
+
+ succes = KIO::NetAccess::upload( fn, templateUrl, 0 );
+ KIO::NetAccess::removeTempFile( fn );
+ }
+ }
+
+ if ( ! succes )
+ {
+ KMessageBox::sorry( this, i18n(
+ "Unable to save the template to '%1'.\n\nThe template will be opened, "
+ "so you can save it from the editor.").arg( templateUrl.prettyURL() ),
+ i18n("Save Failed") );
+
+ kft->application()->activeMainWindow()->viewManager()->openURL( KURL() );
+ Kate::View *view = kft->application()->activeMainWindow()->viewManager()->activeView();
+ Kate::Document *doc = view->getDoc();
+ doc->insertText( ln++, 0, str );
+ }
+ else if ( cbOpenTemplate->isChecked() )
+ kft->application()->activeMainWindow()->viewManager()->openURL( templateUrl );
+}
+//END KateTemplateWizard
+
+//BEGIN KateTemplateItem
+class KateTemplateItem : public KListViewItem
+{
+ public:
+ KateTemplateItem( KListViewItem *parent, TemplateInfo *templateinfo )
+ : KListViewItem( parent, templateinfo->tmplate ), templateinfo( templateinfo )
+ {
+ }
+ TemplateInfo *templateinfo;
+};
+//END KateTemplateItem
+
+//BEGIN KFTNewStuff
+class KFTNewStuff : public KNewStuff {
+ public:
+ KFTNewStuff( const QString &type, QWidget *parent=0 ) : KNewStuff( type, parent ), m_win( parent ) {}
+ ~KFTNewStuff() {}
+ bool install( const QString &/*filename*/ ) { return true; }
+ bool createUploadFile( const QString &/*filename*/ ) { return false; }
+ QString downloadDestination( KNS::Entry *entry )
+ {
+ QString dir = KGlobal::dirs()->saveLocation( "data", "kate/plugins/katefiletemplates/templates/", true );
+ return dir.append( entry->payload().filename() );
+ }
+
+ private:
+ QWidget *m_win;
+};
+//END KTNewStuff
+
+//BEGIN KateTemplateManager
+KateTemplateManager::KateTemplateManager( KateFileTemplates *kft, QWidget *parent, const char *name )
+ : QWidget( parent, name )
+ , kft( kft )
+{
+ QGridLayout *lo = new QGridLayout( this, 2, 6 );
+ lo->setSpacing( KDialogBase::spacingHint() );
+ lvTemplates = new KListView( this );
+ lvTemplates->addColumn( i18n("Template") );
+ lo->addMultiCellWidget( lvTemplates, 1, 1, 1, 6 );
+ connect( lvTemplates, SIGNAL(selectionChanged()), this, SLOT(slotUpdateState()) );
+
+ btnNew = new QPushButton( i18n("New..."), this );
+ connect( btnNew, SIGNAL(clicked()), kft, SLOT(slotCreateTemplate()) );
+ lo->addWidget( btnNew, 2, 2 );
+
+ btnEdit = new QPushButton( i18n("Edit..."), this );
+ connect( btnEdit, SIGNAL(clicked()), this, SLOT( slotEditTemplate()) );
+ lo->addWidget( btnEdit, 2, 3 );
+
+ btnRemove = new QPushButton( i18n("Remove"), this );
+ connect( btnRemove, SIGNAL(clicked()), this, SLOT(slotRemoveTemplate()) );
+ lo->addWidget( btnRemove, 2, 4 );
+
+ btnUpload = new QPushButton( i18n("Upload..."), this );
+ connect( btnUpload, SIGNAL(clicked()), this, SLOT(slotUpload()) );
+ lo->addWidget( btnUpload, 2, 5 );
+
+ btnDownload = new QPushButton( i18n("Download..."), this );
+ connect( btnDownload, SIGNAL(clicked()), this, SLOT(slotDownload()) );
+ lo->addWidget( btnDownload, 2, 6 );
+
+ lo->setColStretch( 1, 1 );
+
+ reload();
+ slotUpdateState();
+}
+
+void KateTemplateManager::apply()
+{
+ // if any files were removed, delete them unless they are not writeable, in
+ // which case a link .filename should be put in the writable directory.
+}
+
+void KateTemplateManager::reload()
+{
+ lvTemplates->clear();
+
+ QDict<KListViewItem> groupitems; // FIXME QMAP
+ for ( uint i = 0; i < kft->templates().count(); i++ )
+ {
+ if ( ! groupitems[ kft->templates().at( i )->group ] )
+ {
+ groupitems.insert( kft->templates().at( i )->group , new KListViewItem( lvTemplates, kft->templates().at( i )->group ) );
+ groupitems[ kft->templates().at( i )->group ]->setOpen( true );
+ }
+ new KateTemplateItem( groupitems[ kft->templates().at( i )->group ], kft->templates().at( i ) );
+ }
+}
+
+void KateTemplateManager::slotUpdateState()
+{
+ // enable/disable buttons wrt the current item in the list view.
+ // we are in single selection mode, so currentItem() is selected.
+ bool cool = false;
+ if ( dynamic_cast<KateTemplateItem*>( lvTemplates->currentItem() ) )
+ cool = true;
+
+ btnEdit->setEnabled( cool );
+ btnRemove->setEnabled( cool );
+ btnUpload->setEnabled( cool );
+}
+
+void KateTemplateManager::slotEditTemplate()
+{
+ // open the template file in kate
+ // TODO show the properties dialog, and modify the file if the data was changed.
+ KateTemplateItem *item = dynamic_cast<KateTemplateItem*>( lvTemplates->currentItem() );
+ if ( item )
+ kft->application()->activeMainWindow()->viewManager()->openURL( item->templateinfo->filename );
+}
+
+void KateTemplateManager::slotRemoveTemplate()
+{
+ KateTemplateItem *item = dynamic_cast<KateTemplateItem*>( lvTemplates->currentItem() );
+ if ( item )
+ {
+ // Find all instances of filename, and try to delete them.
+ // If it fails (there was a global, unwritable instance), add to a
+ // list of removed templates
+ KConfig *config = kapp->config();
+ QString fname = item->templateinfo->filename.section( '/', -1 );
+ QStringList templates = KGlobal::dirs()->findAllResources(
+ "data", fname.prepend( "kate/plugins/katefiletemplates/templates/" ),
+ false,true);
+ int failed = 0;
+ int removed = 0;
+ for ( QStringList::Iterator it=templates.begin(); it!=templates.end(); ++it )
+ {
+ if ( ! QFile::remove(*it) )
+ failed++;
+ else
+ removed++;
+ }
+
+ if ( failed )
+ {
+ config->setGroup( "KateFileTemplates" );
+ QStringList l;
+ config->readListEntry( "Hidden", l, ';' );
+ l << fname;
+ config->writeEntry( "Hidden", l, ';' );
+ }
+
+ // If we removed any files, we should delete a KNewStuff key
+ // for this template, so the template is installable again.
+ // ### This assumes that the knewstuff name is similar to the template name.
+ kdDebug()<<"trying to remove knewstuff key '"<<item->templateinfo->tmplate<<"'"<<endl;
+ config->setGroup("KNewStuffStatus");
+ config->deleteEntry( item->templateinfo->tmplate );
+
+
+ kft->updateTemplateDirs();
+ reload();
+ }
+}
+
+// KNewStuff upload
+void KateTemplateManager::slotUpload()
+{
+ // TODO something nicer, like preparing the meta data from the template info.
+ KateTemplateItem *item = dynamic_cast<KateTemplateItem*>( lvTemplates->currentItem() );
+ if ( item )
+ {
+ KFTNewStuff *ns = new KFTNewStuff( "katefiletemplates/template", this );
+ ns->upload( item->templateinfo->filename, QString::null );
+ }
+}
+
+// KNewStuff download
+void KateTemplateManager::slotDownload()
+{
+ KFTNewStuff *ns = new KFTNewStuff( "katefiletemplates/template", this );
+ ns->download();
+
+ kft->updateTemplateDirs();
+ reload();
+}
+
+//END KateTemplateManager
+
+// kate: space-indent on; indent-width 2; replace-tabs on;
+
+#include "filetemplates.moc"
diff --git a/kate/filetemplates/plugin/filetemplates.h b/kate/filetemplates/plugin/filetemplates.h
new file mode 100644
index 0000000..0eedc38
--- /dev/null
+++ b/kate/filetemplates/plugin/filetemplates.h
@@ -0,0 +1,258 @@
+/*
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+ ---
+ Copyright (C) 2004, Anders Lund <anders@alweb.dk>
+ */
+
+#ifndef _PLUGIN_KATE_FILETEMPLATES_H_
+#define _PLUGIN_KATE_FILETEMPLATES_H_
+
+#include <kate/application.h>
+#include <kate/documentmanager.h>
+#include <kate/document.h>
+#include <kate/mainwindow.h>
+#include <kate/plugin.h>
+#include <kate/view.h>
+#include <kate/viewmanager.h>
+
+#include <klibloader.h>
+#include <klocale.h>
+#include <kurl.h>
+#include <kwizard.h>
+
+#include <qptrlist.h>
+
+class KatePluginFactory : public KLibFactory
+{
+ Q_OBJECT
+
+ public:
+ KatePluginFactory();
+ virtual ~KatePluginFactory();
+
+ virtual QObject* createObject( QObject* parent = 0, const char* pname = 0, const char* name = "QObject", const QStringList &args = QStringList() );
+
+ private:
+ static KInstance* s_instance;
+};
+
+/**
+ * This template system has the following features:
+ * It allows to create new documents that allready has some contents and a meaningfull
+ * document name.
+ *
+ * Any file can b e used as a template.
+ *
+ * Special template files can contain macros that are expanded when the document
+ * is created, and the cursor can be positioned in the new document.
+ *
+ * A menu is provided, allowing access to templates located in the KDE file system
+ * in the plugins data directory. The menu is dynamically updated.
+ *
+ * Simple tools are provided for creating/eidting templates.
+ *
+ * The main class has methods to do all of the work related to use file templates:
+ * @li Maintain the Template menu (File, New from Template)
+ * @li Load templates
+ * @li Provide simple tools for creating/editing templates
+*/
+class KateFileTemplates : public Kate::Plugin, public Kate::PluginViewInterface
+{
+ Q_OBJECT
+
+ public:
+ KateFileTemplates( QObject* parent = 0, const char* name = 0 );
+ virtual ~KateFileTemplates();
+
+ void addView (Kate::MainWindow *win);
+ void removeView (Kate::MainWindow *win);
+
+ /**
+ * @return a list of unique group names in the template list.
+ */
+ QStringList groups();
+
+ /**
+ * @return a pointer to the templateinfo collection
+ */
+ QPtrList<class TemplateInfo> templates() { return m_templates; }
+
+ /**
+ * @return a pointer to the templateInfo for the template at @p index
+ * in the template collection.
+ */
+ class TemplateInfo *templateInfo( int index ) { return m_templates.at( index ); }
+
+ /**
+ * @return a a pointer to the active main window
+ */
+ QWidget * parentWindow();
+
+ public slots:
+ /**
+ * Update the template collection by rereading the template
+ * directories. Also updates the menu.
+ */
+ void updateTemplateDirs(const QString &s=QString::null);
+
+ private slots:
+ /**
+ * Show a file dialog, so that any file can be opened as a template.
+ * If the chosen file has the .katetemplate extension, it is parsed,
+ * otherwise it is just copied to the new document.
+ */
+ void slotAny();
+
+ /**
+ * Open the template found at @p index in the colletion
+ */
+ void slotOpenTemplate( int index );
+
+ /**
+ * Open the file at @p url as a template. If it has the .katetemplate
+ * extension it is parsed, otherwise its content is just copied to the new
+ * document.
+ */
+ void slotOpenTemplate( const KURL &url );
+
+ void slotEditTemplate();
+
+ /**
+ * Show a KateTemplateWizard wizard.
+ */
+ void slotCreateTemplate();
+
+ private:
+ void refreshMenu( class PluginView */*class QPopupMenu **/ );
+
+ QPtrList<class PluginView> m_views;
+ class KActionCollection *m_actionCollection;
+ class KRecentFilesAction *m_acRecentTemplates;
+ QPtrList<class TemplateInfo> m_templates;
+ class KDirWatch *m_dw;
+ class KUser *m_user;
+ class KConfig *m_emailstuff;
+ class KActionMenu *m_menu;
+};
+
+class TemplateInfo;
+
+/**
+ * This widget provide a GUI for editing template properties.
+ */
+class KateTemplateInfoWidget : public QWidget
+{
+ Q_OBJECT
+ public:
+ KateTemplateInfoWidget( QWidget *parent=0, TemplateInfo *info=0, KateFileTemplates *kft=0 );
+ ~KateTemplateInfoWidget() {}
+
+ TemplateInfo *info;
+
+ class QLineEdit *leTemplate, *leDocumentName, *leDescription, *leAuthor;
+ class QComboBox *cmbGroup;
+ class QPushButton *btnHighlight;
+ class KIconButton *ibIcon;
+
+ private slots:
+ void slotHlSet( int id );
+
+ private:
+ KateFileTemplates *kft;
+};
+
+/**
+ * This wizard helps creating a new template, which is then opened for the user
+ * to edit.
+ * Basically, the user is offered to select an existing file or template to start
+ * from, set template properties, and if a file is loaded, some replacements is
+ * done in the text:
+ * @li % characters are protected (% -> %%)
+ * @li ^ characters are protected (with a backsplash)
+ * @li The users name, username and email is replaced by the corresponding macros
+ * If so chosen, the file is saved to either the template directory, or a location
+ * set by the user.
+*/
+class KateTemplateWizard : public KWizard
+{
+ friend class KateFileTemplates;
+ Q_OBJECT
+ public:
+ KateTemplateWizard( QWidget* parent, KateFileTemplates *ktf );
+ ~KateTemplateWizard() {}
+
+ public slots:
+ void accept();
+
+ private slots:
+ void slotTmplateSet( int );
+ void slotStateChanged();
+ void slotStateChanged( int ) { slotStateChanged(); }
+ void slotStateChanged( const QString& ) { slotStateChanged(); }
+
+ private:
+ KateFileTemplates *kft;
+ KateTemplateInfoWidget *kti;
+
+ // origin page
+ class QButtonGroup *bgOrigin;
+ class KURLRequester *urOrigin;
+ class QPushButton *btnTmpl;
+ uint selectedTemplateIdx;
+
+ // location page
+ class QButtonGroup *bgLocation;
+ class KURLRequester *urLocation;
+ class QLineEdit *leTemplateFileName;
+
+ // macro replacement page
+ class QCheckBox *cbRRealname, *cbRUsername, *cbREmail;
+ QString sFullname, sEmail/*, sUsername*/;
+
+ // final
+ class QCheckBox *cbOpenTemplate;
+};
+
+class KateTemplateManager : public QWidget
+{
+ Q_OBJECT
+ public:
+ KateTemplateManager( KateFileTemplates *kft=0, QWidget *parent=0, const char *name=0 );
+ ~KateTemplateManager() {}
+
+ public slots:
+ void apply();
+ void reload();
+ void reset() { reload(); }
+
+ private slots:
+ void slotUpload();
+ void slotDownload();
+ void slotUpdateState();
+ void slotEditTemplate();
+ void slotRemoveTemplate();
+
+ private:
+ class KListView *lvTemplates;
+ class QPushButton *btnNew, *btnEdit, *btnRemove, *btnDownload, *btnUpload;
+ KateFileTemplates *kft;
+ QPtrList<class TemplateInfo> *remove;
+
+};
+
+#endif // _PLUGIN_KATE_FILETEMPLATES_H_
+// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/kate/filetemplates/plugin/katefiletemplates.desktop b/kate/filetemplates/plugin/katefiletemplates.desktop
new file mode 100644
index 0000000..252adaa
--- /dev/null
+++ b/kate/filetemplates/plugin/katefiletemplates.desktop
@@ -0,0 +1,113 @@
+[Desktop Entry]
+Type=Service
+ServiceTypes=Kate/Plugin
+X-Kate-Version=2.5
+X-KDE-Library=katefiletemplates
+Name=Kate File Templates
+Name[bs]=Kate predlošci datoteka
+Name[ca]=Plantilles de fitxer Kate
+Name[cs]=Souborové šablony Kate
+Name[da]=Kate filskabeloner
+Name[de]=Kate-Dateivorlagen
+Name[el]=Αρχείο προτύπων του Kate
+Name[eo]=Dosieraj ŝablonoj por Kodredaktilo
+Name[es]=Plantillas de archivos de Kate
+Name[et]=Kate failimallid
+Name[eu]=Kateren txantiloi fitxategiak
+Name[fa]=قالبهای پروندۀ Kate
+Name[fi]=Kate tiedostomallit
+Name[fr]=Fichier de modèle pour Kate
+Name[fy]=Kate Triemsjabloanen
+Name[ga]=Teimpléid Kate
+Name[gl]=Modelos de Ficheiro para Kate
+Name[he]= תבניות הטקסט של Kate
+Name[hi]=के-एटीई फ़ाइल टैम्पलेट्स
+Name[hr]=Predlošci datoteka za Kate
+Name[hu]=Kate fájlsablonok
+Name[is]=Kate skráasniðmát
+Name[it]=File template di Kate
+Name[ja]=Kate ファイルテンプレート
+Name[ka]=Kate ფაილის შაბლონები
+Name[kk]=Kate файл үлгілері
+Name[km]=ពុម្ព​ឯកសារ Kate​
+Name[lt]=Kate bylų šablonai
+Name[mk]=Шаблони на датотеки за Кате
+Name[ms]=Templat Fail Kate
+Name[nb]=Kate Filmaler
+Name[nds]=Kate-Dateivörlagen
+Name[ne]=केट फाइल टेम्प्लेटहरू
+Name[nl]=Kate Bestandsjablonen
+Name[nn]=Kate Filmalar
+Name[pa]=ਕੇਟ ਫਾਇਲ ਨਮੂਨੇ
+Name[pl]=Wzorce plików dla Kate
+Name[pt]=Modelos de Ficheiro do Kate
+Name[pt_BR]=Modelos de Arquivo do Kate
+Name[ru]=Шаблоны Kate
+Name[sk]=Šablóny súborov pre Kate
+Name[sl]=Datotečne predloge za Kate
+Name[sr]=Шаблони фајлова за Kate
+Name[sr@Latn]=Šabloni fajlova za Kate
+Name[sv]=Kate-filmallar
+Name[ta]=கேட் உரை வார்ப்புரு
+Name[tg]=Нусхаҳои Kate
+Name[tr]=Kate Dosya Şablonları
+Name[uk]=Шаблони файлів для Kate
+Name[uz]=Kate fayl namunalari
+Name[uz@cyrillic]=Kate файл намуналари
+Name[vi]=Mẫu tập tin Kate
+Name[zh_CN]=Kate 文件模板
+Name[zh_TW]=Kate 檔案樣本
+Comment=Create new files from templates in the Kate text editor
+Comment[bg]=Създаване на нови файлове от шаблони
+Comment[bs]=Napravi nove datoteke iz šablona u Kate editoru teksta
+Comment[ca]=Crea fitxers nous des de les plantilles de l'editor de text Kate
+Comment[cs]=Vytváří z šablon nové soubory v textovém editoru Kate
+Comment[da]=Lav nye filer ud fra skabeloner i teksteditoren Kate
+Comment[de]=Erstellt neue Dateien aus Vorlagen im Kate Texteditor
+Comment[el]=Δημιουργία νέων αρχείων από πρότυπα στον επεξεργαστή κειμένου Kate
+Comment[eo]=Kreas novajn dosierojn el ŝablonoj en Kodredaktilo
+Comment[es]=Crea archivos nuevos a partir de plantillas en el editor de texto Kate
+Comment[et]=Uute failide loomine mallide põhjal tekstiredaktoris Kate
+Comment[eu]=Sortu fitxategi berriak txantiloietatik Kate testu editorean
+Comment[fa]=ایجاد پرونده‌های جدید از قالبهای درون ویرایشگر متن
+Comment[fi]=Luo uudet tiedostot Kate-tekstieditorin malleista
+Comment[fr]=Création de nouveaux fichiers à partir de modèles dans l'éditeur de texte de Kate
+Comment[fy]=Makket nije triemmen fanút sjabloanen binnen de Kate tekstferwurker
+Comment[ga]=Cruthaigh comhaid nua ó theimpléid in eagarthóir téacs Kate
+Comment[gl]=Criar novos ficheiros a partir de modelos no editor de textKate
+Comment[hi]=टैम्पलेट्स के द्वारा केएटीई पाठ संपादक में नया फ़ाइल बनाएँ
+Comment[hr]=Izrađuje nove datoteke iz predložaka unutar Kate uređivača
+Comment[hu]=Új fájlok létrehozása sablon alapján a Kate szövegszerkesztőben
+Comment[is]=Búa til nýjar skrár úr sniðmátum í kate ritlinum
+Comment[it]=Crea nuovi file dai template nell'editor di testi di Kate
+Comment[ja]=テンプレートから新しいファイルを作成します
+Comment[ka]=ახალი ფაილების შექმნა Kate ტექსტური რედაქტორიდან
+Comment[kk]=Kate мәтін редакторында үлгілер бойынша жаңа файлдарды құру
+Comment[km]=បង្កើត​ឯកសារ​ថ្មី​ចេញ​ពី​ពុម្ព​នៅ​ក្នុង​កម្មវិធី​​និពន្ធ​​អត្ថបទ​របស់ Kate
+Comment[lt]=Kurkite naujas bylas iš Kate teksto rengyklės šablonų
+Comment[mk]=Креира нови датотеки од шаблони во уредувачот на текст Кате
+Comment[ms]=Cipta fail bari dari templat dalam editor teks Kate
+Comment[nb]=Lag nye filer fra maler i redigeringsprogrammet Kate
+Comment[nds]=In Kate niege Dateien ut Vörlagen opstellen
+Comment[ne]=केट पाठ सम्पादकमा टेम्प्लेटहरूबाट नयाँ फाइल सिर्जना गर्छ
+Comment[nl]=Creëert nieuwe bestanden vanuit sjablonen binnen de Kate tekstverwerker
+Comment[nn]=Lag nye filer frå malar i redigeringsprogrammet Kate
+Comment[pl]=Tworzy nowe pliki ze wzorców w edytorze tekstów Kate
+Comment[pt]=Criar novos ficheiro a partir de modelos no editor de texto Kate
+Comment[pt_BR]=Cria arquivos através dos modelos no editor de textos Kate
+Comment[ru]=Создание новых файлов из шаблонов в Kate
+Comment[sk]=Vytváranie nových súborov zo štablón v textovom editore Kate
+Comment[sl]=Ustvari nove datoteke iz predlog v urejevalniku besedil Kate
+Comment[sr]=Прави нове фајлове према шаблону у уређивачу текста Kate
+Comment[sr@Latn]=Pravi nove fajlove prema šablonu u uređivaču teksta Kate
+Comment[sv]=Skapa nya filer från mallar i texteditorn Kate
+Comment[ta]=புதிய கோப்பினை கேட் உரை தொகுப்பியின் வார்ப்புருவில் இருந்து உருவாக்கவும்
+Comment[tg]=Эҷод кардани файлҳои нав аз нусхаҳо ба Kate
+Comment[tr]=Kate metin düzenleyicide hazır şablonlardan dosya oluşturma
+Comment[uk]=Створення нових файлів з шаблонів в текстовому редакторі Kate
+Comment[uz]=Namunalardan Kate tahrirchida fayl yaratish
+Comment[uz@cyrillic]=Намуналардан Kate таҳрирчида файл яратиш
+Comment[vi]=Tạo tập tin mới từ mẫu trong trình soạn thảo văn bản Kate
+Comment[zh_CN]=在 Kate 文本编辑器中根据模板创建新文件
+Comment[zh_TW]=在 Kate 文字編輯器中從樣本建立新檔案
+author=Anders Lund, anders@alweb.dk
diff --git a/kate/filetemplates/plugin/katetemplate.xml b/kate/filetemplates/plugin/katetemplate.xml
new file mode 100644
index 0000000..0748481
--- /dev/null
+++ b/kate/filetemplates/plugin/katetemplate.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE language SYSTEM "language.dtd">
+<!--
+ This file is part of KDE's kate project.
+
+ (C) 2004 by Anders Lund <anders@alweb.dk>
+ (C) 2004 by Joseph Weninger <jowenn@kde.org>
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+-->
+<!--
+ This file is highlighting kate template files.
+ TODO equal signs will disturb in the template header (property values)
+-->
+<language version="1.00" kateversion="2.3" name="Kate File Template" section="Markup" extensions="*.katetemplate" mimetype="" author="Anders Lund" licence="GPL">
+ <highlighting>
+
+ <list name="properties">
+ <item>template</item>
+ <item>group</item>
+ <item>documentname</item>
+ <item>author</item>
+ <item>description</item>
+ <item>highlight</item>
+ <item>icon</item>
+ </list>
+ <list name="macros" casesensitive="1">
+ <item>realname</item>
+ <item>username</item>
+ <item>email</item>
+ <item>organisation</item>
+ <item>date</item>
+ <item>time</item>
+ <item>datetime</item>
+ <item>month</item>
+ <item>year</item>
+ </list>
+
+ <contexts>
+ <context attribute="Normal Text" lineEndContext="#pop" name="Normal Text">
+ <RegExpr attribute="Header Keyword" context="header" String="^katetemplate:" />
+ <RegExpr attribute="Normal" context="escape" String="\\[$%]\{[^}\s]+\}" lookAhead="true" />
+ <RegExpr attribute="Macro" context="macros" String="[$%]\{[^}\s]+\}" lookAhead="true"/>
+ <Detect2Chars attribute="Escape" context="#stay" char="\" char1="^" />
+ <DetectChar attribute="Keyword" context="#stay" char="^" />
+ </context>
+ <context attribute="Comment" lineEndContext="#pop" name="header">
+ <keyword attribute="Property" context="headervalue" String="properties" />
+ </context>
+ <context attribute="Property Value" lineEndContext="#pop#pop" name="headervalue">
+ <DetectChar attribute="Header Text" context="#stay" char="=" />
+ <RegExpr context="#pop" String=" \w+\s*=" lookAhead="true" />
+ </context>
+ <context attribute="Error" lineEndContext="#pop" name="macros">
+ <Detect2Chars attribute="Keyword" context="#stay" char="$" char1="{"/>
+ <Detect2Chars attribute="Keyword" context="#stay" char="%" char1="{"/>
+ <DetectChar attribute="Keyword" context="#pop" char="}" />
+ <RegExpr attribute="Macro" context="#stay" String="[^}\s]+" />
+ <keyword attribute="Keyword" context="#stay" String="macros" />
+ </context>
+ <context attribute="Escape" lineEndContext="#stay" name="escape">
+ <Detect2Chars attribute="Escape" context="#pop" char="\" char1="$"/>
+ </context>
+ </contexts>
+
+
+ <itemDatas>
+ <itemData name="Normal Text" defStyleNum="dsNormal" />
+ <itemData name="Keyword" defStyleNum="dsKeyword" />
+ <itemData name="Escape" defStyleNum="dsOthers" />
+ <itemData name="Macro" defStyleNum="dsDataType" />
+ <itemData name="Error" defStyleNum="dsError" />
+ <itemData name="Header Keyword" defStyleNum="dsKeyword" backgroundColor="#eee" />
+ <itemData name="Property" defStyleNum="dsDecVal" bold="true" backgroundColor="#eee"/>
+ <itemData name="Property Value" defStyleNum="dsString" backgroundColor="#eee"/>
+ <itemData name="Comment" defStyleNum="dsComment" backgroundColor="#eee" />
+ <itemData name="Header Text" defStyleNum="dsNormal" backgroundColor="#eee" />
+ </itemDatas>
+ </highlighting>
+ <general>
+ <keywords casesensitive="0"/>
+ </general>
+</language>
+<!-- kate: space-indent on; indent-width 2; replace-tabs on; -->
diff --git a/kate/filetemplates/plugin/ui.rc b/kate/filetemplates/plugin/ui.rc
new file mode 100644
index 0000000..cbf18c8
--- /dev/null
+++ b/kate/filetemplates/plugin/ui.rc
@@ -0,0 +1,15 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="katefiletemplates" library="libkatefiletemplates" version="2">
+<MenuBar>
+ <Menu name="file"><text>&amp;File</text>
+ <Action name="file_new_fromtemplate" group="new_merge" />
+ </Menu>
+ <Menu name="settings"><text>&amp;Settings</text>
+ <Separator/>
+ <Action name="settings_manage_templates" />
+ </Menu>
+</MenuBar>
+ <Toolbar name="mainToolBar"><text>Main Toolbar</text>
+ <Action name="file_new_fromtemplate" group="file_open" />
+</Toolbar>
+</kpartplugin>
diff --git a/kate/filetemplates/templates/Makefile.am b/kate/filetemplates/templates/Makefile.am
new file mode 100644
index 0000000..54f91aa
--- /dev/null
+++ b/kate/filetemplates/templates/Makefile.am
@@ -0,0 +1,5 @@
+templatesdir=$(kde_datadir)/kate/plugins/katefiletemplates/templates
+templates_DATA=html.katetemplate \
+ cpplgpl.cpp.katetemplate cpplgpl.hh.katetemplate \
+ cppgpl.cpp.katetemplate cppgpl.hh.katetemplate \
+ docbookchapter.xml.katetemplate language.xml.katetemplate \ No newline at end of file
diff --git a/kate/filetemplates/templates/cppgpl.cpp.katetemplate b/kate/filetemplates/templates/cppgpl.cpp.katetemplate
new file mode 100644
index 0000000..a479615
--- /dev/null
+++ b/kate/filetemplates/templates/cppgpl.cpp.katetemplate
@@ -0,0 +1,24 @@
+katetemplate: template=C++ Source File (GPL) group=Source Code documentname=New%N.cpp highlight=C++
+katetemplate: description=A very simple GPL C++ source file
+katetemplate: author= Anders Lund <anders@alweb.dk>
+/*
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+ ---
+ Copyright (C) %{year}, %{fullname} <%{email}>
+ */
+
+${cursor} \ No newline at end of file
diff --git a/kate/filetemplates/templates/cppgpl.hh.katetemplate b/kate/filetemplates/templates/cppgpl.hh.katetemplate
new file mode 100644
index 0000000..7e0bd02
--- /dev/null
+++ b/kate/filetemplates/templates/cppgpl.hh.katetemplate
@@ -0,0 +1,34 @@
+katetemplate: template=C++ Header (GPL) group=Source Code documentname=New%N.hh highlight=C++
+katetemplate: description=A very simple GPL C++ header file
+katetemplate: author= Anders Lund <anders@alweb.dk>
+/*
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+ ---
+ Copyright (C) %{year}, %{fullname} <%{email}>
+ */
+
+#ifndef _${ClassName}_h_
+#define _${ClassName}_h_
+
+class ${ClassName} : public ${Super} {
+ public:
+ ${ClassName}( ${cursor} );
+ ~${ClassName}();
+
+}
+
+#endif // _${ClassName}_h_
diff --git a/kate/filetemplates/templates/cpplgpl.cpp.katetemplate b/kate/filetemplates/templates/cpplgpl.cpp.katetemplate
new file mode 100644
index 0000000..2742ee9
--- /dev/null
+++ b/kate/filetemplates/templates/cpplgpl.cpp.katetemplate
@@ -0,0 +1,23 @@
+katetemplate: template=C++ Source File (LGPL) group=Source Code documentname=New%N.cpp highlight=C++
+katetemplate: description=A very simple LGPL C++ source file
+katetemplate: author= Anders Lund <anders@alweb.dk>
+/*
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+ ---
+ Copyright (C) %{year}, %{realname} <%{email}>
+*/
+
+${cursor}
diff --git a/kate/filetemplates/templates/cpplgpl.hh.katetemplate b/kate/filetemplates/templates/cpplgpl.hh.katetemplate
new file mode 100644
index 0000000..301f34b
--- /dev/null
+++ b/kate/filetemplates/templates/cpplgpl.hh.katetemplate
@@ -0,0 +1,32 @@
+katetemplate: template=C++ Header (LGPL) group=Source Code documentname=New%N.hh highlight=C++
+katetemplate: description=A very simple LGPL C++ header file
+katetemplate: author= Anders Lund <anders@alweb.dk>
+/*
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+ ---
+ Copyright (C) %{year}, %{fullname} <%{email}>
+*/
+#ifndef _${ClassName}_h_
+#define _${ClassName}_h_
+
+class ${ClassName} : public ${Super} {
+ public:
+ ${ClassName}( ${cursor} );
+ ~${ClassName}();
+
+}
+
+#endif // _${ClassName}_h_
diff --git a/kate/filetemplates/templates/docbookchapter.xml.katetemplate b/kate/filetemplates/templates/docbookchapter.xml.katetemplate
new file mode 100644
index 0000000..581682c
--- /dev/null
+++ b/kate/filetemplates/templates/docbookchapter.xml.katetemplate
@@ -0,0 +1,75 @@
+katetemplate: Template=Kate Plugin Docbook Chapter DocumentName=chapter%N.docbook
+katetemplate: Group=Documentation highlight=XML
+katetemplate: Description=This creates a suitable beginning of a docbook chapter for a Kate plugin.
+katetemplate: Author= Anders Lund <anders@alweb.dk>
+<chapter id="${cursor}">
+<chapterinfo>
+
+<title>${title}</title>
+
+<authorgroup>
+<author>
+<firstname>%{firstname}</firstname>
+<surname>%{lastname}</surname>
+<affiliation>
+<address><email>%{email}</email></address>
+</affiliation>
+</author>
+</authorgroup>
+<date>%{date}</date>
+<releaseinfo></releaseinfo>
+
+<abstract>
+<para></para>
+</abstract>
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>kate</keyword>
+<keyword></keyword>
+<keyword></keyword>
+</keywordset>
+</chapterinfo>
+
+<title>Introduction</title>
+
+<para></para>
+
+<sect1 id="PROJECT-menu">
+<title>Menu Structure</title>
+
+<variablelist>
+<varlistentry>
+<term>
+<menuchoice>
+<guimenu>Tools</guimenu>
+<guimenuitem>Validate XML</guimenuitem>
+</menuchoice>
+</term>
+<listitem><para></para></listitem>
+</varlistentry>
+</variablelist>
+
+</sect1>
+
+<sect1 id="PROJECT-thanks-and-acknowledgements">
+<title>Thanks and Acknowledgments</title>
+
+<para>
+&kate; Plugin <quote>PROJECT</quote> copyright %{year} %{fullname}
+<email>%{email}</email>.
+</para>
+
+<para>
+Documentation copyright %{year} %{fullname}
+</para>
+
+<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
+
+<!-- &underFDL; -->
+&underGPL;
+
+</sect1>
+</chapter>
+
+<!-- kate: wordwrap on; -->
diff --git a/kate/filetemplates/templates/html.katetemplate b/kate/filetemplates/templates/html.katetemplate
new file mode 100644
index 0000000..40718e3
--- /dev/null
+++ b/kate/filetemplates/templates/html.katetemplate
@@ -0,0 +1,18 @@
+katetemplate: template=HTML 4.01 Strict Document documentname=New%N.html
+katetemplate: highlight=HTML group=Internet icon=www
+katetemplate: description=This will create a very basic HTML file with the HTML 4.01 strict DTD.
+katetemplate: author=Anders Lund <anders@alweb.dk>
+katetemplate: this text is supposedly thrown away.
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<!-- Copyright (C) %{year} %{fullname} <%{email}> -->
+<head>
+ <title>${title}</title>
+ <link rel="author" title="%{fullname}" href="mailto: (%{author}) %{email}">
+ </head>
+ <body>
+ <h1>${title}</h1>
+ ${cursor}
+ </body>
+</html>
diff --git a/kate/filetemplates/templates/language.xml.katetemplate b/kate/filetemplates/templates/language.xml.katetemplate
new file mode 100644
index 0000000..420ba84
--- /dev/null
+++ b/kate/filetemplates/templates/language.xml.katetemplate
@@ -0,0 +1,60 @@
+katetemplate: Documentname=New language.xml (%N) Template=Kate Highlight Definition highlight=XML
+katetemplate: Author=Dominik Haumann <dhdev@gmx.de>
+katetemplate: Description=This template will create the basics of a kate highlight definition file.
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE language SYSTEM "language.dtd">
+<!--
+ This file is part of KDE's kate project.
+
+ copyright : (C) %{year} by %{fullname}
+ email : %{email}
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+-->
+<!--
+ You'll find the "Writing a Kate Highlighting XML File HOWTO" at
+ http://kate.kde.org/doc/hlhowto.php
+ This is a template for the XML format used for syntax highlight descriptions
+ for the Kate text editor (http://kate.kde.org), which is part of the KDE
+ desktop environment (http://www.kde.org).
+
+ Use it as the base for your own syntax files.
+
+ Look at language.dtd for some documentation of the allowed elements and their attributes.
+ There is also a description of how to validate your syntax file.
+
+ You'll find the "Writing a Kate Highlighting XML File HOWTO" at
+ http://kate.kde.org/doc/hlhowto.php
+ -->
+
+<language version="1.00" kateversion="2.4" name="${cursor}" section="${section}" extensions="${extensions}" mimetype="${mimetypes}" author="%{fullname}" licence="GPL">
+ <highlighting>
+<!--
+ <list name="aList">
+ <item></item>
+ </list>
+-->
+ <contexts>
+ <context attribute="Normal Text" lineEndContext="#pop" name="Normal Text" >
+<!-- <keyword attribute="Normal Text" context="#stay" String="aList" />
+-->
+ </context>
+ </contexts>
+ <itemDatas>
+ <itemData name="Normal Text" defStyleNum="dsNormal"/>
+ </itemDatas>
+ </highlighting>
+ <general>
+ <keywords casesensitive="1" />
+<!--
+ <comments>
+ <comment name="singleLine" start="" />
+ <comment name="multiLine" start="" end="" />
+ </comments>
+-->
+ </general>
+</language>
+<!-- kate: space-indent on; indent-width 2; replace-tabs on; indent-mode xml; -->
diff --git a/kate/helloworld/Makefile.am b/kate/helloworld/Makefile.am
new file mode 100644
index 0000000..b3fca29
--- /dev/null
+++ b/kate/helloworld/Makefile.am
@@ -0,0 +1,18 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = katehelloworldplugin.la
+
+katehelloworldplugin_la_SOURCES = plugin_katehelloworld.cpp
+katehelloworldplugin_la_LIBADD = -lkateinterfaces
+katehelloworldplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+pluginsdir = $(kde_datadir)/kate/plugins/katehelloworld
+plugins_DATA = ui.rc
+
+kde_services_DATA = katehelloworld.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/katehelloworld.pot
+
diff --git a/kate/helloworld/katehelloworld.desktop b/kate/helloworld/katehelloworld.desktop
new file mode 100644
index 0000000..e8d2bf7
--- /dev/null
+++ b/kate/helloworld/katehelloworld.desktop
@@ -0,0 +1,119 @@
+[Desktop Entry]
+Type=Service
+ServiceTypes=Kate/Plugin
+X-KDE-Library=katehelloworldplugin
+X-Kate-Version=2.5
+Name=My First Kate Plugin
+Name[br]=Ma lugent Kate kentañ
+Name[ca]=El meu primer connector per a Kate
+Name[cs]=Můj první modul pro Kate
+Name[cy]=F'ategyn cyntaf Kate
+Name[da]=Mit første Kate-plugin
+Name[de]=Mein erstes Kate-Modul
+Name[el]=Το πρώτο μου πρόσθετο για το Kate
+Name[eo]=Mia unua kromaĵo por Kodredaktilo
+Name[es]=Mi primer complemento de Kate
+Name[et]=Kate näidisplugin
+Name[eu]=Nire lehen Kate plugina
+Name[fa]=اولین وصلۀ Kate من
+Name[fi]=Minun ensimmäinen Kate-sovelma
+Name[fr]=Mon premier module Kate
+Name[fy]=Myn earste Kate-plugin
+Name[ga]=Mo Chéad Bhreiseán Kate
+Name[gl]=O Meu Primeiro plugin para Kate
+Name[he]=התוסף הראשון שלי ל־Kate
+Name[hr]=Moj prvi dodatak za Kate
+Name[hu]=Az első Kate-bővítőmodulom
+Name[is]=Fyrsta Kate viðbótin mín
+Name[it]=Il mio primo plugin di Kate
+Name[ja]=はじめての Kate プラグイン
+Name[ka]=ჩემი პირველი Kate მოდული
+Name[kk]=Менің алғашқы Kate плагин модулім
+Name[km]=កម្មវិធី​ជំនួយ​របស់ Kate ដំបូង​របស់​ខ្ញុំ
+Name[lt]=Mano pirmas Kate priedas
+Name[mk]=Мојот прв приклучок за Кате
+Name[ms]=Plugin Kate Pertama Saya
+Name[nb]=Mitt første programtillegg til Kate
+Name[nds]=Mien eerst Kate-Moduul
+Name[ne]=मेरो पहिलो केट प्लगइन
+Name[nl]=Mijn eerste Kate-plugin
+Name[nn]=Mitt første programtillegg til Kate
+Name[pa]=ਮੇਰੀ ਪਹਿਲੀ ਕੇਟ ਪਲੱਗਇਨ
+Name[pl]=Moja pierwsza wtyczka do Kate
+Name[pt]=O Meu Primeiro 'Plugin' para o Kate
+Name[pt_BR]=Meu Primeiro Plugin para o Kate
+Name[ru]=Простой модуль для Kate
+Name[sk]=Môj prvý modul pre Kate
+Name[sl]=Moj prvi vstavek za Kate
+Name[sr]=Мој први прикључак за Kate
+Name[sr@Latn]=Moj prvi priključak za Kate
+Name[sv]=Mitt första insticksprogram för Kate
+Name[ta]=என் முதல் கேட் சொருகுப்பொருள்
+Name[tr]=İlk Kate Eklentim
+Name[uk]=Мій перший втулок до Kate
+Name[vi]=Bổ sung Kate đầu tiên của tôi
+Name[zh_CN]=我的第一个 Kate 插件
+Name[zh_TW]=我的第一個 Kate 的外掛程式
+Comment=Your short description about the plugin goes here
+Comment[af]=Jou kort beskrywing aangaande die inplak gaan hier
+Comment[ar]=اكتب وصف قصير عن هذا الملحق هنا
+Comment[az]=Əlavə haqqında qisaca izahat burada yer almalıdır
+Comment[bg]=Описание на вашата първа приставка за Kate
+Comment[bs]=Ovdje treba biti vaše malo objašnjenje o dodatku
+Comment[ca]=La vostra descripció referent al connector va aquí
+Comment[cs]=Zde by měl být krátký popis modulu
+Comment[cy]=Mae eich disgrifiad byr am yr ategyn yn mynd yma
+Comment[da]=Her er plads til din korte beskrivelse af hvad dette plugin gør
+Comment[de]=Hier sollte eine kurze Beschreibung Ihres Moduls stehen
+Comment[el]=Η σύντομη περιγραφή του προσθέτου σας πηγαίνει εδώ
+Comment[eo]=Jen estu la mallonga priskribo pri la kromaĵo
+Comment[es]=Aquí deberá incluir una breve descripción de su complemento
+Comment[et]=Näidisplugina lühikirjeldus
+Comment[eu]=Hemen duzu pluginari buruzko deskribapen laburra
+Comment[fa]=توصیف کوتاه شما دربارۀ وصله‌ای که در اینجا می‌آید
+Comment[fi]=Tässä pitäisi olla pieni kuvaus sovelmasta
+Comment[fo]=Her kann tú skriva ein lýsing av ístingurin.
+Comment[fr]=La description brève de votre module se place ici
+Comment[fy]=Set hjir in lytse omskriuwing fan jo plugin
+Comment[ga]=Cuir do chur síos gearr ar an mbreiseán anseo
+Comment[gl]=Aqui deberá colocar unha descrición do plugin
+Comment[he]=כאן אמור להיות התיאור הקצר שלך אודות התוסף
+Comment[hi]=प्लगइन के बारे में आपका संक्षिप्त वर्णन यहाँ जाएगा
+Comment[hr]=Mjesto za kratak opis vašeg dodatka
+Comment[hu]=Ez a bővítőmodul leírása
+Comment[is]=Hér ætti að vera smá lýsing á viðbótinni
+Comment[it]=Inserisci qui la descrizione del tuo plugin
+Comment[ja]=プラグインの簡単な説明をここに書きます
+Comment[ka]=მოდულის მოკლე აღწერა იქნება აქ
+Comment[kk]=Бұл плагин модульдің қысқаша сипаттамасының орны
+Comment[km]=សេចក្ដី​អធិប្បាយ​ដ៏​​​ខ្លី​របស់​អ្នក​អំពី​កម្មវិធី​ជំនួយ​ទៅ​ទីនេះ
+Comment[lt]=Čia turėtų būti trumpas priedo aprašymas
+Comment[mk]=Тука доаѓа вашиот краток опис за приклучокот
+Comment[ms]=Huraian ringkas anda tentang plugin anda di sini
+Comment[nb]=Her skriver du en kort beskrivelse av programtillegget
+Comment[nds]=Dien korte Beschrieven vun Dien Moduul kummt hierhen
+Comment[ne]=प्लगइनका बारेको तपाईँको छोटो वर्णन यहाँ जान्छ
+Comment[nl]=Plaats hier een kleine omschrijving van uw plugin
+Comment[nn]=Her skildrar du kort programtillegget
+Comment[nso]=Thlaloso ya gago ye kopana kaga plugin e tsamaya mo
+Comment[pl]=Tu powinien być Twój krótki opis wtyczki
+Comment[pt]=Aqui deverá colocar uma descrição do 'plugin'
+Comment[pt_BR]=Uma pequena descrição maior sobre o que um plugin faz
+Comment[ro]=Aici trebuie să fie descrierea modulului dumneavoastră
+Comment[ru]=А здесь должно быть описание модуля
+Comment[sk]=Tu by mal byť popis o module
+Comment[sl]=Vaš kratek opis o vstavku je tukaj
+Comment[sr]=Ваш кратак опис прикључка иде овде
+Comment[sr@Latn]=Vaš kratak opis priključka ide ovde
+Comment[sv]=Kort beskrivning av vad insticksprogrammet gör
+Comment[ta]= உங்கள் சொருகு பொருளைப் பற்றிய சிறு விவரிப்பு இங்கே போகும்
+Comment[tg]=Дар инҷо бояд тасвири модул бошад
+Comment[th]=นี่เป็นรายละเอียดสั้น ๆ เกี่ยวกับปลั๊กอินที่ควรมี
+Comment[tr]=Eklentinizin küçük bir açıklamasını buraya yazın
+Comment[uk]=Тут повинен бути ваш короткий опис втулку
+Comment[uz]=Plagin haqida qisqacha maʼlumot
+Comment[uz@cyrillic]=Плагин ҳақида қисқача маълумот
+Comment[vi]=Mô tả ngắn về bổ sung nằm ở đây
+Comment[xh]=Inkcazelo yakho emfutshane malunga ne plagi yangaphakathi ihamba apha
+Comment[zh_CN]=这里应该提供插件的简短描述
+Comment[zh_TW]=您對於這個外掛程式的一些描述放在這裡
diff --git a/kate/helloworld/plugin_katehelloworld.cpp b/kate/helloworld/plugin_katehelloworld.cpp
new file mode 100644
index 0000000..7499c08
--- /dev/null
+++ b/kate/helloworld/plugin_katehelloworld.cpp
@@ -0,0 +1,66 @@
+
+#include "plugin_katehelloworld.h"
+#include "plugin_katehelloworld.moc"
+
+#include <kaction.h>
+#include <klocale.h>
+#include <kgenericfactory.h>
+
+K_EXPORT_COMPONENT_FACTORY( katehelloworldplugin, KGenericFactory<KatePluginHelloWorld>( "katehelloworld" ) )
+
+class PluginView : public KXMLGUIClient
+{
+ friend class KatePluginHelloWorld;
+
+ public:
+ Kate::MainWindow *win;
+};
+
+KatePluginHelloWorld::KatePluginHelloWorld( QObject* parent, const char* name, const QStringList& )
+ : Kate::Plugin ( (Kate::Application*)parent, name )
+{
+}
+
+KatePluginHelloWorld::~KatePluginHelloWorld()
+{
+}
+
+void KatePluginHelloWorld::addView(Kate::MainWindow *win)
+{
+ // TODO: doesn't this have to be deleted?
+ PluginView *view = new PluginView ();
+
+ (void) new KAction ( i18n("Insert Hello World"), 0, this,
+ SLOT( slotInsertHello() ), view->actionCollection(),
+ "edit_insert_helloworld" );
+
+ view->setInstance (new KInstance("kate"));
+ view->setXMLFile("plugins/katehelloworld/ui.rc");
+ win->guiFactory()->addClient (view);
+ view->win = win;
+
+ m_views.append (view);
+}
+
+void KatePluginHelloWorld::removeView(Kate::MainWindow *win)
+{
+ for (uint z=0; z < m_views.count(); z++)
+ if (m_views.at(z)->win == win)
+ {
+ PluginView *view = m_views.at(z);
+ m_views.remove (view);
+ win->guiFactory()->removeClient (view);
+ delete view;
+ }
+}
+
+void KatePluginHelloWorld::slotInsertHello()
+{
+ if (!application()->activeMainWindow())
+ return;
+
+ Kate::View *kv = application()->activeMainWindow()->viewManager()->activeView();
+
+ if (kv)
+ kv->insertText ("Hello World");
+}
diff --git a/kate/helloworld/plugin_katehelloworld.h b/kate/helloworld/plugin_katehelloworld.h
new file mode 100644
index 0000000..84b3e86
--- /dev/null
+++ b/kate/helloworld/plugin_katehelloworld.h
@@ -0,0 +1,30 @@
+#ifndef _PLUGIN_KATE_HELLOWORLD_H_
+#define _PLUGIN_KATE_HELLOWORLD_H_
+
+#include <kate/application.h>
+#include <kate/documentmanager.h>
+#include <kate/document.h>
+#include <kate/mainwindow.h>
+#include <kate/plugin.h>
+#include <kate/view.h>
+#include <kate/viewmanager.h>
+
+class KatePluginHelloWorld : public Kate::Plugin, Kate::PluginViewInterface
+{
+ Q_OBJECT
+
+ public:
+ KatePluginHelloWorld( QObject* parent = 0, const char* name = 0, const QStringList& = QStringList() );
+ virtual ~KatePluginHelloWorld();
+
+ void addView (Kate::MainWindow *win);
+ void removeView (Kate::MainWindow *win);
+
+ public slots:
+ void slotInsertHello();
+
+ private:
+ QPtrList<class PluginView> m_views;
+};
+
+#endif
diff --git a/kate/helloworld/ui.rc b/kate/helloworld/ui.rc
new file mode 100644
index 0000000..36b11a0
--- /dev/null
+++ b/kate/helloworld/ui.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="katehelloworld" library="libkatehelloworldplugin" version="2">
+<MenuBar>
+ <Menu name="tools"><text>&amp;Tools</text>
+ <Action name="edit_insert_helloworld" />
+ </Menu>
+</MenuBar>
+</kpartplugin>
diff --git a/kate/htmltools/Makefile.am b/kate/htmltools/Makefile.am
new file mode 100644
index 0000000..73795b7
--- /dev/null
+++ b/kate/htmltools/Makefile.am
@@ -0,0 +1,21 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = katehtmltoolsplugin.la
+
+# This is all standard. Remove the LIB_KHTML reference if you are not
+# using the KHTML Part
+katehtmltoolsplugin_la_SOURCES = plugin_katehtmltools.cpp
+katehtmltoolsplugin_la_LIBADD = -lkateinterfaces
+katehtmltoolsplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+# Install the .rc file in the Part's directory (in this case, the part
+# is KHTMLPart)
+pluginsdir = $(kde_datadir)/kate/plugins/katehtmltools
+plugins_DATA = ui.rc
+
+kde_services_DATA = katehtmltools.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/katehtmltools.pot
diff --git a/kate/htmltools/katehtmltools.desktop b/kate/htmltools/katehtmltools.desktop
new file mode 100644
index 0000000..ed9b1ec
--- /dev/null
+++ b/kate/htmltools/katehtmltools.desktop
@@ -0,0 +1,136 @@
+[Desktop Entry]
+Type=Service
+ServiceTypes=Kate/Plugin
+X-KDE-Library=katehtmltoolsplugin
+X-Kate-Version=2.5
+Name=Kate HTML Tools
+Name[af]=Kate Html Nutsprogramme
+Name[ar]=أدوات Kate HTML
+Name[az]=Kate HTML Vasitələri
+Name[br]=Ostilhoù Kate HTML
+Name[bs]=Kate HTML alati
+Name[ca]=Eines HTML per a Kate
+Name[cs]=HTML nástroje Kate
+Name[cy]=Offer HTML am Kate
+Name[da]=Kate HTML-værktøjer
+Name[de]=HTML-Dienstprogramme für Kate
+Name[el]=Εργαλεία HTML του Kate
+Name[eo]=HTML-iloj por Kodredaktilo
+Name[es]=Herramientas HTML de Kate
+Name[et]=Kate HTML-tööriistad
+Name[eu]=Kateren HTML tresnak
+Name[fa]=ابزارهای زنگام Kate
+Name[fi]=Kate HTML-työkalut
+Name[fo]=Kate HTML-amboð
+Name[fr]=Outils HTML pour Kate
+Name[fy]=Kate HTML Ark
+Name[ga]=Uirlisí HTML Kate
+Name[gl]=Ferramentas de HTML para Kate
+Name[he]=כלי ה־HTML של Kate
+Name[hi]=के-एटीई एचटीएमएल औज़ार
+Name[hr]=Kate HTML alati
+Name[hu]=Kate HTML-eszközök
+Name[is]=Kate HTML tól
+Name[it]=Strumenti HTML di Kate
+Name[ja]=Kate HTML ツール
+Name[ka]=Kate HTML ხელსაწყოები
+Name[kk]=Kate HTML құралдары
+Name[km]=ឧបករណ៍ Kate HTML
+Name[lt]=Kate HTML įrankiai
+Name[lv]=Kate HTML Rīki
+Name[mk]=HTML-алатки за Кате
+Name[ms]= Alat HTML Kate
+Name[mt]=Għodda HTML Kate
+Name[nb]=HTML-verktøy til Kate
+Name[nds]=HTML-Warktüüch för Kate
+Name[ne]=केट एचटीएमएल उपकरणहरू
+Name[nn]=Kate HTML-verktøy
+Name[nso]=Dibereka tsa HTML ya Kate
+Name[pa]=ਕੇਟ HTML ਸੰਦ
+Name[pl]=Narzędzia HTML do Kate
+Name[pt]=Ferramentas de HTML do Kate
+Name[pt_BR]=Ferramentas HTML do Kate
+Name[ro]=Unelte HTML Kate
+Name[ru]=Утилиты для работы с HTML в Kate
+Name[sk]=HTML nástroje Kate
+Name[sl]=Orodja za HTML Kate
+Name[sr]=HTML алати за Kate
+Name[sr@Latn]=HTML alati za Kate
+Name[sv]=HTML-verktyg för Kate
+Name[ta]=கேட் HTML கருவிகள்
+Name[tg]=Асбобҳо барои кор бо HTML дар Kate
+Name[th]=เครื่องมือ HTML ของ Kate
+Name[tr]=Kate HTML Araçları
+Name[uk]=Засоби HTML для Kate
+Name[uz]=Kate HTML vositalari
+Name[uz@cyrillic]=Kate HTML воситалари
+Name[ven]=Kate HTML Zwishumiswa
+Name[vi]=Công cụ HTML Kate
+Name[xh]=Izixhobo ze Kate HTML
+Name[zh_CN]=Kate HTML 工具
+Name[zh_TW]=Kate HTML 工具組
+Name[zu]=Amathuluzi e Kate HTML.
+Comment=Facilitated insertion of HTML tags
+Comment[af]=Bystand invoeg van Html etiket
+Comment[ar]=ادخال أسهل لعلامات HTML
+Comment[az]=HTML təqlərinin səliqəli əlavəsi
+Comment[bg]=Помощ при вмъкване на тагове и елементи HTML
+Comment[bs]=Primjenjeno ubacivanje HTML tagova
+Comment[ca]=Fàcil inserció d'etiquetes HTML
+Comment[cs]=Usnadněné vkládání HTML značek
+Comment[cy]=Hwyluso mewnosod tagiau HTML
+Comment[da]=Hjælper med indsætning af HTML-koder
+Comment[de]=Vereinfachte Eingabe von HTML-Formatierungen
+Comment[el]=Διευκόλυνση της εισαγωγής HTML tags
+Comment[eo]=Asistita enmeto de HTML-etikedoj
+Comment[es]=Facilita la inserción de etiquetas HTML
+Comment[et]=Hõlpus HTML-siltide lisamine
+Comment[eu]=HTML etiketen txertaketa erraza
+Comment[fa]=درج آسان برچسبهای زنگام
+Comment[fi]=Helpotettu HTML-tagien lisäys
+Comment[fo]=Gevur møguleiki fyri at innseta HTML-merki.
+Comment[fr]=Aide à l'insertion de balises HTML
+Comment[fy]=Maklike ynfoeging fan HTML-tags
+Comment[ga]=Ionsá éascaithe de chlibeanna HTML
+Comment[gl]=Introdución facilitada de marcas de HTML
+Comment[he]=הוספה מובנית של תגיות HTML
+Comment[hi]=एचटीएमएल टैग्स शामिल करने में मदद करता है
+Comment[hr]=Olakšano umetanje HTML oznaka
+Comment[hu]=HTML-tag-ek beszúrása
+Comment[is]=Hjálpar til við að setja HTML merki i texta
+Comment[it]=Inserimento facilitato dei tag HTML
+Comment[ja]=HTML タグ挿入を簡単にします
+Comment[ka]=HTML ჭდეების გამიზნული ჩადგმა
+Comment[kk]=HTML тегтерін енгізуін жеңілдету
+Comment[km]=ការ​បញ្ចូល​ដែល​បាន​​​សម្រួល​របស់​​ស្លាក HTML
+Comment[lt]=Palengvintas HTML tagų įdėjimas
+Comment[lv]=Atvieglota HTML tagu iespraušana
+Comment[mk]=Го олеснува вметнувањето на HTML-ознаки
+Comment[ms]=Memudahkan penyertaan tag HTML
+Comment[mt]=Jiffaċilita l-użu ta' tags HTML
+Comment[nb]=Forenklet innsetting av HTML-tagger
+Comment[nds]=HTML-Betekers eenfacher infögen
+Comment[ne]=एचटीएमएल ट्यागहरूको घुसाई सहजता
+Comment[nl]=Gemakkelijke invoeging van HTML-tags
+Comment[nn]=Enkel innsetjing av HTML-taggar
+Comment[pl]=Uproszczone wstawianie znaczników HTML
+Comment[pt]=Introdução facilitada de marcas de HTML
+Comment[pt_BR]=Inserção de tags HTML facilitada
+Comment[ro]=Facilitează inserarea de taguri HTML
+Comment[ru]=Интеллектуальная вставка тегов HTML
+Comment[sk]=Vkladanie tagov HTML
+Comment[sl]=Pospešeno vstavljanje oznak HTML
+Comment[sr]=Олакшано убацивање HTML ознака
+Comment[sr@Latn]=Olakšano ubacivanje HTML oznaka
+Comment[sv]=Kraftfull infogning av HTML-taggar
+Comment[ta]=HTML கட்டளைகளை இணைக்க உதவும்
+Comment[tg]=Барқарори маънавии тегҳои HTML
+Comment[th]=การแทรกแท็ก HTML ที่แสนสะดวก
+Comment[tr]=Kolaylaştırılmış HTML etiketleri eklenmesi
+Comment[uk]=Форматування тексту мітками HTML
+Comment[ven]=U dzhenisiwa zwo itwaho zwa dzi thege dza HTML
+Comment[vi]=Làm dễ dàng việc chèn thẻ HTML
+Comment[xh]=Ufakelo olulula lwe tags ze HTML
+Comment[zh_CN]=方便地插入 HTML 标签
+Comment[zh_TW]=輔助嵌入 HTML 標籤
+Comment[zu]=Kuqhubekisiwe Ukufakwa kwamathagi e HTML
diff --git a/kate/htmltools/plugin_katehtmltools.cpp b/kate/htmltools/plugin_katehtmltools.cpp
new file mode 100644
index 0000000..f0764f2
--- /dev/null
+++ b/kate/htmltools/plugin_katehtmltools.cpp
@@ -0,0 +1,161 @@
+/***************************************************************************
+ plugin_katehtmltools.cpp - description
+ -------------------
+ begin : FRE Feb 23 2001
+ copyright : (C) 2001 by Joseph Wenninger
+ email : jowenn@bigfoot.com
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "plugin_katehtmltools.h"
+#include "plugin_katehtmltools.moc"
+
+#include <klineeditdlg.h>
+#include <kaction.h>
+#include <kinstance.h>
+#include <klocale.h>
+#include <cassert>
+#include <kdebug.h>
+#include <kgenericfactory.h>
+
+K_EXPORT_COMPONENT_FACTORY( katehtmltoolsplugin, KGenericFactory<PluginKateHtmlTools>( "katehtmltools" ) )
+
+class PluginView : public KXMLGUIClient
+{
+ friend class PluginKateHtmlTools;
+
+ public:
+ Kate::MainWindow *win;
+};
+
+PluginKateHtmlTools::PluginKateHtmlTools( QObject* parent, const char* name, const QStringList& )
+ : Kate::Plugin ( (Kate::Application *)parent, name )
+{
+}
+
+PluginKateHtmlTools::~PluginKateHtmlTools()
+{
+}
+
+void PluginKateHtmlTools::addView(Kate::MainWindow *win)
+{
+ // TODO: doesn't this have to be deleted?
+ PluginView *view = new PluginView ();
+
+ (void) new KAction ( i18n("HT&ML Tag..."), /*"edit_HTML_tag",*/ ALT + Key_Minus, this,
+ SLOT( slotEditHTMLtag() ), view->actionCollection(), "edit_HTML_tag" );
+
+ view->setInstance (new KInstance("kate"));
+ view->setXMLFile( "plugins/katehtmltools/ui.rc" );
+ win->guiFactory()->addClient (view);
+ view->win = win;
+
+ m_views.append (view);
+}
+
+void PluginKateHtmlTools::removeView(Kate::MainWindow *win)
+{
+ for (uint z=0; z < m_views.count(); z++)
+ if (m_views.at(z)->win == win)
+ {
+ PluginView *view = m_views.at(z);
+ m_views.remove (view);
+ win->guiFactory()->removeClient (view);
+ delete view;
+ }
+}
+
+void PluginKateHtmlTools::slotEditHTMLtag()
+// PCP
+{
+ if (!application()->activeMainWindow())
+ return;
+
+ Kate::View *kv=application()->activeMainWindow()->viewManager()->activeView();
+ if (!kv) return;
+
+ QString text ( KatePrompt ( i18n("HTML Tag"),
+ i18n("Enter HTML tag contents (the <, >, and closing tag will be supplied):"),
+ (QWidget *)kv)
+ );
+
+ if ( !text.isEmpty () )
+ slipInHTMLtag (*kv, text); // user entered something and pressed ok
+
+}
+
+
+QString PluginKateHtmlTools::KatePrompt
+ (
+ const QString & strTitle,
+ const QString & strPrompt,
+ QWidget * that
+ )
+{
+ // TODO: Make this a "memory edit" field with a combo box
+ // containing prior entries
+
+ KLineEditDlg dlg(strPrompt, QString::null, that);
+ dlg.setCaption(strTitle);
+
+ if (dlg.exec())
+ return dlg.text();
+ else
+ return "";
+}
+
+
+void PluginKateHtmlTools::slipInHTMLtag (Kate::View & view, QString text) // PCP
+{
+
+ // We must add a heavy elaborate HTML markup system. Not!
+
+ QStringList list = QStringList::split (' ', text);
+ QString marked = view.getDoc()->selection ();
+ uint preDeleteLine = 0, preDeleteCol = 0;
+ view.cursorPosition (&preDeleteLine, &preDeleteCol);
+
+ if (marked.length() > 0)
+ view.keyDelete ();
+ uint line = 0, col = 0;
+ view.cursorPosition (&line, &col);
+ QString pre ("<" + text + ">");
+ QString post;
+ if (list.count () > 0) post = "</" + list[0] + ">";
+ view.insertText (pre + marked + post);
+
+ // all this muck to leave the cursor exactly where the user
+ // put it...
+
+ // Someday we will can all this (unless if it already
+ // is canned and I didn't find it...)
+
+ // The second part of the if disrespects the display bugs
+ // when we try to reselect. TODO: fix those bugs, and we can
+ // un-break this if...
+
+ if (preDeleteLine == line && -1 == marked.find ('\n'))
+ if (preDeleteLine == line && preDeleteCol == col)
+ {
+ view.setCursorPosition (line, col + pre.length () + marked.length () - 1);
+
+ for (int x (marked.length()); x--;)
+ view.shiftCursorLeft ();
+ }
+ else
+ {
+ view.setCursorPosition (line, col += pre.length ());
+
+ for (int x (marked.length()); x--;)
+ view.shiftCursorRight ();
+ }
+
+}
diff --git a/kate/htmltools/plugin_katehtmltools.h b/kate/htmltools/plugin_katehtmltools.h
new file mode 100644
index 0000000..8f134ce
--- /dev/null
+++ b/kate/htmltools/plugin_katehtmltools.h
@@ -0,0 +1,53 @@
+ /***************************************************************************
+ plugin_katehtmltools.h - description
+ -------------------
+ begin : FRE Feb 23 2001
+ copyright : (C) 2001 by Joseph Wenninger
+ email : jowenn@bigfoot.com
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _PLUGIN_KANT_HTMLTOOLS_H
+#define _PLUGIN_KANT_HTMLTOOLS_H
+
+#include <qstring.h>
+
+#include <kate/plugin.h>
+#include <kate/application.h>
+#include <kate/view.h>
+#include <kate/document.h>
+#include <kate/documentmanager.h>
+#include <kate/mainwindow.h>
+#include <kate/viewmanager.h>
+
+class PluginKateHtmlTools : public Kate::Plugin, Kate::PluginViewInterface
+{
+ Q_OBJECT
+
+public:
+ PluginKateHtmlTools( QObject* parent = 0, const char* name = 0, const QStringList& = QStringList() );
+ virtual ~PluginKateHtmlTools();
+
+ void addView (Kate::MainWindow *win);
+ void removeView (Kate::MainWindow *win);
+
+private:
+ QPtrList<class PluginView> m_views;
+
+ QString KatePrompt (const QString & strTitle, const QString &strPrompt,
+ QWidget * that);
+ void slipInHTMLtag (Kate::View & view, QString text);
+
+public slots:
+ void slotEditHTMLtag();
+};
+
+#endif // _PLUGIN_KANT_HTMLTOOLS_H
diff --git a/kate/htmltools/ui.rc b/kate/htmltools/ui.rc
new file mode 100644
index 0000000..885f00e
--- /dev/null
+++ b/kate/htmltools/ui.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="katehtmltools" library="libkatehtmltoolsplugin" version="3">
+<MenuBar>
+ <Menu name="tools"><text>&amp;Tools</text>
+ <Action name="edit_HTML_tag" />
+ </Menu>
+</MenuBar>
+</kpartplugin>
diff --git a/kate/insertcommand/Makefile.am b/kate/insertcommand/Makefile.am
new file mode 100644
index 0000000..22fd871
--- /dev/null
+++ b/kate/insertcommand/Makefile.am
@@ -0,0 +1,21 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = kateinsertcommandplugin.la
+
+# This is all standard. Remove the LIB_KHTML reference if you are not
+# using the KHTML Part
+kateinsertcommandplugin_la_SOURCES = plugin_kateinsertcommand.cpp
+kateinsertcommandplugin_la_LIBADD = -lkateinterfaces
+kateinsertcommandplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+# Install the .rc file in the Part's directory (in this case, the part
+# is KHTMLPart)
+pluginsdir = $(kde_datadir)/kate/plugins/kateinsertcommand
+plugins_DATA = ui.rc
+
+kde_services_DATA = kateinsertcommand.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/kateinsertcommand.pot
diff --git a/kate/insertcommand/kateinsertcommand.desktop b/kate/insertcommand/kateinsertcommand.desktop
new file mode 100644
index 0000000..cfd0197
--- /dev/null
+++ b/kate/insertcommand/kateinsertcommand.desktop
@@ -0,0 +1,119 @@
+[Desktop Entry]
+Type=Service
+ServiceTypes=Kate/Plugin
+X-KDE-Library=kateinsertcommandplugin
+X-Kate-Version=2.5
+Name=Kate InsertCommand
+Name[af]=Kate Invoeg-opdrag
+Name[ca]=Inserció de comandaments per a Kate
+Name[cy]=MewnosodGorchymyn Kate
+Name[da]=Kate Indsætningskommando
+Name[de]=Befehlsausgabe einfügen für Kate
+Name[el]=Εισαγωγή εντολών του Kate
+Name[eo]=Komandenmeto de Kodredaktilo
+Name[es]=Insertar orden en Kate
+Name[et]=Kate käsu-lisaja
+Name[eu]=Kateren InsertCommand
+Name[fi]=Kate lisäyskomento
+Name[fo]=Kate innsetingarstýriboð
+Name[fr]=Insertion de commande dans Kate
+Name[gl]=Inserción de Comandos para Kate
+Name[he]=הוספת פקודות ל־Kate
+Name[hi]=के-एटीई इंसर्ट-कमांड
+Name[hr]=Kate UmetniNaredbu
+Name[hu]=Kate parancsbeszúró
+Name[it]=InserisciComando di Kate
+Name[ja]=Kate コマンド挿入
+Name[ka]=Kate ბრძანების ჩამატება
+Name[kk]=Kate-те команда шығарлымын енгізу
+Name[km]=ពាក្យ​បញ្ជា​បញ្ចូល​របស់​ Kate
+Name[lt]=Kate įdėti komandą
+Name[lv]=Kate IespraustKomandu
+Name[mk]=ВметниКоманда за Кате
+Name[ms]=Kate MasukkanArahan
+Name[nds]=Kate-Befehlinfögen
+Name[ne]=केट घुसाउने आदेश
+Name[pa]=ਕੇਟ ਕਮਾਂਡ ਸ਼ਾਮਲ
+Name[pl]=Polecenie wstawiania do Kate
+Name[pt]=Inserção de Comandos do Kate
+Name[pt_BR]=Inserir Comando do Kate
+Name[ro]=Inserare comandă Kate
+Name[ru]=Вставка вывода команды в Kate
+Name[sr]=„Убацивање наредбе“ за Kate
+Name[sr@Latn]=„Ubacivanje naredbe“ za Kate
+Name[sv]=Kate - Infoga kommando
+Name[ta]=கேட் சொருகு கட்டளை
+Name[th]=คำสั่งแทรกของ Kate
+Name[tr]=Kate KomutEkle
+Name[uk]=Команда вставлення Kate
+Name[ven]=Muthetho wo dzheniswaho wa Kate
+Name[vi]=Chèn lệnh Kate
+Name[xh]=IKate IfakaUmyalelo
+Name[zh_CN]=Kate 插入命令
+Name[zh_TW]=Kate 插入命令
+Name[zu]=Faka Inkomba ka Kate
+Comment=Insert shell command output into a document
+Comment[af]=Voeg by tolk opdrag uitset binnein 'n dokument
+Comment[ar]=أدخل مخرجات أمر من سطر الأوامر الى مستندك
+Comment[az]=Qabıq əmrə yekununu sənədə daxil et
+Comment[bg]=Вмъкване на резултата от изпълнението на дадена команда в документа
+Comment[bs]=Dodaj izlaz shell komande u dokument
+Comment[ca]=Insereix la sortida d'un comandament de l'intèrpret de comandaments en un document
+Comment[cs]=Vloží výstup příkazu shellu do dokumentu
+Comment[cy]=Mewnosod allbwn o orchymyn plisgyn i mewn i ddogfen
+Comment[da]=Indsæt uddata fra skalkommando i et dokument
+Comment[de]=Ausgabe eines Befehlszeilenprogramms einfügen
+Comment[el]=Εισαγωγή εξόδου κάποιας εντολής σε ένα έγγραφο
+Comment[eo]=Enmetas la eligon de ŝelprogramo en dokumenton
+Comment[es]=Inserta la salida del intérprete de órdenes en un documento
+Comment[et]=Shelli käsu väljundi lisamine dokumenti
+Comment[eu]=Txertatu Shell komandoaren irteera dokumentu batean
+Comment[fa]=درج خروجی فرمان پوستۀ درون یک سند
+Comment[fi]=Lisää komentotulkin tuloste asiakirjaan
+Comment[fo]=Innset úttak frá eitt stýriboð/forrit í eitt skjal.
+Comment[fr]=Insertion de la sortie d'une commande shell dans un document
+Comment[fy]=Set útfier fan shellkommando yn in dokumint
+Comment[ga]=Ionsáigh aschur ó ordú blaoisce isteach i gcáipéis
+Comment[gl]=Inserir o resultado da execución dun comando nun documento
+Comment[he]=הוספת פלט של פקודות מעטפת לתוך מסמך
+Comment[hi]=एक दस्तावेज़ में शेल कमांड आउटपुट प्रविष्ट करता है
+Comment[hr]=Umetanje ispisa iz naredbene ljuske u dokument
+Comment[hu]=Parancs kimenetének beillesztése
+Comment[is]=Setja úttak skeljarskipunar inn í skjal
+Comment[it]=Inserisce l'output di un comando della shell in un documento
+Comment[ja]=文書にシェルコマンドの出力を挿入します
+Comment[ka]=გარსის ბრძანების გამოტანის დოკუმენტში ჩამატება
+Comment[kk]=Қоршау-орта командасының шығысын құжатқа енгізу
+Comment[km]=បញ្ចូល​លទ្ធផល​ពាក្យ​បញ្ជា​របស់​សែល​​ទៅ​ក្នុង​ឯកសារ​មួយ
+Comment[lt]=Įdėti apvalkalo komandos išvestį į dokumentą
+Comment[lv]=Iesprauž čaulas komandas izvadi dokumentā
+Comment[mk]=Вметнува излез од команда од школката во документ
+Comment[ms]=Memasukkan output arahan cengkerang kepada dokumen
+Comment[mt]=Daħħal ir-riżultat ta' kmand tax-shell fid-dokument
+Comment[nb]=Sett inn utfallet fra en skall-kommando i et dokument
+Comment[nds]=Konsoolbefehl-Utgaav na en Dokment infögen
+Comment[ne]=कागजातमा शेला आदेश निर्गत घुसाउनुहोस्
+Comment[nl]=Voeg uitvoer van shellcommando in een document
+Comment[nn]=Set inn resultatet av ein skalkommando i dokumentet
+Comment[pa]=ਇੱਕ ਦਸਤਾਵੇਜ਼ ਵਿੱਚ ਇੱਕ ਸ਼ੈਲ ਕਮਾਂਡ ਆਉਟਪੁੱਟ ਦਿਓ
+Comment[pl]=Wstaw wynik wykonania polecenia powłoki
+Comment[pt]=Inserir o resultado da execução de um comando num documento
+Comment[pt_BR]=Inserir comando de saída do shell dentro do documento
+Comment[ro]=Inserează în document rezultatul comenzii de interpretor
+Comment[ru]=Вставить вывод команды в документ
+Comment[sk]=Vloží výstup príkazu shellu do dokumentu
+Comment[sl]=Vstavi izhod lupinskega ukaza v dokument
+Comment[sr]=Убаците излаз наредбе шкољке у документ
+Comment[sr@Latn]=Ubacite izlaz naredbe školjke u dokument
+Comment[sv]=Infoga utmatning från skalkommando till ett dokument
+Comment[ta]=ஓட்டுக் கட்டளை வெளியீட்டை ஆவணத்தில் செருக உதவும்
+Comment[tg]=Барқарор кардани баромади фармони лифофа дар санад
+Comment[th]=แทรกผลส่งออกของคำสั่งเชลล์ไปยังเอกสาร
+Comment[tr]=Kabuk komut çıktısını bir belgeye ekle
+Comment[uk]=Вставити вивід команди оболонки в документ
+Comment[ven]=Dzhenisani muthetho wa shele wa nnda u tshi ya kha dokhwumennte
+Comment[vi]=Chèn kết xuất lệnh trình bao vào tài liệu
+Comment[xh]=Faka iqokobhe lomyalelo wemveliso phakathi kuxwebhu
+Comment[zh_CN]=将 Shell 命令的输出插入到文档中
+Comment[zh_TW]=在文件內嵌入 shell 命令輸出
+Comment[zu]=Faka igobodo lenkomba kwisiqephu
diff --git a/kate/insertcommand/plugin_kateinsertcommand.cpp b/kate/insertcommand/plugin_kateinsertcommand.cpp
new file mode 100644
index 0000000..eadbc02
--- /dev/null
+++ b/kate/insertcommand/plugin_kateinsertcommand.cpp
@@ -0,0 +1,417 @@
+ /***************************************************************************
+ plugin_kateinsertcommand.cpp - description
+ -------------------
+ begin : THU Apr 19 2001
+ copyright : (C) 2001 by Anders Lund
+ email : anders@alweb.dk
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+//BEGIN includes
+#include "plugin_kateinsertcommand.h"
+#include "plugin_kateinsertcommand.moc"
+
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qdir.h>
+#include <qfile.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qradiobutton.h>
+#include <qspinbox.h>
+#include <qstringlist.h>
+#include <qwhatsthis.h>
+#include <qwidget.h>
+
+#include <kaction.h>
+#include <kanimwidget.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kfiledialog.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kprocess.h>
+#include <kstandarddirs.h>
+#include <kgenericfactory.h>
+#include <kapplication.h>
+//END includes
+
+K_EXPORT_COMPONENT_FACTORY( kateinsertcommandplugin, KGenericFactory<PluginKateInsertCommand>( "kateinsertcommand" ) )
+
+//BEGIN obligatory stuff
+class PluginView : public KXMLGUIClient
+{
+ friend class PluginKateInsertCommand;
+
+ public:
+ Kate::MainWindow *win;
+};
+//END
+
+//BEGIN PluginKateInsertCommand
+PluginKateInsertCommand::PluginKateInsertCommand( QObject* parent, const char* name, const QStringList& )
+ : Kate::Plugin ( (Kate::Application *)parent, name ),
+ kv ( 0 ),
+ sh ( 0 )
+{
+ config = new KConfig("kateinsertcommandpluginrc");
+ cmdhist = config->readListEntry("Command History");
+ wdlg = 0;
+ workingdir = QDir::currentDirPath();
+}
+
+PluginKateInsertCommand::~PluginKateInsertCommand()
+{
+ // write config file
+ config->writeEntry("Command History", cmdhist);
+ config->writeEntry("Dialog Settings", dialogSettings);
+ config->sync();
+ delete config;
+ delete sh;
+}
+
+void PluginKateInsertCommand::addView(Kate::MainWindow *win)
+{
+ // TODO: doesn't this have to be deleted?
+ PluginView *view = new PluginView ();
+
+ (void) new KAction ( i18n("Insert Command..."), "", 0, this,
+ SLOT( slotInsertCommand() ), view->actionCollection(),
+ "edit_insert_command" );
+
+ view->setInstance (new KInstance("kate"));
+ view->setXMLFile("plugins/kateinsertcommand/ui.rc");
+ win->guiFactory()->addClient (view);
+ view->win = win;
+
+ m_views.append (view);
+}
+
+void PluginKateInsertCommand::removeView(Kate::MainWindow *win)
+{
+ for (uint z=0; z < m_views.count(); z++)
+ if (m_views.at(z)->win == win)
+ {
+ PluginView *view = m_views.at(z);
+ m_views.remove (view);
+ win->guiFactory()->removeClient (view);
+ delete view;
+ }
+}
+
+void PluginKateInsertCommand::slotInsertCommand()
+{
+ if (!kapp->authorize("shell_access")) {
+ KMessageBox::sorry(0,i18n("You are not allowed to execute arbitrary external applications. If you want to be able to do this, contact your system administrator."),i18n("Access Restrictions"));
+ return;
+ }
+ if ( sh && sh->isRunning() ) {
+ KMessageBox::sorry (0, i18n("A process is currently being executed."),
+ i18n("Error"));
+ return;
+ }
+
+ if (!application()->activeMainWindow() || !application()->activeMainWindow()->viewManager()->activeView())
+ return;
+
+ kv = application()->activeMainWindow()->viewManager()->activeView();
+
+ QString dir = workingdir;
+ QString docdir;
+ KURL docurl = kv->getDoc()->url();
+ if (docurl.isLocalFile())
+ docdir = docurl.directory();
+ QString lwd( config->readPathEntry("Last WD") );
+ switch ( (int)config->readNumEntry("Start In", 0) )
+ {
+ case 1:
+ if ( ! docdir.isEmpty() ) dir = docdir;
+ break;
+ case 2:
+ if ( ! lwd.isEmpty() ) dir = lwd;
+ break;
+ default:
+ break;
+ }
+ dialogSettings = config->readNumEntry("Dialog Settings", 0);
+ CmdPrompt *d = new CmdPrompt((QWidget*)kv, 0, cmdhist, dir,
+ docdir, dialogSettings);
+ if ( d->exec() && ! d->command().isEmpty() ) {
+ if ( ! sh ) {
+ sh = new KShellProcess;
+
+ connect ( sh, SIGNAL(receivedStdout(KProcess*, char*, int)),
+ this, SLOT(slotReceivedStdout(KProcess*, char*, int)) );
+ connect ( sh, SIGNAL(receivedStderr(KProcess*, char*, int)),
+ this, SLOT(slotReceivedStderr(KProcess*, char*, int)) );
+ connect ( sh, SIGNAL(processExited(KProcess*)),
+ this, SLOT(slotProcessExited(KProcess*)) ) ;
+ }
+
+ sh->clearArguments();
+
+ bInsStdErr = d->insertStdErr();
+
+ if ( d->printCmd() ) {
+ if ( ! d->wd().isEmpty() )
+ kv->insertText( d->wd() + ": ");
+ kv->insertText( d->command()+":\n" );
+ }
+ if ( ! d->wd().isEmpty() ) {
+ *sh << "cd" << d->wd() << "&&";
+ config->writePathEntry("Last WD", d->wd());
+ }
+ *sh << QFile::encodeName(d->command());
+ sh->start( KProcess::NotifyOnExit, KProcess::All );
+
+ // add command to history
+ if ( cmdhist.contains( d->command() ) ) {
+ cmdhist.remove( d->command() );
+ }
+ cmdhist.prepend( d->command() );
+ int cmdhistlen = config->readNumEntry("Command History Length", 20);
+ while ( (int)cmdhist.count() > cmdhistlen )
+ cmdhist.remove( cmdhist.last() );
+ // save dialog state
+ dialogSettings = 0;
+ if ( d->insertStdErr() )
+ dialogSettings += 1;
+ if ( d->printCmd() )
+ dialogSettings += 2;
+
+ cmd = d->command();
+ delete d;
+ // If process is still running, display a dialog to cancel...
+ slotShowWaitDlg();
+
+ config->writeEntry("Dialog Settings", dialogSettings);
+ config->sync();
+ }
+}
+
+void PluginKateInsertCommand::slotAbort()
+{
+ if ( sh->isRunning() )
+ if (! sh->kill() )
+ KMessageBox::sorry(0, i18n("Could not kill command."), i18n("Kill Failed"));
+}
+
+void PluginKateInsertCommand::slotShowWaitDlg()
+{
+ if ( sh->isRunning() ) {
+ wdlg = new WaitDlg( (QWidget*)kv, i18n(
+ "Executing command:\n%1\n\nPress 'Cancel' to abort.").arg(cmd) );
+ connect(wdlg, SIGNAL(cancelClicked()), this, SLOT(slotAbort()) );
+ }
+ if ( sh->isRunning() ) // we may have finished while creating the dialog.
+ wdlg->show();
+ else if (wdlg) { // process may have exited before the WaitDlg constructor returned.
+ delete wdlg;
+ wdlg = 0;
+ }
+}
+
+void PluginKateInsertCommand::slotReceivedStdout( KProcess* /*p*/, char* text,
+ int len )
+{
+ QString t = QString::fromLocal8Bit ( text );
+ t.truncate(len);
+ kv->insertText( t );
+}
+
+void PluginKateInsertCommand::slotReceivedStderr( KProcess* p, char* text,
+ int len )
+{
+ if ( bInsStdErr )
+ slotReceivedStdout( p, text, len );
+}
+
+void PluginKateInsertCommand::slotProcessExited( KProcess* p )
+{
+ if (wdlg) {
+ wdlg->hide();
+ delete wdlg;
+ wdlg = 0;
+ }
+ if ( ! p->normalExit() )
+ KMessageBox::sorry(0, i18n("Command exited with status %1").
+ arg( p->exitStatus()), i18n("Oops!"));
+ kv->setFocus();
+}
+//END PluginKateInsertCommand
+
+//BEGIN PluginConfigPage
+Kate::PluginConfigPage* PluginKateInsertCommand::configPage (uint,
+ QWidget *w, const char */*name*/)
+{
+ InsertCommandConfigPage* p = new InsertCommandConfigPage(this, w);
+ initConfigPage( p );
+ connect( p, SIGNAL(configPageApplyRequest(InsertCommandConfigPage*)),
+ this, SLOT(applyConfig(InsertCommandConfigPage*)) );
+ return (Kate::PluginConfigPage*)p;
+}
+
+void PluginKateInsertCommand::initConfigPage( InsertCommandConfigPage *p )
+{
+ p->sb_cmdhistlen->setValue( config->readNumEntry("Command History Length", 20) );
+ p->rg_startin->setButton( config->readNumEntry("Start In", 0) );
+}
+
+void PluginKateInsertCommand::applyConfig( InsertCommandConfigPage *p )
+{
+ config->writeEntry( "Command History Length", p->sb_cmdhistlen->value() );
+ // truncate the cmd hist if nessecary?
+ config->writeEntry( "Start In", p->rg_startin->id(p->rg_startin->selected()) );
+ config->sync();
+}
+//END PluginConfigPage
+
+//BEGIN CmdPrompt
+// This is a simple dialog to retrieve a command and decide if
+// stdErr should be included in the text inserted.
+CmdPrompt::CmdPrompt(QWidget* parent,
+ const char* name,
+ const QStringList& cmdhist,
+ const QString& dir,
+ const QString& /*docdir*/,
+ int settings)
+ : KDialogBase (parent, name, true, i18n("Insert Command"), Ok|Cancel, Ok, true)
+{
+ QWidget *page = new QWidget( this );
+ setMainWidget(page);
+
+ QVBoxLayout *lo = new QVBoxLayout( page, 0, spacingHint() );
+
+ QLabel *l = new QLabel( i18n("Enter &command:"), page );
+ lo->addWidget( l );
+ cmb_cmd = new KHistoryCombo(true, page);
+ cmb_cmd->setHistoryItems(cmdhist, true);
+ cmb_cmd->setCurrentItem(0);
+ cmb_cmd->lineEdit()->setSelection(0, cmb_cmd->currentText().length());
+ l->setBuddy(cmb_cmd);
+ cmb_cmd->setFocus();
+ lo->addWidget(cmb_cmd);
+ connect( cmb_cmd->lineEdit(),SIGNAL(textChanged ( const QString & )),
+ this, SLOT( slotTextChanged(const QString &)));
+
+ QLabel *lwd = new QLabel( i18n("Choose &working folder:"), page );
+ lo->addWidget( lwd );
+ wdreq = new KURLRequester( page );
+ if ( ! dir.isEmpty() )
+ wdreq->setURL( dir );
+ wdreq->setMode( static_cast<KFile::Mode>(KFile::Directory|KFile::LocalOnly|KFile::ExistingOnly) );
+ lwd->setBuddy( wdreq );
+ lo->addWidget( wdreq );
+
+ //kdDebug()<<"settings: "<<settings<<endl;
+ cb_insStdErr = new QCheckBox( i18n("Insert Std&Err messages"), page );
+ cb_insStdErr->setChecked(settings & 1);
+ lo->addWidget( cb_insStdErr );
+ cb_printCmd = new QCheckBox( i18n("&Print command name"), page );
+ cb_printCmd->setChecked(settings & 2);
+ lo->addWidget( cb_printCmd );
+
+ QWhatsThis::add( cmb_cmd, i18n(
+ "Enter the shell command, the output of which you want inserted into your "
+ "document. Feel free to use a pipe or two if you wish.") );
+ QWhatsThis::add( wdreq, i18n(
+ "Sets the working folder of the command. The command executed is 'cd <dir> "
+ "&& <command>'") );
+ QWhatsThis::add( cb_insStdErr, i18n(
+ "Check this if you want the error output from <command> inserted as well.\n"
+ "Some commands, such as locate, print everything to STDERR") );
+ QWhatsThis::add( cb_printCmd, i18n(
+ "If you check this, the command string will be printed followed by a "
+ "newline before the output.") );
+ slotTextChanged(cmb_cmd->lineEdit()->text());
+}
+
+CmdPrompt::~CmdPrompt() {}
+
+void CmdPrompt::slotTextChanged(const QString &text)
+{
+ enableButtonOK( !text.isEmpty());
+}
+//END CmdPrompt
+
+//BEGIN WaitDlg implementation
+// This is a dialog that is displayed while a command is running,
+// with a cancel button to allow the user to kill the command
+WaitDlg::WaitDlg(QWidget* parent, const QString& text, const QString& title)
+ : KDialogBase( parent, "wait dialog", true, title, Cancel, Cancel, true )
+{
+ QWidget *page = new QWidget( this );
+ setMainWidget( page );
+ QHBoxLayout *lo = new QHBoxLayout( page, 0, spacingHint() );
+
+ KAnimWidget *aw = new KAnimWidget( QString::fromLatin1("kde"), 48, page );
+ lo->addWidget(aw);
+ QLabel *l = new QLabel( text, page );
+ lo->addWidget( l );
+
+ aw->start();
+}
+WaitDlg::~WaitDlg()
+{
+}
+//END WaitDlg
+
+//BEGIN InsertCommandConfigPage
+// This is the config page for this plugin.
+InsertCommandConfigPage::InsertCommandConfigPage(QObject* /*parent*/,
+ QWidget *parentWidget)
+ : Kate::PluginConfigPage( parentWidget )
+{
+ QVBoxLayout* lo = new QVBoxLayout( this );
+ lo->setSpacing(KDialogBase::spacingHint());
+
+ // command history length
+ QHBox *hb1 = new QHBox( this );
+ hb1->setSpacing(KDialogBase::spacingHint());
+ (void) new QLabel( i18n("Remember"), hb1 );
+ sb_cmdhistlen = new QSpinBox( hb1 );
+ QLabel *l1 = new QLabel( sb_cmdhistlen, i18n("Co&mmands"), hb1);
+ hb1->setStretchFactor(l1, 1);
+ lo->addWidget( hb1 );
+
+ // dir history length
+
+ // initial dir choice
+ rg_startin = new QButtonGroup( 1, Qt::Horizontal, i18n("Start In"), this );
+ rg_startin->setRadioButtonExclusive( true );
+ (void) new QRadioButton( i18n("Application &working folder"), rg_startin);
+ (void) new QRadioButton( i18n("&Document folder"), rg_startin);
+ (void) new QRadioButton( i18n("&Latest used working folder"), rg_startin);
+ lo->addWidget( rg_startin );
+ // other?
+
+ lo->addStretch(1); // look nice
+
+ // Be helpfull!
+ QWhatsThis::add( sb_cmdhistlen, i18n(
+ "Sets the number of commands to remember. The command history is saved "
+ "over sessions.") );
+ QWhatsThis::add( rg_startin, i18n(
+ "<qt><p>Decides what is suggested as <em>working folder</em> for the "
+ "command.</p><p><strong>Application Working Folder (default):</strong> "
+ "The folder from which you launched the application hosting the plugin, "
+ "usually your home folder.</p><p><strong>Document Folder:</strong> The "
+ "folder of the document. Used only for local documents.</p><p><strong>"
+ "Latest Working Folder:</strong> The folder used last time you used this "
+ "plugin.</p></qt>") );
+}
+
+void InsertCommandConfigPage::apply()
+{
+ emit configPageApplyRequest( this );
+}
+//END InsertCommandConfigPage
+// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/kate/insertcommand/plugin_kateinsertcommand.h b/kate/insertcommand/plugin_kateinsertcommand.h
new file mode 100644
index 0000000..c948b38
--- /dev/null
+++ b/kate/insertcommand/plugin_kateinsertcommand.h
@@ -0,0 +1,170 @@
+ /***************************************************************************
+ plugin_kateinsertcommand.h - description
+ -------------------
+ begin : THU Apr 19 2001
+ copyright : (C) 2001 by Anders Lund
+ email : anders@alweb.dk
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _PLUGIN_KATE_INSERT_COMMAND_H_
+#define _PLUGIN_KATE_INSERT_COMMAND_H_
+
+#include <kate/application.h>
+#include <kate/documentmanager.h>
+#include <kate/document.h>
+#include <kate/pluginconfiginterface.h>
+#include <kate/pluginconfiginterfaceextension.h>
+#include <kate/mainwindow.h>
+#include <kate/plugin.h>
+#include <kate/view.h>
+#include <kate/viewmanager.h>
+
+#include <kcombobox.h>
+#include <kdialogbase.h>
+#include <klibloader.h>
+#include <klocale.h>
+#include <kurlrequester.h>
+#include <qcheckbox.h>
+
+
+class InsertCommandConfigPage;
+namespace Kate {
+ class PluginConfigPage;
+ class PluginView;
+}
+class KConfig;
+class KProcess;
+class KShellProcess;
+class QButtonGroup;
+class QCheckBox;
+class QSpinBox;
+class QStringList;
+class WaitDlg;
+
+class PluginKateInsertCommand : public Kate::Plugin,
+ Kate::PluginViewInterface,
+ Kate::PluginConfigInterfaceExtension
+{
+ Q_OBJECT
+
+ public:
+ PluginKateInsertCommand( QObject* parent = 0, const char* name = 0, const QStringList& = QStringList() );
+ virtual ~PluginKateInsertCommand();
+
+ void addView (Kate::MainWindow *win);
+ void removeView (Kate::MainWindow *win);
+
+ Kate::View *kv;
+
+ WaitDlg *wdlg;
+ QPtrList<class PluginView> m_views;
+
+ uint configPages () const { return 1; }
+ Kate::PluginConfigPage *configPage (uint , QWidget *w, const char *name=0);
+ QString configPageName(uint) const { return i18n("Insert Command"); }
+ QString configPageFullName(uint) const {
+ return i18n("Configure Insert Command Plugin"); }
+ QPixmap configPagePixmap (uint /*number = 0*/,
+ int /*size = KIcon::SizeSmall*/) const
+ { return 0L; }
+
+ private:
+ void initConfigPage( InsertCommandConfigPage* );
+
+ KShellProcess *sh;
+ QString workingdir;
+ QString cmd;
+ QStringList cmdhist;
+ bool bInsStdErr;
+ int dialogSettings;
+ KConfig *config;
+
+ public slots:
+ void slotInsertCommand();
+ void slotAbort();
+ void applyConfig( InsertCommandConfigPage* );
+
+ private slots:
+ void slotReceivedStdout(KProcess*, char*, int);
+ void slotReceivedStderr(KProcess*, char*, int);
+ void slotProcessExited(KProcess*);
+ void slotShowWaitDlg();
+};
+
+class CmdPrompt : public KDialogBase
+{
+Q_OBJECT
+public:
+ CmdPrompt(QWidget* parent=0,
+ const char* name=0,
+ const QStringList& cmdhist=QStringList(),
+ const QString& dir=QString::null,
+ const QString& docdir=QString::null,
+ int settings=0);
+ ~CmdPrompt();
+ QString command()const { return cmb_cmd->currentText(); }
+ bool insertStdErr()const { return cb_insStdErr->isChecked(); }
+ bool printCmd()const { return cb_printCmd->isChecked(); }
+ QString wd()const { return wdreq->url(); }
+private slots:
+ void slotTextChanged(const QString &text);
+
+
+ private:
+ KHistoryCombo *cmb_cmd;
+ KURLRequester *wdreq;
+ QCheckBox *cb_insStdErr;
+ QCheckBox *cb_printCmd;
+
+};
+
+class WaitDlg : public KDialogBase
+{
+ public:
+ WaitDlg(QWidget* parent,
+ const QString& text=QString::null,
+ const QString& title=i18n("Please Wait"));
+ ~WaitDlg();
+};
+
+/** Config page for the plugin. */
+class InsertCommandConfigPage : public Kate::PluginConfigPage
+{
+ Q_OBJECT
+ friend class PluginKateInsertCommand;
+
+ public:
+ InsertCommandConfigPage(QObject* parent = 0L, QWidget *parentWidget = 0L);
+ ~InsertCommandConfigPage() {}
+
+ /** Reimplemented from Kate::PluginConfigPage
+ * just emits configPageApplyRequest( this ).
+ */
+ void apply();
+
+ void reset () { ; }
+ void defaults () { ; }
+
+ signals:
+ /** Ask the plugin to set initial values */
+ void configPageApplyRequest( InsertCommandConfigPage* );
+ /** Ask the plugin to apply changes */
+ void configPageInitRequest( InsertCommandConfigPage* );
+
+ protected:
+ QSpinBox *sb_cmdhistlen;
+ //QCheckBox *cb_startindocdir;
+ QButtonGroup *rg_startin;
+};
+
+#endif // _PLUGIN_KATE_INSERT_COMMAND_H_
+// kate: space-indent on; indent-width 2; replace-tabs on;
diff --git a/kate/insertcommand/ui.rc b/kate/insertcommand/ui.rc
new file mode 100644
index 0000000..49fb61b
--- /dev/null
+++ b/kate/insertcommand/ui.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="kateinsertcommand" library="libkateinsertcommandplugin" version="2">
+<MenuBar>
+ <Menu name="tools"><Text>&amp;Tools</Text>
+ <Action name="edit_insert_command" />
+ </Menu>
+</MenuBar>
+</kpartplugin>
diff --git a/kate/kjswrapper/Makefile.am b/kate/kjswrapper/Makefile.am
new file mode 100644
index 0000000..51258f7
--- /dev/null
+++ b/kate/kjswrapper/Makefile.am
@@ -0,0 +1,16 @@
+SUBDIRS= . samples
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = katekjswrapperplugin.la
+
+# This is all standard. Remove the LIB_KHTML reference if you are not
+# using the KHTML Part
+katekjswrapperplugin_la_SOURCES = plugin_katekjswrapper.cpp bindings.cpp
+katekjswrapperplugin_la_LIBADD = -lkateinterfaces -lkjsembed -lkjs
+katekjswrapperplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/katekjswrapper.pot
+
diff --git a/kate/kjswrapper/bindings.cpp b/kate/kjswrapper/bindings.cpp
new file mode 100644
index 0000000..fcb8d38
--- /dev/null
+++ b/kate/kjswrapper/bindings.cpp
@@ -0,0 +1,466 @@
+#include "bindings.h"
+#include "bindings.moc"
+#include "plugin_katekjswrapper.h"
+#include <qstringlist.h>
+#include <kdebug.h>
+#include <kate/documentmanager.h>
+#include <kate/document.h>
+#include <kjsembed/kjsembedpart.h>
+#include <kjsembed/jsfactory.h>
+#include <kjsembed/jsobjectproxy_imp.h>
+#include <klocale.h>
+#include <kjs/value.h>
+#include <kdockwidget.h>
+#include <kate/application.h>
+#include <kate/documentmanager.h>
+#include <kjsembed/jsconsolewidget.h>
+
+
+using namespace Kate::JS;
+Bindings::Bindings(QObject *parent): KJSEmbed::Bindings::JSBindingPlugin(parent,"KateAppBindings",QStringList()) {
+}
+
+Bindings::~Bindings() {
+}
+
+KJS::Object Bindings::createBinding(KJSEmbed::KJSEmbedPart *jspart, KJS::ExecState *exec, const KJS::List &args) const {
+/*
+ kdDebug() << "Loading a custom object" << endl;
+ DocumentManager *obj = new DocumentManager();
+ JSOpaqueProxy *prx = new JSOpaqueProxy( (void *) obj, "Kate::JS::DocumentManager" );
+
+ KJS::Object proxyObj(prx);
+ DocumentManagerImp::addBindings( exec, proxyObj );
+ return proxyObj;
+*/
+ return KJS::Object();
+}
+
+
+void Bindings::addBindings(KJS::ExecState *exec, KJS::Object &target) const {
+ kdDebug()<<"Kate::JS::Bindings:: ADDING CUSTOM BINDINGS"<<endl;
+
+ KJSEmbed::JSObjectProxy *proxy = KJSEmbed::JSProxy::toObjectProxy( target.imp() );
+ if ( !proxy )
+ return;
+
+ Kate::DocumentManager *dm=dynamic_cast<Kate::DocumentManager*>(proxy->object());
+ if (dm) {
+ DocumentManager::addBindings(exec,proxy,target);
+ } else {
+ Kate::Application *app=dynamic_cast<Kate::Application*>(proxy->object());
+ if (app) {
+ Application::addBindings(exec,proxy,target);
+ } else {
+ Kate::MainWindow *win=dynamic_cast<Kate::MainWindow*>(proxy->object());
+ if (win) {
+ MainWindow::addBindings(exec,proxy,target);
+ }
+ }
+ }
+ General::addBindings(exec,proxy,target);
+}
+
+void DocumentManager::addBindings(KJS::ExecState *exec, KJSEmbed::JSObjectProxy *proxy,KJS::Object &object){
+ RefCountedObjectDict *dict=new RefCountedObjectDict(100);
+ object.put(exec, "document", KJS::Object(new DocumentManager( exec, Document, proxy,dict )));
+ object.put(exec, "activeDocument", KJS::Object(new DocumentManager( exec, ActiveDocument, proxy,dict )));
+ object.put(exec, "documentForID", KJS::Object(new DocumentManager( exec, DocumentWithID, proxy,dict )));
+ object.put(exec, "documentForURL", KJS::Object(new DocumentManager( exec, FindDocument, proxy,dict )));
+ object.put(exec, "openURL", KJS::Object(new DocumentManager( exec, OpenURL, proxy,dict )));
+ object.put(exec, "isOpen", KJS::Object(new DocumentManager( exec, IsOpen, proxy,dict )));
+ object.put(exec, "documentCount", KJS::Object(new DocumentManager( exec, Documents, proxy,dict )));
+ object.put(exec, "closeDocument", KJS::Object(new DocumentManager( exec, CloseDocument, proxy,dict )));
+ object.put(exec, "closeAllDocument", KJS::Object(new DocumentManager( exec, CloseAllDocuments, proxy,dict )));
+}
+
+DocumentManager::DocumentManager( KJS::ExecState *exec, int id, KJSEmbed::JSObjectProxy *parent, RefCountedObjectDict *dict ):KJSEmbed::JSProxyImp(exec) {
+ m_dict=dict;
+ m_dict->incRef();
+ m_id=id;
+ m_proxy=parent;
+}
+
+DocumentManager::~DocumentManager() {
+ m_dict->decRef();
+}
+
+KJS::Value DocumentManager::call( KJS::ExecState *exec, KJS::Object &self, const KJS::List &args ) {
+ QObject *o=m_proxy->object();
+ Kate::DocumentManager *dm=dynamic_cast<Kate::DocumentManager*>(o);
+ if (!dm) {
+ kdWarning()<<"Object died"<<endl;
+ QString msg = i18n("Call of DocumentManager member on destroyed object");
+ KJS::Object err = KJS::Error::create( exec, KJS::GeneralError, msg.utf8() );
+ exec->setException( err );
+ return KJS::Undefined();
+ }
+ QString mdesc;
+ switch (m_id) {
+ case Document: {
+ mdesc="document(int)";
+ if (args.size()!=1) break;
+ uint index=args[0].toUInt32(exec);
+ if (exec->hadException()) break;
+ QObject *doc=dynamic_cast<QObject*>(dm->document(index));
+ if (!doc) return KJS::Null();
+ return m_dict->jsObject(exec,doc,m_proxy); }
+ break;
+ case ActiveDocument: {
+ mdesc="activeDocument()";
+ if (args.size()!=0) break;
+ QObject *doc=dynamic_cast<QObject*>(dm->activeDocument());
+ if (!doc) return KJS::Null();
+ return m_dict->jsObject(exec,doc,m_proxy); }
+ break;
+ case DocumentWithID: {
+ mdesc="documentForID(int)";
+ if (args.size()!=1) break;
+ uint id=args[0].toUInt32(exec);
+ if (exec->hadException()) break;
+ QObject *doc=dynamic_cast<QObject*>(dm->documentWithID(id));
+ if (!doc) return KJS::Null();
+ return m_dict->jsObject(exec,doc,m_proxy); }
+ break;
+ case FindDocument: {
+ mdesc="documentForURL(KURL)";
+ if (args.size()!=1) break;
+ KURL url = QString( args[0].toString(exec).qstring() );
+ if (exec->hadException()) break;
+ return KJS::Number(dm->findDocument(url)); }
+ break;
+ case IsOpen: {
+ mdesc="isOpen(KURL)";
+ if (args.size()!=0) break;
+ KURL url = QString( args[0].toString(exec).qstring() );
+ if (exec->hadException()) break;
+ return KJS::Boolean(dm->isOpen(url));}
+
+ break;
+ case OpenURL: {
+ mdesc="openURL(KURL[,String encoding])";
+ uint docID;
+ if (args.size()==1) {
+ KURL url = QString( args[0].toString(exec).qstring() );
+ if (exec->hadException()) break;
+ (void)dm->openURL(url,QString::null,&docID);
+ return KJS::Number(docID);
+ } else if (args.size()==2) {
+ KURL url = QString( args[0].toString(exec).qstring() );
+ if (exec->hadException()) break;
+ QString encoding=QString( args[1].toString(exec).qstring() );
+ (void)dm->openURL(url,encoding,&docID);
+ return KJS::Number(docID);
+ }
+ }
+ break;
+ case Documents: {
+ mdesc="documentCount()";
+ if (args.size()!=0) break;
+ return KJS::Number(dm->documents()); }
+ break;
+ case CloseDocument: {
+ mdesc="closeDocument(Kate::Document)";
+ if (args.size()!=1) break;
+ KJSEmbed::JSObjectProxy *proxy = KJSEmbed::JSProxy::toObjectProxy( args[0].imp() );
+ if (!proxy) break;
+ QObject *tmp=proxy->object();
+ Kate::Document *tmpdoc=dynamic_cast<Kate::Document*>(tmp);
+ if (!tmpdoc) break;
+ return KJS::Boolean(dm->closeDocument(tmpdoc)); }
+ break;
+ case CloseAllDocuments: {
+ mdesc="closeAllDocuments()";
+ if (args.size()!=0) break;
+ return KJS::Boolean(dm->closeAllDocuments()); }
+ break;
+ default:
+ kdDebug()<<"calling illegal method of DocumentManager"<<endl;
+ return KJS::Null();
+ }
+ QString msg = i18n("Method %1 called with wrong signature").arg(mdesc);
+ KJS::Object err = KJS::Error::create( exec, KJS::GeneralError, msg.utf8() );
+ exec->setException( err );
+ return KJS::Undefined();
+
+}
+
+Kate::JS::Management::Management(KJS::ExecState *exec, int id, PluginKateKJSWrapper *kateplug):KJSEmbed::JSProxyImp(exec) {
+ m_id=id;
+ m_wrapper=kateplug;
+}
+
+
+KJS::Value Kate::JS::Management::call( KJS::ExecState *exec, KJS::Object &self, const KJS::List &args ) {
+ if (m_id==AddConfigPage) {
+ if (args.size()!=1) {
+ QString msg = i18n("One parameter expected");
+ KJS::Object err = KJS::Error::create( exec, KJS::GeneralError, msg.utf8() );
+ exec->setException( err );
+ return KJS::Undefined();
+ }
+ KJS::Value v=args[0];
+// m_wrapper->m_configPageFactories.append(v);
+#warning implement me
+ } else if (m_id==SetConfigPages) {
+ if (args.size()>1) {
+ QString msg=i18n("One or no parameter expected");
+ KJS::Object err = KJS::Error::create( exec, KJS::GeneralError, msg.utf8() );
+ exec->setException( err );
+ return KJS::Undefined();
+ }
+ m_wrapper->m_configPageFactories=(args.size()>0)?args[0]:KJS::Value();
+ } else if (m_id==SetWindowConfiguration) {
+ if (args.size()>3) {
+ QString msg = i18n("A maximum of three parameters expected");
+ KJS::Object err = KJS::Error::create( exec, KJS::GeneralError, msg.utf8() );
+ exec->setException( err );
+ return KJS::Undefined();
+ }
+ kdDebug()<<"***********************************************************************************"<<endl<<
+ "Kate::JS::Management::call: Object type for m_toolViewConstructors (1):"<<args[0].type()<<endl;
+ m_wrapper->m_toolViewConstructors=(args.size()>0)?args[0]:KJS::Value();
+ kdDebug()<<"Kate::JS::Management::call: Object type for m_toolViewConstructors (2):"<<m_wrapper->m_toolViewConstructors.type()<<endl;
+ m_wrapper->m_newWindowHandler=(args.size()>1)?args[1]:KJS::Value();
+ m_wrapper->m_removeWindowHandler=(args.size()>2)?args[2]:KJS::Value();
+ } else if (m_id==KJSConsole) {
+ m_wrapper->m_part->view()->show();
+ } else
+ kdDebug()<<"Remove not implemented yet"<<endl;
+ return KJS::Boolean(true);
+}
+
+void Kate::JS::Application::addBindings(KJS::ExecState *exec, KJSEmbed::JSObjectProxy *proxy,KJS::Object &object){
+ PluginKateKJSWrapper *wrap=static_cast<PluginKateKJSWrapper*>(proxy->part()->parent());
+ KJS::Object ToolView(new Application( exec, ToolView, proxy ,wrap));
+ ToolView.put(exec,KJS::Identifier("Left"),KJS::Number(KDockWidget::DockLeft) ,KJS::ReadOnly | KJS::DontDelete);
+ ToolView.put(exec,KJS::Identifier("Top"),KJS::Number(KDockWidget::DockTop) ,KJS::ReadOnly | KJS::DontDelete);
+ ToolView.put(exec,KJS::Identifier("Right"),KJS::Number(KDockWidget::DockRight) ,KJS::ReadOnly | KJS::DontDelete);
+ ToolView.put(exec,KJS::Identifier("Bottom"),KJS::Number(KDockWidget::DockBottom), KJS::ReadOnly | KJS::DontDelete);
+ General::addBindings(exec,proxy,ToolView);
+ object.put(exec, "ToolView",ToolView);
+
+ object.put(exec, KJS::Identifier("DocumentManager"),proxy->part()->bind(::Kate::documentManager()),KJS::ReadOnly | KJS::DontDelete);
+
+ object.put(exec, "windowCount", KJS::Object(new Application( exec, WindowCount, proxy,wrap)));
+ object.put(exec, "activeWindow", KJS::Object(new Application( exec, ActiveWindow, proxy,wrap)));
+ object.put(exec, "window", KJS::Object(new Application( exec, Window, proxy,wrap )));
+
+// object.put(exec, "ProjectManager",proxy->part()->bind(::Kate::projectManager());
+
+/* obbject.put(exec, KJS::Identifier("WindowManager"),proxy->part
+ KJS::Object*/
+/*
+ Kate::PluginManager *pluginManager ();
+
+ Kate::InitPluginManager *initPluginManager ();
+
+ Kate::MainWindow *activeMainWindow ();*/
+
+ // uint mainWindows ();
+ // Kate::MainWindow *mainWindow (uint n = 0);
+
+}
+
+Kate::JS::Application::Application( KJS::ExecState *exec, int id, KJSEmbed::JSObjectProxy *parent,PluginKateKJSWrapper *plugin):KJSEmbed::JSProxyImp(exec) {
+ kdDebug()<<"Kate::JS::Application::Application"<<endl;
+ m_id=id;
+ m_proxy=parent;
+ m_plugin=plugin;
+}
+
+Kate::JS::Application::~Application() {
+}
+
+KJS::Value Kate::JS::Application::call( KJS::ExecState *exec, KJS::Object &self, const KJS::List &args ) {
+ QObject *o=m_proxy->object();
+ Kate::Application *ka=dynamic_cast<Kate::Application*>(o);
+ if (!ka) {
+ kdWarning()<<"Object died"<<endl;
+ QString msg = i18n("Call of KATE member on destroyed object");
+ KJS::Object err = KJS::Error::create( exec, KJS::GeneralError, msg.utf8() );
+ exec->setException( err );
+ return KJS::Undefined();
+ }
+ QString mdesc;
+ switch (m_id) {
+ case WindowCount: {
+ mdesc="windowCount()";
+ if (args.size()!=0) break;
+ return KJS::Number(ka->mainWindows()); }
+ break;
+ case Window: {
+ mdesc="window(int)";
+ if (args.size()!=1) break;
+ uint index=args[0].toUInt32(exec);
+ if (exec->hadException()) break;
+ Kate::MainWindow *mw=ka->mainWindow(index);
+ if (!mw) return KJS::Null();
+ return m_plugin->getViewObject(mw)->winObj;
+ }
+ break;
+ case ActiveWindow: {
+ mdesc="activeWindow()";
+ if (args.size()!=0) break;
+ Kate::MainWindow *mw=ka->activeMainWindow();
+ if (!mw) return KJS::Null();
+ return m_plugin->getViewObject(mw)->winObj;
+ }
+ break;
+
+
+ }
+ QString msg = i18n("Method %1 called with wrong signature").arg(mdesc);
+ KJS::Object err = KJS::Error::create( exec, KJS::GeneralError, msg.utf8() );
+ exec->setException( err );
+ return KJS::Undefined();
+
+}
+
+
+
+
+
+
+void Kate::JS::General::addBindings(KJS::ExecState *exec, KJSEmbed::JSObjectProxy *proxy,KJS::Object &object){
+#warning "try to find a way to make the function implementations static, right now this doesn't work because of the need to retrieve the interpreter"
+ KJS::Object methods= KJS::Object(new General( exec,proxy->interpreter(),MethodMethods));
+ KJS::Object fields= KJS::Object(new General( exec,proxy->interpreter(),MethodFields));
+ object.put(exec, "methods", methods);
+ object.put(exec, "fields", fields);
+}
+
+Kate::JS::General::General( KJS::ExecState *exec, KJS::Interpreter *interpreter, int id):KJSEmbed::JSProxyImp(exec) {
+ m_id=id;
+ m_interpreter=interpreter;
+}
+
+
+KJS::Value Kate::JS::General::call( KJS::ExecState *exec, KJS::Object &self, const KJS::List &args ) {
+ switch (m_id) {
+ case MethodMethods:
+ return methodz(exec,self,args);
+ case MethodFields:
+ return fieldz(exec,self,args);
+ default:
+ return KJS::Null();
+ }
+}
+
+
+
+
+KJS::Value Kate::JS::General::methodz(KJS::ExecState *exec, KJS::Object &obj, const KJS::List &)
+{
+ KJS::List items;
+
+ KJS::ReferenceList list=obj.propList(exec, /*bool recursive*/ false);
+ for (KJS::ReferenceListIterator it=list.begin();it!=list.end();it++) {
+ if (it->getValue(exec).toObject(exec).implementsCall()) items.append(KJS::String(it->getPropertyName(exec).qstring()));
+ }
+ return KJS::Object(m_interpreter->builtinArray().construct(exec,items) );
+}
+
+KJS::Value Kate::JS::General::fieldz(KJS::ExecState *exec, KJS::Object &obj, const KJS::List &)
+{
+ KJS::List items;
+
+ KJS::ReferenceList list=obj.propList(exec, /*bool recursive*/ false);
+ for (KJS::ReferenceListIterator it=list.begin();it!=list.end();it++) {
+ if (!(it->getValue(exec).toObject(exec).implementsCall())) items.append(KJS::String(it->getPropertyName(exec).qstring()));
+ }
+ return KJS::Object(m_interpreter->builtinArray().construct(exec,items) );
+}
+
+
+Kate::JS::RefCountedObjectDict::RefCountedObjectDict(int size): QObject(), QPtrDict<ObjectEntry>(size) {
+ m_usageCount=0;
+ setAutoDelete(true);
+}
+
+void Kate::JS::RefCountedObjectDict::incRef() {
+ m_usageCount++;
+}
+
+void Kate::JS::RefCountedObjectDict::decRef() {
+ kdDebug()<<"Kate::JS:RefCountedObjectDict::decCount()"<<endl;
+ m_usageCount--;
+ if (m_usageCount<1) deleteLater();
+
+}
+
+KJS::Object Kate::JS::RefCountedObjectDict::jsObject(KJS::ExecState *exec, QObject *obj, KJSEmbed::JSObjectProxy *proxy) {
+ ObjectEntry *oe=find(obj);
+ if (oe==0) {
+ oe=new ObjectEntry;
+ oe->obj=proxy->part()->factory()->createProxy(exec,obj,proxy);
+ connect(obj,SIGNAL(destroyed()),this,SLOT(removeSender()));
+ insert(obj,oe);
+ return oe->obj;
+ } else return oe->obj;
+
+}
+
+void Kate::JS::RefCountedObjectDict::removeSender() {
+ kdDebug()<<"Trying to remove object from dict"<<sender()<<endl;
+ remove((void*)sender());
+}
+
+
+void Kate::JS::MainWindow::addBindings(KJS::ExecState *exec, KJSEmbed::JSObjectProxy *proxy,KJS::Object &object){
+ kdDebug()<<"Kate::JS::MainWindow::addBindings - 1"<<endl;
+ if (!proxy)
+ return;
+ kdDebug()<<"Kate::JS::MainWindow::addBindings - 2"<<endl;
+
+ Kate::MainWindow *mw=dynamic_cast<Kate::MainWindow*>(proxy->object());
+ if (!mw) return;
+ kdDebug()<<"Kate::JS::MainWindow::addBindings - 3"<<endl;
+
+ PluginKateKJSWrapper *wrap=static_cast<PluginKateKJSWrapper*>(proxy->part()->parent());
+ if (!wrap) return;
+ kdDebug()<<"Kate::JS::MainWindow::addBindings - 4"<<endl;
+
+ object.put(exec, "actionCollection", KJS::Object(new MainWindow( exec, ActionCollection, proxy,wrap)));
+
+}
+
+
+
+Kate::JS::MainWindow::MainWindow( KJS::ExecState *exec, int id, KJSEmbed::JSObjectProxy *parent,PluginKateKJSWrapper *plugin):KJSEmbed::JSProxyImp(exec) {
+ kdDebug()<<"Kate::JS::MainWindow::MainWindow"<<endl;
+ m_id=id;
+ m_proxy=parent;
+ m_plugin=plugin;
+}
+
+Kate::JS::MainWindow::~MainWindow() {
+}
+
+KJS::Value Kate::JS::MainWindow::call( KJS::ExecState *exec, KJS::Object &self, const KJS::List &args ) {
+ QObject *o=m_proxy->object();
+ Kate::MainWindow *mw=dynamic_cast<Kate::MainWindow*>(o);
+ if (!mw) {
+ kdWarning()<<"Object died"<<endl;
+ QString msg = i18n("Call of MainWindow member on destroyed object");
+ KJS::Object err = KJS::Error::create( exec, KJS::GeneralError, msg.utf8() );
+ exec->setException( err );
+ return KJS::Undefined();
+ }
+ QString mdesc;
+ switch (m_id) {
+ case ActionCollection: {
+ mdesc="actionCollection()";
+ if (args.size()!=0) break;
+ return m_plugin->getViewObject(mw)->actionCollectionObj;
+ }
+ break;
+ default:
+ return KJS::Undefined();
+ }
+ QString msg = i18n("Method %1 called with wrong signature").arg(mdesc);
+ KJS::Object err = KJS::Error::create( exec, KJS::GeneralError, msg.utf8() );
+ exec->setException( err );
+ return KJS::Undefined();
+}
+
diff --git a/kate/kjswrapper/bindings.h b/kate/kjswrapper/bindings.h
new file mode 100644
index 0000000..2e98ee8
--- /dev/null
+++ b/kate/kjswrapper/bindings.h
@@ -0,0 +1,150 @@
+#ifndef _KATE_JS_BINDINGS_H_
+#define _KATE_JS_BINDINGS_H_
+
+#include <kjsembed/jsbindingplugin.h>
+#include <kjsembed/jsproxy_imp.h>
+#include <kjsembed/jsobjectproxy.h>
+#include <kjsembed/jsfactory.h>
+#include <qptrdict.h>
+
+class PluginKateKJSWrapper;
+
+namespace Kate {
+ namespace JS {
+
+
+ struct ObjectEntry {
+ KJS::Object obj;
+ };
+
+ class RefCountedObjectDict: public QObject, public QPtrDict<ObjectEntry> {
+ Q_OBJECT
+ public:
+ RefCountedObjectDict(int size);
+ void incRef();
+ void decRef();
+ KJS::Object jsObject(KJS::ExecState *exec, QObject *obj, KJSEmbed::JSObjectProxy *proxy);
+ public slots:
+ void removeSender();
+ private:
+ int m_usageCount;
+ };
+
+
+ class Bindings: public KJSEmbed::Bindings::JSBindingPlugin {
+ public:
+ Bindings(QObject *parent);
+ virtual ~Bindings();
+ KJS::Object createBinding(KJSEmbed::KJSEmbedPart *jspart, KJS::ExecState *exec, const KJS::List &args) const;
+ void addBindings(KJS::ExecState *exec, KJS::Object &target) const;
+ };
+
+ class DocumentManager: public KJSEmbed::JSProxyImp {
+ public:
+ enum MethodID {
+ Document,
+ ActiveDocument,
+ DocumentWithID,
+ FindDocument,
+ IsOpen,
+ OpenURL,
+ Documents,
+ CloseDocument,
+ CloseAllDocuments
+ };
+ virtual bool implementsCall() const { return true; }
+ virtual KJS::Value call( KJS::ExecState *exec, KJS::Object &self, const KJS::List &args );
+ static void addBindings(KJS::ExecState *exec, KJSEmbed::JSObjectProxy *proxy,KJS::Object &target);
+ private:
+ DocumentManager( KJS::ExecState *exec, int id, KJSEmbed::JSObjectProxy *parent, RefCountedObjectDict *dict );
+ virtual ~DocumentManager();
+ private:
+ RefCountedObjectDict *m_dict;
+ int m_id;
+ KJSEmbed::JSObjectProxy *m_proxy;
+
+ };
+
+ class Management: public KJSEmbed::JSProxyImp {
+ public:
+ enum MethodID {
+ AddConfigPage,
+ SetConfigPages,
+ RemoveConfigPage,
+ SetWindowConfiguration,
+ KJSConsole
+ };
+ Management( KJS::ExecState *exec, int id, class PluginKateKJSWrapper *kateplug);
+ virtual bool implementsCall() const { return true; }
+ virtual KJS::Value call( KJS::ExecState *exec, KJS::Object &self, const KJS::List &args );
+
+ private:
+ int m_id;
+ class PluginKateKJSWrapper *m_wrapper;
+
+ };
+
+ class Application: public KJSEmbed::JSProxyImp {
+ public:
+ enum MethodID {
+ ToolView,
+ WindowCount,
+ Window,
+ ActiveWindow,
+
+ };
+ virtual bool implementsCall() const { return true; }
+ virtual KJS::Value call( KJS::ExecState *exec, KJS::Object &self, const KJS::List &args );
+ static void addBindings(KJS::ExecState *exec, KJSEmbed::JSObjectProxy *proxy,KJS::Object &target);
+ private:
+ Application( KJS::ExecState *exec, int id, KJSEmbed::JSObjectProxy *parent, PluginKateKJSWrapper *plugin );
+ ~Application();
+ private:
+ int m_id;
+ KJSEmbed::JSObjectProxy *m_proxy;
+ PluginKateKJSWrapper *m_plugin;
+ };
+
+ class General: public KJSEmbed::JSProxyImp {
+ public:
+ enum MethodID {
+ MethodMethods,
+ MethodFields
+ };
+ virtual bool implementsCall() const { return true; }
+ virtual KJS::Value call( KJS::ExecState *exec, KJS::Object &self, const KJS::List &args );
+ virtual KJS::Value fieldz( KJS::ExecState *exec, KJS::Object &self, const KJS::List &args );
+ virtual KJS::Value methodz( KJS::ExecState *exec, KJS::Object &self, const KJS::List &args );
+ static void addBindings(KJS::ExecState *exec,KJSEmbed::JSObjectProxy *proxy,KJS::Object &target);
+ private:
+ General( KJS::ExecState *exec,KJS::Interpreter *interpreter,int id);
+
+ private:
+ int m_id;
+ KJS::Interpreter *m_interpreter;
+ };
+
+
+ class MainWindow: public KJSEmbed::JSProxyImp {
+ public:
+ enum MethodID {
+ ActionCollection
+
+ };
+ virtual bool implementsCall() const { return true; }
+ virtual KJS::Value call( KJS::ExecState *exec, KJS::Object &self, const KJS::List &args );
+ static void addBindings(KJS::ExecState *exec, KJSEmbed::JSObjectProxy *proxy,KJS::Object &target);
+ private:
+ MainWindow( KJS::ExecState *exec, int id, KJSEmbed::JSObjectProxy *parent, PluginKateKJSWrapper *plugin );
+ ~MainWindow();
+ private:
+ int m_id;
+ KJSEmbed::JSObjectProxy *m_proxy;
+ PluginKateKJSWrapper *m_plugin;
+ };
+
+
+ }
+}
+
+#endif
diff --git a/kate/kjswrapper/plugin_katekjswrapper.cpp b/kate/kjswrapper/plugin_katekjswrapper.cpp
new file mode 100644
index 0000000..c3e54b7
--- /dev/null
+++ b/kate/kjswrapper/plugin_katekjswrapper.cpp
@@ -0,0 +1,437 @@
+/* This file is part of the KDE project
+ Copyright (C) 2004 Joseph Wenninger <jowenn@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+//BEGIN includes
+#include "plugin_katekjswrapper.h"
+#include "plugin_katekjswrapper.moc"
+#include "bindings.h"
+
+#include <kjsembed/kjsembedpart.h>
+#include <kjsembed/jssecuritypolicy.h>
+#include <kjsembed/jsfactory.h>
+#include <kjsembed/jsconsolewidget.h>
+#include <kjs/interpreter.h>
+#include <kjs/value.h>
+#include <kjs/object.h>
+#include <kgenericfactory.h>
+#include <kdebug.h>
+#include <qlayout.h>
+#include <kstandarddirs.h>
+#include <kate/mainwindow.h>
+#include <kate/toolviewmanager.h>
+#include <kdockwidget.h>
+#include <qvbox.h>
+//END includes
+
+K_EXPORT_COMPONENT_FACTORY( katekjswrapperplugin, KGenericFactory<PluginKateKJSWrapper>( "katekjswrapper" ) )
+
+PluginKateKJSWrapperView::~PluginKateKJSWrapperView() {
+}
+
+void PluginKateKJSWrapperView::removeFromWindow() {
+ kdDebug()<<"PluginKateKJSWrapperView::removeFromWindow"<<endl;
+ for (QValueList<QGuardedPtr<KMDI::ToolViewAccessor> >::iterator it=toolviews.begin();it!=toolviews.end();it=toolviews.begin()) {
+ kdDebug()<<"removeFromWindow: removing a toolview"<<endl;
+ KMDI::ToolViewAccessor* tva=(*it);
+ toolviews.remove(it);
+ win->toolViewManager()->removeToolView (tva);
+ }
+ win->guiFactory()->removeClient (this);
+ }
+
+PluginKateKJSWrapper::PluginKateKJSWrapper( QObject* parent, const char* name, const QStringList& list)
+ : Kate::Plugin ( (Kate::Application *)parent, name ) {
+ m_views.setAutoDelete(true);
+ m_scriptname=list[0];
+ m_kateAppBindings=new Kate::JS::Bindings(this);
+ KJSEmbed::JSSecurityPolicy::setDefaultPolicy( KJSEmbed::JSSecurityPolicy::CapabilityAll );
+ m_part = new KJSEmbed::KJSEmbedPart(this);
+ KJS::Interpreter *js = m_part->interpreter();
+
+ KJSEmbed::JSFactory *factory=m_part->factory();
+
+/* factories for kate app classes */
+ factory->addQObjectPlugin("Kate::Application",m_kateAppBindings);
+ factory->addQObjectPlugin("Kate::DocumentManager",m_kateAppBindings);
+ factory->addQObjectPlugin("Kate::MainWindow",m_kateAppBindings);
+ factory->addQObjectPlugin("Kate::PluginManager",m_kateAppBindings);
+ factory->addQObjectPlugin("Kate::InitPluginManager",m_kateAppBindings);
+ factory->addQObjectPlugin("Kate::ProjectManager",m_kateAppBindings);
+ factory->addQObjectPlugin("Kate::Project",m_kateAppBindings);
+ factory->addQObjectPlugin("Kate::ViewManager",m_kateAppBindings);
+ factory->addQObjectPlugin("Kate::View",m_kateAppBindings);
+/* toplevel objects*/
+ KJS::Object appobj=m_part->addObject(Kate::application(),"KATE");
+ js->globalObject().put( js->globalExec(), "addConfigPage", KJS::Object(new Kate::JS::Management(js->globalExec(),Kate::JS::Management::AddConfigPage,this )));
+ js->globalObject().put( js->globalExec(), "setConfigPages", KJS::Object(new Kate::JS::Management(js->globalExec(),Kate::JS::Management::SetConfigPages,this )));
+ js->globalObject().put( js->globalExec(), "removeConfigPage", KJS::Object(new Kate::JS::Management(js->globalExec(),Kate::JS::Management::RemoveConfigPage,this )));
+ js->globalObject().put( js->globalExec(), "setWindowConfiguration", KJS::Object(new Kate::JS::Management(js->globalExec(),Kate::JS::Management::SetWindowConfiguration,this )));
+ js->globalObject().put( js->globalExec(), "KJSConsole", KJS::Object(new Kate::JS::Management(js->globalExec(),Kate::JS::Management::KJSConsole,this )));
+
+/* KJSEmbed::JSConsoleWidget *w=m_part->view();
+ w->show();
+ //w->show();*/
+ kdDebug()<<"m_scriptname="<<m_scriptname<<endl;
+ m_part->runFile(locate("appdata",QString("plugins/%1/%2.js").arg(m_scriptname).arg(m_scriptname)));
+//"/home/jowenn/development/kde/cvs/kdeaddons/kate/kjswrapper/samples/test1.js");
+}
+
+PluginKateKJSWrapper::~PluginKateKJSWrapper()
+{
+ delete m_part;
+ m_part=0;
+}
+
+
+uint PluginKateKJSWrapper::configPages () const {
+ KJS::Interpreter *js = m_part->interpreter();
+ KJS::ExecState *exec=js->globalExec();
+
+ if (! (m_configPageFactories.isNull() || (m_configPageFactories.type()==KJS::NullType))) {
+ KJS::Object constrs=m_configPageFactories.toObject(exec);
+ if (!exec->hadException()) {
+ if (QString(constrs.classInfo()->className)=="Array") {
+ kdDebug()<<"config page constructor array detected"<<endl;
+ uint size=constrs.get(exec,KJS::Identifier("length")).toInteger(exec);
+ if (exec->hadException()) {
+ exec->clearException();
+ kdDebug()<<"Error while retrieving array length"<<endl;
+ }
+ else return size;
+ } else return 1;
+ }
+ }
+ exec->clearException();
+ return 0;
+}
+
+
+static KJS::Object getObj(KJS::Interpreter *js, KJS::Value mightBeArray, int id) {
+ KJS::ExecState *exec=js->globalExec();
+ KJS::Object constrs=mightBeArray.toObject(exec);
+ KJS::Value constr;
+ if (!exec->hadException()) {
+ if (QString(constrs.classInfo()->className)=="Array") {
+ kdDebug()<<"config page constructor array detected"<<endl;
+ constr=constrs.get(exec,id);
+ } else constr=mightBeArray;
+
+ }
+ return constr.toObject(js->globalExec());
+}
+
+QString PluginKateKJSWrapper::configPageName(uint id) const {
+ if (id>=configPages()) return "";
+ KJS::Interpreter *js = m_part->interpreter();
+
+ KJS::Object constr=getObj(js,m_configPageFactories,id);
+
+ KJS::Value o=constr.get(js->globalExec(),KJS::Identifier("name"));
+ QString retVal( o.toString(js->globalExec()).qstring() );
+
+ kdDebug()<<"=============================================================================================="<<endl;
+ kdDebug()<<"PluginKateKJSWrapper::configPageName: "<<retVal<<endl;
+ kdDebug()<<"=============================================================================================="<<endl;
+ js->globalExec()->clearException();
+ return retVal;
+}
+
+QString PluginKateKJSWrapper::configPageFullName(uint id) const {
+ if (id>=configPages()) return "";
+ KJS::Interpreter *js = m_part->interpreter();
+
+ KJS::Object constr=getObj(js,m_configPageFactories,id);
+
+ KJS::Value o=constr.get(js->globalExec(),KJS::Identifier("fullName"));
+ QString retVal( o.toString(js->globalExec()).qstring() );
+
+ kdDebug()<<"=============================================================================================="<<endl;
+ kdDebug()<<"PluginKateKJSWrapper::configPageFullName: "<<retVal<<endl;
+ kdDebug()<<"=============================================================================================="<<endl;
+ js->globalExec()->clearException();
+ return retVal;
+}
+
+QPixmap PluginKateKJSWrapper::configPagePixmap (uint /*number = 0*/,
+ int /*size = KIcon::SizeSmall*/) const {
+ return 0;
+}
+
+
+Kate::PluginConfigPage* PluginKateKJSWrapper::configPage (uint id,
+ QWidget *w, const char */*name*/) {
+ kdDebug()<<"PluginKateKJSWrapper::configPage"<<endl;
+
+ if (id>=configPages()) return 0;
+ KJS::Interpreter *js = m_part->interpreter();
+
+ KJS::Object constr=getObj(js,m_configPageFactories,id);
+
+ if (js->globalExec()->hadException()) {
+ kdDebug()<<"PluginKateKJSWrapper::configPage: exit 1"<<endl;
+ js->globalExec()->clearException();
+ return 0;
+ }
+
+ if (!constr.implementsConstruct()) {
+ kdWarning()<<"config page factory has to be an object constructor"<<endl;
+ return 0;
+ }
+
+ KateKJSWrapperConfigPage *p=new KateKJSWrapperConfigPage(constr,this,w);
+ return (Kate::PluginConfigPage*)p;
+/*
+ KateKJSWrapperConfigPage* p = new KateKJSWrapperConfigPage(this, w);
+ //init
+ connect( p, SIGNAL(configPageApplyRequest(KateKJSWrapperConfigPage*)),
+ this, SLOT(applyConfig(KateKJSWrapperConfigPage*)) );
+ return (Kate::PluginConfigPage*);*/
+}
+
+
+
+
+static KMDI::ToolViewAccessor *createToolView(KJSEmbed::JSFactory *factory,KJS::Interpreter *js, Kate::MainWindow *winN,KJS::Object win,KJS::Object viewConstructor) {
+ KJS::List params;
+ KJS::ExecState *exec = js->globalExec();
+ params.append(win);
+ exec->clearException();
+ int dockPos;
+ if (!viewConstructor.implementsConstruct()) return 0;
+ KJS::Value dockPosV=viewConstructor.get(exec,KJS::Identifier("startPosition"));
+ if (exec->hadException()) {
+ dockPos=KDockWidget::DockLeft;
+ exec->clearException();
+ } else {
+ dockPos=dockPosV.toInteger(exec);
+ if (exec->hadException()) {
+ dockPos=KDockWidget::DockLeft;
+ exec->clearException();
+ }
+ }
+ QString viewName;
+ KJS::Value viewNameV=viewConstructor.get(exec,KJS::Identifier("name"));
+ if (exec->hadException()) {
+ viewName="kjs_unknown";
+ exec->clearException();
+ } else {
+ viewName=QString( viewNameV.toString(exec).qstring() );
+ if (exec->hadException()) {
+ viewName="kjs_unknown";
+ exec->clearException();
+ }
+ }
+
+ Kate::JS::ToolView *tv=new Kate::JS::ToolView(viewConstructor,exec,factory,params,viewName.utf8());
+ //params.append(factory->createProxy(exec,tv));
+ //KJS::Object otv=viewConstructor.construct(exec,params);
+ if (exec->hadException()) {
+ kdDebug()<<"Error while calling constructor"<<endl;
+ delete tv;
+ kdDebug()<<exec->exception().toString(exec).qstring()<<endl;
+ exec->clearException();
+ return 0;
+ }
+ KMDI::ToolViewAccessor *tva=winN->toolViewManager()->addToolView((KDockWidget::DockPosition)dockPos,tv,
+ tv->icon()?(*(tv->icon())):QPixmap(),tv->caption());
+ kdDebug()<<"****************************************************************************************"<<endl;
+ kdDebug()<<"PluginKateKJSWrapper: Toolview has been added"<<endl;
+ kdDebug()<<"****************************************************************************************"<<endl;
+ return tva;
+
+}
+
+PluginKateKJSWrapperView *PluginKateKJSWrapper::getViewObject(Kate::MainWindow *win) {
+ PluginKateKJSWrapperView * view=m_views[win];
+ if (!view) {
+ view=new PluginKateKJSWrapperView();
+ view->win=win;
+ connect(win,SIGNAL(destroyed()),this,SLOT(slotWindowDestroyed()));
+ m_views.insert(win,view);
+ KJS::Interpreter *js = m_part->interpreter();
+ KJS::ExecState *exec = js->globalExec();
+ view->actionCollectionObj=m_part->factory()->createProxy(exec,view->actionCollection());
+ view->winObj=m_part->factory()->createProxy(exec,win);
+ } else kdDebug()<<"returning cached View/Window Object"<<endl;
+ return view;
+}
+
+void PluginKateKJSWrapper::addView(Kate::MainWindow *win)
+{
+ PluginKateKJSWrapperView * view=getViewObject(win); // this is needed to ensure correct caching the javascript object
+ KJS::Interpreter *js = m_part->interpreter();
+ KJS::ExecState *exec = js->globalExec();
+ exec->clearException();
+ kdDebug()<<"****************************************************************************************"<<endl;
+ kdDebug()<<"PluginKateKJSWrapper::addView"<<endl;
+ kdDebug()<<"****************************************************************************************"<<endl;
+ kdDebug()<<"checking for newWindowHandler"<<endl;
+ if (!m_newWindowHandler.isNull()) {
+ KJS::List param;
+ param.append(view->winObj);
+ KJS::Object newWinFunc=m_newWindowHandler.toObject(exec);
+ if (exec->hadException()) {
+ exec->clearException();
+ } else {
+ if (newWinFunc.implementsCall()) {
+ newWinFunc.call(exec,js->globalObject(),param);
+ if (exec->hadException()) {
+ kdDebug()<<"Error while calling newWindowHandler"<<endl;
+ exec->clearException();
+ }
+ }
+ }
+ }
+ if (exec->hadException()) kdDebug()<<"void PluginKateKJSWrapper::addView(Kate::MainWindow *win): exec had an exception - 1"<<endl;
+
+ kdDebug()<<"checking for toolview constructors"<<endl;
+ if (! (m_toolViewConstructors.isNull() || (m_toolViewConstructors.type()==KJS::NullType))) {
+ KJS::Object constrs=m_toolViewConstructors.toObject(exec);
+ if (!exec->hadException()) {
+ if (QString(constrs.classInfo()->className)=="Array") {
+ kdDebug()<<"Toolview constructor array detected"<<endl;
+ int size=constrs.get(exec,KJS::Identifier("length")).toInteger(exec);
+ if (exec->hadException()) {
+ exec->clearException();
+ kdDebug()<<"Error while retrieving array length"<<endl;
+ }
+ else {
+ for (int i=0;i<size;i++) {
+ KJS::Object constrO=constrs.get(exec,i).toObject(exec);
+ if (exec->hadException()) {
+ exec->clearException();
+ } else {
+ KMDI::ToolViewAccessor *w=createToolView(m_part->factory(),js,win,view->winObj,constrO);
+ if (w) {
+ view->toolviews.append(QGuardedPtr<KMDI::ToolViewAccessor>(w));
+ }
+ exec->clearException();
+ }
+ }
+ }
+ } else {
+ kdDebug()<<"Single toolview constructor detected"<<endl;
+ if (!constrs.implementsConstruct()) {
+ kdWarning()<<"wrong object type"<<endl;
+ } else {
+ KMDI::ToolViewAccessor *w=createToolView(m_part->factory(),js,win,view->winObj,constrs);
+ if (w) {
+ view->toolviews.append(QGuardedPtr<KMDI::ToolViewAccessor>(w));
+ }
+ exec->clearException();
+ }
+ }
+
+ }
+ } else kdDebug()<<"void PluginKateKJSWrapper::addView(Kate::MainWindow *win): no toolview constructors"<<endl;
+
+
+ if (exec->hadException()) kdDebug()<<"void PluginKateKJSWrapper::addView(Kate::MainWindow *win): exec had an exception - 2"<<endl;
+
+ view->setInstance (new KInstance("kate"));
+ view->setXMLFile(QString("plugins/%1/%2.rc").arg(m_scriptname).arg(m_scriptname));
+ win->guiFactory()->addClient (view);
+}
+
+
+void PluginKateKJSWrapper::slotWindowDestroyed() {
+ m_views.remove((void*)sender());
+}
+
+void PluginKateKJSWrapper::removeView(Kate::MainWindow *win)
+{
+//here toolviews must not be destroyed. Only cleanup functions called the view should be removed in the slot connected to the windows destroy signal only
+ m_views[win]->removeFromWindow();
+}
+
+
+
+void PluginKateKJSWrapper::applyConfig( KateKJSWrapperConfigPage *p )
+{
+#if 0
+ config->writeEntry( "Command History Length", p->sb_cmdhistlen->value() );
+ // truncate the cmd hist if nessecary?
+ config->writeEntry( "Start In", p->rg_startin->id(p->rg_startin->selected()) );
+ config->sync();
+#endif
+}
+
+KateKJSWrapperConfigPage::KateKJSWrapperConfigPage(KJS::Object pageConstructor,PluginKateKJSWrapper* parent,
+ QWidget *parentWidget)
+ : Kate::PluginConfigPage( parentWidget ),m_plugin(parent)
+{
+ QVBoxLayout *l=new QVBoxLayout(this);
+ l->setAutoAdd(true);
+ l->activate();
+ KJS::Interpreter *js = parent->m_part->interpreter();
+ KJS::ExecState *exec = js->globalExec();
+ exec->clearException();
+ KJS::List param;
+ param.append(parent->m_part->factory()->createProxy(exec,this,0));
+ m_pageObject=pageConstructor.construct(exec,param);
+}
+
+
+static void callJS(KJSEmbed::KJSEmbedPart *p,KJS::Object o,const QString& funcName){
+ KJS::Interpreter *js = p->interpreter();
+ KJS::ExecState *exec = js->globalExec();
+ KJS::List param;
+ exec->clearException();
+ KJS::Value funcV=o.get(exec,KJS::Identifier(funcName));
+ if (exec->hadException()) {
+#warning clear exception ?
+ return;
+ }
+ KJS::Object func=funcV.toObject(exec);
+ if (exec->hadException()) {
+#warning clear exception ?
+ return;
+ }
+ if (func.implementsCall()) {
+ func.call(exec,o,param);
+ if (js->globalExec()->hadException()) {
+#warning clear exception ?
+ return;
+ }
+ }
+}
+
+void KateKJSWrapperConfigPage::apply()
+{
+ callJS(m_plugin->m_part,m_pageObject,"apply");
+}
+
+void KateKJSWrapperConfigPage::reset()
+{
+ callJS(m_plugin->m_part,m_pageObject,"reset");
+}
+
+void KateKJSWrapperConfigPage::defaults()
+{
+ callJS(m_plugin->m_part,m_pageObject,"defaults");
+}
+
+
+Kate::JS::ToolView::ToolView(KJS::Object constr, KJS::ExecState *exec, KJSEmbed::JSFactory *factory, KJS::List parameters, const char *name):QVBox(0,name) {
+ parameters.append(factory->createProxy(exec,this));
+ handler=constr.construct(exec,parameters);
+
+}
+
+Kate::JS::ToolView::~ToolView() {
+}
+
diff --git a/kate/kjswrapper/plugin_katekjswrapper.h b/kate/kjswrapper/plugin_katekjswrapper.h
new file mode 100644
index 0000000..f04043e
--- /dev/null
+++ b/kate/kjswrapper/plugin_katekjswrapper.h
@@ -0,0 +1,180 @@
+/* This file is part of the KDE project
+ Copyright (C) 2004 Joseph Wenninger <jowenn@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _PLUGIN_KATE_KJS_WRAPPER_H_
+#define _PLUGIN_KATE_KJS_WRAPPER_H_
+
+#include <kate/application.h>
+#include <kate/documentmanager.h>
+#include <kate/document.h>
+#include <kate/pluginconfiginterface.h>
+#include <kate/pluginconfiginterfaceextension.h>
+#include <kate/mainwindow.h>
+#include <kate/plugin.h>
+#include <kate/view.h>
+#include <kate/viewmanager.h>
+
+#include <kcombobox.h>
+#include <kdialogbase.h>
+#include <klibloader.h>
+#include <klocale.h>
+#include <kurlrequester.h>
+#include <qcheckbox.h>
+#include <qvaluelist.h>
+#include <kjs/value.h>
+#include <kjs/object.h>
+#include <qvbox.h>
+#include <qptrdict.h>
+#include <kxmlguiclient.h>
+#include <qvaluelist.h>
+#include <qguardedptr.h>
+
+namespace Kate {
+ class PluginConfigPage;
+ namespace JS {
+ class Bindings;
+ class Management;
+ class RefCountedObjectDict;
+ class Application;
+ class MainWindow;
+ }
+}
+
+
+namespace KJSEmbed {
+ class KJSEmbedPart;
+ class JSFactory;
+}
+
+class KateKJSWrapperConfigPage;
+class PluginKateKJSWrapperView;
+
+namespace KMDI {
+ class ToolViewAccessor;
+}
+
+class PluginKateKJSWrapper : public Kate::Plugin,
+ Kate::PluginViewInterface,
+ Kate::PluginConfigInterfaceExtension
+{
+ Q_OBJECT
+
+ public:
+ PluginKateKJSWrapper( QObject* parent = 0, const char* name = 0, const QStringList& = QStringList() );
+ virtual ~PluginKateKJSWrapper();
+
+ void addView (Kate::MainWindow *win);
+ void removeView (Kate::MainWindow *win);
+
+ Kate::View *kv;
+
+
+ QPtrDict<class PluginKateKJSWrapperView> m_views;
+ uint configPages () const;
+ Kate::PluginConfigPage *configPage (uint , QWidget *w, const char *name=0);
+ QString configPageName(uint) const;
+ QString configPageFullName(uint) const;
+ QPixmap configPagePixmap (uint /*number = 0*/,
+ int /*size = KIcon::SizeSmall*/) const;
+ PluginKateKJSWrapperView *getViewObject(Kate::MainWindow *win);
+
+ public slots:
+ //void slotInsertCommand();
+ //void slotAbort();
+ void applyConfig( KateKJSWrapperConfigPage* );
+ void slotWindowDestroyed();
+
+ private:
+ friend class Kate::JS::Management;
+ friend class KateKJSWrapperConfigPage;
+ KJSEmbed::KJSEmbedPart *m_part;
+ Kate::JS::Bindings *m_kateAppBindings;
+ //QValueList<KJS::Value> m_configPageFactories;
+ KJS::Value m_configPageFactories;
+ KJS::Value m_toolViewConstructors;
+ KJS::Value m_newWindowHandler;
+ KJS::Value m_removeWindowHandler;
+ QString m_scriptname;
+ };
+
+
+/** Config page for the plugin. */
+class KateKJSWrapperConfigPage : public Kate::PluginConfigPage
+{
+ Q_OBJECT
+ friend class PluginKateKJSWrapper;
+
+ public:
+ KateKJSWrapperConfigPage(KJS::Object pageConstructor,PluginKateKJSWrapper* parent = 0L, QWidget *parentWidget = 0L);
+ ~KateKJSWrapperConfigPage() {};
+
+ /** Reimplemented from Kate::PluginConfigPage
+ * just emits configPageApplyRequest( this ).
+ */
+ void apply();
+
+ void reset ();
+ void defaults ();
+
+ signals:
+ /** Ask the plugin to set initial values */
+ void configPageApplyRequest( KateKJSWrapperConfigPage* );
+ /** Ask the plugin to apply changes */
+ void configPageInitRequest( KateKJSWrapperConfigPage* );
+
+ private:
+ KJS::Object m_pageObject;
+ PluginKateKJSWrapper *m_plugin;
+ };
+
+class PluginKateKJSWrapperView : public KXMLGUIClient
+{
+ public:
+
+ virtual ~PluginKateKJSWrapperView();
+
+ private:
+ friend class PluginKateKJSWrapper;
+ friend class Kate::JS::Application;
+ friend class Kate::JS::MainWindow;
+ void removeFromWindow();
+
+ Kate::MainWindow *win;
+ KJS::Object winObj;
+ KJS::Object actionCollectionObj;
+ QValueList<QGuardedPtr<KMDI::ToolViewAccessor> > toolviews;
+};
+
+
+
+namespace Kate {
+ namespace JS {
+ class ToolView: public QVBox {
+ Q_OBJECT
+ public:
+ ToolView(KJS::Object constr, KJS::ExecState *exec, KJSEmbed::JSFactory *factory, KJS::List parameters, const char * name);
+ virtual ~ToolView();
+ private:
+ KJS::Object handler;
+ };
+ }
+
+}
+
+#endif // _PLUGIN_KATE_KJS_WRAPPER_H_
+
diff --git a/kate/kjswrapper/samples/Makefile.am b/kate/kjswrapper/samples/Makefile.am
new file mode 100644
index 0000000..ee9a457
--- /dev/null
+++ b/kate/kjswrapper/samples/Makefile.am
@@ -0,0 +1,23 @@
+
+# Install the .rc file in the Part's directory (in this case, the part
+# is KHTMLPart)
+#pluginsdir=$(kde_datadir)/kate/plugins/katekjswrapper
+#plugins_DATA=ui.rc
+
+plugins1dir=$(kde_datadir)/kate/plugins/katekjstest1
+plugins1_DATA=katekjstest1.js
+
+pluginsconsolewindowdir=$(kde_datadir)/kate/plugins/katekjsconsolewindow
+pluginsconsolewindow_DATA=katekjsconsolewindow.js katekjsconsolewindow.rc
+
+pluginsselectdir=$(kde_datadir)/kate/plugins/katekjsselect
+pluginsselect_DATA=katekjsselect.js katekjsselect.rc
+
+#plugins2dir = $(kde_datadir)/kate/plugins/katekjstest2
+#plugins2_DATA = katekjstest2.js
+
+kde_services_DATA = katekjstest1.desktop katekjsconsolewindow.desktop katekjsselect.desktop
+#kde_services_DATA = katekjstest2.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kateinsertcommand.pot
diff --git a/kate/kjswrapper/samples/katekjsconsolewindow.desktop b/kate/kjswrapper/samples/katekjsconsolewindow.desktop
new file mode 100644
index 0000000..a882953
--- /dev/null
+++ b/kate/kjswrapper/samples/katekjsconsolewindow.desktop
@@ -0,0 +1,55 @@
+[Desktop Entry]
+Type=Service
+ServiceTypes=Kate/Plugin
+X-KDE-Library=katekjswrapperplugin
+X-Kate-Version=2.2
+X-Kate-PluginName=katekjsconsolewindow
+Name=Kate Javascript Console Window
+Name[bg]=Прозорец за изхода на Javascript
+Name[ca]=Finestra de consola de Javascript per a Kate
+Name[cs]=Okno javscriptové konzole Kate
+Name[da]=Kate Javascript konsolvindue
+Name[de]=Konsolenfenster für JavaScript in Kate
+Name[el]=Παράθυρο κονσόλας Javascript του Kate
+Name[eo]=Javaskripta konzolfenestro por Kodredaktilo
+Name[es]=Ventana de la consola de Javascript de Kate
+Name[et]=Kate Javascripti konsooliaken
+Name[eu]=Kate Javascript konsola leihoa
+Name[fa]=پنجرۀ پیشانۀ جاوااسکریپت Kate
+Name[fi]=Kate Javascript konsoli-ikkuna
+Name[fr]=Console Javascript pour Kate
+Name[fy]=Kate Javascript console-finster
+Name[ga]=Fuinneog Chonsóil Javascript Kate
+Name[gl]=Fiestra de Consola de JavaScript para Kate
+Name[he]= חלון תסריטי הג'אווה של Kate
+Name[hi]=केएटीई जावास्क्रिप्ट कंसोल विंडो
+Name[hr]=Kate terminalski prozor za Javascript
+Name[hu]=Kate Javascript-es parancsértelmező ablak
+Name[is]=Kate Javascript skjáhermir
+Name[it]=Finestra console JavaScript di Kate
+Name[ja]=Kate Javascript コンソールウィンドウ
+Name[ka]=Kate Javascript კონსოლის ფანჯარა
+Name[kk]=Kate Javascript консоль терезесі
+Name[km]=បង្អួច​កុងសូល​របស់ Kate Javascript
+Name[mk]=прозорец со Javascript-конзола за Кате
+Name[nb]=Javascript konsollvindu for Kate
+Name[nds]=Javascript-Konsoolfinster för Kate
+Name[ne]=केट जाभास्क्रिप्ट कन्सोल सञ्झ्याल
+Name[nl]=Kate Javascript console-venster
+Name[nn]=Javascript-konsollvindauge til Kate
+Name[pa]=ਕੇਟ ਜਾਵਾਸਕਰਿਪ ਕੰਨਸੋਲ ਝਰੋਖਾ
+Name[pl]=Okno konsoli Javascript dla Kate
+Name[pt]=Janela de Consola de JavaScript do Kate
+Name[pt_BR]=Janela de Console Javascript do Kate
+Name[ru]=Окно консоли Javascript Kate
+Name[sk]=Konzolové okno Kate Javascript
+Name[sl]=Konzolno okno javascripta v Kate
+Name[sr]=Конзолни прозор JavaSript-а за Kate
+Name[sr@Latn]=Konzolni prozor JavaSript-a za Kate
+Name[sv]=Kate Javaskript terminalfönster
+Name[tg]=Тирезаи нозиргоҳи Kate Javascript
+Name[tr]=Kate Javascript Konsol Penceresi
+Name[uk]=Вікно консолі Javascript для Kate
+Name[vi]=Cửa sổ bàn giao tiếp Javascript Kate
+Name[zh_CN]=Kate Javascript 控制台窗口
+Name[zh_TW]=Kate Javascript 主控台視窗
diff --git a/kate/kjswrapper/samples/katekjsconsolewindow.js b/kate/kjswrapper/samples/katekjsconsolewindow.js
new file mode 100644
index 0000000..e253ce0
--- /dev/null
+++ b/kate/kjswrapper/samples/katekjsconsolewindow.js
@@ -0,0 +1,18 @@
+function newWindowCallBack(mainwindow) {
+ var ac=mainwindow.actionCollection();
+ action = new KAction( ac, 'kjsconsole_show_action' );
+ action.text = 'Javascript Console Window';
+ action.icon = 'konsole';
+
+ mainwindow.showConsole = function()
+ {
+
+ KJSConsole();
+ }
+
+ action.connect( action, 'activated()', mainwindow, 'showConsole' );
+
+}
+
+setWindowConfiguration(null,newWindowCallBack,null);
+
diff --git a/kate/kjswrapper/samples/katekjsconsolewindow.rc b/kate/kjswrapper/samples/katekjsconsolewindow.rc
new file mode 100644
index 0000000..7ac34fc
--- /dev/null
+++ b/kate/kjswrapper/samples/katekjsconsolewindow.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="katekjsconsolewindow" library="libkatekjsconsolewindowplugin" version="1">
+<MenuBar>
+ <Menu name="tools"><Text>&amp;Tools</Text>
+ <Action name="kjsconsole_show_action"/>
+ </Menu>
+</MenuBar>
+</kpartplugin>
diff --git a/kate/kjswrapper/samples/katekjsselect.desktop b/kate/kjswrapper/samples/katekjsselect.desktop
new file mode 100644
index 0000000..c4d1273
--- /dev/null
+++ b/kate/kjswrapper/samples/katekjsselect.desktop
@@ -0,0 +1,53 @@
+[Desktop Entry]
+Type=Service
+ServiceTypes=Kate/Plugin
+X-KDE-Library=katekjswrapperplugin
+X-Kate-Version=2.2
+X-Kate-PluginName=katekjsselect
+Name=Select Smallest Enclosing Block
+Name[ca]=Selecció del bloc tancat més petit
+Name[cs]=Zvolte nejmenší blok
+Name[da]=Vælg den mindste omsluttende blok
+Name[de]=Kleinsten einschließenden Block auswählen
+Name[el]=Επιλογή του μικρότερου περικλυόμενου κομματιού
+Name[eo]=Elektu pli mallongan entenantan blokon
+Name[es]=Selecciona un bloque cerrado más pequeño
+Name[et]=Vali väikseim sulgev blokk
+Name[eu]=Hautatu blokerik txikiena
+Name[fa]=گزینش کوچک‌ترین بلوک محصور
+Name[fi]=Valitse pienin ympäröity lohko
+Name[fr]=Sélection du plus petit bloc enfermé
+Name[fy]=Lytste ynslutende blok selektearje
+Name[gl]=Seleccionar o Menor Bloco Envolvente
+Name[he]=בחר את בלוק הסגירה הכי קטן
+Name[hr]=Odabir najmanjeg zatvorenog bloka
+Name[hu]=A legkisebb bezáró blokk kijelölése
+Name[is]=Velja minnstu umluktu blokkina
+Name[it]=Seleziona il più piccolo blocco
+Name[ja]=囲っている最も内側のブロックを選択します
+Name[ka]=უმცირესი დახურვის ბლოკის ამორჩევა
+Name[kk]=Ең шағын блокты таңдау
+Name[km]=ជ្រើស​ប្លុក​ដែល​បាន​ព័ទ្ធ​ជុំវិញ​​​តូច​បំផុត
+Name[lt]=Žymėti mažiausią bloką
+Name[mk]=Најмал опкружувачки блок
+Name[ms]=Pilih Blok Penutupan Terkecil
+Name[nb]=Velg minste omsluttende blokk
+Name[nds]=Den lüttsten insluten Block utsöken
+Name[ne]=सामेल गरिने सबैभन्दा सानो खण्ड चयन गर्नुहोस्
+Name[nl]=Kleinste insluitende blok selecteren
+Name[nn]=Vel minste omsluttande blokk
+Name[pl]=Wybierz najmniejszy blok zawierający
+Name[pt]=Seleccionar o Menor Bloco Envolvente
+Name[pt_BR]=Sleecione o Menor Bloco Aninhado
+Name[ru]=Выбор наименьшего блока
+Name[sk]=Zvolí najmenší ohraničujúci blok
+Name[sl]=Izberite najmanjši obdajajoč blok
+Name[sr]=Изаберите најмањи обухватајући блок
+Name[sr@Latn]=Izaberite najmanji obuhvatajući blok
+Name[sv]=Markera minsta omgivande block
+Name[ta]=மிகச்சிறிய இணைப்பை தேர்ந்தெடு
+Name[tr]=Çevreleyen en küçük bloğu seç
+Name[uk]=Виберіть найменший блок включення
+Name[vi]=Chọn khối chứa nhỏ nhất
+Name[zh_CN]=选择最小的包围块
+Name[zh_TW]=選擇最小封閉區域
diff --git a/kate/kjswrapper/samples/katekjsselect.js b/kate/kjswrapper/samples/katekjsselect.js
new file mode 100644
index 0000000..d6a33fb
--- /dev/null
+++ b/kate/kjswrapper/samples/katekjsselect.js
@@ -0,0 +1,92 @@
+function newWindowCallBack(mainwindow) {
+ var ac=mainwindow.actionCollection();
+ action = new KAction( ac, 'kjsselect_select_action' );
+ action.text = 'Select enclosing block';
+ //action.icon = 'konsole';
+
+
+ mainwindow.selectIt = function()
+ {
+ endChars=Array();
+ endChars['\"']="\"";
+ endChars['(']=")";
+ endChars['[']="]";
+ endChars['\'']="'";
+ endChars['{']="}";
+ endChar="";
+ av=this.viewManager().activeView();
+ d=KATE.DocumentManager.activeDocument();
+
+ lineCnt=d.numLines();
+ x=av.cursorColumn();
+ y=av.cursorLine();
+ line=d.textLine(y);
+ sy=y;
+ sx=x-1;
+ while (true) {
+ if (sx<0) {
+ sy=sy-1;
+ if (sy<0) {
+ d.selectAll();
+ return;
+ }
+ line=d.textLine(sy);
+ while (line.length==0) {
+ sy=sy-1;
+ if (sy<0) {
+ d.selectAll();
+ return;
+ }
+ line=d.textLine(sy);
+ }
+ sx=line.length-1;
+
+ }
+ if (
+ (line[sx]=="\"") ||
+ (line[sx]=="'") ||
+ (line[sx]=="(") ||
+ (line[sx]=="[") ||
+ (line[sx]=="{")
+ ) {
+ endChar=endChars[line[sx]];
+ break;
+ }else sx--;
+ }
+
+
+ alert("Searching end");
+ ex=x;
+ ey=y;
+ line=d.textLine(y);
+ while (true) {
+ if (ex>=(line.length-1)) {
+ ey=ey+1;
+ if (ey>=lineCnt) {
+ d.selectAll();
+ return;
+ }
+ line=d.textLine(ey);
+ while (line.length==0) {
+ ey=ey+1;
+ if (ey>=lineCnt) {
+ d.selectAll();
+ return;
+ }
+ line=d.textLine(ey);
+ }
+ ex=0;
+ }
+ if (line[ex]==endChar)
+ break; else ex++;
+ }
+ d.setSelection(sy,sx,ey,ex);
+
+ }
+
+ action.connect( action, 'activated()', mainwindow, 'selectIt' );
+
+}
+
+setWindowConfiguration(null,newWindowCallBack,null);
+
diff --git a/kate/kjswrapper/samples/katekjsselect.rc b/kate/kjswrapper/samples/katekjsselect.rc
new file mode 100644
index 0000000..2b210a1
--- /dev/null
+++ b/kate/kjswrapper/samples/katekjsselect.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="katekjsselect" library="libkatekjsselect" version="1">
+<MenuBar>
+ <Menu name="tools"><Text>&amp;Tools</Text>
+ <Action name="kjsselect_select_action"/>
+ </Menu>
+</MenuBar>
+</kpartplugin>
diff --git a/kate/kjswrapper/samples/katekjstest1.desktop b/kate/kjswrapper/samples/katekjstest1.desktop
new file mode 100644
index 0000000..d5731b5
--- /dev/null
+++ b/kate/kjswrapper/samples/katekjstest1.desktop
@@ -0,0 +1,90 @@
+[Desktop Entry]
+Type=Service
+ServiceTypes=Kate/Plugin
+X-KDE-Library=katekjswrapperplugin
+X-Kate-Version=2.2
+X-Kate-PluginName=katekjstest1
+Name=Kate KJS Test 1
+Name[bs]=Kate KJS test 1
+Name[ca]=Test 1 per KJS a Kate
+Name[cs]=Kate KJS test 1
+Name[el]=Kate KJS δοκιμή 1
+Name[eo]=KJS testo 1 de Kodredaktilo
+Name[et]=Kate KJS test 1
+Name[eu]=Kate KJS-ren 1 froga
+Name[fa]=آزمون ۱ Kate KJS
+Name[fi]=Kate KJS testi 1
+Name[fr]=Test 1 KJS pour Kate
+Name[ga]=Tástáil 1 Kate KJS
+Name[gl]=Proba 1 para Kate KJS
+Name[he]=ניסוי KJS של Kate מספר 1
+Name[hi]=के-एटीई केजेएस जाँच 1
+Name[is]=Kate KJS prufa 1
+Name[ja]=Kate KJS テスト 1
+Name[km]=សាកល្បង Kate KJS
+Name[ms]=Kate KJS Ujian 1
+Name[nds]=Kate-KJSTest 1
+Name[ne]=केट केजेएस परीक्षण १
+Name[nn]=Kate KJS-test 1
+Name[pa]=ਕੇਟ KJS Test 1
+Name[pl]=KJS Test 1 dla Kate
+Name[pt]=Teste 1 Kate do KJS
+Name[pt_BR]=Teste Kate KJS 1
+Name[sl]=Kate KJS preizkus 1
+Name[sr]=Kate KJS, тест 1
+Name[sr@Latn]=Kate KJS, test 1
+Name[ta]=கேட் KJS சோதனை 1
+Name[tr]=Kate KJS Deneme1
+Name[uk]=Kate KJS Тест 1
+Name[vi]=Thử thách KJS Kate 1
+Name[zh_CN]=Kate KJS 测试 1
+Comment=Test for the KJS Wrapper
+Comment[bg]=Проба на обвивката на KJS
+Comment[ca]=Test pel Wrapper de KJS
+Comment[cs]=Test KJS wrapperu
+Comment[da]=Test for KJS Wrapper
+Comment[de]=Test für den KJS-Wrapper
+Comment[el]=Δοκιμή για το KJS Wrapper
+Comment[eo]=Testo por la KJS envolvaĵo
+Comment[es]=Test para el ajuste KJS
+Comment[et]=KJS Wrapperi test
+Comment[eu]=KJS Wrapper-erako testua
+Comment[fa]=آزمون برای سطربندی KJS
+Comment[fi]=KJS Wrapperin testi
+Comment[fr]=Test pour l'interface avec KJS
+Comment[fy]=Test foar de KJS Wrapper
+Comment[ga]=Tástáil an Rapar KJS
+Comment[gl]=Proba para o Wrapper de KJS
+Comment[he]=ניסיון עבור המעטפת KJS
+Comment[hi]=केजेएस व्रेपर के लिए जाँच
+Comment[hr]=Provjera za KJS omotač
+Comment[hu]=Tesztprogram a KJS felülethez
+Comment[is]=Prufa fyrir KJS eininguna
+Comment[it]=Test per il wrapper KJS
+Comment[ja]=KJS ラッパーのテスト
+Comment[ka]=KJS Wrapper-ის შემოწმება
+Comment[kk]=KJS Wrapper сынағы
+Comment[km]=សាកល្បង​សម្រាប់​​កម្មវិធី​រុំ​ KJS
+Comment[lt]=Bandymas KJS įdėklui
+Comment[mk]=Тест за обвивката KJS
+Comment[ms]=Ujian untuk Pembungkus KJS
+Comment[nb]=Test for KJS-omslaget
+Comment[nds]=Test för den KJS-Wrapper
+Comment[ne]=केजेएस आवरणका लागि परीक्षण
+Comment[nl]=Test voor de KJS Wrapper
+Comment[nn]=Test for KJS-omslaget
+Comment[pl]=Test obsługi KJS
+Comment[pt]=Teste para o 'Wrapper' de KJS
+Comment[pt_BR]=Teste para o Wrapper do KJS
+Comment[ru]=Тест KJS Wrapper
+Comment[sk]=Test pre obálku KJS
+Comment[sl]=Preizkus za KJS Wrapper
+Comment[sr]=Тест за KJS омотач
+Comment[sr@Latn]=Test za KJS omotač
+Comment[sv]=Test för KJS-omslutande program
+Comment[ta]=KJS சுற்றுத்தாளுக்கான சோதனை
+Comment[tr]=KJS Wrapper Testi
+Comment[uk]=Тест для KJS Wrapper
+Comment[vi]=Thử thách cho bộ bao bọc KJS
+Comment[zh_CN]=KJS Wrapper 的测试
+Comment[zh_TW]=KJS 包裝測試
diff --git a/kate/kjswrapper/samples/katekjstest1.js b/kate/kjswrapper/samples/katekjstest1.js
new file mode 100644
index 0000000..7e4e041
--- /dev/null
+++ b/kate/kjswrapper/samples/katekjstest1.js
@@ -0,0 +1,167 @@
+/****************************************************************
+ First configuration page
+****************************************************************/
+function Page1 (parentWidget) {
+ this.defaults=function() {
+ alert("Defaults has been called");
+ }
+ this.apply=function() {
+ alert("Apply has been called");
+ }
+ this.reset=function() {
+ alert("Reset defaults has been called");
+ }
+ box=new QVBox(parentWidget);
+ this.button1=new QPushButton(box);
+ this.button1.text="P1 Button 1";
+ this.button1.show();
+ this.button2=new QPushButton(box);
+ this.button2.text="P1 Button 2";
+ this.button2.show();
+ box.show();
+}
+Page1.name="Page1"
+Page1.fullName="Test1/Page1";
+
+/****************************************************************
+ Second configuration page
+****************************************************************/
+
+function Page2 (parentWidget) {
+ box=new QVBox(parentWidget);
+ this.button1=new QPushButton(box);
+ this.button1.text="P2 Button 1";
+ this.button1.show();
+ this.button2=new QPushButton(box);
+ this.button2.text="P2Button 2";
+ this.button2.show();
+ box.show();
+}
+Page2.name="Page2";
+Page2.fullName="Test1/Page2";
+
+/****************************************************************
+ Third configuration page
+****************************************************************/
+
+function Page3 (parentWidget) {
+ box=new QVBox(parentWidget);
+ this.button1=new QPushButton(box);
+ this.button1.text="P3 Button 1";
+ this.button1.show();
+ this.button2=new QPushButton(box);
+ this.button2.text="P3 Button 2";
+ this.button2.show();
+ box.show();
+}
+Page3.name="Page3";
+Page3.fullName="Test1/Page3";
+
+
+/****************************************************************
+ First toolview
+****************************************************************/
+
+function MyToolView1 (mainwindow,parentwidget) {
+ parentwidget.caption="This is my first JS Toolview";
+ parentwidget.icon=StdIcons.BarIcon("yes");
+
+ this.lv = new KListView( parentwidget );
+
+ this.lv.addColumn('Pix');
+ this.lv.addColumn('One');
+ this.lv.addColumn('Two');
+ this.lv.addColumn('Three');
+
+ this.lv.insertItem( StdIcons.BarIcon("no"), 'Something', "Nothing", "Thing" );
+ this.lv.insertItem( StdIcons.BarIcon("no"), 'Something', "Nothing", "Thing" );
+ this.lv.insertItem( StdIcons.BarIcon("no"), 'Something', "Nothing", "Thing" );
+ this.lv.insertItem( StdIcons.BarIcon("no"), 'Something', "Nothing", "Thing" );
+
+ this.changed=function() {
+ alert("Item changed");
+ KATE.DocumentManager.activeDocument().insertText(0,0,"TEST");
+ }
+ this.lv.connect(this.lv,'selectionChanged()',this,'changed');
+
+
+ this.mw=mainwindow;
+ this.cleanup=function() {
+ alert("Cleanup MyToolView1");
+ }
+
+}
+MyToolView1.startPosition=KATE.ToolView.Right;
+MyToolView1.name="myfirstjstoolview"
+
+
+/****************************************************************
+ Second toolview
+****************************************************************/
+
+function MyToolView2 (mainwindow,parentwidget) {
+ parentwidget.caption="This is my second JS Toolview";
+ parentwidget.icon=StdIcons.BarIcon("no");
+
+ this.lb=new QListBox(parentwidget);
+ this.mainwindow=mainwindow;
+ this.cleanup=function() {
+ alert("Cleanup MyToolView2");
+ }
+}
+MyToolView2.startPosition=KATE.ToolView.Left;
+MyToolView2.name="mysecondjstoolview"
+
+
+
+/****************************************************************
+ NewWindow callback
+****************************************************************/
+
+function newWindowCallBack(mainwindow) {
+ alert("New Window has been created");
+/*
+ anotherToolView = function (mainwindow,parentwidget) {
+ parentwidget.caption="This is my third JS Toolview";
+ parentwidget.icon=StdIcons.BarIcon("kate");
+
+ this.lb=new QListBox(parentwidget);
+ this.mainwindow=mainwindow;
+ this.cleanup=function() {
+ alert("Cleanup MyToolView3");
+ }
+ }
+ anotherToolView.startPosition=KATE.ToolView.Left;
+ anotherToolView.name="mythirdjsoolview"
+ mainwindow.createToolView(anotherToolView);*/
+}
+
+/****************************************************************
+ WindowRemoved callback
+****************************************************************/
+function windowRemovedCallBack(mainwindow) {
+ alert("Window has been removed");
+}
+
+
+
+
+
+
+/****************************************************************
+ Initialization
+****************************************************************/
+
+cpc=new Array();
+cpc.push(Page1);
+cpc.push(Page2);
+setConfigPages(cpc);
+//setConfigPages(Page3);
+//addConfigPage(Page3);
+
+tvc=new Array();
+tvc.push(MyToolView1);
+tvc.push(MyToolView2);
+setWindowConfiguration(tvc,newWindowCallBack,windowRemovedCallBack);
+//setWindowConfiguration(MyToolView1,newWindowCallBack,windowRemovedCallBack);
+
diff --git a/kate/kpybrowser/Makefile.am b/kate/kpybrowser/Makefile.am
new file mode 100644
index 0000000..654dacc
--- /dev/null
+++ b/kate/kpybrowser/Makefile.am
@@ -0,0 +1,18 @@
+# set the include path for X, qt and KDE
+INCLUDES= $(all_includes)
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = katepybrowseplugin.la
+
+katepybrowseplugin_la_SOURCES = kpybrowser.cpp pybrowsenode.cpp pybrowse_part.cpp
+katepybrowseplugin_la_LIBADD = -lkateinterfaces
+katepybrowseplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+pluginsdir = $(kde_datadir)/kate/plugins/katepybrowse
+plugins_DATA = ui.rc
+
+kde_services_DATA = katepybrowse.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/katepybrowse.pot
+
diff --git a/kate/kpybrowser/katepybrowse.desktop b/kate/kpybrowser/katepybrowse.desktop
new file mode 100644
index 0000000..8b33b1c
--- /dev/null
+++ b/kate/kpybrowser/katepybrowse.desktop
@@ -0,0 +1,128 @@
+# KDE Config File
+[Desktop Entry]
+Type=Service
+ServiceTypes=Kate/Plugin
+X-KDE-Library=katepybrowseplugin
+X-Kate-Version=2.5
+Name=Kate Python Browser Plugin
+Name[af]=Kate Python Blaaier Inplak
+Name[ar]=ملحق متصفح Python لـKate
+Name[az]=Kate Python Səyyah Əlavəsi
+Name[ca]=Connector del navegador Python per a Kate
+Name[cs]=Modul Python prohlížeče pro Kate
+Name[cy]=Ategyn porydd Python am Kate
+Name[da]=Kate Pythonlæser-plugin
+Name[de]=Browser-Modul für Python
+Name[el]=Πρόσθετο περιηγητή Python του Kate
+Name[eo]=Pitona foliumila kromaĵo por Kodredaktilo
+Name[es]=Complemento del navegador Python de Kate
+Name[et]=Kate Pythoni brauseri plugin
+Name[eu]=Kateren Python arakatzailearen plugina
+Name[fa]=وصلۀ مرورگر Kate Python
+Name[fi]=Kate Python selain -sovelma
+Name[fo]=Kate Python-kagari-ístingur
+Name[fr]=Module de navigation en Python pour Kate
+Name[fy]=Kate Pyton Blêder Plugin
+Name[gl]=Plugin de Navegación por Python para Kate
+Name[he]=תוסף דפדפן Python ל־Kate
+Name[hi]=के-एटीई पायथन ब्राउज़र प्लगइन
+Name[hr]=Python dodatak za Kate
+Name[hu]=Kate Python-böngésző bővítőmodul
+Name[is]=Kate Python flakk viðbætur
+Name[it]=Plugin visualizzatore Python di Kate
+Name[ja]=Kate Python ブラウザプラグイン
+Name[ka]=Kate-ის პითონის ბროუზერის მოდული
+Name[kk]=Kate Python шолғышының плагин модулі
+Name[km]=កម្មវិធី​ជំនួយ​​របស់​កម្មវិធី​រុករក Kate Python
+Name[lt]=Kate Python naršyklės priedas
+Name[mk]=Приклучок за пребарувач на Python во Кате
+Name[ms]=Plug masuk Pelungsur Python Kate
+Name[nb]=Pythonleser-programtillegg til Kate
+Name[nds]=Python-Kiekermoduul för Kate
+Name[ne]=केट पाइथन ब्राउजर प्लगइन
+Name[nn]=Kate-programtillegg for Python-oversikt
+Name[pa]=ਕੇਟ ਪਾਈਥਨ ਝਲਕਾਰਾ ਪਲੱਗਇਨ
+Name[pl]=Wtyczka przeglądarki do Pythona do Kate
+Name[pt]='Plugin' de Navegação no Python do Kate
+Name[pt_BR]=Plug-in de Navegação Python do Kate
+Name[ro]=Modul Kate de navigare Python
+Name[ru]=Модуль просмотра программ на Python для Kate
+Name[sk]=Modul Kate Python prehliadača
+Name[sl]=Vstavek za brskanje po Pythonu v Kate
+Name[sr]=Прикључак прегледача Python-а за Kate
+Name[sr@Latn]=Priključak pregledača Python-a za Kate
+Name[sv]=Kates Python-bläddrarinsticksprogram
+Name[ta]=கேட் பைதான் உலாவி சொருகுப்பொருள்
+Name[tg]=Модули аз назар гузаронидани барнома ба Python барои Kate
+Name[th]=ปลั๊กอินบราวเซอร์ไพธอนของ Kate
+Name[tr]=Kate Python Tarayıcı Eklentisi
+Name[uk]=Втулок навігації Python для Kate
+Name[uz]=Kate Python brauzer plagini
+Name[uz@cyrillic]=Kate Python браузер плагини
+Name[vi]=Bổ sung duyệt Python Kate
+Name[xh]=IPython ye Kate yokukhangela iplagi yangaphakathi
+Name[zh_CN]=Kate Python 浏览器插件
+Name[zh_TW]=Kate Python 瀏覽外掛程式
+Comment=A Python browser plugin for Kate
+Comment[af]='n Python blaaier inplak vir Kate
+Comment[ar]=ملحق متصفح Python لـKate
+Comment[az]=Kate üçün Python səyyah əlavəsi
+Comment[bg]=Приставка за разглеждане на класовете и методите на програми на Питон
+Comment[bs]=Python browser plugin za Kate
+Comment[ca]=Un connector per a Kate per a navegar dins del codi Python
+Comment[cs]=Modul Python prohlížeče pro Kate
+Comment[cy]=Ategyn porydd Python am Kate
+Comment[da]=Et Pythonlæser-plugin for Kate
+Comment[de]=Ein Browser-Modul für Python
+Comment[el]=Ένα πρόσθετο περιηγητή Python για το Kate
+Comment[eo]=Pitona foliumila kromaĵo por Kodredaktilo
+Comment[es]=Un complemento de un navegador Python para Kate
+Comment[et]=Pythoni brauseri plugin Kate jaoks
+Comment[eu]=Python-en arakatzaile plugina Katerentzat
+Comment[fa]=وصلۀ مرورگر Python برای Kate
+Comment[fi]=Python selainsovelma Katelle
+Comment[fo]=Ein Python-kagari-ístingur til Kate.
+Comment[fr]=Un module externe de navigateur en Python pour Kate
+Comment[fy]=In Pyton-blêderplugin foar Kate
+Comment[ga]=Breiseán brabhsála Python le haghaidh Kate
+Comment[gl]=Un plugin de navegación por Python para Kate
+Comment[he]=תוסף דפדפן Python ל־Kate
+Comment[hi]=के-एटीई के लिए पायथन ब्राउज़र प्लगइन
+Comment[hr]=Python preglednički dodatak za Kate
+Comment[hu]=Python-böngésző bővítőmodul a Kate-hez
+Comment[is]=Python flakk viðbætur fyrir Kate
+Comment[it]=Un plugin di visualizzazione di Python per Kate
+Comment[ja]=Kate の Python ブラウザプラグイン
+Comment[ka]=პითონის ბრაუზერის მოდული Kate-სთვის
+Comment[kk]=Python бағдарламаларды көрсету Kate-тің плагин модулі
+Comment[km]=កម្មវិធី​ជំនួយ​​របស់​កម្មវិធី​រុករក Python សម្រាប់ Kate
+Comment[lt]=Python naršyklės priedas, skirtas Kate
+Comment[mk]=Приклучок за пребарувач на Python во Кате
+Comment[ms]=Plug masuk Pelungsur Python Kate
+Comment[nb]=Et programtillegg for Pythonleseren til Kate
+Comment[nds]=En Python-Kiekermoduul för Kate
+Comment[ne]=केटका लागि एउटा पाइथन ब्राउजर प्लगइन
+Comment[nl]=Een Python-browserplugin voor Kate
+Comment[nn]=Ei Python-oversikt til Kate
+Comment[pa]=ਕੇਟ ਲਈ ਪਾਈਥਨ ਝਲਕਾਰਾ ਪਲੱਗਇਨ
+Comment[pl]=Wtyczka przeglądarki Pythona do Kate
+Comment[pt]=Um 'plugin' de navegação no Python para o Kate
+Comment[pt_BR]=Um Plugin de navegação Python para o Kate
+Comment[ro]=Un modul de navigare Python pentru Kate
+Comment[ru]=Модуль просмотра программ на Python для Kate
+Comment[sk]=Python modul prehliadača pre Kate
+Comment[sl]=Vstavek za brskanje po Pythonu v Kate
+Comment[sr]=Прикључак прегледача Python-а за Kate
+Comment[sr@Latn]=Priključak pregledača Python-a za Kate
+Comment[sv]=Python-bläddrarinsticksprogram för Kate
+Comment[ta]=கேட்-டுக்கான பைதான் உலாவி சொருகுப்பொருள்
+Comment[tg]=Модули аз назар гузаронидани барнома ба Python барои Kate
+Comment[th]=ปลั๊กอินบราวเซอร์ไพธอนสำหรับ Kate
+Comment[tr]=Kate için Python tarayıcı programı
+Comment[uk]=Втулок навігації Python для Kate
+Comment[uz]=Kate uchun Python brauzer vositasi
+Comment[uz@cyrillic]=Kate учун Python браузер воситаси
+Comment[vi]=Bổ sung duyệt Python cho Kate
+Comment[xh]=Isijongi se Python yeplagi yangaphakathi se Kate
+Comment[zh_CN]=为 Kate 提供的 Python 浏览器插件
+Comment[zh_TW]=Kate 的 Python 瀏覽外掛程式
diff --git a/kate/kpybrowser/kpybrowser.cpp b/kate/kpybrowser/kpybrowser.cpp
new file mode 100644
index 0000000..9023e65
--- /dev/null
+++ b/kate/kpybrowser/kpybrowser.cpp
@@ -0,0 +1,397 @@
+/***************************************************************************
+ kpybrowser.cpp - description
+ -------------------
+ begin : Fri Aug 24 15:11:58 MST 2001
+ copyright : (C) 2001 by Christian Bird
+ email : chrisb@lineo.com
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "kpybrowser.h"
+#include <qheader.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <qregexp.h>
+
+#include "kpybrowser.moc"
+
+#include <iostream>
+
+static const char *container_xpm[] = {
+ "16 16 119 2",
+ " c None",
+ ". c #020202",
+ "+ c #484848",
+ "@ c #141414",
+ "# c #CBCBCB",
+ "$ c #E9E9E9",
+ "% c #2F2F2F",
+ "& c #3E3E3E",
+ "* c #006B9E",
+ "= c #003D5A",
+ "- c #757575",
+ "; c #A4A4A4",
+ "> c #727272",
+ ", c #282828",
+ "' c #C1E1ED",
+ ") c #D3EDF6",
+ "! c #79BFD6",
+ "~ c #E4E4E4",
+ "{ c #202121",
+ "] c #3CB9ED",
+ "^ c #3AA3C5",
+ "/ c #77BCD6",
+ "( c #82C3D9",
+ "_ c #0873A5",
+ ": c #003C5B",
+ "< c #464646",
+ "[ c #1E1E1E",
+ "} c #19AFEE",
+ "| c #0787B6",
+ "1 c #38A2C5",
+ "2 c #5DB1D0",
+ "3 c #76BBD5",
+ "4 c #81C2D8",
+ "5 c #85C4D9",
+ "6 c #0770A1",
+ "7 c #4F4F4F",
+ "8 c #169ACB",
+ "9 c #106CA1",
+ "0 c #127CAD",
+ "a c #0784B2",
+ "b c #56B0CD",
+ "c c #72B9D4",
+ "d c #91C9DB",
+ "e c #3F3F3F",
+ "f c #2B2B2B",
+ "g c #1380B2",
+ "h c #0B5482",
+ "i c #0E5E91",
+ "j c #0E6597",
+ "k c #116FA0",
+ "l c #127FB1",
+ "m c #58AECD",
+ "n c #70B8D3",
+ "o c #454545",
+ "p c #FCFCFC",
+ "q c #E9E4E4",
+ "r c #8AA9B9",
+ "s c #296C8E",
+ "t c #0E5C8D",
+ "u c #0F6698",
+ "v c #1175A4",
+ "w c #404040",
+ "x c #444444",
+ "y c #F6F6F6",
+ "z c #F1F1F1",
+ "A c #EBEBEB",
+ "B c #EAEAEA",
+ "C c #DBD7D6",
+ "D c #81A0B0",
+ "E c #286C8F",
+ "F c #0F6596",
+ "G c #1172A4",
+ "H c #57A1C0",
+ "I c #424242",
+ "J c #EEEEEE",
+ "K c #E6E6E6",
+ "L c #E1E1E1",
+ "M c #DCDCDC",
+ "N c #D5D5D5",
+ "O c #D7D7D7",
+ "P c #CBC9C8",
+ "Q c #88A6B5",
+ "R c #276C8C",
+ "S c #276892",
+ "T c #363636",
+ "U c #C4C4C4",
+ "V c #DFDFDF",
+ "W c #DEDEDE",
+ "X c #DBDBDB",
+ "Y c #D6D6D6",
+ "Z c #D1D1D1",
+ "` c #CCCCCC",
+ " . c #C5C5C5",
+ ".. c #BFBFBF",
+ "+. c #C1BEBE",
+ "@. c #6E6D6D",
+ "#. c #686868",
+ "$. c #C0C0C0",
+ "%. c #CECECE",
+ "&. c #CACACA",
+ "*. c #C6C6C6",
+ "=. c #BBBBBB",
+ "-. c #B6B6B6",
+ ";. c #AEAEAE",
+ ">. c #323232",
+ ",. c #606060",
+ "'. c #AFAFAF",
+ "). c #B5B5B5",
+ "!. c #B0B0B0",
+ "~. c #AAAAAA",
+ "{. c #6C6B6B",
+ "]. c #2E2E2E",
+ "^. c #585858",
+ "/. c #9D9D9D",
+ "(. c #A7A7A7",
+ "_. c #6A6969",
+ ":. c #393939",
+ "<. c #292929",
+ "[. c #3A3835",
+ " . + ",
+ " @ # $ + + % ",
+ " & * = - ; # $ + . + > . ",
+ " , ' ) ! * = - ; # ~ $ $ . ",
+ " { ] ^ / ' ) ( _ : - ; # $ < ",
+ " [ } | 1 2 3 4 ' ) 5 6 = - 7 ",
+ " [ 8 9 0 a | 1 b c d ' ) ! e ",
+ " f g h i j k l | | 1 m n ' e ",
+ " o p q r s h t u v 0 | | n w ",
+ " x y z A B C D E h i F G H w ",
+ " I J B K L M N O P Q R h S w ",
+ " T U V W X Y Z ` ... .+.@.o ",
+ " . T #.$.%.&.*.$.=.-.;.@.< ",
+ " . >.,.'.=.).!.~.{.o ",
+ " . ].^./.(._.:.",
+ " . <.[. "
+};
+
+void
+getOpenNodes (QValueList < QString > *open_nodes, PyBrowseNode * node)
+{
+ if (node == NULL)
+ return;
+ if (node->isOpen ())
+ {
+ open_nodes->append (node->getQualifiedName ());
+ }
+
+ getOpenNodes (open_nodes,
+ dynamic_cast < PyBrowseNode * >(node->firstChild ()));
+ getOpenNodes (open_nodes,
+ dynamic_cast < PyBrowseNode * >(node->nextSibling ()));
+}
+
+
+KPyBrowser::KPyBrowser (QWidget * parent, const char *name):
+KListView (parent, name)
+{
+
+ addColumn(i18n("Name"));
+ header ()->hide ();
+ class_root =
+ new PyBrowseNode (this, QString ("Classes"), i18n("Classes"),
+ PYOTHER);
+ class_root->setPixmap (0, QPixmap (container_xpm));
+ function_root =
+ new PyBrowseNode (this, QString ("Globals"), i18n("Globals"),
+ PYOTHER);
+ function_root->setPixmap (0, QPixmap (container_xpm));
+ setRootIsDecorated (1);
+ connect (this, SIGNAL (executed (QListViewItem *)), this,
+ SLOT (nodeSelected (QListViewItem *)));
+ setTooltipColumn (1);
+ setShowToolTips (1);
+ tooltip = new KPBToolTip (this);
+}
+
+KPyBrowser::~KPyBrowser ()
+{
+}
+
+void
+KPyBrowser::nodeSelected (QListViewItem * node)
+{
+ PyBrowseNode *browse_node = dynamic_cast < PyBrowseNode * >(node);
+
+ if (!browse_node)
+ {
+ return;
+ }
+
+ QString method_name;
+ int line_no;
+
+ line_no = browse_node->getLine();
+ method_name = browse_node->getName();
+ if (browse_node->getType () == PYCLASS)
+ {
+ method_name = QString ("class ") + browse_node->getName ();
+ }
+ else if (browse_node->getType () == PYMETHOD
+ || browse_node->getType () == PYFUNCTION)
+ {
+ method_name = QString ("def ") + browse_node->getName ();
+ }
+ emit selected(method_name, line_no);
+}
+
+void
+KPyBrowser::parseText (QString & pytext)
+{
+ QRegExp class_rx (QString ("^class [a-zA-Z0-9_,\\s\\(\\).]+:"));
+ QRegExp function_rx (QString ("^def [a-zA-Z_]+[^#]*:"));
+ QRegExp method_rx (QString ("[\\s]+def [a-zA-Z_]+[^#]*:"));
+
+ int paren_i;
+ QStringList lines = QStringList::split ("\n", pytext, TRUE);
+ QStringList::Iterator iter;
+ QString *line;
+ QString class_name, method_name, function_name, class_sig, method_sig,
+ function_sig;
+ PyBrowseNode *last_class_node = NULL;
+ PyBrowseNode *last_method_node = NULL;
+ PyBrowseNode *last_function_node = NULL;
+
+ QValueList < QString > open_nodes;
+ getOpenNodes (&open_nodes, class_root);
+ getOpenNodes (&open_nodes, function_root);
+
+
+ int line_no, state = 0;
+
+ if (class_root != NULL)
+ {
+ delete class_root;
+ }
+ if (function_root != NULL)
+ {
+ delete function_root;
+ }
+ class_root =
+ new PyBrowseNode (this, QString ("Classes"), i18n("Classes"),
+ PYOTHER);
+ class_root->setPixmap (0, QPixmap (container_xpm));
+ function_root =
+ new PyBrowseNode (this, QString ("Globals"), i18n("Globals"),
+ PYOTHER);
+ function_root->setPixmap (0, QPixmap (container_xpm));
+ node_dict.insert (class_root->getQualifiedName (), class_root);
+ node_dict.insert (function_root->getQualifiedName (), function_root);
+
+
+ line_no = 0;
+
+ for (iter = lines.begin(); iter != lines.end(); ++iter)
+ {
+ line_no++;
+ line = &(*iter);
+ if (class_rx.search(*line) >= 0)
+ {
+ //KMessageBox::information(this, *line, QString("Found class on line %1").arg(line_no));
+ //strip out the beginning class and ending colon
+ class_sig = line->stripWhiteSpace ().mid (6);
+ class_sig = class_sig.left (class_sig.length () - 1);
+ paren_i = class_sig.find ("(");
+ class_name = class_sig.left (paren_i);
+
+ last_class_node =
+ new PyBrowseNode (class_root, class_name, class_sig, PYCLASS);
+ last_class_node->setLine (line_no);
+ last_class_node->setClass (class_name);
+ node_dict.insert (last_class_node->getQualifiedName (),
+ last_class_node);
+ state = 1;
+ }
+ if ((method_rx.search(*line) >= 0) && (state == 1))
+ {
+ //strip off the leading def and the ending colon
+ method_sig = line->stripWhiteSpace ().mid (4);
+ method_sig = method_sig.left (method_sig.find (":"));
+ paren_i = method_sig.find ("(");
+ method_name = method_sig.left (paren_i);
+ last_method_node =
+ new PyBrowseNode (last_class_node, method_name, method_sig,
+ PYMETHOD);
+ last_method_node->setLine (line_no);
+ last_method_node->setClass (last_class_node->getClass ());
+ node_dict.insert (last_method_node->getQualifiedName (),
+ last_method_node);
+ }
+ if ((function_rx.search(*line) >= 0))
+ {
+ //KMessageBox::information(this, *line, QString("Found function on line %1").arg(line_no));
+ function_sig = line->stripWhiteSpace ().mid (4);
+ function_sig = function_sig.left (function_sig.find (":"));
+ paren_i = function_sig.find ("(");
+ function_name = function_sig.left (paren_i);
+ last_function_node =
+ new PyBrowseNode (function_root, function_name, function_sig,
+ PYFUNCTION);
+ last_function_node->setLine (line_no);
+ node_dict.insert (last_function_node->getQualifiedName (),
+ last_function_node);
+ state = 0;
+ }
+ }
+
+ //now go through the list of old open nodes and open them in the new
+ //tree. For each node name in the open_nodes list, attempt to find that
+ //node and in the new dict and open it.
+ QValueList<QString>::iterator it;
+ PyBrowseNode *tmp_node;
+ for (it=open_nodes.begin(); it != open_nodes.end(); ++it)
+ {
+ tmp_node = node_dict[(*it)];
+ if (tmp_node)
+ {
+ tmp_node->setOpen(1);
+ }
+ }
+
+}
+
+
+void
+KPyBrowser::tip (const QPoint & p, QRect & r, QString & str)
+{
+ QListViewItem *item = (QListViewItem *) itemAt (p);
+ if (item == NULL)
+ {
+ str = "";
+ return;
+ }
+ r = itemRect (item);
+ //r.setY(r.y() + 10);
+
+ PyBrowseNode *browse_node = dynamic_cast < PyBrowseNode * >(item);
+
+ if (browse_node)
+ {
+ if (r.isValid ())
+ str = browse_node->getSig ();
+ else
+ str = "";
+ }
+ else
+ {
+ str = item->text (0);
+ }
+}
+
+/////////////////////////////////////////////////////////////////////
+// KateFileList::KFLToolTip implementation
+
+KPyBrowser::KPBToolTip::KPBToolTip (QWidget * parent):QToolTip (parent)
+{
+}
+
+void
+KPyBrowser::KPBToolTip::maybeTip (const QPoint & p)
+{
+ QString str;
+ QRect r;
+
+ ((KPyBrowser *) parentWidget ())->tip (p, r, str);
+
+ if (!str.isEmpty () && r.isValid ())
+ tip (r, str);
+}
diff --git a/kate/kpybrowser/kpybrowser.desktop b/kate/kpybrowser/kpybrowser.desktop
new file mode 100644
index 0000000..c045dfc
--- /dev/null
+++ b/kate/kpybrowser/kpybrowser.desktop
@@ -0,0 +1,18 @@
+# KDE Config File
+[Desktop Entry]
+Type=Application
+Exec=kpybrowser -caption "%c" %i %m
+Icon=kpybrowser
+Comment=
+Terminal=false
+Name=KPyBrowser
+Name[cy]=KPyPorydd
+Name[eo]=KPyFoliumilo
+Name[fo]=KPyKagari
+Name[fy]=KPyBlêder
+Name[hi]=के-पीवाय-ब्राउज़र
+Name[ne]=केपीवाई ब्राउजर
+Name[sv]=Python-bläddrare
+Name[ta]=KPyஉலாவி
+Name[th]=บราวเซอร์ไพธอน
+Name[tr]=KPy Tarayıcı
diff --git a/kate/kpybrowser/kpybrowser.h b/kate/kpybrowser/kpybrowser.h
new file mode 100644
index 0000000..ae49d3c
--- /dev/null
+++ b/kate/kpybrowser/kpybrowser.h
@@ -0,0 +1,69 @@
+/***************************************************************************
+ kpybrowser.h - description
+ -------------------
+ begin : Fri Aug 24 15:11:58 MST 2001
+ copyright : (C) 2001 by Christian Bird
+ email : chrisb@lineo.com
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef KPYBROWSER_H
+#define KPYBROWSER_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kapplication.h>
+#include <klistview.h>
+#include <qstring.h>
+#include <qvaluelist.h>
+#include <qtooltip.h>
+#include <qdict.h>
+#include "pybrowsenode.h"
+
+
+/** KPyBrowser is the base class of the project */
+class KPyBrowser : public KListView
+{
+ Q_OBJECT
+ public:
+ /** construtor */
+ KPyBrowser(QWidget* parent=0, const char *name=0);
+ /** destructor */
+ ~KPyBrowser();
+ void parseText(QString &pytext);
+
+ //used by KPBToolTip to dynamically create the needed tooltip
+ void tip (const QPoint &p, QRect &r, QString &str);
+
+ private:
+ PyBrowseNode *class_root, *function_root;
+
+ //create a mapping of names to nodes
+ QDict<PyBrowseNode> node_dict;
+
+ public slots:
+ void nodeSelected(QListViewItem *node);
+ signals:
+ void selected(QString, int);
+ private:
+ class KPBToolTip : public QToolTip
+ {
+ public:
+ KPBToolTip(QWidget *parent);
+ protected:
+ void maybeTip( const QPoint & );
+ };
+ KPBToolTip* tooltip;
+};
+
+#endif
diff --git a/kate/kpybrowser/pybrowse.xpm b/kate/kpybrowser/pybrowse.xpm
new file mode 100644
index 0000000..dc0b4c5
--- /dev/null
+++ b/kate/kpybrowser/pybrowse.xpm
@@ -0,0 +1,495 @@
+#ifndef PYBROWSE_XPM
+
+static const char * pybrowse_xpm[] = {
+"34 34 454 2",
+" c None",
+". c #90826F",
+"+ c #8D7F6C",
+"@ c #897C6A",
+"# c #857968",
+"$ c #817666",
+"% c #7D7364",
+"& c #7A7062",
+"* c #766D60",
+"= c #726A5D",
+"- c #6E675B",
+"; c #6B6459",
+"> c #676157",
+", c #635E55",
+"' c #5F5B53",
+") c #5B5851",
+"! c #848484",
+"~ c #8E816D",
+"{ c #C9C9C9",
+"] c #C1C1C1",
+"^ c #BABABA",
+"/ c #ABAAAA",
+"( c #8F8F8E",
+"_ c #7B7B7A",
+": c #616161",
+"< c #8C7F6C",
+"[ c #FFFFFF",
+"} c #FEFEFE",
+"| c #F8F8F8",
+"1 c #EAEAE9",
+"2 c #D1D1D1",
+"3 c #A6A6A6",
+"4 c #929292",
+"5 c #000000",
+"6 c #8A7D6B",
+"7 c #FDFDFD",
+"8 c #F5F5F5",
+"9 c #E9E9E9",
+"0 c #C3C2C2",
+"a c #757575",
+"b c #878787",
+"c c #887B69",
+"d c #DCDBD9",
+"e c #FAFAFA",
+"f c #ECECEC",
+"g c #666666",
+"h c #867968",
+"i c #9D9D9D",
+"j c #FBFBFB",
+"k c #575757",
+"l c #847867",
+"m c #4E4E4E",
+"n c #E0E0E0",
+"o c #817665",
+"p c #C6C6C6",
+"q c #7F7464",
+"r c #FCFCFC",
+"s c #4D4D4D",
+"t c #1A1A1A",
+"u c #2B2B2B",
+"v c #474747",
+"w c #737373",
+"x c #6A6A6A",
+"y c #7D7263",
+"z c #C8C8C8",
+"A c #D9D8D6",
+"B c #4D641F",
+"C c #EEEEEE",
+"D c #D6D5D3",
+"E c #C0C0BB",
+"F c #B5B3AC",
+"G c #9D9A90",
+"H c #837F7A",
+"I c #726F6D",
+"J c #5C5957",
+"K c #656565",
+"L c #7A6F60",
+"M c #587421",
+"N c #5E7D22",
+"O c #5F7E22",
+"P c #8EAA36",
+"Q c #9AB646",
+"R c #8AAE26",
+"S c #728A2A",
+"T c #96AE46",
+"U c #869E52",
+"V c #E8E8E8",
+"W c #DEDEDE",
+"X c #CECDCB",
+"Y c #BCBCBA",
+"Z c #AFAAA3",
+"` c #8C8B81",
+" . c #706C69",
+".. c #494743",
+"+. c #5E6A42",
+"@. c #74902E",
+"#. c #B2D252",
+"$. c #729222",
+"%. c #C6DE6A",
+"&. c #F6FACE",
+"*. c #BADA4E",
+"=. c #6A8A26",
+"-. c #E7EFB3",
+";. c #A2C646",
+">. c #CADE82",
+",. c #9ABE42",
+"'. c #F3F3F3",
+"). c #E9E9E8",
+"!. c #DBD9D6",
+"~. c #CDCBC8",
+"{. c #C5C0B3",
+"]. c #ACA79F",
+"^. c #89827B",
+"/. c #312F2B",
+"(. c #5D7C21",
+"_. c #79952F",
+":. c #AEC272",
+"<. c #F2F5C6",
+"[. c #5A761E",
+"}. c #769626",
+"|. c #96B24A",
+"1. c #86AE22",
+"2. c #B6D656",
+"3. c #BEDA56",
+"4. c #667E1A",
+"5. c #8AAE36",
+"6. c #86A632",
+"7. c #E2EDA6",
+"8. c #96B646",
+"9. c #E2E0DD",
+"0. c #EDEAE6",
+"a. c #E8E5E1",
+"b. c #E7E3DC",
+"c. c #D3CFC9",
+"d. c #C6C3BB",
+"e. c #BBB6AD",
+"f. c #928C81",
+"g. c #5C7A21",
+"h. c #718D28",
+"i. c #A6C256",
+"j. c #A2BA66",
+"k. c #96BE26",
+"l. c #72921E",
+"m. c #565A32",
+"n. c #B19549",
+"o. c #926616",
+"p. c #524616",
+"q. c #D6E696",
+"r. c #7EA226",
+"s. c #769232",
+"t. c #9ABE2A",
+"u. c #7AA226",
+"v. c #DBD6D1",
+"w. c #E7E2DC",
+"x. c #E8E2DA",
+"y. c #E0DAD2",
+"z. c #CFC9C1",
+"A. c #CBC6BC",
+"B. c #A1998D",
+"C. c #5B7921",
+"D. c #B2CE62",
+"E. c #9ABE36",
+"F. c #A6BE62",
+"G. c #AECA56",
+"H. c #4A4E16",
+"I. c #E1DEB0",
+"J. c #7A6E2A",
+"K. c #966E16",
+"L. c #4E6A1E",
+"M. c #6A862E",
+"N. c #8AA636",
+"O. c #7A9A1E",
+"P. c #C2D676",
+"Q. c #CEE672",
+"R. c #C2D286",
+"S. c #A2C63A",
+"T. c #729A2A",
+"U. c #627A1E",
+"V. c #525B40",
+"W. c #D9D4CB",
+"X. c #DED6CB",
+"Y. c #CAC3B5",
+"Z. c #A99F8D",
+"`. c #96BA3E",
+" + c #26320E",
+".+ c #3E4E1A",
+"++ c #D2E68A",
+"@+ c #9EBE46",
+"#+ c #96AE56",
+"$+ c #CEE282",
+"%+ c #423E0E",
+"&+ c #96C226",
+"*+ c #C6E262",
+"=+ c #829652",
+"-+ c #AEBA82",
+";+ c #8EBA2A",
+">+ c #AAD226",
+",+ c #628222",
+"'+ c #A2CE26",
+")+ c #5A6A42",
+"!+ c #C8C1B8",
+"~+ c #D1C8BA",
+"{+ c #AEA18E",
+"]+ c #AECA62",
+"^+ c #A6C646",
+"/+ c #9AAA66",
+"(+ c #BEDA62",
+"_+ c #6A862A",
+":+ c #9AB64E",
+"<+ c #628622",
+"[+ c #628626",
+"}+ c #CEE284",
+"|+ c #EEF2BA",
+"1+ c #9EC62A",
+"2+ c #7A9E22",
+"3+ c #8AB22A",
+"4+ c #7A9A22",
+"5+ c #4B621A",
+"6+ c #D2CABD",
+"7+ c #989898",
+"8+ c #E6DBCC",
+"9+ c #DBD1C0",
+"0+ c #B4A791",
+"a+ c #597622",
+"b+ c #82A23A",
+"c+ c #AAC65A",
+"d+ c #CAE27A",
+"e+ c #9EB65A",
+"f+ c #86A23A",
+"g+ c #F1F4C5",
+"h+ c #EAF2B6",
+"i+ c #9EBE52",
+"j+ c #AABE6E",
+"k+ c #96B63A",
+"l+ c #AAD22E",
+"m+ c #A2B652",
+"n+ c #8EAE2E",
+"o+ c #6A8E26",
+"p+ c #6A8E22",
+"q+ c #92B626",
+"r+ c #769A26",
+"s+ c #627E1E",
+"t+ c #9ECA2A",
+"u+ c #7A924A",
+"v+ c #C2B9AC",
+"w+ c #DDD2C3",
+"x+ c #E4D8C6",
+"y+ c #DCD1BC",
+"z+ c #B5A58E",
+"A+ c #4D651B",
+"B+ c #A6C642",
+"C+ c #82A222",
+"D+ c #F2F6C2",
+"E+ c #526222",
+"F+ c #BEDA5A",
+"G+ c #42561A",
+"H+ c #A6CE26",
+"I+ c #5E8226",
+"J+ c #668E26",
+"K+ c #4A611A",
+"L+ c #BDB2A3",
+"M+ c #D6CBB8",
+"N+ c #E3D7C2",
+"O+ c #DED0BB",
+"P+ c #B4A48B",
+"Q+ c #4B631A",
+"R+ c #4A621A",
+"S+ c #4E661E",
+"T+ c #66821E",
+"U+ c #5E7226",
+"V+ c #586826",
+"W+ c #576923",
+"X+ c #92BA26",
+"Y+ c #729A26",
+"Z+ c #5E761A",
+"`+ c #92BA2A",
+" @ c #6E9626",
+".@ c #465E1A",
+"+@ c #7EA222",
+"@@ c #7A9E26",
+"#@ c #82AA26",
+"$@ c #4A601A",
+"%@ c #E1D4BD",
+"&@ c #E6D6BD",
+"*@ c #B8A58B",
+"=@ c #526921",
+"-@ c #6A8636",
+";@ c #56721E",
+">@ c #627A1A",
+",@ c #425216",
+"'@ c #9EC626",
+")@ c #6E962A",
+"!@ c #AAD22A",
+"~@ c #627E22",
+"{@ c #8AB62A",
+"]@ c #7EA626",
+"^@ c #52662A",
+"/@ c #939393",
+"(@ c #E4D4B9",
+"_@ c #B8A387",
+":@ c #525E3A",
+"<@ c #5A7622",
+"[@ c #4A621E",
+"}@ c #6E922A",
+"|@ c #526A22",
+"1@ c #465A26",
+"2@ c #5E7E22",
+"3@ c #9ABE26",
+"4@ c #7B7B7B",
+"5@ c #D2C2A7",
+"6@ c #E2D1B3",
+"7@ c #BEA989",
+"8@ c #555047",
+"9@ c #A5A5A5",
+"0@ c #CACACA",
+"a@ c #C5C5C4",
+"b@ c #C4C3C0",
+"c@ c #C4C1BE",
+"d@ c #C3C0BA",
+"e@ c #C2BDB6",
+"f@ c #465A1A",
+"g@ c #729622",
+"h@ c #AED626",
+"i@ c #5A6E32",
+"j@ c #CCBB9F",
+"k@ c #DECBAC",
+"l@ c #BCA683",
+"m@ c #5C564D",
+"n@ c #BCBCBC",
+"o@ c #EBEBEB",
+"p@ c #E6E4E1",
+"q@ c #E5E1DD",
+"r@ c #E4DFDA",
+"s@ c #E3DED5",
+"t@ c #E0DBD3",
+"u@ c #D8D1C7",
+"v@ c #C8C1B6",
+"w@ c #BEB6AB",
+"x@ c #769A22",
+"y@ c #82A62A",
+"z@ c #BEAC92",
+"A@ c #D7C4A6",
+"B@ c #BAA27F",
+"C@ c #5C564E",
+"D@ c #C7C7C7",
+"E@ c #FAF8F7",
+"F@ c #F7F3EE",
+"G@ c #F6F1EB",
+"H@ c #F5EEE6",
+"I@ c #F2EDE3",
+"J@ c #F1EADE",
+"K@ c #ECE3D7",
+"L@ c #E2D9CB",
+"M@ c #DDD3C4",
+"N@ c #D2C7B7",
+"O@ c #516822",
+"P@ c #D4E398",
+"Q@ c #526A1A",
+"R@ c #7A9622",
+"S@ c #5A7A22",
+"T@ c #A2CA26",
+"U@ c #6E8E1E",
+"V@ c #B6A389",
+"W@ c #D3BD9C",
+"X@ c #BBA27F",
+"Y@ c #5A554D",
+"Z@ c #FBF8F6",
+"`@ c #F8F4ED",
+" # c #F7F1E8",
+".# c #F5EFE6",
+"+# c #F4EDE1",
+"@# c #F3EADE",
+"## c #F1E7D8",
+"$# c #EFE4D2",
+"%# c #EDE2CE",
+"&# c #E5D8C4",
+"*# c #506722",
+"=# c #567222",
+"-# c #B3A083",
+";# c #CFB998",
+"># c #BCA17A",
+",# c #58544C",
+"'# c #F9F5F0",
+")# c #F3EBDC",
+"!# c #F2E8D9",
+"~# c #F1E6D4",
+"{# c #F0E5D1",
+"]# c #EFE1CC",
+"^# c #EBDBC4",
+"/# c #D5E29D",
+"(# c #668A22",
+"_# c #B29D7F",
+":# c #CFB590",
+"<# c #BBA077",
+"[# c #56524B",
+"}# c #F8F3EB",
+"|# c #F5EEE4",
+"1# c #F0E2CF",
+"2# c #EFE2CC",
+"3# c #EEDEC7",
+"4# c #EAD9C1",
+"5# c #769E26",
+"6# c #B29C7F",
+"7# c #BB9C73",
+"8# c #545049",
+"9# c #F3EADC",
+"0# c #F2E8D7",
+"a# c #ECDAC1",
+"b# c #596E2D",
+"c# c #C0DC62",
+"d# c #6A8242",
+"e# c #B39E80",
+"f# c #D0B691",
+"g# c #B99D6F",
+"h# c #524E48",
+"i# c #F2EEE6",
+"j# c #F2EADE",
+"k# c #EEEADE",
+"l# c #EEE6DA",
+"m# c #F2E2CE",
+"n# c #EEE2CE",
+"o# c #EAE2D2",
+"p# c #EEDECA",
+"q# c #E8D8C0",
+"r# c #6A8A22",
+"s# c #96C222",
+"t# c #A79275",
+"u# c #BBA382",
+"v# c #D3B994",
+"w# c #BA9A6C",
+"x# c #504C47",
+"y# c #C6C2B6",
+"z# c #C8C1B7",
+"A# c #C7BFB4",
+"B# c #C6BBAB",
+"C# c #C6B9A9",
+"D# c #C6B8A3",
+"E# c #C5B7A0",
+"F# c #C4B49D",
+"G# c #C4B299",
+"H# c #C3B296",
+"I# c #C3AE92",
+"J# c #C4AD8F",
+"K# c #C2AB8B",
+"L# c #C1AA86",
+"M# c #C0A583",
+"N# c #BEA481",
+"O# c #BFA37C",
+"P# c #BEA279",
+"Q# c #BE9E75",
+"R# c #BC9F71",
+"S# c #BC9C6D",
+"T# c #9C7F55",
+"U# c #4E4B46",
+" . + @ # $ % & * = - ; > , ' ) ! ",
+" ~ { { { { { { { { { ] ^ / ( _ ! : ",
+" < { [ [ [ [ [ [ [ [ } | 1 2 3 ! 4 5 ",
+" 6 { [ [ [ [ [ [ [ [ } 7 8 9 0 a { b 5 ",
+" c { [ d 5 [ [ [ d 5 } [ [ e f g [ { b 5 ",
+" h { [ 5 i [ [ 5 i [ [ [ j k [ [ { b 5 ",
+" l { [ [ i [ [ [ [ i } [ [ [ [ m n [ [ { b 5 ",
+" o { [ [ [ [ [ [ [ [ } [ [ [ [ m p n [ [ { 4 : ",
+" q { [ [ } 7 7 r r 7 r } [ [ [ s t t u v : w x ! ",
+" y z 7 A B B B B B B C | 7 } [ C D E F G H I J K ",
+" L M N O P Q R S T U O O C | 7 7 V W X Y Z ` ... ",
+" +.@.#.$.%.&.*.=.-.;.>.,.O O C '.f ).!.~.{.].^./. ",
+" (.N (._.:.<.[.}.|.1.2.3.4.5.6.7.8.O 9.0.a.b.c.d.e.f./. ",
+" (.(.g.h.i.j.k.l.m.n.o.p.}.q.<.r.2.2.s.t.u.O v.w.x.y.z.A.B./. ",
+"C.(.D.D.;.<.E.F.<.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.D 5 X.Y.Z./. ",
+"(.`. +.+P ++@+#+$+2.H.%+ +H.O.&+*+R =+-+;+>+,+'+)+!+5 i ~+{+/. ",
+"B ]+i.`.^+/+<.(+_+:+s.H.H.<+[+}+<.(+#+|+1+2+3+,+4+5+6+7+8+9+0+/. ",
+" a+b+c+d+e+>.f+g+h+i+j+k+%.g+l+m+n+o+p+q+$.r+s+t+u+v+w+x+y+z+/. ",
+" A+k.<.B+4+C+f+d+$+]+D+>.E+F+1+G+H+q+I+H+H+J+q+t+K+L+M+N+O+P+/. ",
+" Q+O.[.R+R+S+T+E+U+V+W+O.l.X+Y+Z+Y+L.`+ @.@+@@@#@$@5 %@&@*@/. ",
+" 5+=@&+-@&+;@&+r+>@;@,@'@Y+4+1.)@!@~@{@]@.+u.^@ /@(@_@/. ",
+" 5+>@>@:@<@[@}@~@|@1@2@2@S+[.3@k.s+'@B 4@5@6@7@/. ",
+" 8@9@0@a@b@c@d@e@f@f@f@R g@h@I+I+s+#@i@5+j@k@l@/. ",
+" m@n@o@p@q@r@s@t@u@v@w@i@f@g@Z+h@x@y@2@f@z@A@B@/. ",
+" C@D@E@F@G@H@I@J@K@L@M@N@O@P@Q@R@S@T@U@f@V@W@X@/. ",
+" Y@{ Z@`@ #.#+#@###$#%#&#*#o+R h@u.@@=#f@-#;#>#/. ",
+" ,#{ '# #.#+#)#!#~#{#]#^#*#/#(#2+C+h@ @f@_#:#<#/. ",
+" [#{ }#|#+#)#!#~#1#2#3#4#*#}@<@r+J+5#=+f@6#:#7#/. ",
+" 8#{ #+#9#0#~#1#]#3#a#b#5#c#g@h@]@}@d#B e#f#g#/. ",
+" h#{ i#j#k#l#m#n#o#p#q#*#&+r#u.]@3+s#B t#u#v#w#/. ",
+" x#y#z#A#B#C#D#E#F#G#H#I#J#K#L#M#N#O#P#Q#R#S#T#/. ",
+" U#/././././././././././././././././././././././. ",
+" ",
+" "};
+
+#endif
+
diff --git a/kate/kpybrowser/pybrowse_part.cpp b/kate/kpybrowser/pybrowse_part.cpp
new file mode 100644
index 0000000..d8b7551
--- /dev/null
+++ b/kate/kpybrowser/pybrowse_part.cpp
@@ -0,0 +1,157 @@
+/***************************************************************************
+ pybrowse_part.cpp - description
+ -------------------
+ begin : Tue Aug 28 2001
+ copyright : (C) 2001 by Christian Bird
+ email : chrisb@lineo.com
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "pybrowse_part.h"
+#include "pybrowse_part.moc"
+#include "kpybrowser.h"
+#include "pybrowse.xpm"
+
+#include <kgenericfactory.h>
+#include <kaction.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kmessagebox.h>
+#include <qimage.h>
+#include <kdockwidget.h>
+
+K_EXPORT_COMPONENT_FACTORY( katepybrowseplugin, KGenericFactory<KatePluginPyBrowse>( "katepybrowse" ) )
+
+PluginViewPyBrowse::PluginViewPyBrowse (Kate::MainWindow *w)
+ : win (w)
+{
+ (void) new KAction ( i18n("Update Python Browser"), 0, this,
+ SLOT( slotUpdatePyBrowser() ), actionCollection(),
+ "python_update_pybrowse" );
+
+ //set up the menus
+ setInstance(new KInstance("kate"));
+ setXMLFile( "plugins/katepybrowse/ui.rc" );
+ win->guiFactory()->addClient(this);
+
+ //create a python head pixmap for the tab
+ QPixmap *py_pixmap = new QPixmap(pybrowse_xpm);
+ QImage py_image = py_pixmap->convertToImage().smoothScale(20, 20);
+ py_pixmap->convertFromImage(py_image);
+
+ //create the browser and put it into a dockwidget using kate's tool view manager
+
+ Kate::ToolViewManager *tool_view_manager = win->toolViewManager();
+ my_dock = tool_view_manager->createToolView("kate_plugin_kpybrowser", Kate::ToolViewManager::Left, (*py_pixmap), i18n("Python Browser"));
+ kpybrowser = new KPyBrowser(my_dock, "kpybrowser");
+
+ connect(kpybrowser, SIGNAL(selected(QString, int)), this, SLOT(slotSelected(QString, int)));
+}
+
+PluginViewPyBrowse::~PluginViewPyBrowse ()
+{
+ win->guiFactory()->removeClient (this);
+ delete my_dock;
+}
+
+
+void PluginViewPyBrowse::slotSelected(QString name, int line)
+{
+ //TO DO - deal with setting the active view to be the file that has this class
+ //if multiple files are open.
+
+ if (name == "Classes" || name == "Globals")
+ return;
+
+ Kate::View *view = win->viewManager()->activeView();
+
+ Kate::Document *doc = view->getDoc();
+ QString docline = doc->textLine(line);
+ int numlines = doc->numLines();
+ int done = 0, apiline = -1, forward_line = line,backward_line = line-1;
+ while (!done)
+ {
+ done = 1;
+ if (forward_line < numlines)
+ {
+ if (doc->textLine(forward_line).find(name) > -1)
+ {
+ apiline = forward_line;
+ break;
+ }
+ forward_line++;
+ done = 0;
+ }
+ if (backward_line > -1)
+ {
+ if (doc->textLine(backward_line).find(name) > -1)
+ {
+ apiline = backward_line;
+ break;
+ }
+ backward_line--;
+ done = 0;
+ }
+ }
+ if (apiline == -1)
+ {
+ KMessageBox::information(0,
+ i18n("Could not find method/class %1.").arg(name), i18n("Selection"));
+ }
+ else
+ {
+ view->setCursorPosition(apiline, 0);
+ }
+ view->setFocus();
+}
+
+void PluginViewPyBrowse::slotUpdatePyBrowser()
+{
+ Kate::ViewManager *viewManager = win->viewManager();
+ if (viewManager == NULL)
+ return;
+ Kate::View *view = viewManager->activeView();
+ if (view == NULL)
+ return;
+ QString pytext(view->getDoc()->text());
+ kpybrowser->parseText(pytext);
+}
+
+void PluginViewPyBrowse::slotShowPyBrowser()
+{
+ //TO DO implement this later so that you can turn the browser off and on
+}
+
+KatePluginPyBrowse::KatePluginPyBrowse( QObject* parent, const char* name, const QStringList& )
+ : Kate::Plugin ( (Kate::Application *)parent, name )
+{
+}
+
+KatePluginPyBrowse::~KatePluginPyBrowse()
+{
+}
+
+void KatePluginPyBrowse::addView (Kate::MainWindow *win)
+{
+ PluginViewPyBrowse *view = new PluginViewPyBrowse(win);
+ m_views.append (view);
+}
+
+void KatePluginPyBrowse::removeView(Kate::MainWindow *win)
+{
+ for (uint z=0; z < m_views.count(); z++)
+ if (m_views.at(z)->win == win)
+ {
+ PluginViewPyBrowse *view = m_views.at(z);
+ m_views.remove (view);
+ delete view;
+ }
+}
diff --git a/kate/kpybrowser/pybrowse_part.h b/kate/kpybrowser/pybrowse_part.h
new file mode 100644
index 0000000..85aedbb
--- /dev/null
+++ b/kate/kpybrowser/pybrowse_part.h
@@ -0,0 +1,72 @@
+/***************************************************************************
+ pybrowse_part.h - description
+ -------------------
+ begin : Tue Aug 28 2001
+ copyright : (C) 2001 by Christian Bird
+ email : chrisb@lineo.com
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _PYBROWSE_PART_H_
+#define _PYBROWSE_PART_H_
+
+#include <kate/application.h>
+#include <kate/document.h>
+#include <kate/mainwindow.h>
+#include <kate/plugin.h>
+#include <kate/view.h>
+#include <kate/viewmanager.h>
+#include <kate/toolviewmanager.h>
+#include <kate/documentmanager.h>
+
+#include <kdockwidget.h>
+#include <klibloader.h>
+#include <klocale.h>
+#include <qstring.h>
+#include "kpybrowser.h"
+
+class PluginViewPyBrowse : public QObject, KXMLGUIClient
+{
+ Q_OBJECT
+
+ friend class KatePluginPyBrowse;
+
+ public:
+ PluginViewPyBrowse (Kate::MainWindow *w);
+ ~PluginViewPyBrowse ();
+
+ public slots:
+ void slotShowPyBrowser();
+ void slotSelected(QString name, int line);
+ void slotUpdatePyBrowser();
+
+ private:
+ Kate::MainWindow *win;
+ QWidget *my_dock;
+ KPyBrowser *kpybrowser;
+};
+
+class KatePluginPyBrowse : public Kate::Plugin, public Kate::PluginViewInterface
+{
+ Q_OBJECT
+
+ public:
+ KatePluginPyBrowse( QObject* parent = 0, const char* name = 0, const QStringList& = QStringList() );
+ ~KatePluginPyBrowse();
+
+ void addView(Kate::MainWindow *win);
+ void removeView(Kate::MainWindow *win);
+
+ private:
+ QPtrList<PluginViewPyBrowse> m_views;
+};
+
+#endif
diff --git a/kate/kpybrowser/pybrowsenode.cpp b/kate/kpybrowser/pybrowsenode.cpp
new file mode 100644
index 0000000..866924b
--- /dev/null
+++ b/kate/kpybrowser/pybrowsenode.cpp
@@ -0,0 +1,209 @@
+/***************************************************************************
+ pybrowsenode.cpp - description
+ -------------------
+ begin : Mon Aug 27 2001
+ copyright : (C) 2001 by Christian Bird
+ email : chrisb@lineo.com
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "pybrowsenode.h"
+
+static const char *py_class_xpm[] = {
+ "16 16 10 1",
+ " c None",
+ ". c #000000",
+ "+ c #A4E8FC",
+ "@ c #24D0FC",
+ "# c #001CD0",
+ "$ c #0080E8",
+ "% c #C0FFFF",
+ "& c #00FFFF",
+ "* c #008080",
+ "= c #00C0C0",
+ " .. ",
+ " .++.. ",
+ " .+++@@. ",
+ " .@@@@@#... ",
+ " .$$@@##.%%.. ",
+ " .$$$##.%%%&&. ",
+ " .$$$#.&&&&&*. ",
+ " ...#.==&&**. ",
+ " .++..===***. ",
+ " .+++@@.==**. ",
+ " .@@@@@#..=*. ",
+ " .$$@@##. .. ",
+ " .$$$###. ",
+ " .$$$##. ",
+ " ..$#. ",
+ " .. "
+};
+
+static const char *py_method_xpm[] = {
+ "16 16 5 1",
+ " c None",
+ ". c #000000",
+ "+ c #FCFC80",
+ "@ c #E0BC38",
+ "# c #F0DC5C",
+ " ",
+ " ",
+ " ",
+ " .. ",
+ " .++.. ",
+ " .+++++. ",
+ " .+++++@. ",
+ " .. .##++@@. ",
+ " .++..###@@@. ",
+ " .+++++.##@@. ",
+ " .+++++@..#@. ",
+ " .##++@@. .. ",
+ " .###@@@. ",
+ " .###@@. ",
+ " ..#@. ",
+ " .. "
+};
+
+static const char *py_function_xpm[] = {
+ "16 16 6 1",
+ " c None",
+ ". c #240000",
+ "+ c #000000",
+ "@ c #FCFC80",
+ "# c #E0BC38",
+ "$ c #F0DC5C",
+ " ........ ",
+ ". . ",
+ ". . ",
+ " ........ ++ ",
+ " +@@++ ",
+ " +@@@@@+ ",
+ " +@@@@@#+ ",
+ " ++ +$$@@##+ ",
+ " +@@++$$$###+ ",
+ " +@@@@@+$$##+ ",
+ " +@@@@@#++$#+ ",
+ " +$$@@##+ ++ ",
+ " +$$$###+ ",
+ " +$$$##+ ",
+ " ++$#+ ",
+ " ++ "
+};
+
+
+PyBrowseNode::PyBrowseNode (QListViewItem * parent, const QString &name,
+ const QString &signature, int nodeType):
+QListViewItem (parent, signature)
+{
+ init (name, signature, nodeType);
+}
+
+PyBrowseNode::PyBrowseNode (QListView * parent, const QString &name,
+ const QString &signature, int nodeType):
+QListViewItem (parent, signature)
+{
+ init (name, signature, nodeType);
+}
+
+void
+PyBrowseNode::init (const QString &a_name, const QString &a_signature, int nodeType)
+{
+ node_type = nodeType;
+ if (nodeType == PYCLASS)
+ setPixmap (0, QPixmap (py_class_xpm));
+ if (nodeType == PYMETHOD)
+ setPixmap (0, QPixmap (py_method_xpm));
+ if (nodeType == PYFUNCTION)
+ setPixmap (0, QPixmap (py_function_xpm));
+
+ name = a_name;
+ signature = a_signature;
+}
+
+PyBrowseNode::~PyBrowseNode ()
+{
+ setPixmap (0, QPixmap (py_class_xpm));
+}
+
+void
+PyBrowseNode::setName (const QString &a_name)
+{
+ name = a_name;
+ setText (0, name);
+}
+
+QString
+PyBrowseNode::getName ()const
+{
+ return name;
+}
+
+void
+PyBrowseNode::setSig (const QString &a_signature)
+{
+ signature = a_signature;
+
+}
+
+QString
+PyBrowseNode::getSig ()const
+{
+ return signature;
+}
+
+void
+PyBrowseNode::setLine (int a_line)
+{
+ line = a_line;
+}
+
+int
+PyBrowseNode::getLine ()const
+{
+ return line;
+}
+
+
+void
+PyBrowseNode::setType (int type)
+{
+ node_type = type;
+}
+
+int
+PyBrowseNode::getType ()const
+{
+ return node_type;
+}
+
+void
+PyBrowseNode::setClass (const QString &a_method_class)
+{
+ node_class = a_method_class;
+}
+
+QString
+PyBrowseNode::getClass ()const
+{
+ return node_class;
+}
+
+QString
+PyBrowseNode::getQualifiedName ()const
+{
+ if (node_type == PYCLASS)
+ return node_class;
+ if (node_type == PYMETHOD)
+ return node_class + "::" + name;
+ if (node_type == PYFUNCTION)
+ return name;
+ return name;
+}
diff --git a/kate/kpybrowser/pybrowsenode.h b/kate/kpybrowser/pybrowsenode.h
new file mode 100644
index 0000000..d5083f9
--- /dev/null
+++ b/kate/kpybrowser/pybrowsenode.h
@@ -0,0 +1,68 @@
+/***************************************************************************
+ pybrowsenode.h - description
+ -------------------
+ begin : Mon Aug 27 2001
+ copyright : (C) 2001 by Christian Bird
+ email : chrisb@lineo.com
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef PYBROWSENODE_H
+#define PYBROWSENODE_H
+
+#include <qlistview.h>
+#include <qpixmap.h>
+
+#define PYCLASS 1
+#define PYMETHOD 2
+#define PYFUNCTION 3
+#define PYVARIABLE 4
+#define PYOTHER 5
+
+/**
+ *@author Christian Bird
+ */
+
+
+
+class PyBrowseNode : public QListViewItem {
+public:
+ QPixmap *pyClassPixmap;
+
+ PyBrowseNode(QListView *parent, const QString &a_name, const QString &a_signature, int type);
+ PyBrowseNode(QListViewItem *parent, const QString &a_name, const QString &a_signature, int type);
+ ~PyBrowseNode();
+
+ void init(const QString &a_name, const QString &a_signature, int nodeType);
+
+ void setName(const QString &name);
+ QString getName()const ;
+ void setLine(int line);
+ int getLine()const;
+ void setSig(const QString &signature);
+ QString getSig()const;
+ void setType(int type);
+ int getType()const;
+ void setClass(const QString &a_method_class);
+ QString getClass()const;
+
+ QString getQualifiedName()const;
+
+private:
+ QString name;
+ QString signature;
+ QString node_class;
+ int line;
+ int node_type;
+
+};
+
+#endif
diff --git a/kate/kpybrowser/ui.rc b/kate/kpybrowser/ui.rc
new file mode 100644
index 0000000..0c4e9ab
--- /dev/null
+++ b/kate/kpybrowser/ui.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="katepybrowse" library="libkatepybrowseplugin" version="3">
+<MenuBar>
+ <Menu name="python"><Text>P&amp;ython</Text>
+ <Action name="python_update_pybrowse" />
+ </Menu>
+</MenuBar>
+</kpartplugin>
diff --git a/kate/make/Makefile.am b/kate/make/Makefile.am
new file mode 100644
index 0000000..a110563
--- /dev/null
+++ b/kate/make/Makefile.am
@@ -0,0 +1,21 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = katemakeplugin.la
+
+# This is all standard. Remove the LIB_KHTML reference if you are not
+# using the KHTML Part
+katemakeplugin_la_SOURCES = plugin_katemake.cpp
+katemakeplugin_la_LIBADD = -lkateinterfaces
+katemakeplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+# Install the .rc file in the Part's directory (in this case, the part
+# is KHTMLPart)
+pluginsdir = $(kde_datadir)/kate/plugins/katemake
+plugins_DATA = ui.rc
+
+kde_services_DATA = katemake.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/katemake.pot
diff --git a/kate/make/katemake.desktop b/kate/make/katemake.desktop
new file mode 100644
index 0000000..9a996a0
--- /dev/null
+++ b/kate/make/katemake.desktop
@@ -0,0 +1,119 @@
+[Desktop Entry]
+Type=Service
+ServiceTypes=Kate/Plugin
+X-KDE-Library=katemakeplugin
+X-Kate-Version=2.5
+Name=Kate Make Plugin
+Name[ar]=ملحق Kate Make
+Name[az]=Kate Make Əlavəsi
+Name[br]=Lugent Kate Make
+Name[ca]=Connector Make per a Kate
+Name[cs]=Make modul pro Kate
+Name[cy]=Ategyn Gwneud am Kate
+Name[da]=Kate make-plugin
+Name[de]=Kate Make-Modul
+Name[el]=Πρόσθετο Make του Kate
+Name[eo]=Make-a kromaĵo por Kodredaktilo
+Name[es]=Crear complemento de Kate
+Name[et]=Kate Make-plugin
+Name[eu]=Kateren Make plugina
+Name[fa]=وصلۀ ایجاد Kate
+Name[fi]=Katen Make-liitännäinen
+Name[fr]=Module Make pour Kate
+Name[fy]=Kate Make-plugin
+Name[ga]=Breiseán Make Kate
+Name[gl]=Plugin de Make para Kate
+Name[he]=תוסף Make ל־Kate
+Name[hi]=के-एटीई मेक प्लगइन
+Name[hr]=Kate Make dodatak
+Name[hu]=Kate Make-bővítőmodul
+Name[is]=Make íforrit fyrir Kate
+Name[it]=Plugin di Kate per la compilazione
+Name[ja]=Kate Make プラグイン
+Name[ka]=Kate Make მოდული
+Name[kk]=Kate Make плагин модулі
+Name[km]=កម្មវិធី​ជំនួយ​របស់ Kate Make
+Name[lt]=Kate Make priedas
+Name[mk]=Make-приклучок во Кате
+Name[ms]=Plug masuk Make Kate
+Name[nb]=Kate programtillegg for Make
+Name[nds]=Make-Moduul för Kate
+Name[ne]=केट बनाउने प्लगइन
+Name[nl]=Kate Make-plugin
+Name[nn]=Kate Make-programtillegg
+Name[pa]=ਕੇਟ Make ਪਲੱਗਇਨ
+Name[pl]=Wtyczka Make dla Kate
+Name[pt]='Plugin' de Make do Kate
+Name[pt_BR]=Plugin de Make do Kate
+Name[ro]=Modul "make" pentru Kate
+Name[ru]=Модуль сборки для Kate
+Name[sk]=Kate Make modul
+Name[sl]=Vstavek za Make v Kate
+Name[sr]=Справљачки прикључак за Kate
+Name[sr@Latn]=Spravljački priključak za Kate
+Name[sv]=Kates bygginsticksprogram
+Name[ta]=கேட் உருவாக்க சொருகுப் பொருள்
+Name[tg]=Модули пайвандҳо барои Kate
+Name[tr]=Kate Yapılandırma Eklentisi
+Name[uk]=Втулок Make для Kate
+Name[uz]=Kate Make plagini
+Name[uz@cyrillic]=Kate Make плагини
+Name[vi]=Bổ sung Make Kate
+Name[zh_CN]=Kate Make 插件
+Name[zh_TW]=Kate Make 外掛程式
+Comment=Compile and parse error messages
+Comment[az]=Dərləyin və xəta ismarışlarını aşkar edin
+Comment[bg]=Изпълнение на командата make и показване на резултата
+Comment[bs]=Kompajlira i parsira poruke o greškama
+Comment[ca]=Compila i analitza els missatges d'error
+Comment[cs]=Chybové zprávy kompilace a analýzy
+Comment[cy]=Negeseuon gwallau crynhoi a dosrannu
+Comment[da]=Kompilér og fortolk fejlmeddelelser
+Comment[de]=Kompilieren und Fehlermeldungen auswerten
+Comment[el]=Μεταγλώττιση και ανάλυση μηνυμάτων λάθους
+Comment[eo]=Kompilas kaj analizas erarajn mesaĝojn
+Comment[es]=Compila y analiza los mensajes de error
+Comment[et]=Veateadete kompileerimine ja analüüsimine
+Comment[eu]=Konpilatu eta errore mezuak aztertu
+Comment[fa]=ترجمه و تجزیۀ پیامهای خطا
+Comment[fi]=Käännä ja jäsennä virheviestit
+Comment[fr]=Compiler et analyser les messages d'erreurs
+Comment[fy]=Foutmeldingen Kompilearje en Untlede
+Comment[ga]=Tiomsaigh agus parsáil teachtaireachtaí earráide
+Comment[gl]=Compilación e procesamento de mensaxes de erros
+Comment[he]=קימפול ופענוח הודעות "שגיאות"
+Comment[hi]=त्रुटि संदेशों को कम्पाइल तथा पारसे करता है
+Comment[hr]=Sastavljanje i raščlanjivanje poruka o pogreškama
+Comment[hu]=Programok fordítása a hibaüzenetek feldolgozásával
+Comment[is]=Þýða kóða og þátta villumeldingar
+Comment[it]=Compila e controlla i messaggi di errore
+Comment[ja]=コンパイルしてエラーメッセージを解析します
+Comment[ka]=კომპილაცია და შეცდომის შეტყობინებების ანალიზი
+Comment[kk]=Компиляциялау және қате хабарларын талдау
+Comment[km]=ចង​ក្រង ​និង​ញែក​សារ​កំហុស
+Comment[lt]=Kompiliuoti ir išvesti klaidų pranešimus
+Comment[mk]=Компилира и ги анализира пораките со грешки
+Comment[ms]=Kompile dan mesej ralat huraian
+Comment[nb]=Kompiler og tolk feilmeldinger
+Comment[nds]=Kompileer- un Inleesfehlermellen
+Comment[ne]=त्रुटि सन्देश कम्पाइल गर्नुहोस् र पदवर्णन गर्नुहोस्
+Comment[nl]=Compileer en ontleed foutmeldingen
+Comment[nn]=Kompiler og fortolk feilmeldingar
+Comment[pa]=ਕੰਪਾਇਲ ਅਤੇ ਗਲਤੀ ਸੁਨੇਹੇ ਪਾਰਸ
+Comment[pl]=Kompiluje i analizuje komunikaty o błędach
+Comment[pt]=Compilação e processamento de mensagens de erros
+Comment[pt_BR]=Compila e gera mensagens de erro
+Comment[ro]=Compilează şi analizează mesajele de eroare
+Comment[ru]=Сборка и обработка сообщений об ошибках
+Comment[sk]=Kompilovať a parsovať chybové hlášky
+Comment[sl]=Prevede in razčleni sporočila napak
+Comment[sr]=Компилује и рашчлањује поруке о грешкама
+Comment[sr@Latn]=Kompiluje i raščlanjuje poruke o greškama
+Comment[sv]=Kompilera och tolka felmeddelanden
+Comment[ta]= தொகுப்பு மற்றும் பாகுபடுத்தல் பிழை செய்திகள்
+Comment[tg]=Васл ва коркарди маълумотҳо дар бораи хатогиҳо
+Comment[tr]=Derleme ve ayrıştırma hataları
+Comment[uk]=Компіляція і опрацювання повідомлень про помилки
+Comment[vi]=Biên dịch và phân tách thông điệp lỗi
+Comment[zh_CN]=编译并分析错误信息
+Comment[zh_TW]=編譯並剖析錯誤訊息
diff --git a/kate/make/plugin_katemake.cpp b/kate/make/plugin_katemake.cpp
new file mode 100644
index 0000000..64282dd
--- /dev/null
+++ b/kate/make/plugin_katemake.cpp
@@ -0,0 +1,736 @@
+/* plugin_katemake.h Kate Plugin
+**
+** Copyright (C) 2003 by Adriaan de Groot
+**
+** This is the hader for the Make plugin.
+**
+** This code was mostly copied from the GPL'ed xmlcheck plugin
+** by Daniel Naber.
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program 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 the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+#include "plugin_katemake.moc"
+
+#include <cassert>
+
+#include <config.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qinputdialog.h>
+#include <qregexp.h>
+#include <qstring.h>
+#include <qtextstream.h>
+#include <qpalette.h>
+#include <qvbox.h>
+#include <qlabel.h>
+
+#include <kaction.h>
+#include <kcursor.h>
+#include <kdebug.h>
+#include <kdockwidget.h>
+#include <kinstance.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kstandarddirs.h>
+#include <kpassivepopup.h>
+#include <klineedit.h>
+#include <kdialogbase.h>
+#include <kconfig.h>
+
+#include <kate/toolviewmanager.h>
+
+#include <kgenericfactory.h>
+
+K_EXPORT_COMPONENT_FACTORY( katemakeplugin, KGenericFactory<PluginKateMake>( "katemake" ) )
+
+// #define FUNCTIONSETUP kdDebug() << k_funcinfo << endl;
+#define FUNCTIONSETUP
+
+PluginKateMake::PluginKateMake( QObject* parent, const char* name, const QStringList& )
+ : Kate::Plugin ( (Kate::Application *)parent, name )
+{
+ FUNCTIONSETUP;
+}
+
+
+PluginKateMake::~PluginKateMake()
+{
+ FUNCTIONSETUP;
+}
+
+
+void PluginKateMake::addView(Kate::MainWindow *win)
+{
+ FUNCTIONSETUP;
+
+ Kate::ToolViewManager *viewmanager = win->toolViewManager();
+ QWidget *w = viewmanager->createToolView("kate_plugin_make",
+ Kate::ToolViewManager::Bottom,
+ SmallIcon(QString::fromLatin1("misc")),
+ i18n("Make Output"));
+ PluginKateMakeView *view = new PluginKateMakeView (w,win,
+ "katemakeview");
+ if( ! view ) {
+ kdDebug() << "Error: no plugin view" << endl;
+ return;
+ }
+
+ if( ! win ) {
+ kdDebug() << "Error: no main win" << endl;
+ return;
+ }
+
+ win->guiFactory()->addClient(view);
+ view->win = win;
+ m_views.append(view);
+}
+
+
+void PluginKateMake::removeView(Kate::MainWindow *win)
+{
+ FUNCTIONSETUP;
+
+ for (unsigned int z=0; z < m_views.count(); z++) {
+ if (m_views.at(z)->win == win) {
+ PluginKateMakeView *view = m_views.at(z);
+ m_views.remove (view);
+ win->guiFactory()->removeClient (view);
+ }
+ }
+}
+
+#define COL_LINE (1)
+#define COL_FILE (0)
+#define COL_MSG (2)
+
+
+class ErrorMessage : public QListViewItem
+{
+public:
+ ErrorMessage(QListView *parent,
+ const QString &filename,
+ int lineno,
+ const QString &message) :
+ QListViewItem(parent,
+ filename,
+ (lineno > 0 ? QString::number(lineno) : QString::null),
+ message)
+ {
+ m_isError = !message.contains(QString::fromLatin1("warning"));
+ m_lineno = lineno;
+ m_serial = s_serial++;
+ }
+ ErrorMessage(QListView *parent,const QString &message) :
+ QListViewItem(parent,QString::null,QString::null,QString::null)
+ {
+ QString m(message);
+ m.remove('\n');
+ m.stripWhiteSpace();
+ setText(COL_MSG,m);
+
+ m_isError=false;
+ m_lineno=-1;
+ m_serial = s_serial++;
+ setSelectable(false);
+ }
+ ErrorMessage(QListView *parent, bool start) :
+ QListViewItem(parent,QString::null)
+ {
+ m_isError=false;
+ m_lineno=-1;
+ m_serial=-1;
+ setSelectable(false);
+ if (start) setText(COL_MSG,i18n("Running make..."));
+ else setText(COL_MSG,i18n("No Errors."));
+ }
+ virtual ~ErrorMessage() ;
+
+ bool isError() const { return m_isError; }
+ QString message() const { return text(COL_MSG); }
+ QString fancyMessage() const;
+ QString caption() const;
+ QString filename() const { return text(COL_FILE); }
+ int line() const { return m_lineno; }
+ int serial() const { return m_serial; }
+
+ virtual int compare(QListViewItem *,int,bool) const;
+
+ static void resetSerial() { s_serial=10; }
+
+protected:
+ virtual void paintCell(QPainter *,const QColorGroup &,
+ int,int,int);
+
+ bool m_isError;
+ int m_lineno;
+ int m_serial;
+
+ static int s_serial;
+} ;
+
+/* static */ int ErrorMessage::s_serial = 0;
+
+/* virtual */ ErrorMessage::~ErrorMessage()
+{
+}
+
+QString ErrorMessage::caption() const
+{
+ return QString::fromLatin1("%1:%2").arg(text(COL_FILE)).arg(line());
+}
+
+QString ErrorMessage::fancyMessage() const
+{
+ QString msg = QString::fromLatin1("<qt>");
+ if (isError())
+ {
+ msg.append(QString::fromLatin1("<font color=\"red\">"));
+ }
+ msg.append(message());
+ if (isError())
+ {
+ msg.append(QString::fromLatin1("</font>"));
+ }
+ msg.append(QString::fromLatin1("<qt>"));
+ return msg;
+}
+
+/* virtual */ void ErrorMessage::paintCell(QPainter *p,
+ const QColorGroup &cg,
+ int column,
+ int width,
+ int align)
+{
+ if ((column!=COL_LINE) || (serial()<0))
+ {
+ QListViewItem::paintCell(p,cg,column,width,align);
+ }
+ else
+ {
+ QColorGroup myCG(cg);
+#if 0
+ red, //darkRed,
+ green, //darkGreen,
+ blue, //darkBlue,
+ cyan, // darkCyan,
+ magenta, // darkMagenta,
+ yellow, //darkYellow,
+ gray);
+#endif
+ myCG.setColor(QColorGroup::Light,red);
+
+ if (!isSelected())
+ {
+ myCG.setColor(QColorGroup::Base,gray);
+ myCG.setColor(QColorGroup::Text,
+ m_isError ? red : yellow);
+ }
+
+
+ QListViewItem::paintCell(p,myCG,column,width,align);
+ }
+}
+
+/* virtual */ int ErrorMessage::compare(QListViewItem *i,
+ int /* column */ , bool /* ascending */) const
+{
+ kdDebug() << "In compare " << serial() << endl;
+ ErrorMessage *e = dynamic_cast<ErrorMessage*>(i);
+ if (!e) return 1;
+ if (e->serial() < serial()) return 1;
+ else if (e->serial() == serial()) return 0;
+ else return -1;
+}
+
+class LinePopup : public KPassivePopup
+{
+protected:
+ LinePopup( QWidget *parent=0, const char *name=0, WFlags f=0 );
+ virtual ~LinePopup();
+
+public:
+ static LinePopup *message(QWidget *,
+ const QPoint &p,ErrorMessage *e);
+
+protected:
+ virtual void positionSelf();
+
+ QPoint fLoc;
+
+ // There should be only one
+ static LinePopup *one;
+} ;
+
+/* static */ LinePopup *LinePopup::one = 0L;
+
+LinePopup::LinePopup(QWidget *p,const char *n,WFlags f) :
+ KPassivePopup(p,n,f),
+ fLoc(-1,-1)
+{
+ ASSERT(!one);
+ one=this;
+}
+
+LinePopup::~LinePopup()
+{
+ one=0L;
+}
+
+/* static */ LinePopup *LinePopup::message(QWidget *parent,
+ const QPoint &p,
+ ErrorMessage *e)
+{
+ if (one) delete one;
+ LinePopup *pop = new LinePopup( parent );
+ pop->setAutoDelete( true );
+
+
+ pop->setView( e->caption(), e->fancyMessage(), QPixmap() );
+ // pop->hideDelay = timeout;
+ pop->fLoc=p;
+ pop->show();
+
+ return pop;
+}
+
+/* virtual */ void LinePopup::positionSelf()
+{
+ if (fLoc.x()==-1) KPassivePopup::positionSelf();
+ else
+ {
+ // Move above or below the intended line
+ if (fLoc.y()>320) fLoc.setY(fLoc.y()-80);
+ else fLoc.setY(fLoc.y()+80);
+ moveNear(QRect(fLoc.x(),fLoc.y(),40,30));
+ }
+}
+
+PluginKateMakeView::PluginKateMakeView(QWidget *parent,
+ Kate::MainWindow *mainwin,
+ const char* name) :
+ QListView(parent,name),
+ KXMLGUIClient(),
+ win(mainwin),
+ filenameDetector(0L),
+ running_indicator(0L)
+{
+ FUNCTIONSETUP;
+
+ m_proc=0;
+ (void) new KAction ( i18n("Next Error"), KShortcut(ALT+CTRL+Key_Right),
+ this, SLOT( slotNext() ),
+ actionCollection(), "make_right" );
+
+ (void) new KAction ( i18n("Previous Error"), KShortcut(ALT+CTRL+Key_Left),
+ this, SLOT( slotPrev() ),
+ actionCollection(), "make_left" );
+
+ (void) new KAction ( i18n("Make"), KShortcut(ALT+Key_R),
+ this, SLOT( slotValidate() ),
+ actionCollection(), "make_check" );
+
+ (void) new KAction ( i18n("Configure..."), KShortcut(),
+ this, SLOT( slotConfigure() ),
+ actionCollection(), "make_settings" );
+
+ setInstance(new KInstance("kate"));
+ setXMLFile(QString::fromLatin1("plugins/katemake/ui.rc"));
+
+
+ setFocusPolicy(QWidget::NoFocus);
+ setSorting(COL_LINE);
+
+ addColumn(i18n("File"), -1);
+ addColumn(i18n("Line"), -1);
+ setColumnAlignment(COL_LINE, AlignRight);
+ addColumn(i18n("Message"), -1);
+ setAllColumnsShowFocus(true);
+ setResizeMode(QListView::LastColumn);
+ connect(this, SIGNAL(clicked(QListViewItem *)), SLOT(slotClicked(QListViewItem *)));
+
+ m_proc = new KProcess();
+
+ connect(m_proc, SIGNAL(processExited(KProcess*)), this, SLOT(slotProcExited(KProcess*)));
+ connect(m_proc, SIGNAL(receivedStderr(KProcess*,char*,int)),
+ this, SLOT(slotReceivedProcStderr(KProcess*, char*, int)));
+
+
+ KConfig c("katemakepluginrc");
+ c.setGroup("Prefixes");
+ source_prefix = c.readEntry("Source",QString::null);
+ build_prefix = c.readEntry("Build",QString::null);
+
+// if (source_prefix.isEmpty())
+ {
+ filenameDetector = new QRegExp(
+ QString::fromLatin1("[a-zA-Z0-9_\\.\\-]*\\.[chp]*:[0-9]*:"));
+ }
+// else
+ {
+// filenameDetector = 0L;
+ }
+}
+
+
+PluginKateMakeView::~PluginKateMakeView()
+{
+ FUNCTIONSETUP;
+
+ delete m_proc;
+ delete filenameDetector;
+ delete running_indicator;
+}
+
+
+void PluginKateMakeView::processLine(const QString &l)
+{
+ kdDebug() << "Got line " << l ;
+
+
+ if (!filenameDetector && l.find(source_prefix)!=0)
+ {
+ /* ErrorMessage *e = */ (void) new ErrorMessage(this,l);
+ return;
+ }
+
+ if (filenameDetector && l.find(*filenameDetector)<0)
+ {
+ ErrorMessage *e = new ErrorMessage(this,l);
+ kdDebug() << "Got message(1) #" << e->serial() << endl;
+ return;
+ }
+
+ int ofs1 = l.find(':');
+ int ofs2 = l.find(':',ofs1+1);
+ //
+ QString m = l.mid(ofs2+1);
+ m.remove('\n');
+ m.stripWhiteSpace();
+ QString filename = l.left(ofs1);
+ int line = l.mid(ofs1+1,ofs2-ofs1-1).toInt();
+ ErrorMessage *e = new ErrorMessage(this,
+ filename,line,m);
+ kdDebug() << "Got message(2) #" << e->serial() << endl;
+
+ // Should cache files being found and check for
+ // existence.
+ kdDebug() << ": Looking at " << document_dir+filename << endl;
+ if (!QFile::exists(document_dir+filename))
+ {
+ e->setSelectable(false);
+ }
+ if (filename.startsWith(source_prefix) && !source_prefix.isEmpty())
+ {
+ e->setSelectable(true);
+ }
+ found_error=true;
+}
+
+
+void PluginKateMakeView::slotReceivedProcStderr(KProcess *, char *result, int len)
+{
+ FUNCTIONSETUP;
+
+ QString l = QString::fromLocal8Bit( QCString(result, len+1) );
+
+ output_line += l;
+
+ int nl_p = -1;
+ while ((nl_p = output_line.find('\n')) > 1)
+ {
+ processLine(output_line.left(nl_p+1));
+ output_line.remove(0,nl_p+1);
+ }
+}
+
+
+void PluginKateMakeView::slotProcExited(KProcess *p)
+{
+ FUNCTIONSETUP;
+
+ delete running_indicator;
+ running_indicator=0L;
+
+ if (!output_line.isEmpty())
+ {
+ processLine(output_line);
+ }
+
+#if 0
+ // FIXME: doesn't work correct the first time:
+ if( m_dockwidget->isDockBackPossible() ) {
+ m_dockwidget->dockBack();
+ }
+#endif
+
+ kdDebug() << "slotProcExited()" << endl;
+ QApplication::restoreOverrideCursor();
+
+ sort();
+
+ if ( found_error || !p->normalExit() || p->exitStatus() )
+ {
+ QListViewItem *i = firstChild();
+ while (i && !i->isSelectable())
+ {
+ i = i->nextSibling();
+ }
+ if (i)
+ {
+ setSelected(i,true);
+ slotClicked(i);
+ }
+ }
+ else
+ {
+ KPassivePopup::message(i18n("Make Results"),
+ i18n("No errors."),
+ this);
+ clear();
+#if 0
+ QListViewItem *i = new QListViewItem(this,QString::null,
+ QString::null,
+ i18n("No Errors."));
+ i->setSelectable(false);
+#else
+ (void) new ErrorMessage(this,false);
+#endif
+ }
+}
+
+
+void PluginKateMakeView::slotClicked(QListViewItem *item)
+{
+ FUNCTIONSETUP;
+ if (!item)
+ {
+ kdDebug() << ": No item clicked." << endl;
+ return;
+ }
+ if (!item->isSelectable()) return;
+
+ ErrorMessage *e = dynamic_cast<ErrorMessage *>(item);
+ if (!e) return;
+
+ ensureItemVisible(e);
+
+ QString filename = document_dir + e->filename();
+ int lineno = e->line();
+
+ if (!build_prefix.isEmpty())
+ {
+ filename = e->filename();
+ }
+
+
+ kdDebug() << ": Looking at " << filename
+ << ":" << lineno << endl;
+
+ if (QFile::exists(filename))
+ {
+ KURL u;
+ u.setPath(filename);
+ win->viewManager()->openURL(u);
+ Kate::View *kv = win->viewManager()->activeView();
+
+ kv->setCursorPositionReal(lineno-1,1);
+
+
+ QPoint globalPos = kv->mapToGlobal(kv->cursorCoordinates());
+ kdDebug() << ": Want to map at "
+ << globalPos.x() << "," << globalPos.y() << endl;
+#if 0
+ KPassivePopup::message(
+ QString::fromLatin1("%1:%2").arg(filename).arg(lineno),
+ msg,
+ this);
+#else
+ if ( ! isVisible() )
+ LinePopup::message(this,globalPos,e);
+#endif
+ }
+}
+
+void PluginKateMakeView::slotNext()
+{
+ FUNCTIONSETUP;
+
+ QListViewItem *i = selectedItem();
+ if (!i) return;
+
+ QListViewItem *n = i;
+ while ((n=n->nextSibling()))
+ {
+ if (n->isSelectable())
+ {
+ if (n==i) return;
+ setSelected(n,true);
+ ensureItemVisible(n);
+ slotClicked(n);
+ return;
+ }
+ }
+}
+
+void PluginKateMakeView::slotPrev()
+{
+ FUNCTIONSETUP;
+
+ QListViewItem *i = selectedItem();
+ if (!i) return;
+
+ QListViewItem *n = i;
+ while ((n=n->itemAbove()))
+ {
+ if (n->isSelectable())
+ {
+ if (n==i) return;
+ setSelected(n,true);
+ ensureItemVisible(n);
+ slotClicked(n);
+ return;
+ }
+ }
+}
+
+bool PluginKateMakeView::slotValidate()
+{
+ FUNCTIONSETUP;
+
+ clear();
+ win->toolViewManager()->showToolView (this);
+
+ m_proc->clearArguments();
+
+ Kate::View *kv = win->viewManager()->activeView();
+ if( ! kv ) {
+ kdDebug() << "Error (slotValidate()): no Kate::View" << endl;
+ return false;
+ }
+ if( ! kv->getDoc() ) {
+ kdDebug() << "Error (slotValidate()): no kv->getDoc()" << endl;
+ return false;
+ }
+
+ Kate::Document *doc = (Kate::Document*)kv->document();
+ doc->save();
+ KURL url(doc->url());
+
+ output_line = QString::null;
+ ErrorMessage::resetSerial();
+ found_error=false;
+
+ kdDebug() << ": Document " << url.protocol() << " : " <<
+ url.path() << endl;
+
+ if (!url.isLocalFile())
+ {
+ KMessageBox::sorry(0,
+ i18n("The file <i>%1</i> is not a local file. "
+ "Non-local files cannot be compiled.")
+ .arg(url.path()));
+ return false;
+ }
+
+ document_dir = QFileInfo(url.path()).dirPath(true) +
+ QString::fromLatin1("/");
+
+ if (document_dir.startsWith(source_prefix))
+ {
+ document_dir = build_prefix + document_dir.mid(source_prefix.length());
+ }
+
+ m_proc->setWorkingDirectory(document_dir);
+ QString make = KStandardDirs::findExe( "gmake" );
+ if (make.isEmpty())
+ make = KStandardDirs::findExe("make");
+ *m_proc << make;
+ if( make.isEmpty() || ! m_proc->start(KProcess::NotifyOnExit, KProcess::AllOutput) ) {
+ KMessageBox::error(0, i18n("<b>Error:</b> Failed to run %1.").arg(make.isEmpty() ?
+ "make" : make));
+ return false;
+ }
+ QApplication::setOverrideCursor(KCursor::waitCursor());
+ running_indicator = new ErrorMessage(this,true);
+ return true;
+}
+
+class Settings : public KDialogBase
+{
+public:
+ Settings( QWidget *parent,
+ const QString &src, const QString &bld);
+
+ KLineEdit *edit_src,*edit_bld;
+} ;
+
+
+Settings::Settings(QWidget *p,
+ const QString &s, const QString &b) :
+ KDialogBase(p,"settings",true,
+ i18n("Directories"),
+ KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok, true )
+{
+ QVBox *page = makeVBoxMainWidget();
+ QHBox *h = new QHBox(page);
+ (void) new QLabel(i18n("Source prefix:"),h);
+ edit_src = new KLineEdit(h);
+ edit_src->setText(s);
+
+ h = new QHBox(page);
+ (void) new QLabel(i18n("Build prefix:"),h);
+ edit_bld = new KLineEdit(h);
+ edit_bld->setText(b);
+}
+
+void PluginKateMakeView::slotConfigure()
+{
+ Kate::View *kv = win->viewManager()->activeView();
+
+
+ Settings s(kv,source_prefix,build_prefix);
+
+ if (!s.exec()) return;
+
+
+ source_prefix = s.edit_src->text();
+ build_prefix = s.edit_bld->text();
+
+ //if (source_prefix.isEmpty())
+ {
+ if (!filenameDetector)
+ {
+ filenameDetector = new QRegExp(
+ QString::fromLatin1("[a-zA-Z0-9_\\.\\-]*\\.[chp]*:[0-9]*:"));
+ }
+ }
+ //else
+ {
+// if (filenameDetector)
+// {
+// delete filenameDetector;
+// filenameDetector = 0L;
+// }
+ }
+
+ KConfig c("katemakepluginrc");
+ c.setGroup("Prefixes");
+ c.writeEntry("Source",source_prefix);
+ c.writeEntry("Build",build_prefix);
+}
diff --git a/kate/make/plugin_katemake.h b/kate/make/plugin_katemake.h
new file mode 100644
index 0000000..5042f1d
--- /dev/null
+++ b/kate/make/plugin_katemake.h
@@ -0,0 +1,108 @@
+#ifndef _KATEMAKE_H
+#define _KATEMAKE_H
+/* plugin_katemake.h Kate Plugin
+**
+** Copyright (C) 2003 by Adriaan de Groot
+**
+** This is the hader for the Make plugin.
+**
+** This code was mostly copied from the GPL'ed xmlcheck plugin
+** by Daniel Naber.
+*/
+
+/*
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program 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 the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program in a file called COPYING; if not, write to
+** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+** MA 02110-1301, USA.
+*/
+
+// #define QT_NO_CAST_ASCII (1)
+// #define QT_NO_ASCII_CAST (1)
+
+class QRegExp;
+
+#include <qlistview.h>
+#include <qstring.h>
+
+#include <kate/plugin.h>
+#include <kate/application.h>
+#include <kate/view.h>
+#include <kate/document.h>
+#include <kate/documentmanager.h>
+#include <kate/mainwindow.h>
+#include <kate/viewmanager.h>
+
+#include <kdockwidget.h>
+#include <kiconloader.h>
+#include <kprocess.h>
+#include <ktempfile.h>
+
+class PluginKateMakeView : public QListView, public KXMLGUIClient
+{
+ Q_OBJECT
+
+ public:
+ PluginKateMakeView(QWidget *parent,
+ Kate::MainWindow *mainwin,
+ const char* name);
+ virtual ~PluginKateMakeView();
+
+ Kate::MainWindow *win;
+
+ public slots:
+ void slotClicked(QListViewItem *item);
+ void slotNext();
+ void slotPrev();
+
+ bool slotValidate();
+ void slotProcExited(KProcess*);
+ void slotReceivedProcStderr(KProcess*, char*, int);
+
+ void slotConfigure();
+
+protected:
+ void processLine(const QString &);
+
+ private:
+ KProcess *m_proc;
+
+ QString output_line;
+ QString doc_name;
+ QString document_dir;
+ QString source_prefix,build_prefix;
+
+ QRegExp *filenameDetector;
+
+ QListViewItem *running_indicator;
+ bool found_error;
+};
+
+
+class PluginKateMake : public Kate::Plugin, Kate::PluginViewInterface
+{
+ Q_OBJECT
+
+ public:
+ PluginKateMake( QObject* parent = 0, const char* name = 0, const QStringList& = QStringList() );
+ virtual ~PluginKateMake();
+
+ void addView (Kate::MainWindow *win);
+ void removeView (Kate::MainWindow *win);
+
+ private:
+ QPtrList<PluginKateMakeView> m_views;
+};
+
+#endif
+
diff --git a/kate/make/ui.rc b/kate/make/ui.rc
new file mode 100644
index 0000000..8385b8c
--- /dev/null
+++ b/kate/make/ui.rc
@@ -0,0 +1,12 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="katemake" library="libkatemakeplugin" version="1">
+<MenuBar>
+ <Menu name="Make"><Text>&amp;Make</Text>
+ <Action name="make_check" />
+ <Action name="make_left" />
+ <Action name="make_right" />
+ <Separator/>
+ <Action name="make_settings" />
+ </Menu>
+</MenuBar>
+</kpartplugin>
diff --git a/kate/modeline/Makefile.am b/kate/modeline/Makefile.am
new file mode 100644
index 0000000..3afccbc
--- /dev/null
+++ b/kate/modeline/Makefile.am
@@ -0,0 +1,21 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = katemodelineplugin.la
+
+# This is all standard. Remove the LIB_KHTML reference if you are not
+# using the KHTML Part
+katemodelineplugin_la_SOURCES = ModelinePlugin.cpp
+katemodelineplugin_la_LIBADD = -lkateinterfaces
+katemodelineplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+# Install the .rc file in the Part's directory (in this case, the part
+# is KHTMLPart)
+pluginsdir = $(kde_datadir)/kate/plugins/katemodeline
+plugins_DATA = ui.rc
+
+kde_services_DATA = katemodeline.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/katemodeline.pot
diff --git a/kate/modeline/ModelinePlugin.cpp b/kate/modeline/ModelinePlugin.cpp
new file mode 100644
index 0000000..b288856
--- /dev/null
+++ b/kate/modeline/ModelinePlugin.cpp
@@ -0,0 +1,125 @@
+ /***************************************************************************
+ ModelinePlugin.cpp - description
+ -------------------
+ begin : Mon Apr 1 2002
+ copyright : (C) 2002 by John Firebaugh
+ email : jfirebaugh@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <qregexp.h>
+#include <kgenericfactory.h>
+#include <klocale.h>
+#include <kaction.h>
+#include <kdebug.h>
+
+#include <kate/application.h>
+#include <kate/documentmanager.h>
+#include <kate/viewmanager.h>
+#include <kate/mainwindow.h>
+#include <kate/document.h>
+#include <kate/view.h>
+
+#include "ModelinePlugin.h"
+#include "ModelinePlugin.moc"
+
+class PluginView : public KXMLGUIClient
+{
+ friend class ModelinePlugin;
+
+ public:
+ Kate::MainWindow *win;
+};
+
+K_EXPORT_COMPONENT_FACTORY( katemodelineplugin, KGenericFactory<ModelinePlugin>( "katemodeline" ) )
+
+ModelinePlugin::ModelinePlugin( QObject* parent, const char* name, const QStringList &args )
+ : Kate::Plugin ( (Kate::Application *) parent, name )
+{
+}
+
+ModelinePlugin::~ModelinePlugin()
+{
+}
+
+void ModelinePlugin::addView(Kate::MainWindow *win)
+{
+ // TODO: doesn't this have to be deleted?
+ PluginView *view = new PluginView ();
+
+ new KAction( i18n("Apply Modeline"), 0,
+ this, SLOT(applyModeline()),
+ view->actionCollection(), "edit_apply_modeline" );
+
+ view->setInstance (new KInstance("kate"));
+ view->setXMLFile( "plugins/katemodeline/ui.rc" );
+ win->guiFactory()->addClient (view);
+ view->win = win;
+
+ m_views.append (view);
+}
+
+void ModelinePlugin::removeView(Kate::MainWindow *win)
+{
+ for (uint z=0; z < m_views.count(); z++)
+ if (m_views.at(z)->win == win)
+ {
+ PluginView *view = m_views.at(z);
+ m_views.remove (view);
+ win->guiFactory()->removeClient (view);
+ delete view;
+ }
+}
+
+void ModelinePlugin::applyModeline()
+{
+ if (!application()->activeMainWindow())
+ return;
+
+ Kate::Document* doc = application()->documentManager()->activeDocument();
+ Kate::View* view = application()->activeMainWindow()->viewManager()->activeView();
+ if( !doc || !view ) return;
+ static QRegExp vim1( "\\b(?:vi:|vim:|ex:)[ \\t](.*)" );
+ static QRegExp vim2( "\\b(?:vi:|vim:|ex:)[ \\t]set (.*):" );
+ uint foundAtLine;
+ uint foundAtCol;
+ uint matchLen;
+ QString options;
+ if( doc->searchText( 0, 0, vim2, &foundAtLine, &foundAtCol, &matchLen ) ) {
+ options = vim2.cap(1);
+ } else if( doc->searchText( 0, 0, vim1, &foundAtLine, &foundAtCol, &matchLen ) ) {
+ options = vim1.cap(1);
+ options.replace( QRegExp( ":" ), " " );
+ }
+ uint configFlags = doc->configFlags();
+ kdDebug() << "Found modeline: " << options << endl;
+ if( options.find( QRegExp( "\\bnoet\\b" ) ) >= 0 ) {
+ kdDebug() << "Clearing replace tabs" << endl;
+ configFlags &= ~Kate::Document::cfReplaceTabs;
+ } else if( options.find( QRegExp( "\\bet\\b" ) ) >= 0 ) {
+ kdDebug() << "Setting replace tabs" << endl;
+ configFlags |= Kate::Document::cfReplaceTabs;
+ }
+ QRegExp ts( "ts=(\\d+)" );
+ if( options.find( ts ) >= 0 ) {
+ uint tabWidth = ts.cap(1).toUInt();
+ kdDebug() << "Setting tab width " << tabWidth << endl;
+ view->setTabWidth( tabWidth );
+ }
+ QRegExp tw( "tw=(\\d+)" );
+ if( options.find( tw ) >= 0 ) {
+ uint textWidth = tw.cap(1).toUInt();
+ kdDebug() << "Setting text width " << textWidth << endl;
+ doc->setWordWrap( true );
+ doc->setWordWrapAt( textWidth );
+ }
+ doc->setConfigFlags( configFlags );
+}
diff --git a/kate/modeline/ModelinePlugin.h b/kate/modeline/ModelinePlugin.h
new file mode 100644
index 0000000..3f4b818
--- /dev/null
+++ b/kate/modeline/ModelinePlugin.h
@@ -0,0 +1,40 @@
+ /***************************************************************************
+ ModelinePlugin.h - description
+ -------------------
+ begin : Mon Apr 1 2002
+ copyright : (C) 2002 by John Firebaugh
+ email : jfirebaugh@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _ModelinePlugin_H_
+#define _ModelinePlugin_H_
+
+#include <kate/plugin.h>
+
+class ModelinePlugin : public Kate::Plugin, Kate::PluginViewInterface
+{
+ Q_OBJECT
+
+public:
+ ModelinePlugin( QObject* parent = 0, const char* name = 0, const QStringList &args = QStringList() );
+ virtual ~ModelinePlugin();
+
+ void addView (Kate::MainWindow *win);
+ void removeView (Kate::MainWindow *win);
+private slots:
+ void applyModeline();
+
+private:
+ QPtrList<class PluginView> m_views;
+};
+
+#endif // _ModelinePlugin_H_
diff --git a/kate/modeline/katemodeline.desktop b/kate/modeline/katemodeline.desktop
new file mode 100644
index 0000000..4d31ae6
--- /dev/null
+++ b/kate/modeline/katemodeline.desktop
@@ -0,0 +1,119 @@
+[Desktop Entry]
+Type=Service
+ServiceTypes=Kate/Plugin
+X-KDE-Library=katemodelineplugin
+X-Kate-Version=2.5
+Name=Kate Modeline Plugin
+Name[af]=Kate Moduslyn Inplak
+Name[ar]=ملحق Kate Modeline
+Name[az]=Kate Modeline ƏLavəsi
+Name[br]=Lugent Kate Modeline
+Name[ca]=Connector Modeline per a Kate
+Name[cy]=Ategyn Modd-linell Kate
+Name[da]=Kate Tilstandslinje-plugin
+Name[de]=Kate Modeline-Modul
+Name[el]=Πρόσθετο Modeline του Kate
+Name[eo]=Modolinia kromaĵo por Kodredaktilo
+Name[es]=Complemento Modeline de Kate
+Name[et]=Kate teaterea plugin
+Name[eu]=Kateren Modeline plugina
+Name[fa]=وصلۀ Kate Modeline
+Name[fi]=Kate Modeline -sovelma
+Name[fr]=Module externe Modeline pour Kate
+Name[fy]=Kate Modeline-plugin
+Name[gl]=Plugin de Liña de Modo para Kate
+Name[he]=תוסף Modeline ל־Kate
+Name[hi]=के-एटीई मॉडलाइन प्लगइन
+Name[hr]=Kate Modeline dodatak
+Name[hu]=Kate módsor-bővítőmodul
+Name[is]=Kate 'Modeline' viðbót
+Name[it]=Plugin Modeline di Kate
+Name[ja]=Kate Modeline プラグイン
+Name[ka]=Kate Modeline მოდული
+Name[kk]=Kate Modeline плагин модулі
+Name[km]=កម្មវិធី​ជំនួយ​​របៀប​បន្ទាត់ Kate
+Name[lt]=Kate Modeline priedas
+Name[mk]=Modeline-приклучок за Кате
+Name[ms]=Plug masuk Kate Modeline
+Name[nb]=Programtillegg for Kate moduslinje
+Name[nds]=Modeline-Moduul för Kate
+Name[ne]=केट मोडलाइन प्लगइन
+Name[nl]=Kate Modeline-plugin
+Name[nn]=Kate nivålinje-tillegg
+Name[pa]=ਕੇਟ ਢੰਗ-ਸਤਰ ਪਲੱਗਇਨ
+Name[pl]=Wtyczka ustawień linii do Kate
+Name[pt]='Plugin' de Linha de Modo do Kate
+Name[pt_BR]=Plugin Modeline do Kate
+Name[ro]=Modul "modeline" pentru Kate
+Name[ru]=Модуль строки состояния буфера для Kate
+Name[sk]=Kate Modeline modul
+Name[sl]=Vstavek za Modeline v Kate
+Name[sr]=Прикључак режимске линије за Kate
+Name[sr@Latn]=Priključak režimske linije za Kate
+Name[sv]=Kates lägesradsinsticksprogram
+Name[ta]=கேட் வரிவகை சொருகுப்பொருள்
+Name[tg]=Модули хатҳои ҳолати буфер барои Kate
+Name[th]=ปลั๊กอินโหมดไลน์ของ Kate
+Name[tr]=Kate Modeline Eklentisi
+Name[uk]=Втулок Modeline для Kate
+Name[vi]=Bổ sung dòng chế độ Kate
+Name[xh]=Ulayini wendlela yokwenza yeplagi yangaphakathi ye Kate
+Name[zh_CN]=Kate 状态行插件
+Name[zh_TW]=Kate Modeline 外掛程式
+Comment=Set document settings based on vim or emacs modelines
+Comment[ar]=عيّن اعدادات المستندات على أساس ملفات modelines الخاص بـvim أو emacs
+Comment[az]=Sənəd qurğularını vim ya da emacs əsaslarına görə tə'yin et
+Comment[bg]=Установяване на режим базиран на редакторите vim или emacs
+Comment[bs]=Podešava postavke dokumenta na osnovu vim ili emacs modeline-ova
+Comment[ca]=Estableix les preferències dels documents basant-se en mode de línies de vim o emacs
+Comment[cs]=Nastaví vlastnosti dokumentu v závislosti na "modeline" z Emacs nebo vi
+Comment[cy]=Gosod gosodiadau dogfen wedi eu seilio ar fodd-linellau vim neu emacs
+Comment[da]=Sæt dokumentindstillinger baseret på vim- eller emacs-tilstandslinjer
+Comment[de]=Dokumenteinstellungen aus vim- oder emacs-Modelines lesen
+Comment[el]=Καθορισμός των ρυθμίσεων του εγγράφου βασισμένες στις modelines του vim ή του emacs
+Comment[eo]=Metas dokumentan agordon laŭ vim aŭ emacs modolinioj
+Comment[es]=Configura las preferencias del documento basado en los modelos de vim o emacs
+Comment[et]=Rakendab dokumendi puhul vim'ile või emacs'ile sarnast teaterida
+Comment[eu]=Ezarri vim edo emacs-en lerro moduetan oinarritutako dokumentu ezarpenak
+Comment[fa]=تنظیمات سند را براساس modeline vim یا emacs تنظیم می‌کند.
+Comment[fi]=Aseta asiakirjan asetukset perustuen vim tai emacs modelineihin
+Comment[fo]=Nýt ásetingar fyri skjal grundað á vim ella emacs *modelines*
+Comment[fr]=Définir les réglages de document basés sur les modules de vim ou d'emacs
+Comment[fy]=Dokumintynstellingen basearre op vim- of emacs-modelines ynstelle
+Comment[gl]=Alterar as configuracións do documento con base nas liñas de modo de emacs ou de vim
+Comment[he]=קביעת הגדרות המסמך בהתבסס על modelines של vim או emacs
+Comment[hi]=वीआईएम या ईमैक्स मॉडलाइन्स आधारित दस्तावेज़ विन्यास नियत करता है
+Comment[hr]=Zadavanje postavki dokumenta na osnovu modelines iz vim-a ili emacs-a
+Comment[hu]=Dokumentumbeállítások VIM/emacs módleíró sorok alapján
+Comment[is]=Setur stillingar skjals byggt á vim eða emacs 'modeline'
+Comment[it]=Seleziona le impostazioni dei documenti basandosi sui "modeline" di emacs o vim
+Comment[ja]=vim や emacs のモード行によるドキュメント設定
+Comment[ka]=vim-ზე ან emacs-ის modeline-ზე დაფუძნებულ პარამეტრებს ანიჭებს დოკუმენტს
+Comment[kk]=vim не emacs modeline негіздеп, құжаттың параметрлерін орнатады
+Comment[km]=កំណត់​ការ​កំណត់​​ឯកសារ​ដោយ​​ផ្អែក​លើ​របៀប​បន្ទាត់របស់ vim ឬemacs
+Comment[lt]=Sukuria dokumento nustatymus pagal vim ar emacs dokumento komandas
+Comment[mk]=Ги мести поставувањата на документот базирани врз линии на режим за vim или emacs
+Comment[ms]=Tetapkan tetapan dokumen
+Comment[nb]=Tilpass dokumentinnstillinger basert på moduslinjer for vim eller emacs
+Comment[nds]=Dokmenteninstellen vun vim- oder emacs-Modelines lesen
+Comment[ne]=भिम वा इमाकस मोडलाइनमा आधारित कागजात सेटिङ सेट गर्नुहोस्
+Comment[nl]=Documentinstellingen gebaseerd op vim- of emacs-modelines instellen
+Comment[nn]=Vel dokumentinnstillingar basert på nivålinjer for vim eller emacs
+Comment[pl]=Zmienia ustawienia dokumentu zgodnie z ustawieniami linii vim lub emacs-a zapisanymi w pliku
+Comment[pt]=Alterar as configurações do documento com base nas linhas de modo do emacs ou do vim
+Comment[pt_BR]=Ajusta as configurações baseado no vim ou no emacs
+Comment[ro]=Configurează setările documentului în funcţie de "modeline"-urile Vim sau Emacs
+Comment[ru]=Показывает строку состояния буфера как в vim или emacs
+Comment[sk]=Nastaví nastavenia dokumentu založené na vim alebo emacs modely
+Comment[sl]=Uredi nastavitve dokumenta na podlagi določil v vim ali emacs
+Comment[sr]=Поставите подешавања документа на основу Vim-ових или Emacs-ових режимских линија
+Comment[sr@Latn]=Postavite podešavanja dokumenta na osnovu Vim-ovih ili Emacs-ovih režimskih linija
+Comment[sv]=Ställ in dokumentalternativ baserat på Vim- eller Emacs-lägesrader
+Comment[ta]=விம் அல்லது எமாக்ஸ் வரிவகை அடிப்படையிலான ஆவண அமைப்புகளை அமை
+Comment[tg]=Хати ҳолати буферо мисли vim ё emacs нишон медиҳад
+Comment[tr]=Belge ayarlarını vim veya emacs kipsatırına(modeline) göre yap
+Comment[uk]=Встановлює параметри документа на основі рядків режимів vim або emacs
+Comment[vi]=Thiết lập tài liệu dựa vào các dòng chế độ kiểu emacs hoặc vim
+Comment[xh]=Cwangcisa izicwangciso zoxwebhu olusekelwe kwi vim okanye kwi ndlela yeelayini ze emacs
+Comment[zh_CN]=根据 VIM 或 EMACS 状态行来设置文档
+Comment[zh_TW]=依 vim 或 emacs modelines 設定文件
diff --git a/kate/modeline/ui.rc b/kate/modeline/ui.rc
new file mode 100644
index 0000000..ef8fc22
--- /dev/null
+++ b/kate/modeline/ui.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="katemodeline" library="libkatemodelineplugin" version="2">
+<MenuBar>
+ <Menu name="tools"><text>&amp;Tools</text>
+ <Action name="edit_apply_modeline" />
+ </Menu>
+</MenuBar>
+</kpartplugin>
diff --git a/kate/openheader/Makefile.am b/kate/openheader/Makefile.am
new file mode 100644
index 0000000..9db3328
--- /dev/null
+++ b/kate/openheader/Makefile.am
@@ -0,0 +1,21 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = kateopenheaderplugin.la
+
+# This is all standard. Remove the LIB_KHTML reference if you are not
+# using the KHTML Part
+kateopenheaderplugin_la_SOURCES = plugin_kateopenheader.cpp
+kateopenheaderplugin_la_LIBADD = -lkateinterfaces
+kateopenheaderplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+# Install the .rc file in the Part's directory (in this case, the part
+# is KHTMLPart)
+pluginsdir = $(kde_datadir)/kate/plugins/kateopenheader
+plugins_DATA = ui.rc
+
+kde_services_DATA = kateopenheader.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kateopenheader.pot
diff --git a/kate/openheader/kateopenheader.desktop b/kate/openheader/kateopenheader.desktop
new file mode 100644
index 0000000..f5f3322
--- /dev/null
+++ b/kate/openheader/kateopenheader.desktop
@@ -0,0 +1,112 @@
+[Desktop Entry]
+Type=Service
+ServiceTypes=Kate/Plugin
+X-KDE-Library=kateopenheaderplugin
+X-Kate-Version=2.5
+Name=Kate OpenHeader
+Name[af]=Kate Maak-opskrif-oop
+Name[cy]=AgorPennawd Kate
+Name[el]=Άνοιγμα επικεφαλίδας του Kate
+Name[eo]=Kodredaktilo-difinmalfermilo
+Name[es]=Cabecera abierta de Kate
+Name[et]=Kate päisefaili avaja
+Name[eu]= Kateren OpenHeader
+Name[fi]=Kate avaaotsikko
+Name[fo]=Kate opna høvd
+Name[fr]=Ouverture d'en-tête pour Kate
+Name[gl]=OpenHeader para Kate
+Name[he]=פותח הכותרות של Kate
+Name[hi]=के-एटीई ओपन-हेडर
+Name[hr]=Kate OtvorenoZaglavlje
+Name[hu]=Kate fejlécmegnyitó
+Name[it]=ApriHeader di Kate
+Name[ja]=Kate オープンヘッダ
+Name[kk]=Kate айдар файлын ашу
+Name[lv]=Kate AtvērtHederi
+Name[nb]=Åpne hodefil i Kate
+Name[nds]=Koppdateien opmaken för Kate
+Name[ne]=केट ओपनहेडर
+Name[pa]=ਕੇਟ ਫਾਇਲ-ਸਿਰਲੇਖ
+Name[pl]=Kate - Otwarcie pliku nagłówkowego
+Name[pt]=OpenHeader do Kate
+Name[pt_BR]=Abrir Cabeçalhos do Kate
+Name[ro]=Includere fişier antet pentru Kate
+Name[ru]=Открытие файла заголовка для Kate
+Name[sr]=Отварање заглавља за Kate
+Name[sr@Latn]=Otvaranje zaglavlja za Kate
+Name[ta]=கேட் திறந்த தலைப்பு
+Name[tg]=Кушодани сарлавҳаи файл барои Kate
+Name[th]=เปิดส่วนหัวของ Kate
+Name[tr]=Kate Başlık Aç
+Name[uk]=Відкрити файл заголовка Kate
+Name[ven]=Kate Openeheda
+Name[vi]=Phần đầu mở Kate
+Name[xh]=Intloko Yokuvula ye Kate
+Name[zu]=u Kate Vula isihloko
+Comment=Opens the corresponding .h/[.cpp|.c] file
+Comment[af]=Maak oop die ooreenstemmend .h/[.cpp|.c] lêer
+Comment[ar]=تفتح ملف .h المقابل لملف [.cpp|.c]
+Comment[az]=Korespond .h/[.cpp|.c] faylını açar
+Comment[bg]=Отваряне на съответстващите файлове .h/[.cpp|.c]
+Comment[bs]=Otvara odgovarajuću .h/[.cpp|.c] datoteku
+Comment[ca]=Obre el corresponent fitxer .h/[.cpp|.c]
+Comment[cs]=Otevře odpovídající soubor .h/[.cpp|.c]
+Comment[cy]=Agor y ffeil .h/[.cpp|.c] addas
+Comment[da]=Åbner den tilsvarende .h/[.cpp|.c]-fil
+Comment[de]=Öffnet die entsprechende .h/[.cpp|.c]-Datei
+Comment[el]=Ανοίγει το αντίστοιχο αρχείο .h/[.cpp|.c]
+Comment[eo]=Malfermas la koncernan .h/[.cpp|.c]-dosieron
+Comment[es]=Abre el archivo .h/[.cpp|.c]
+Comment[et]=Vastava .h/[.cpp|.c] faili avamine
+Comment[eu]= Dagokion .h/[.cpp|.c] fitxategia irekitzen du
+Comment[fa]=پروندۀ متناظر .h/[.cpp|.c] را باز می‌کند.
+Comment[fi]=Avaa vastaavan .h/[.cpp|.c] tiedoston
+Comment[fo]=Opnar tann samsvarandi .h/[.cpp|.c]-fíla.
+Comment[fr]=Ouvre le fichier correspondant .h/[.cpp|.c]
+Comment[fy]=iepent de korrespondearjende .h/[.cpp|.c]-triem
+Comment[ga]=Oscail an comhad .h/[.cpp|.c] a fhreagraíonn leis an gceann seo
+Comment[gl]=Abre o ficheiro .h/[.cpp|.c] correspondente
+Comment[he]=פתיחת קובץ הכותרת המתאים [h/[.cpp|.c.
+Comment[hi]= .h/[.cpp|.c] के सदृश्य फ़ाइल खोलता है
+Comment[hr]=Otvaranje odgovarajuće .h/[.cpp|.c] datoteke
+Comment[hu]=A megfelelő .h/[.cpp|.c] fájl megnyitása
+Comment[is]=Opnar viðkomandi .h/[.cpp|.c] skrá
+Comment[it]=Apre il file .h/[.cpp|.c] corrispondente
+Comment[ja]=対応する .h/[.cpp|.c] ファイルを開きます
+Comment[ka]=ხსნის შესაბამის .h/[.cpp|.c] ფაილს
+Comment[kk]=Керек .h/[.cpp|.c] айдар файлын ашады
+Comment[km]=បើក​ការ​ទាក់ទង​ឯកសារ .h/[.cpp|.c]
+Comment[lt]=Atveria atitinkamą .h/[.cpp|.c] bylą
+Comment[lv]=Atver atbilstošo .h/[.cpp|.c] failu
+Comment[mk]=Ја отвора соодветната .h/[.cpp|.c] датотека
+Comment[ms]=Membuka fail .h/[.cpp|.c] yang sepadan.
+Comment[mt]=Jiftaħ il-fajl .h/[.cpp|.c] li jikkorrispondi
+Comment[nb]=Åpner den tilhørende .h/[.cpp|.c]-fila
+Comment[nds]=Maakt de tohören .h/[.cpp|.c]-Datei op
+Comment[ne]=सङ्गत .h/[.cpp|.c] फाइल खोल्दछ
+Comment[nl]=Opent het corresponderende .h/[.cpp|.c]-bestand
+Comment[nn]=Opnar .h/[.cpp|.c]-fila som høyrer til
+Comment[pa]=ਅਨੁਸਾਰੀ .h/[.cpp|.c] ਫਾਇਲ ਖੋਲੋ
+Comment[pl]=Otwiera odpowiadający plik h/[.cpp|.c]
+Comment[pt]=Abre o ficheiro .h/[.cpp|.c] correspondente
+Comment[pt_BR]=Abrir o arquivo .h[cpp|.c] correspondente
+Comment[ro]=Deschide fişierul antet corespunzător .h/[.cpp|.c]
+Comment[ru]=Открывает соответствующий файл .h/[.cpp|.c]
+Comment[sk]=Otvorí odpovedajúci súbor .h/[.cpp|.c]
+Comment[sl]=Odpre pripadajočo datoteko .h/[.cpp|.c]
+Comment[sr]=Отвара одговарајући .h/[.cpp|.c] фајл
+Comment[sr@Latn]=Otvara odgovarajući .h/[.cpp|.c] fajl
+Comment[sv]=Öppnar den motsvarande .h/[.cpp|.c]-filen
+Comment[ta]=தொடர்புடைய .h/[.cpp|.c] கோப்பினைத் திறக்கிறது
+Comment[tg]=Файли мувофиқи .h/[.cpp|.c] мекушояд
+Comment[th]=เปิดแฟ้มที่มีรูปแบบ .h/[.cpp|.c]
+Comment[tr]=.h/[.cpp|.c] dosyasını açar
+Comment[uk]=Відкриває відповідний файл .h/[.cpp|.c]
+Comment[uz]=Tegishli .h/[.cpp|.c] faylini ochish
+Comment[uz@cyrillic]=Тегишли .h/[.cpp|.c] файлини очиш
+Comment[ven]=Tshi vula faele dzino yelana .h/[.cpp|.c]
+Comment[vi]=Mở tập tin .h/[.cpp|.c] tương ứng
+Comment[xh]=Ivula ungqamano .h/[.cpp|.c] file
+Comment[zh_CN]=打开相应的 .h/[.cpp|.c] 文件
+Comment[zh_TW]=開啟相對應的 .h/[.cpp|.c] 檔案
+Comment[zu]=Ivula ifayela evumelenayo .h/[.cpp|.c]
diff --git a/kate/openheader/plugin_kateopenheader.cpp b/kate/openheader/plugin_kateopenheader.cpp
new file mode 100644
index 0000000..f404022
--- /dev/null
+++ b/kate/openheader/plugin_kateopenheader.cpp
@@ -0,0 +1,117 @@
+/***************************************************************************
+ plugin_katetextfilter.cpp - description
+ -------------------
+ begin : FRE Feb 23 2001
+ copyright : (C) 2001 by Joseph Wenninger
+ email : jowenn@bigfoot.com
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "plugin_kateopenheader.h"
+#include "plugin_kateopenheader.moc"
+
+#include <qfileinfo.h>
+#include <kgenericfactory.h>
+#include <kaction.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <kurl.h>
+#include <kio/netaccess.h>
+
+class PluginView : public KXMLGUIClient
+{
+ friend class PluginKateOpenHeader;
+
+ public:
+ Kate::MainWindow *win;
+};
+
+K_EXPORT_COMPONENT_FACTORY( kateopenheaderplugin, KGenericFactory<PluginKateOpenHeader>( "kateopenheader" ) )
+
+PluginKateOpenHeader::PluginKateOpenHeader( QObject* parent, const char* name, const QStringList& )
+ : Kate::Plugin ( (Kate::Application *)parent, name )
+{
+}
+
+PluginKateOpenHeader::~PluginKateOpenHeader()
+{
+}
+
+void PluginKateOpenHeader::addView(Kate::MainWindow *win)
+{
+ // TODO: doesn't this have to be deleted?
+ PluginView *view = new PluginView ();
+
+ (void) new KAction( i18n("Open .h/.cpp/.c"), Key_F12,
+ this, SLOT( slotOpenHeader() ),
+ view->actionCollection(), "file_openheader" );
+
+ view->setInstance (new KInstance("kate"));
+ view->setXMLFile( "plugins/kateopenheader/ui.rc" );
+ win->guiFactory()->addClient (view);
+ view->win = win;
+
+ m_views.append (view);
+}
+
+void PluginKateOpenHeader::removeView(Kate::MainWindow *win)
+{
+ for (uint z=0; z < m_views.count(); z++)
+ if (m_views.at(z)->win == win)
+ {
+ PluginView *view = m_views.at(z);
+ m_views.remove (view);
+ win->guiFactory()->removeClient (view);
+ delete view;
+ }
+}
+
+void PluginKateOpenHeader::slotOpenHeader ()
+{
+ if (!application()->activeMainWindow())
+ return;
+
+ Kate::View * kv (application()->activeMainWindow()->viewManager()->activeView());
+ if (!kv) return;
+
+ KURL url=kv->document()->url();
+ if ((!url.isValid()) || (url.isEmpty())) return;
+
+ QFileInfo info( url.path() );
+ QString extension = info.extension().lower();
+
+ QStringList headers( QStringList() << "h" << "H" << "hh" << "hpp" );
+ QStringList sources( QStringList() << "c" << "cpp" << "cc" << "cp" << "cxx" );
+
+ if( sources.find( extension ) != sources.end() ) {
+ tryOpen( url, headers );
+ } else if ( headers.find( extension ) != headers.end() ) {
+ tryOpen( url, sources );
+ }
+}
+
+void PluginKateOpenHeader::tryOpen( const KURL& url, const QStringList& extensions )
+{
+ if (!application()->activeMainWindow())
+ return;
+
+ kdDebug() << "Trying to open " << url.prettyURL() << " with extensions " << extensions.join(" ") << endl;
+ QString basename = QFileInfo( url.path() ).baseName();
+ KURL newURL( url );
+ for( QStringList::ConstIterator it = extensions.begin(); it != extensions.end(); ++it ) {
+ newURL.setFileName( basename + "." + *it );
+ if( KIO::NetAccess::exists( newURL ) )
+ application()->activeMainWindow()->viewManager()->openURL( newURL );
+ newURL.setFileName( basename + "." + (*it).upper() );
+ if( KIO::NetAccess::exists( newURL ) )
+ application()->activeMainWindow()->viewManager()->openURL( newURL );
+ }
+}
diff --git a/kate/openheader/plugin_kateopenheader.h b/kate/openheader/plugin_kateopenheader.h
new file mode 100644
index 0000000..61b6058
--- /dev/null
+++ b/kate/openheader/plugin_kateopenheader.h
@@ -0,0 +1,50 @@
+ /***************************************************************************
+ plugin_katetextfilter.h - description
+ -------------------
+ begin : FRE Feb 23 2001
+ copyright : (C) 2001 by Joseph Wenninger
+ email : jowenn@bigfoot.com
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _PLUGIN_KANT_HEADER_H
+#define _PLUGIN_KANT_HEADER_H
+
+#include <qstring.h>
+
+#include <kate/plugin.h>
+#include <kate/application.h>
+#include <kate/view.h>
+#include <kate/document.h>
+#include <kate/documentmanager.h>
+#include <kate/mainwindow.h>
+#include <kate/viewmanager.h>
+
+class PluginKateOpenHeader : public Kate::Plugin, Kate::PluginViewInterface
+{
+ Q_OBJECT
+
+ public:
+ PluginKateOpenHeader( QObject* parent = 0, const char* name = 0, const QStringList& = QStringList() );
+ virtual ~PluginKateOpenHeader();
+
+ void addView (Kate::MainWindow *win);
+ void removeView (Kate::MainWindow *win);
+
+ public slots:
+ void slotOpenHeader ();
+ void tryOpen( const KURL& url, const QStringList& extensions );
+
+ private:
+ QPtrList<class PluginView> m_views;
+};
+
+#endif // _PLUGIN_KANT_OPENHEADER_H
diff --git a/kate/openheader/ui.rc b/kate/openheader/ui.rc
new file mode 100644
index 0000000..5ccd8f8
--- /dev/null
+++ b/kate/openheader/ui.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="kateopenheader" library="libkateopenheaderplugin" version="3">
+<MenuBar>
+ <Menu name="file"><Text>&amp;File</Text>
+ <Action name="file_openheader" group="open_merge"/>
+ </Menu>
+</MenuBar>
+</kpartplugin>
diff --git a/kate/scripts/Makefile.am b/kate/scripts/Makefile.am
new file mode 100644
index 0000000..5648dab
--- /dev/null
+++ b/kate/scripts/Makefile.am
@@ -0,0 +1,2 @@
+katescriptsdir = $(kde_datadir)/kate/scripts
+katescripts_DATA = html-tidy.desktop html-tidy.sh
diff --git a/kate/scripts/html-tidy.desktop b/kate/scripts/html-tidy.desktop
new file mode 100644
index 0000000..68a5c9e
--- /dev/null
+++ b/kate/scripts/html-tidy.desktop
@@ -0,0 +1,77 @@
+[Desktop Entry]
+Name=HTML Tidy
+Name[cs]=Úklid HTML
+Name[cy]=Tacluso HTML (HTML Tidy)
+Name[eo]=HTML-purigilo
+Name[es]=Ordenado de HTML
+Name[fa]=Tidy زنگام
+Name[hi]=एचटीएमएल टाइडी
+Name[hr]=HTML preuređivanje
+Name[ka]=HTML გაწმენდა
+Name[nds]=HTML-Tidy
+Name[ne]=एचटीएमएल स्पष्टता
+Name[pl]=Sprawdzenie poprawności HTML
+Name[sk]=Vyčistenie HTML
+Name[sv]=HTML-tidy
+Name[ta]=HTML சுத்தமாக்கம்
+Name[tr]=HTML Düzenleme
+Name[vi]=Làm sạch HTML
+Comment=Validates the current document via HTML Tidy
+Comment[ar]=التأكد من صالحية وثيقة HTML الحالية عن طريق HTML Tidy
+Comment[bg]=Валидиране на текущия документ чрез HTML Tidy
+Comment[bs]=Provjerava trenutni dokument sa HTML Tidy
+Comment[ca]=Valida el document actual mitjançant HTML Tidy
+Comment[cs]=Validuje současný dokument pomocí HTML Tidy
+Comment[cy]=Dilysa'r ddogfen gyfredol drwy ddefnyddio Tacluso HTML (HTML Tidy)
+Comment[da]=Godkender dette dokument via HTML Tidy
+Comment[de]=Überprüft das aktuelle Dokument mit "HTML Tidy"
+Comment[el]=Ελέγχει την εγκυρότητα στο τρέχον έγγραφο μέσω του HTML Tidy
+Comment[eo]=Kontrolas la nunan dokumenton laŭ HTML-purigilo
+Comment[es]=Valida que el documento HTML actual presente un orden correcto
+Comment[et]=Kontrollib aktiivset dokumenti HTML Tidy abil
+Comment[eu]=Uneko dokumentua HTML Tidy bidez balidatzen du
+Comment[fa]=سند جاری را از طریق Tidy زنگام اعتبارسنجی می‌کند
+Comment[fi]=Validoi nykyisen asiakirjan HTML Tidyllä
+Comment[fr]=Valide le document courant grâce à HTML Tidy
+Comment[fy]=Falidearret it besteande dokumint fia HTML Tidy
+Comment[ga]=Bailíochtaigh an cháipéis reatha le HTML Tidy
+Comment[gl]=Valida o documento actual utilizando HTML Tidy
+Comment[he]=מוודא את המסמך הנוכחי באמצעות HTML Tidy
+Comment[hi]=एचटीएमएल टाइडी के द्वारा मौज़ूदा दस्तावेज़ वेलिडेट करता है
+Comment[hr]=Provjera valjanosti trenutnog dokumenta putem aplikacije HTML Tidy
+Comment[hu]=Az aktuális dokumentum ellenőrzése a HTML Tidy programmal
+Comment[is]=Staðfestir núverandi skjal með HTML Tidy
+Comment[it]=Convalida il documento attuale tramite HTML Tidy
+Comment[ja]=HTML Tidy で現在のドキュメントを検証します
+Comment[ka]=მიმდინარე დოკუმენტს HTML-ს გაწმენდით ამოწმებს
+Comment[kk]=Назардағы құжатты HTML Tidy дегенге сәйкестігін тексереді
+Comment[km]=ធ្វើ​ឯកសារ​បច្ចុប្បន្ន​​មាន​សុពល​ភាព​តាមរយៈ HTML Tidy
+Comment[lt]=Patikrina dabartinį dokumentą panaudojant HTML Tidy
+Comment[mk]=Го проверува тековниот документ со HTML Tidy
+Comment[ms]=Mengesahkan dokumen semasa melalui HTML Tidy
+Comment[nb]=Validerer gjeldende dokument via HTML Tidy
+Comment[nds]=Pröövt dat aktuelle Dokment mit HTML Tidy
+Comment[ne]=एचटीएमएल स्पष्टताबाट हालको कागजात प्रमाणित गर्छ
+Comment[nl]=Valideert het huidige document via HTML Tidy
+Comment[nn]=Validerer dokumentet med HTML Tidy
+Comment[pl]=Sprawdza poprawność kodu HTML aktualnego dokumentu za pomocą HTML Tidy
+Comment[pt]=Valida o documento actual utilizando o HTML Tidy
+Comment[pt_BR]=Valida o documento atual via HTML Tidy
+Comment[ro]=Validează documentul HTML curent folosind utilitarul Tidy
+Comment[ru]=Проверяет соответствие текущей HTML-страницы на соответствие стандартам
+Comment[sk]=Skontroluje aktuálny dokument pomocou HTML Tidy
+Comment[sl]=Potrdi trenuten dokument preko HTML Tidy
+Comment[sr]=Проверава текући документ HTML Tidy-јем
+Comment[sr@Latn]=Proverava tekući dokument HTML Tidy-jem
+Comment[sv]=Validerar aktuellt dokument via HTML-tidy
+Comment[ta]=HTML டைடி மூலமாக நடப்பு ஆவணத்தை மதிப்பிடுகிறது
+Comment[tg]=Саҳифаҳои HTML -ро бо мувофиқати ҷараён дар стандарти мувофиқат, тафтиш мекунад
+Comment[tr]=HTML Tidy yardımıyla
+Comment[uk]=Перевіряє відповідність даного документа стандартам за допомогою HTML Tidy
+Comment[uz]=Ushbu hujjatni HTML-andozasiga mosligini tekshirish
+Comment[uz@cyrillic]=Ушбу ҳужжатни HTML-андозасига мослигини текшириш
+Comment[vi]=Thẩm tra tài liệu hiện thời bằng Làm sạch HTML
+Comment[zh_CN]=通过 HTML Tidy 校验当前文档
+Comment[zh_TW]=透過 HTML Tidy 驗證目前的文件
+Type=ShellScript/bash
+X-KDE-ScriptName=html-tidy.sh
diff --git a/kate/scripts/html-tidy.sh b/kate/scripts/html-tidy.sh
new file mode 100644
index 0000000..02f9282
--- /dev/null
+++ b/kate/scripts/html-tidy.sh
@@ -0,0 +1,64 @@
+#!/bin/bash
+
+# Kate script interface to html tidy
+# Version 1 - 13/10/03
+# by David Ross http://www.rossy.co.uk
+# modified by Christoph Cullmann for Kate 2.2 (KDE 3.2)
+# Version 1.1 - 15/10/03
+# Added a help message if tidy isn't installed.
+
+################
+# Start Config #
+################
+
+# Path to tidy - just use "tidy" if it is in your path
+tidy="tidy"
+
+# Specify any options you want to pass to tidy
+tidyoptions="-iu --wrap 0 --doctype transitional"
+
+# File to write errors to
+errfile=/tmp/$$.err
+infile=/tmp/$$.in
+outfile=/tmp/$$.out
+
+# Clean up when done or when aborting.
+trap "rm -f $outfile; rm -f $infile; rm -f $errfile" 0 1 2 3 15
+
+# Do you want a prompt before showing errors
+# If you don't have "kdialog" set to 0
+errprompt=1
+
+##############
+# Start Code #
+##############
+
+# Is tidy installed
+if [ `$tidy -v | grep -c "HTML Tidy"` -ne 1 ];then
+kdialog --msgbox "HTML Tidy could not be found.
+Please download install HTML tidy into your path, tidy can be downloaded from http://tidy.sf.net"
+else
+# Get the active document number
+doc=`dcop $1 KateDocumentManager activeDocumentNumber`
+
+# Get the current html from kate
+dcop $1 EditInterface#$doc text > $infile
+
+# Run the html through tidy
+cat $infile | $tidy $tidyoptions > $outfile 2> $errfile
+
+# Only send back the tidied version if there is valid html
+if [ `cat $outfile|grep -c "DOCTYPE"` -gt 0 ];then
+dcop $1 EditInterface#$doc setText "`cat $outfile`"
+fi
+
+# Open a new document with the error code should errors arise
+if [ `cat $errfile|grep -c "No warnings or errors were found"` -eq 0 ];then
+if [ $errprompt -eq 1 ];then
+kdialog --yesno "Errors were found. Do you want to see them?"
+fi
+if [ $? -eq 0 ] || [ $errprompt -eq 0 ];then
+dcop $1 KateDocumentManager openURL "$errfile" ""
+fi
+fi
+fi
diff --git a/kate/snippets/CWidgetSnippetsBase.ui b/kate/snippets/CWidgetSnippetsBase.ui
new file mode 100644
index 0000000..7f370f9
--- /dev/null
+++ b/kate/snippets/CWidgetSnippetsBase.ui
@@ -0,0 +1,214 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>CWidgetSnippetsBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>CWidgetSnippetsBase</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>531</width>
+ <height>740</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Snippets</string>
+ <comment>Snippets for Kate</comment>
+ </property>
+ <property name="icon">
+ <pixmap>image0</pixmap>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QSplitter">
+ <property name="name">
+ <cstring>splitter13</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <widget class="QListView">
+ <column>
+ <property name="text">
+ <string>Snippet</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>false</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>lvSnippets</cstring>
+ </property>
+ <property name="cursor">
+ <cursor>13</cursor>
+ </property>
+ <property name="acceptDrops">
+ <bool>false</bool>
+ </property>
+ <property name="lineWidth">
+ <number>2</number>
+ </property>
+ <property name="midLineWidth">
+ <number>0</number>
+ </property>
+ <property name="resizePolicy">
+ <enum>Manual</enum>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="showSortIndicator">
+ <bool>true</bool>
+ </property>
+ <property name="showToolTips">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ <property name="treeStepSize">
+ <number>20</number>
+ </property>
+ <property name="defaultRenameAction">
+ <enum>Accept</enum>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>A list of Snippets</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>A list of Snippets, what else</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout24</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout11</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>btnNew</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>image1</iconset>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>btnSave</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>image2</iconset>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>btnDelete</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="iconSet">
+ <iconset>image3</iconset>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>200</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QTextEdit">
+ <property name="name">
+ <cstring>teSnippetText</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="textFormat">
+ <enum>PlainText</enum>
+ </property>
+ <property name="tabChangesFocus">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </widget>
+ </vbox>
+</widget>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="1917">789c7dd4476fdb401005e0bb7e05e1bd19c158ec5c0439b897b8c9dd0e725816c94d6e926b90ff9ed9d9478a0e83686d409fe6f189c2aeb430ef9dedef78f30bbdc9d44caf0aafb8344fde7cf93c1ebffff8f9ed576fcecf3cfe4b032f98fbd29b1b4cbdc2dbbdbfab2c4831545f1ee2657196e8c488f7acfd7e52c21bb5d3d05a0dad031debc8cd2bebd00fb2c0f5ddc2057ce49cf9995c4f191cc363b10efb8116dfc111bcef9ce92c177fb78efcc6723f9189faa12f367004af386b5f47e2dc3a0e78eefa3f9cb5d685f8596c1a3f582781f18dbbfe526ce2129fffcab99917700cbf58a761e2c7b219740f6bb86cecfaa67089f9b538e7fd707eb7cec2348697600df71b4b9faae0fafa35715ecf6913aef73b74ce7ce4d71bbbf9161ca39fac75d4cc0f60cce9acb63b3fb4036b78575c6465eaf6f3d059fb706c9d470656aa36cecf051c637f13d8c0917511e709f6f35c5ce606fba3adcb38aff3a9739118c92b533b77f347715504e85b84eb7e1fae70bd9c878ab7af28c5396c9ce9585c9549ee1cc006ef770a57452c7eb21e268d4f9cab007d03980f9078049b52beffaaac5d25327f150f9bebb79d8701e66f8dddefc7044ee055d80c5dfe06e687fbf121e5d6603a5b64289fbde67e97a8a092aad9ab9c18d2882e3bb92bbaa61bba95d631dd71e686d77d27f7c07d765271ea919e68229a7672cfd267d70be75ee94d9ebfd7f74d0ab90ff4d98ec5a66f89df7ff9536e057dabb4d6ea5be7dcc65fb99233139e6fb6fab63a7ddfb96f9bd788765a7dbbecbd4fb97dee1bd180d741abefb0d377c47dc77442a77486be73fe14179dfbb3c93ef91450c87d1167624a28edf4d995f167d5fc44d19a322a57852a3fdf5f730eb85355dc75c4d7d4ffcbed5c93ccd49067aabbeadcec6cfd7bcd72ff4fb673ed64fbc4ca79f9fdb5f707a32dabb2</data>
+ </image>
+ <image name="image1">
+ <data format="XPM.GZ" length="1055">789c5dd24b6fe2301000e03bbf222237b4a22d2259a2d51e80044a5b28ed69a5d51efc248f8600061a5aed7fdf8cc793a28da3c8df783cb623dff4bc5feba5d7bbe998233b66c213293b783d792acbcbef3f3f3f3bddbbd06bde61f3ed7eeb74fb9ef056d55641bf6cfafe773e0a2201fc20b221903b46c87720139c09093c00f990281c1592116500f42da51820f78e21f20c148160d2ee6ae6a8904f9692b824aa10b846ca018e268e218ec64019105347867c6969e7be5a2a1add39ba85b29636b940aa01b202aa6619e485a8eddc8d23436a4b45cc1d15f204d421718bd403ad8147475759b5b4a3c65247c1ed2db0768c9013a408915347869448cdb0d4d851df8d808fc48001e7c47000bc278e38f08118d99bb320727b375644bc2acf44bc0c6f44dc46bf797c868d377d8a89e6dfeb4d9a09fe15f3a554f9a6c87c9f7fe5bd2995e75956f2925fe76df36a97ee0f25c58c39aafc541467f68e79a6eed7469a3abf6467dfffb07f773c31e3b1998e4d9ccc667b9737bf5f2c1e1eeb2c4de2a7a5ab67a6abe78929b2348de3f575debc866012ff576f97256d1eacab4d5d14e94b1c5fedafaa8a62f7dad68373e41a826d3d88c139a975fffee8fc0371b41110</data>
+ </image>
+ <image name="image2">
+ <data format="XPM.GZ" length="1345">789c5dd44b53db301007f07b3e8507df980e58b625dbd3e9018815de2101c2a3d3c35a9209818400e1d9e9776f76572a505fe2df7f572b3913677d353a3f3a8856d73b8f0b585c9bc88ce1215ab54fd3e9dbcf5f3f7e7756848a4411a93c122bdf3a2b6b91890eef660eeff5f23e4ee84296c4322905b1468a44e4a244a6c43270e059328f9169224c46bbec11abb44c2be433321359921113642e322353e41911f25211f3c0b2413aa6945c554899caa4c89085a764021164c5cde61f0129032b83cc3c2d3346aa545a6ebe662ac13c0ce4e67d22280939b2f2acf8cca7815c1d228bac10406b0f884d219923cfaaa1e62d4fcb7c419659e011b3148d4576894d29993b9e15731b59e5953012f9ee29991744132890b0fca20dadbd241a00663fd052f32bb2c9c1311f988d62be116d03967e66b748231bc79c324dea1472e2a9988f441b78efe9980ba495069863a64d1d4d7ef254cc19d105ce3d817917d8d2a82b4fc7d50da453d66f74eee9b8f984e9fcbebd40ae369e8ab9ebe9d75aa20bd54d4f7f8c1b64dbb6d0b6c8d6b365aef92bf69f9f3268ccffd9f271daf86b06576e39ca7ccee2f135cd8f3f329898f6864213b2f8763a89db9bd9dd6c7e1f73060fb7f03831f78ba7f9fcf9855fa1d737b0307e8f9b8dcde7ad6e4d7f3253e8f51ad8de31bb7bfb0775975e266d7bfd9e85a3adc170587779deb19e9ff47b7d189e8eea33edf7d5fabc777139381cd589d6da9f4febbe48b351adf547b60c07b9acd5976c19eed485fe9aade9b2c2009ff7cff7ce5fcf2134c0</data>
+ </image>
+ <image name="image3">
+ <data format="XPM.GZ" length="965">789c5dd1514fdb301007f0f77e8aa879aba6423b9a0d211e70431b284c7b44427b70ec334e89db244da165da77c7e7b393322791fcf3fd7d4e94b351f4f4fb311a9d0d762d6f0b1109cd9b6824f7c61c9fff5cff1d0c274964ef8bf36832fc36188e2311fdda6e00e78d9dc73fbeff9c5c0ae4bb631e283c67c41b2417792224f20d995f04724f20e68172868c1d65e09628a6c4bd6742fc408a99e0c47947f7ceb79e405c38cac07ba29c12d3404890779e09551f02a9aa917216987972e2c61388b52304161d5d67438429f188842470e59910db40e55abd7872a27204e0142e03a95a7902f1405453e22b52d96394422e89a1baebe8aae0991099a33ab703b9262a4e55e9a988e371cce31c1f31c6416bf68f817ad10517fd5a2cd7f05a9a4dbc155f725555178d68c4696e57b5b5debfbd9fe60e87a3f9e0377d8e31bbb9652c8e9b2eb766ac2c199bcff77d0e76cc0e9dde2efa7eb0ac18cbb2bb74f15faec8749af6fda0c4bdb5d6f77d6ec9d8cad8dd0fbaefc7586b4c6d4f39c955ed6a658acc36ecfae17786cbaefdbb1a7c029001f396</data>
+ </image>
+</images>
+<includes>
+ <include location="local" impldecl="in implementation">CWidgetSnippetsBase.ui.h</include>
+</includes>
+<signals>
+ <signal>lalala()</signal>
+</signals>
+<slots>
+ <slot>init()</slot>
+</slots>
+<functions>
+ <function returnType="QListViewItem *">insertItem( const QString&amp; name, bool bRename )</function>
+</functions>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kate/snippets/CWidgetSnippetsBase.ui.h b/kate/snippets/CWidgetSnippetsBase.ui.h
new file mode 100644
index 0000000..816d7d8
--- /dev/null
+++ b/kate/snippets/CWidgetSnippetsBase.ui.h
@@ -0,0 +1,28 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you wish to add, delete or rename functions or slots use
+** Qt Designer which will update this file, preserving your code. Create an
+** init() function in place of a constructor, and a destroy() function in
+** place of a destructor.
+*****************************************************************************/
+
+
+
+void CWidgetSnippetsBase::init()
+{
+
+}
+
+
+QListViewItem* CWidgetSnippetsBase::insertItem( const QString& name, bool bRename )
+{
+ QListViewItem *item = new QListViewItem(lvSnippets, name);
+ item->setRenameEnabled(0,true);
+ lvSnippets->setSelected( item, true );
+ if ( bRename ) {
+ teSnippetText->clear();
+ item->startRename (0);
+ }
+ return item;
+}
diff --git a/kate/snippets/Makefile.am b/kate/snippets/Makefile.am
new file mode 100644
index 0000000..23bc3cf
--- /dev/null
+++ b/kate/snippets/Makefile.am
@@ -0,0 +1,17 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = katesnippetsplugin.la
+
+katesnippetsplugin_la_SOURCES = plugin_katesnippets.cpp CWidgetSnippetsBase.ui cwidgetsnippets.h cwidgetsnippets.cpp csnippet.h csnippet.cpp CWidgetSnippetsBase.ui.h
+katesnippetsplugin_la_LIBADD = -lkateinterfaces
+katesnippetsplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+pluginsdir = $(kde_datadir)/kate/plugins/katesnippets
+plugins_DATA = plugin_katesnippets.rc
+
+kde_services_DATA = katesnippets.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/katesnippets.pot
diff --git a/kate/snippets/csnippet.cpp b/kate/snippets/csnippet.cpp
new file mode 100644
index 0000000..fc7d7e7
--- /dev/null
+++ b/kate/snippets/csnippet.cpp
@@ -0,0 +1,17 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Stephan Mres *
+ * Erdling@gmx.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ ***************************************************************************/
+#include "csnippet.h"
+
+CSnippet::CSnippet(QString sKey, QString sValue, QListViewItem *lvi, QObject *parent, const char *name)
+ : QObject(parent, name), _sKey(sKey), _sValue(sValue), _lvi(lvi) {}
+
+CSnippet::~CSnippet() {}
+
+#include "csnippet.moc"
diff --git a/kate/snippets/csnippet.h b/kate/snippets/csnippet.h
new file mode 100644
index 0000000..a139f03
--- /dev/null
+++ b/kate/snippets/csnippet.h
@@ -0,0 +1,39 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Stephan Mres *
+ * Erdling@gmx.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ ***************************************************************************/
+#ifndef CSNIPPET_H
+#define CSNIPPET_H
+
+#include <qobject.h>
+#include <qlistview.h>
+#include <kaction.h>
+#include <qsignalmapper.h>
+
+/**
+@author Stephan Mres
+*/
+
+class CSnippet : public QObject {
+ Q_OBJECT
+public:
+ CSnippet(QString sKey, QString sValue, QListViewItem *lvi, QObject *parent = 0, const char *name = 0);
+ ~CSnippet();
+ QString getKey() { return _sKey; }
+ QString getValue() { return _sValue; }
+ QListViewItem* getListViewItem() const { return _lvi; }
+ void setKey(const QString& sKey) { _sKey = sKey; }
+ void setValue(const QString& sValue) { _sValue = sValue; }
+
+protected:
+ QString _sKey;
+ QString _sValue;
+ QListViewItem *_lvi;
+};
+
+#endif
diff --git a/kate/snippets/cwidgetsnippets.cpp b/kate/snippets/cwidgetsnippets.cpp
new file mode 100644
index 0000000..cf44319
--- /dev/null
+++ b/kate/snippets/cwidgetsnippets.cpp
@@ -0,0 +1,22 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Stephan Mres *
+ * Erdling@gmx.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ ***************************************************************************/
+#include "cwidgetsnippets.h"
+
+CWidgetSnippets::CWidgetSnippets( QWidget* parent, const char* name, WFlags fl)
+ : CWidgetSnippetsBase(parent, name, fl)
+{
+}
+
+
+CWidgetSnippets::~CWidgetSnippets()
+{
+}
+
+
diff --git a/kate/snippets/cwidgetsnippets.h b/kate/snippets/cwidgetsnippets.h
new file mode 100644
index 0000000..6d246c3
--- /dev/null
+++ b/kate/snippets/cwidgetsnippets.h
@@ -0,0 +1,26 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Stephan Mres *
+ * Erdling@gmx.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ ***************************************************************************/
+#ifndef CWIDGETSNIPPETS_H
+#define CWIDGETSNIPPETS_H
+
+#include <CWidgetSnippetsBase.h>
+
+/**
+@author Stephan Mres
+*/
+class CWidgetSnippets : public CWidgetSnippetsBase {
+public:
+ CWidgetSnippets( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+
+ ~CWidgetSnippets();
+
+};
+
+#endif
diff --git a/kate/snippets/katesnippets.desktop b/kate/snippets/katesnippets.desktop
new file mode 100644
index 0000000..4479b06
--- /dev/null
+++ b/kate/snippets/katesnippets.desktop
@@ -0,0 +1,101 @@
+[Desktop Entry]
+Type=Service
+ServiceTypes=Kate/Plugin
+X-KDE-Library=katesnippetsplugin
+X-Kate-Version=2.5
+Name=Kate Snippets
+Name[ca]=Retalls del Kate
+Name[cs]=Kate útržky
+Name[da]=Kate-Stumper
+Name[de]=Kate-Schnipsel
+Name[el]=Δείγματα Kate
+Name[eo]=Erilo por Kodredaktilo
+Name[es]=Recorte de Kate
+Name[et]=Kate koodijupid
+Name[fa]=تکه‌های Kate
+Name[fi]=Kate tekstipalat
+Name[fr]=Fragments de codes pour Kate
+Name[fy]=Kate-fragminten
+Name[ga]=Blúirí Kate
+Name[gl]=Anacos para Kate
+Name[he]=טקעי קוד של Kate
+Name[hr]=Kate isječci
+Name[hu]=Kate-kódrészletek
+Name[is]=Kate úrklippur
+Name[it]=Frammenti di testo di Kate
+Name[ja]=Kate 定型表現
+Name[ka]=Kate ფრაგმენტები
+Name[km]=អត្ថបទ​ខ្លីៗ​របស់ Kate
+Name[lt]=Kate teksto fragmentai
+Name[mk]=Парчиња за Кате
+Name[nb]=Kate-biter
+Name[nds]=Kate-Snippets
+Name[ne]=केट स्निपेट
+Name[nl]=Kate-fragmenten
+Name[nn]=Kate-snuttar
+Name[pa]=ਕੇਟ ਸਨੇਪਿੱਟ
+Name[pl]=Fragmenty kodu dla Kate
+Name[pt]=Pedaços do Kate
+Name[pt_BR]=Trechos de Código (snippets) do Kate
+Name[ru]=Фрагменты текста Kate
+Name[sk]=Kate štipka
+Name[sl]=Odsek za Kate
+Name[sr]=Исечци за Kate
+Name[sr@Latn]=Isečci za Kate
+Name[sv]=Kate-snuttar
+Name[ta]=கேட் சிறுகுறிப்புகள்
+Name[tr]=Kate Parçacıkları
+Name[uk]=Kate-Snippets
+Name[vi]=Đoạn Kate
+Name[zh_CN]=Kate 段
+Comment=Configurable Text-Snippets for Kate
+Comment[bg]=Потребителски текстови пасажи за Kate
+Comment[ca]=Retalls de text configurables per al Kate
+Comment[cs]=Nastavitelné textové útržky v Kate
+Comment[da]=Indstillelige tekststumper for Kate
+Comment[de]=Konfigurierbare Textschnipsel für Kate
+Comment[el]=Ρυθμιζόμενα δείγματα κειμένου για το Kate
+Comment[eo]=Agordeblaj tekseroj por Kodredaktilo
+Comment[es]=Recortes de texto para Kate
+Comment[et]=Kate seadistatavad tekstijupid
+Comment[eu]=Text-Snippets konfiguragarria Katerako
+Comment[fa]=تکه‌های متن قابل پیکربندی برای Kate
+Comment[fi]=Aseteltavia tekstipaloja Kateen
+Comment[fr]=Fragments de codes configurables pour Kate
+Comment[fy]=Ynstelbere tekstfragminten foar Kate
+Comment[ga]=Blúirí Inchumraithe Téacs do Kate
+Comment[gl]=Pedazos de Texto Configurábeis para Kate
+Comment[he]=הגדרת קטעי קוד עבור Kate
+Comment[hi]=केएटीई हेतु कॉन्फ़िगर करने योग्य टैक्स्ट-स्निपेट्स
+Comment[hr]=Konfigurabilni tekstualni isječci za Kate
+Comment[hu]=Beállítható szövegrészletek a Kate-hez
+Comment[is]=Stillanlegar texta úrklippur fyrir Kate
+Comment[it]=Frammenti di testo configurabili per Kate
+Comment[ja]=よく使う表現を登録しておきます
+Comment[ka]=კონფიგურირებადი ტექსტის ფრაგმენტები Kate-სთვის
+Comment[kk]=Бапталатын Kate мәтін-фрагменттері
+Comment[km]=អត្ថបទ​ខ្លីៗ​​ដែល​អាច​កំណត់​រចនា​សម្ព័ន្ធ​បាន​សម្រាប់ Kate
+Comment[lt]=Konfigūruoti Kate teksto fragmentų priedą
+Comment[mk]=Конфигурабилни парчиња текст за Кате
+Comment[ms]=Teks-Snippets boleh konfigur untuk Kate
+Comment[nb]=Innstillbare tekstbiter til Kate
+Comment[nds]=Instellbor Textsnippels för Kate
+Comment[ne]=केटका लागि कन्फिगर योग्य पाठ- खण्ड
+Comment[nl]=Instelbare tekstfragmenten voor Kate
+Comment[nn]=Tilpassbare tekstsnuttar til Kate
+Comment[pl]=Konfigurowalne fragmenty kodu dla Kate
+Comment[pt]=Pedaços de Texto Configuráveis para o Kate
+Comment[pt_BR]=Snippets configuráveis para o Kate
+Comment[ru]=Настраиваемые фрагменты текста для Kate
+Comment[sk]=Konfigurovateľná textová štipka pre Kate
+Comment[sl]=nastavljivi besedilni odseki za Kate
+Comment[sr]=Подесиви исечци текста за Kate
+Comment[sr@Latn]=Podesivi isečci teksta za Kate
+Comment[sv]=Anpassningsbara textsnuttar för Kate
+Comment[ta]=வடிவமைக்கக்கூடிய கேட்டுக்கான உரை-குறிப்புகள்
+Comment[tr]=Kate için Yapılandırılabilir Kod Parçacıkları
+Comment[uk]=Текстові уривки для Kate, які можна налаштовувати
+Comment[vi]=Đoạn văn bản có thể cấu hình cho Kate
+Comment[zh_CN]=可配置的 Kate 文本段
+Comment[zh_TW]=設定 Kate Text-Snippets
+author=Stephan Möres, Erdling@gmx.net
diff --git a/kate/snippets/plugin_katesnippets.cpp b/kate/snippets/plugin_katesnippets.cpp
new file mode 100644
index 0000000..07cba2b
--- /dev/null
+++ b/kate/snippets/plugin_katesnippets.cpp
@@ -0,0 +1,321 @@
+/*
+ * Copyright (C) 2004 Stephan Mres <Erdling@gmx.net>
+ */
+
+#include "plugin_katesnippets.h"
+
+#include <kaction.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kgenericfactory.h>
+
+
+// let the world know ...
+K_EXPORT_COMPONENT_FACTORY(katesnippetsplugin, KGenericFactory<KatePluginSnippets>( "katesnippets" ) )
+
+
+// < IMPLEMENTAIONS for KatePluginSnippetsView >
+//
+//
+
+/**
+ * ctor KatePluginSnippetsView
+ * @param w
+ * @return
+ */
+KatePluginSnippetsView::KatePluginSnippetsView(Kate::MainWindow *w, QWidget *dock) : CWidgetSnippets(dock,"snippetswidget")
+ , dock (dock)
+{
+ setInstance (new KInstance("kate"));
+ setXMLFile("plugins/katesnippets/plugin_katesnippets.rc");
+
+ w->guiFactory()->addClient (this);
+ win = w;
+
+
+ //<make connections>
+ connect (
+ lvSnippets, SIGNAL( selectionChanged(QListViewItem *) ),
+ this, SLOT( slot_lvSnippetsSelectionChanged(QListViewItem *) )
+ );
+ connect (
+ lvSnippets, SIGNAL( doubleClicked (QListViewItem *) ),
+ this, SLOT( slot_lvSnippetsClicked(QListViewItem *) )
+ );
+ connect (
+ lvSnippets, SIGNAL( itemRenamed(QListViewItem *, int, const QString &) ),
+ this, SLOT( slot_lvSnippetsItemRenamed(QListViewItem *, int, const QString &) )
+ );
+
+ connect (
+ btnNew, SIGNAL( clicked () ),
+ this, SLOT( slot_btnNewClicked() )
+ );
+ connect (
+ btnSave, SIGNAL( clicked () ),
+ this, SLOT( slot_btnSaveClicked() )
+ );
+ connect (
+ btnDelete, SIGNAL( clicked () ),
+ this, SLOT( slot_btnDeleteClicked() )
+ );
+ //</make connections>
+
+ lSnippets.setAutoDelete( TRUE ); // the list owns the objects
+
+ config = new KConfig("katesnippetspluginrc");
+ readConfig();
+
+ // set text of selected item at startup
+ slot_lvSnippetsSelectionChanged(lvSnippets->selectedItem() );
+}
+
+
+/**
+ * dtor KatePluginSnippetsView
+ * @return
+ */
+KatePluginSnippetsView::~ KatePluginSnippetsView() {
+ writeConfig();
+
+ win->guiFactory()->removeClient(this);
+}
+
+
+//
+//
+// < IMPLEMENTAIONS for KatePluginSnippetsView >
+
+
+
+
+// < IMPLEMENTAIONS for KatePluginSnippets >
+//
+//
+
+/**
+ * ctor KatePluginSnippets
+ * @param parent
+ * @param name
+ * @return
+ */
+KatePluginSnippets::KatePluginSnippets( QObject* parent, const char* name, const QStringList& )
+ : Kate::Plugin ( (Kate::Application*)parent, name ) {}
+
+/**
+ * dtor KatePluginSnippets
+ * @return
+ */
+KatePluginSnippets::~KatePluginSnippets() {}
+
+/**
+ *
+ * @param win
+ */
+void KatePluginSnippets::addView(Kate::MainWindow *win)
+{
+ QWidget *dock = win->toolViewManager()->createToolView(
+ "kate_plugin_snippets",
+ Kate::ToolViewManager::Left,
+ SmallIcon("contents"),
+ i18n("Snippets"));
+
+ KatePluginSnippetsView *view = new KatePluginSnippetsView (win,dock);
+ m_views.append(view);
+}
+
+
+/**
+ *
+ * @param win
+ */
+void KatePluginSnippets::removeView(Kate::MainWindow *win) {
+ for (uint z=0; z < m_views.count(); z++)
+ if (m_views.at(z)->win == win) {
+ KatePluginSnippetsView *view = m_views.at(z);
+ m_views.remove (view);
+ delete view->dock;
+ }
+}
+
+/**
+ *
+ * @param item
+ */
+void KatePluginSnippetsView::slot_lvSnippetsSelectionChanged(QListViewItem * item) {
+ CSnippet *snippet;
+ if ( (snippet = findSnippetByListViewItem(item))!= NULL ) {
+ teSnippetText->setText(snippet->getValue());
+ }
+
+}
+
+
+/**
+ * Special meaning of <mark/> and <cursor/> ...
+ * @param item
+ */
+void KatePluginSnippetsView::slot_lvSnippetsClicked (QListViewItem * item) {
+ Kate::View *kv = win->viewManager()->activeView();
+ CSnippet *snippet;
+
+ if (kv) {
+ if ( (snippet = findSnippetByListViewItem(item))!= NULL ) {
+ QString sText = snippet->getValue();
+ QString sSelection = "";
+
+ if ( kv->getDoc()->hasSelection() ) {
+ sSelection = kv->getDoc()->selection();
+ // clear selection
+ kv->keyDelete();
+ }
+
+ sText.replace( QRegExp("<mark/>"), sSelection );
+ sText.replace( QRegExp("<date/>"), QDate::currentDate().toString(Qt::LocalDate) );
+ sText.replace( QRegExp("<time/>"), QTime::currentTime().toString(Qt::LocalDate) );
+ kv->insertText ( sText );
+ }
+ kv->setFocus();
+ }
+}
+
+
+/**
+ *
+ * @param lvi
+ * @param
+ * @param text
+ */
+void KatePluginSnippetsView::slot_lvSnippetsItemRenamed(QListViewItem *lvi,int /*col*/, const QString& text) {
+ CSnippet *snippet;
+ if ( (snippet = findSnippetByListViewItem(lvi)) != NULL ) {
+ snippet->setKey( text );
+ writeConfig();
+ }
+}
+
+
+/**
+ *
+ */
+void KatePluginSnippetsView::slot_btnNewClicked() {
+ QString sKey = "New Snippet";
+ QString sValue = "";
+
+ QListViewItem *lvi = insertItem(sKey, true);
+ lSnippets.append( new CSnippet(sKey, sValue, lvi) );
+}
+
+
+/**
+ *
+ */
+void KatePluginSnippetsView::slot_btnSaveClicked() {
+ CSnippet *snippet;
+ QListViewItem *lvi = lvSnippets->selectedItem();
+ if ( (snippet = findSnippetByListViewItem(lvi)) != NULL ) {
+ snippet->setValue(teSnippetText->text() );
+ writeConfig();
+ }
+}
+
+
+/**
+ *
+ */
+void KatePluginSnippetsView::slot_btnDeleteClicked() {
+ CSnippet *snippet;
+ QListViewItem *lvi = lvSnippets->selectedItem();
+
+
+ if ( (snippet = findSnippetByListViewItem(lvi)) != NULL ) {
+ lvSnippets->takeItem(lvi);
+ lSnippets.remove(snippet);
+ }
+}
+
+
+/**
+ *
+ */
+void KatePluginSnippetsView::readConfig() {
+ QString sKey, sValue;
+ QListViewItem *lvi;
+
+ config->setGroup("Snippets");
+
+ int iNrOfSnippets = config->readEntry("NumberOfSnippets", "0").toInt() ;
+ for (int i=0; i < iNrOfSnippets; i++) {
+ QStringList slFields;
+ slFields = config->readListEntry ( QString::number(i) );
+
+ sKey = slFields[0];
+ sValue = slFields[1];
+
+ lvi = insertItem(sKey, false);
+
+ lSnippets.append( new CSnippet(sKey, sValue, lvi, this) );
+ }
+
+ // <defaults>
+ if ( iNrOfSnippets == 0 ) {
+ sKey = "DEBUG variable";
+ sValue = "## < DEBUG >\nout \"<pre>\\$<mark/> : \\\"$<mark/>\\\"\\n</pre>\"\n## </DEBUG >\n";
+ lvi = insertItem(sKey, false);
+ lSnippets.append( new CSnippet(sKey, sValue, lvi, this) );
+
+ sKey = "proc-header";
+ sValue = "## [created : <date/>, <time/>]\n## Description:\n## ============\n## The function \"<mark/>\" ...\n##\n##\n##\n##\n## Input:\n## ======\n##\n##\n##\nproc <mark/> {args} {\n\n ## add your code here\n\n return \"\"\n}\n";
+ lvi = insertItem(sKey, false);
+ lSnippets.append( new CSnippet(sKey, sValue, lvi, this) );
+ }
+ // </defaults>
+
+}
+
+
+/**
+ *
+ */
+void KatePluginSnippetsView::writeConfig() {
+ config->setGroup("Snippets");
+
+ int iNrOfSnippets = lSnippets.count();
+
+ config->writeEntry("NumberOfSnippets", iNrOfSnippets );
+
+ int i=0;
+
+ CSnippet *snippet;
+ for ( snippet = lSnippets.first(); snippet; snippet = lSnippets.next() ) {
+ QStringList slFields;
+ slFields.append( snippet->getKey() );
+ slFields.append( snippet->getValue() );
+
+ config->writeEntry ( QString::number(i), slFields, ',' );
+ i++;
+ }
+ // sync to disc ...
+ config->sync();
+}
+
+
+/**
+ *
+ * @param item
+ * @return
+ */
+CSnippet* KatePluginSnippetsView::findSnippetByListViewItem(QListViewItem *item) {
+ CSnippet *snippet = NULL;
+ for ( snippet = lSnippets.first(); snippet; snippet = lSnippets.next() ) {
+ if ( snippet->getListViewItem() == item)
+ break;
+ }
+ return snippet;
+}
+
+//
+//
+// < IMPLEMENTAIONS for KatePluginSnippets >
+
+#include "plugin_katesnippets.moc"
diff --git a/kate/snippets/plugin_katesnippets.h b/kate/snippets/plugin_katesnippets.h
new file mode 100644
index 0000000..9a940e5
--- /dev/null
+++ b/kate/snippets/plugin_katesnippets.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2004 Stephan Mres <Erdling@gmx.net>
+ */
+
+#ifndef _PLUGIN_KATESNIPPETS_H_
+#define _PLUGIN_KATESNIPPETS_H_
+
+#include <kate/application.h>
+#include <kate/documentmanager.h>
+#include <kate/document.h>
+#include <kate/mainwindow.h>
+#include <kate/plugin.h>
+#include <kate/view.h>
+#include <kate/viewmanager.h>
+#include <klibloader.h>
+#include <klocale.h>
+
+#include <kate/toolviewmanager.h>
+
+#include <qlistview.h>
+#include <qregexp.h>
+#include <kconfig.h>
+#include <qptrlist.h>
+#include <qtoolbutton.h>
+#include <qtextedit.h>
+#include <kiconloader.h>
+
+#include "csnippet.h"
+#include "cwidgetsnippets.h"
+
+class KatePluginSnippetsView : public CWidgetSnippets, public KXMLGUIClient {
+
+ Q_OBJECT
+
+ friend class KatePluginSnippets;
+
+public:
+ KatePluginSnippetsView (Kate::MainWindow *w, QWidget *dock);
+ virtual ~KatePluginSnippetsView ();
+ CSnippet* findSnippetByListViewItem(QListViewItem *item);
+
+public slots:
+ void slot_lvSnippetsSelectionChanged(QListViewItem * item);
+ void slot_lvSnippetsClicked (QListViewItem * item);
+ void slot_lvSnippetsItemRenamed(QListViewItem *lvi,int col, const QString& text);
+ void slot_btnNewClicked();
+ void slot_btnSaveClicked();
+ void slot_btnDeleteClicked();
+
+protected:
+ void readConfig();
+ void writeConfig();
+
+private:
+ KConfig *config;
+ QPtrList<CSnippet> lSnippets;
+
+public:
+ Kate::MainWindow *win;
+ QWidget *dock;
+};
+
+class KatePluginSnippets : public Kate::Plugin, Kate::PluginViewInterface {
+ Q_OBJECT
+
+public:
+ KatePluginSnippets( QObject* parent = 0, const char* name = 0, const QStringList& = QStringList() );
+ virtual ~KatePluginSnippets();
+
+ void addView (Kate::MainWindow *win);
+ void removeView (Kate::MainWindow *win);
+
+private:
+ QPtrList<class KatePluginSnippetsView> m_views;
+
+};
+
+#endif // _PLUGIN_KATESNIPPETS_H_
diff --git a/kate/snippets/plugin_katesnippets.rc b/kate/snippets/plugin_katesnippets.rc
new file mode 100644
index 0000000..86c92da
--- /dev/null
+++ b/kate/snippets/plugin_katesnippets.rc
@@ -0,0 +1,11 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="katesnippets" library="katesnippetsplugin" version="1">
+<MenuBar>
+ <Menu name="tools"><Text>&amp;Tools</Text>
+ <Action name="edit_insert_katesnippets"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="extraToolBar">
+ <Action name="edit_insert_katesnippets"/>
+</ToolBar>
+</kpartplugin>
diff --git a/kate/tabbarextension/Makefile.am b/kate/tabbarextension/Makefile.am
new file mode 100644
index 0000000..eea5072
--- /dev/null
+++ b/kate/tabbarextension/Makefile.am
@@ -0,0 +1,17 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = libkatetabbarextensionplugin.la
+
+libkatetabbarextensionplugin_la_SOURCES = plugin_katetabbarextension.cpp
+libkatetabbarextensionplugin_la_LIBADD = -lkateinterfaces
+libkatetabbarextensionplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+pluginsdir = $(kde_datadir)/kate/plugins/katetabbarextension
+plugins_DATA = ui.rc
+
+kde_services_DATA = katetabbarextension.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/katetabbarextension.pot
diff --git a/kate/tabbarextension/katetabbarextension.desktop b/kate/tabbarextension/katetabbarextension.desktop
new file mode 100644
index 0000000..0a54045
--- /dev/null
+++ b/kate/tabbarextension/katetabbarextension.desktop
@@ -0,0 +1,109 @@
+[Desktop Entry]
+Type=Service
+ServiceTypes=Kate/Plugin
+X-KDE-Library=libkatetabbarextensionplugin
+X-Kate-Version=2.5
+Name=Kate Tab Bar Extension
+Name[bs]=Kate tab bar ekstenzija
+Name[ca]=Extensió de barra de pestanyes per Kate
+Name[cs]=Rozšiření se záložkovou lištou
+Name[da]=Kate Fanebladslinjeudvidelse
+Name[de]=Unterfensterleiste für Kate
+Name[el]=Επέκταση γραμμής καρτελών του Kate
+Name[eo]=Tablistela kromaĵo por Kodredaktilo
+Name[es]=Extensión de la barra de pestañas de Kate
+Name[et]=Kate kaardirea laiend
+Name[eu]=Kateren fitxa-barra hedapena
+Name[fa]=توسعۀ میله تب Kate
+Name[fi]=Kate tabulointipalkkilaajennus
+Name[fr]=Extension de la barre d'onglets pour Kate
+Name[fy]=Kate Tabbalke-ekstinsje
+Name[ga]=Eisínteacht Barra Cluaisíní Kate
+Name[gl]=Extensión de Barra de Páxina para Kate
+Name[hi]=के-एटीई टैब पट्टी एक्सटेंशन
+Name[hr]=Kate proširenje za trake kartica
+Name[hu]=Kate fülsáv
+Name[is]=Kate flipaviðbót
+Name[it]=Estensione di Kate per la barra delle linguette
+Name[ja]=Kate タブバーエクステンション
+Name[ka]=Kate ჩანართთა ზოლის გაფართოება
+Name[kk]=Kate койындылар панелі
+Name[km]=ផ្នែក​បន្ថែម​របារ​ថេប​របស់ Kate
+Name[lt]=Kate kortelių juostos plėtinys
+Name[mk]=Лента со ливчиња за Кате
+Name[ms]=Sambungan Bar Tab Kate
+Name[nb]=Kate Tablinje-utvidelse
+Name[nds]=Kate-Ünnerfinsterbalken
+Name[ne]=केट ट्याब पट्टी विस्तार
+Name[nl]=Kate Tabbalk-extensie
+Name[nn]=Kate fanelinjetillegg
+Name[pa]=ਕੇਟ ਟੈਬ ਪੱਟੀ ਵਿਹਾਰ
+Name[pl]=Rozszerzenie paska kart dla Kate
+Name[pt]=Extensão de Barra de Página do Kate
+Name[pt_BR]=Extensão da Barra de Abas do Kate
+Name[ru]=Панель вкладок
+Name[sk]=Rozšírenie pre pruh kariet v Kate
+Name[sl]=Razširitev Vrstica z zavihki za Kate
+Name[sr]=Трака језичака, проширење за Kate
+Name[sr@Latn]=Traka jezičaka, proširenje za Kate
+Name[sv]=Kate flikradsutökning
+Name[ta]=கேட் தத்தல் பட்டி விரிவாக்கம்
+Name[tg]=Воридотҳо барои Kate
+Name[tr]=Kate Sekme Çubuğu Uzantısı
+Name[uk]=Розширення смужки вкладок Kate
+Name[vi]=Phần mở rộng thanh thẻ Kate
+Name[zh_CN]=Kate 标签栏扩展
+Name[zh_TW]=Kate Tab 列延伸
+Comment=Adds a tab bar to Kate's main window
+Comment[bg]=Добавяне на лента за отворените прозорци в главния прозорец на редактора
+Comment[bs]=Dodaje traku sa karticama na Kate glavni prozor
+Comment[ca]=Afegeix una barra de pestanyes a la finestra principal de Kate
+Comment[cs]=Přidá lištu se záložkami do okna Kate
+Comment[da]=Tilføjer en fanebladslinje til Kate's hovedvindue
+Comment[de]=Eine Unterfensterleiste mit allen geöffneten Dokumenten in Kate
+Comment[el]=Προσθέτει μία γραμμή στηλοθέτη στο κύριο παράθυρο του Kate
+Comment[eo]=Aldonas tablistelon al Kodredaktila ĉeffenestro
+Comment[es]=Añada una barra de pestañas a la ventana principal de Kate
+Comment[et]=Lisab Kate peaaknasse kaardirea
+Comment[eu]=Kateren leiho nagusiari fitxa-barra gehitzen dio
+Comment[fa]=میله تب را به پنجرۀ اصلی Kate اضافه می‌کند.
+Comment[fi]=Lisää tabulointipalkin Katen pääikkunaan
+Comment[fr]=Ajoute une barre d'onglet dans la fenêtre principale de Kate
+Comment[fy]=Heakket in taakbalke ta oan it haadfinster fan Kate
+Comment[ga]=Cuir barra cluaisíní le príomhfhuinneog Kate
+Comment[gl]=Engade unha barra de páxinas á fiestra principal de Kate
+Comment[hi]=केएटीई के मुख्य विंडो में एक टैब पट्टी जोड़ता है
+Comment[hr]=Dodaje traku kartica u glavni prozor aplikacije Kate
+Comment[hu]=Hozzáad egy lapozósávot a Kate főablakához
+Comment[is]=Bætir við flipaslá í aðalglugga Kate
+Comment[it]=Aggiunge una barra delle linguette alla finestra principale di Kate
+Comment[ja]=Kate のメインウインドウにタブバーを追加します
+Comment[ka]=Kateის მთავარ ფანჯარას ამატებს ჩანართთა ზოლს
+Comment[kk]=Kate негізгі терезесіне қойындылар панелін қосады
+Comment[km]=បន្ថែម​របារ​ថេប​ទៅ​បង្អួច​មេ​របស់ Kate
+Comment[lt]=Įdeda kortelių juostą į Kate langą
+Comment[mk]=Додава лента со ливчиња на главниот прозорец на Кате
+Comment[ms]=Tambah bar tab kepada tetingkap utama
+Comment[nb]=Legger til en tabulatorlinje i Kates hovedvindu
+Comment[nds]=Föögt dat Hööftfinster vun Kate en Ünnerfinsterbalken to
+Comment[ne]=केटको मुख्य सञ्झ्यालमा ट्याब पट्टी थप्दछ
+Comment[nl]=Voegt een tabbalk toe aan het hoofdvenster van Kate
+Comment[nn]=Legg til ei fanelinje i hovudvindauget til Kate
+Comment[pa]=ਕੇਟ ਦੇ ਮੁੱਖ ਝਰੋਖੇ ਵਿੱਚ ਇੱਕ ਟੈਬ ਜੋੜੋ
+Comment[pl]=Dodaje pasek kart do głównego okna Kate
+Comment[pt]=Adiciona uma barra de páginas à janela principal do Kate
+Comment[pt_BR]=Adiciona uma barra de abas na janela principal do Kate
+Comment[ru]=Добавляет панель вкладок с именами файлов в окно Kate
+Comment[sk]=Pridá pruh kariet do hlavného okna Kate
+Comment[sl]=Doda vrstico z zavihki v glavno okno Kate
+Comment[sr]=Додаје траку са језичцима у главни прозор Kate
+Comment[sr@Latn]=Dodaje traku sa jezičcima u glavni prozor Kate
+Comment[sv]=Lägger till en flikrad i Kates huvudfönster
+Comment[ta]=கேட்ஸ்ன் முக்கிய சாளரத்தில் ஒரு தத்தல் பட்டியைச் சேர்க்கிறது
+Comment[tg]=Панели воридотҳоро ба тирезаи Kate илова мекунад
+Comment[tr]=Kate'in ana penceresine bir sekme çubuğu ekler
+Comment[uk]=Додає смужку вкладок до головного вікна Kate
+Comment[vi]=Thêm một thanh thẻ vào cửa sổ chính của Kate
+Comment[zh_CN]=在 Kate 的主窗口添加一个标签栏
+Comment[zh_TW]=新增 tab 列到 Kate 主視窗
+author=Dominik Haumann, dhdev@gmx.de
diff --git a/kate/tabbarextension/plugin_katetabbarextension.cpp b/kate/tabbarextension/plugin_katetabbarextension.cpp
new file mode 100644
index 0000000..7004ff8
--- /dev/null
+++ b/kate/tabbarextension/plugin_katetabbarextension.cpp
@@ -0,0 +1,530 @@
+/***************************************************************************
+ plugin_katetabbarextension.cpp
+ -------------------
+ begin : 2004-04-20
+ copyright : (C) 2004 by Dominik Haumann
+ email : dhdev@gmx.de
+ ***************************************************************************/
+
+/***************************************************************************
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ ***************************************************************************/
+
+
+// BEGIN INCLUDES
+#include "plugin_katetabbarextension.h"
+
+#include <kaction.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kglobalsettings.h>
+
+#include <kdebug.h>
+#include <ktoolbar.h>
+#include <kconfig.h>
+#include <kiconloader.h>
+#include <kfiledialog.h>
+
+#include <qpushbutton.h>
+#include <qlayout.h>
+#include <qtooltip.h>
+#include <qgroupbox.h>
+#include <qcheckbox.h>
+// END
+
+class PluginView : public KXMLGUIClient
+{
+ friend class KatePluginTabBarExtension;
+
+ public:
+ Kate::MainWindow *win;
+ KateTabBarExtension* tabbar;
+};
+
+extern "C"
+{
+ void* init_libkatetabbarextensionplugin()
+ {
+ KGlobal::locale()->insertCatalogue("katetabbarextension");
+ return new KatePluginFactory;
+ }
+}
+
+KatePluginFactory::KatePluginFactory()
+{
+ s_instance = new KInstance( "kate" );
+}
+
+KatePluginFactory::~KatePluginFactory()
+{
+ delete s_instance;
+}
+
+QObject* KatePluginFactory::createObject(
+ QObject* parent, const char* name, const char*, const QStringList & )
+{
+ return new KatePluginTabBarExtension( parent, name );
+}
+
+KInstance* KatePluginFactory::s_instance = 0L;
+
+// BEGIN KatePluginTabBarExtension
+KatePluginTabBarExtension::KatePluginTabBarExtension(
+ QObject* parent, const char* name )
+ : Kate::Plugin ( (Kate::Application*)parent, name ),
+ pConfig(new KConfig("katetabbarextensionpluginrc"))
+{
+ pConfig->setGroup("global");
+}
+
+KatePluginTabBarExtension::~KatePluginTabBarExtension()
+{
+ while (m_views.count() > 0)
+ {
+ removeView(m_views.at(0)->win);
+ }
+
+ delete pConfig;
+}
+
+void KatePluginTabBarExtension::addView(Kate::MainWindow *win)
+{
+ PluginView *view = new PluginView ();
+
+ bool bHoriz = pConfig->readBoolEntry("horizontal orientation", true);
+ bool sort = pConfig->readBoolEntry("sort", true);
+
+ view->tabbar = new KateTabBarExtension( application()->documentManager(),
+ win, bHoriz, sort, 0, "tabs_hbox");
+
+ new KWidgetAction(view->tabbar, "tab_bar_widget",
+ KShortcut::null(), 0, 0, view->actionCollection(), "tabbar_widget");
+
+ view->setInstance (new KInstance("kate"));
+ view->setXMLFile("plugins/katetabbarextension/ui.rc");
+ win->guiFactory()->addClient (view);
+ view->win = win;
+
+ m_views.append (view);
+
+ KToolBar* toolbar = dynamic_cast<KToolBar*>
+ (win->guiFactory()->container("tabbarExtensionToolBar", view));
+ if (toolbar) {
+ connect(toolbar, SIGNAL( orientationChanged(Orientation) ),
+ view->tabbar, SLOT( slotMoved(Orientation) ));
+ }
+}
+
+void KatePluginTabBarExtension::removeView(Kate::MainWindow *win)
+{
+ for (uint z=0; z < m_views.count(); z++) {
+ if (m_views.at(z)->win == win)
+ {
+ PluginView *view = m_views.at(z);
+
+ // the last tabbar, save options
+ if (m_views.count() == 1)
+ {
+ pConfig->writeEntry("horizontal orientation",
+ view->tabbar->orientation()==Qt::Horizontal?true:false);
+ pConfig->writeEntry("sort", view->tabbar->sortByName());
+ pConfig->sync();
+ }
+
+ m_views.remove (view);
+ win->guiFactory()->removeClient (view);
+ delete view->tabbar;
+ delete view;
+ }
+ }
+}
+
+Kate::PluginConfigPage* KatePluginTabBarExtension::configPage(
+ uint, QWidget *w, const char* /*name*/)
+{
+ KateTabBarExtensionConfigPage* p = new KateTabBarExtensionConfigPage(this, w);
+ initConfigPage( p );
+ connect( p, SIGNAL(configPageApplyRequest(KateTabBarExtensionConfigPage*)),
+ SLOT(applyConfig(KateTabBarExtensionConfigPage*)) );
+ return (Kate::PluginConfigPage*)p;
+}
+
+void KatePluginTabBarExtension::initConfigPage( KateTabBarExtensionConfigPage* p )
+{
+ p->pSortAlpha->setChecked(m_views.at(0)->tabbar->sortByName());
+}
+
+void KatePluginTabBarExtension::applyConfig( KateTabBarExtensionConfigPage* p )
+{
+ m_views.at(0)->tabbar->setSortByName(p->pSortAlpha->isChecked());
+ // sync m_config in destructor
+}
+// END KatePluginTabBarExtension
+
+// BEGIN KateTabBarButton
+KateTabBarButton::KateTabBarButton(Kate::ViewManager* pViewManager,
+ Kate::Document *pDoc, QWidget * parent, const char * name)
+ : QPushButton(parent, name),
+ modified(false),
+ myDocID(pDoc->documentNumber()),
+ doc(pDoc),
+ viewManager(pViewManager)
+{
+ setFlat(true);
+ setToggleButton(true);
+ setFocusPolicy(QWidget::NoFocus);
+
+ setText(pDoc->docName());
+
+ connect(this, SIGNAL(toggled(bool)), SLOT(setOn(bool)));
+}
+
+KateTabBarButton::~KateTabBarButton() {}
+
+uint KateTabBarButton::documentNumber()
+{
+ return myDocID;
+}
+
+void KateTabBarButton::setDirty(bool d)
+{
+ if (d) {
+ setIconSet(SmallIconSet("cancel"));
+ } else {
+ if (modified) setIconSet(SmallIconSet("modified"));
+ else setIconSet(QIconSet());
+ }
+}
+
+void KateTabBarButton::setText( const QString& newText)
+{
+ QToolTip::remove(this);
+
+ if (newText.length() > 20) {
+ // squeeze to length 17+3=20
+ QPushButton::setText(newText.left(9) + "..." + newText.right(8));
+ QToolTip::add(this, newText);
+ } else {
+ QPushButton::setText(newText);
+ }
+}
+
+QString KateTabBarButton::fullName() const
+{
+ if (doc) {
+ return doc->docName();
+ } else {
+ return QString("");
+ }
+}
+
+void KateTabBarButton::triggerModified()
+{
+ modified = !modified;
+ if (modified) {
+ QColor c(255, 0, 0);
+ setPaletteForegroundColor( c );
+ setIconSet(SmallIconSet("modified"));
+ } else {
+ QColor c(KGlobalSettings::textColor());
+ setPaletteForegroundColor( c );
+ setIconSet(QIconSet());
+ }
+}
+
+void KateTabBarButton::setOn(bool on)
+{
+ disconnect( SIGNAL(toggled(bool)));
+// kdDebug() << "setOn: " << (int)on << endl;
+ if ((!on) && viewManager->activeView()->document()->documentNumber()
+ == documentNumber()) {
+// kdDebug() << "setOn aborted " << endl;
+ QPushButton::setOn(true);
+ } else {
+ QPushButton::setOn(on);
+
+ if (on) emit myToggled(this);
+ }
+ connect(this, SIGNAL(toggled(bool)), SLOT(setOn(bool)));
+}
+// END KateTabBarButton
+
+// BEGIN KateTabBarExtension
+KateTabBarExtension::KateTabBarExtension( Kate::DocumentManager *pDocManager,
+ Kate::MainWindow *win, bool bHorizOrientation, bool bSort,
+ QWidget* parent, const char* name, WFlags f )
+ : QWidget(parent, name, f),
+ pCurrentTab(0), m_win(win), m_docManager(pDocManager), m_sort(false)
+{
+ if (bHorizOrientation) {
+ top = new QBoxLayout(this, QBoxLayout::LeftToRight);
+ m_orientation = Qt::Horizontal;
+ } else {
+ top = new QBoxLayout(this, QBoxLayout::TopToBottom);
+ m_orientation = Qt::Vertical;
+ }
+
+ // add all already existing documents to the tabbar
+ for (uint i = 0; i < pDocManager->documents(); i++)
+ {
+ slotDocumentCreated (pDocManager->document(i));
+ }
+
+ connect(m_win->viewManager(), SIGNAL(viewChanged()), SLOT(slotViewChanged()));
+ connect(pDocManager,
+ SIGNAL(documentCreated(Kate::Document *)),
+ SLOT(slotDocumentCreated(Kate::Document *)));
+ connect(pDocManager,
+ SIGNAL(documentDeleted(uint)),
+ SLOT(slotDocumentDeleted(uint)));
+
+ setSortByName(bSort);
+}
+
+KateTabBarExtension::~KateTabBarExtension() {}
+
+void KateTabBarExtension::slotMoved(Orientation o)
+{
+ // the tabbar moved (top, right, bottom, left or fluently)
+ switch (o) {
+ case Qt::Vertical:
+ top->setDirection(QBoxLayout::TopToBottom);
+ break;
+
+ case Qt::Horizontal:
+ top->setDirection(QBoxLayout::LeftToRight);
+ break;
+ }
+
+ m_orientation = o;
+}
+
+Qt::Orientation KateTabBarExtension::orientation() const
+{
+ return m_orientation;
+}
+
+bool KateTabBarExtension::sortByName() const
+{
+ return m_sort;
+}
+
+void KateTabBarExtension::setSortByName(bool sbn)
+{
+ if (m_sort != sbn) {
+ m_sort = sbn;
+ if (m_sort)
+ updateSort();
+ }
+}
+
+void KateTabBarExtension::updateSort()
+{
+// kdDebug() << "updateSort called" << endl;
+
+ if (sortByName()) {
+ // remove all tabs from the tabbar
+ KateTabBarButton* tab;
+ for (tab = m_tabs.first(); tab; tab = m_tabs.next() ) {
+ top->remove(tab);
+ }
+
+ // now sort
+ m_tabs.sort();
+
+ // and finally add tabs again. FIXME: Is there a better way? :(
+ for (tab = m_tabs.first(); tab; tab = m_tabs.next() ) {
+ top->addWidget(tab);
+ }
+ }
+}
+
+void KateTabBarExtension::slotDocumentCreated (Kate::Document *doc)
+{
+// kdDebug() << "slotDocumentCreated" << endl;
+ if (!doc) return;
+
+ KateTabBarButton* tab = new KateTabBarButton(m_win->viewManager(), doc, this);
+ connect(tab, SIGNAL(myToggled(KateTabBarButton*)),
+ SLOT(slotActivateView(KateTabBarButton*)));
+ connect(doc, SIGNAL(nameChanged(Kate::Document *)),
+ SLOT(slotNameChanged(Kate::Document *)));
+ connect(doc, SIGNAL(modStateChanged(Kate::Document *)),
+ SLOT(slotModChanged(Kate::Document *)));
+ connect(doc,
+ SIGNAL(modifiedOnDisc(Kate::Document *, bool, unsigned char)),
+ SLOT(slotModifiedOnDisc(Kate::Document *, bool, unsigned char)));
+ if(doc->isModified()) tab->triggerModified();
+ tab->show();
+ top->addWidget(tab);
+ m_tabs.append(tab);
+
+ updateSort();
+}
+
+void KateTabBarExtension::slotDocumentDeleted (uint documentNumber)
+{
+// kdDebug() << "slotDocumentDeleted " << endl;
+ KateTabBarButton* tab;
+ for (tab = m_tabs.first(); tab; tab = m_tabs.next() ) {
+ if (tab->documentNumber() == documentNumber) {
+ tab->disconnect();
+ top->remove(tab);
+ m_tabs.removeRef(tab);
+ delete tab;
+ tab = 0;
+ break;
+ }
+ }
+}
+
+void KateTabBarExtension::slotActivateView(KateTabBarButton* newTab)
+{
+// kdDebug() << "slotActiavateView" << endl;
+ pCurrentTab = newTab;
+ if (pCurrentTab) {
+ KateTabBarButton* tab;
+ for (tab = m_tabs.first(); tab; tab = m_tabs.next() ) {
+ if (tab->isOn() && tab != pCurrentTab)
+ tab->setOn(false);
+ }
+ uint id = pCurrentTab->documentNumber();
+ m_win->viewManager()->activateView( id );
+ }
+}
+
+void KateTabBarExtension::slotModChanged (Kate::Document *doc)
+{
+// kdDebug() << "slotModChanged" << endl;
+
+ if (!doc) return;
+
+ KateTabBarButton* tab;
+ for (tab = m_tabs.first(); tab; tab = m_tabs.next() ) {
+ if (tab->documentNumber() == doc->documentNumber()) {
+ // found
+ tab->triggerModified();
+ break;
+ }
+ }
+}
+
+void KateTabBarExtension::slotModifiedOnDisc (
+ Kate::Document *doc, bool b, unsigned char /*reason*/)
+{
+// kdDebug() << "slotModifiedOnDisc: " << (int)b << endl;
+
+ // find corresponding tab
+ KateTabBarButton* tab;
+ for (tab = m_tabs.first(); tab; tab = m_tabs.next() ) {
+ if (tab->documentNumber() == doc->documentNumber()) {
+ tab->setDirty(b);
+ }
+ }
+}
+
+void KateTabBarExtension::slotNameChanged (Kate::Document *doc)
+{
+ if (!doc) return;
+// kdDebug() << "slotNameChanged " << doc->docName() << endl;
+
+ KateTabBarButton* tab;
+ for (tab = m_tabs.first(); tab; tab = m_tabs.next() ) {
+ if (tab->documentNumber() == doc->documentNumber()) {
+ tab->setText(doc->docName());
+ break;
+ }
+ }
+
+ updateSort();
+}
+
+void KateTabBarExtension::slotViewChanged ()
+{
+// kdDebug() << "slotVieChanged()" << endl;
+ Kate::View *view = m_win->viewManager()->activeView();
+ if (!view) return;
+
+ KateTabBarButton* tab;
+ for (tab = m_tabs.first(); tab; tab = m_tabs.next() ) {
+ if (tab->documentNumber()
+ == ((Kate::Document *)view->getDoc())->documentNumber()) {
+ pCurrentTab = tab;
+ for (tab = m_tabs.first(); tab; tab = m_tabs.next() ) {
+ if (tab->isOn()) tab->setOn(false);
+ }
+ if (!pCurrentTab->isOn()) pCurrentTab->setOn(true);
+
+ break;
+ }
+ }
+}
+// END KateTabBarExtension
+
+// BEGIN KateTabBarExtensionConfigPage
+KateTabBarExtensionConfigPage::KateTabBarExtensionConfigPage(
+ QObject* /*parent*/ /*= 0L*/, QWidget *parentWidget /*= 0L*/)
+ : Kate::PluginConfigPage( parentWidget )
+{
+ QVBoxLayout* top = new QVBoxLayout(this, 0,
+ KDialogBase::spacingHint());
+
+ QGroupBox* gb = new QGroupBox( i18n("Sorting Behavior"),
+ this, "tab_bar_extension_config_page_layout" );
+ gb->setColumnLayout(1, Qt::Vertical);
+ gb->setInsideSpacing(KDialogBase::spacingHint());
+ pSortAlpha = new QCheckBox(i18n("Sort files alphabetically"), gb);
+
+ top->add(gb);
+ top->addStretch(1);
+// throw signal changed
+ connect(pSortAlpha, SIGNAL(toggled(bool)), this, SIGNAL(changed()));
+}
+
+KateTabBarExtensionConfigPage::~KateTabBarExtensionConfigPage() {}
+
+void KateTabBarExtensionConfigPage::apply()
+{
+ emit configPageApplyRequest( this );
+}
+// END KateTabBarExtensionConfigPage
+
+
+// BEGIN MyPtrList implementaion
+int MyPtrList::compareItems ( QPtrCollection::Item item1_,
+ QPtrCollection::Item item2_ )
+{
+ KateTabBarButton* item1 = reinterpret_cast<KateTabBarButton*>(item1_);
+ KateTabBarButton* item2 = reinterpret_cast<KateTabBarButton*>(item2_);
+
+ if (item1->fullName().lower() < item2->fullName().lower()) {
+// kdDebug() << item1->fullName().lower() << " < "
+// << item2->fullName().lower() << endl;
+ return -1;
+ } else {
+ if (item1->fullName().lower() > item2->fullName().lower()) {
+// kdDebug() << item1->fullName().lower() << " > "
+// << item2->fullName().lower() << endl;
+ return 1;
+ } else {
+// kdDebug() << item1->fullName().lower() << " == "
+// << item2->fullName().lower() << endl;
+ return 0;
+ }
+ }
+}
+// END MyPtrList implementaion
+
+#include "plugin_katetabbarextension.moc"
diff --git a/kate/tabbarextension/plugin_katetabbarextension.h b/kate/tabbarextension/plugin_katetabbarextension.h
new file mode 100644
index 0000000..6b53444
--- /dev/null
+++ b/kate/tabbarextension/plugin_katetabbarextension.h
@@ -0,0 +1,322 @@
+/***************************************************************************
+ plugin_katetabbarextension.h
+ -------------------
+ begin : 2004-04-20
+ copyright : (C) 2004 by Dominik Haumann
+ email : dhdev@gmx.de
+ ***************************************************************************/
+
+/***************************************************************************
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ ***************************************************************************/
+
+#ifndef _PLUGIN_TABBAREXTENSION_H_
+#define _PLUGIN_TABBAREXTENSION_H_
+
+#include <kate/application.h>
+#include <kate/documentmanager.h>
+#include <kate/document.h>
+#include <kate/mainwindow.h>
+#include <kate/plugin.h>
+#include <kate/view.h>
+#include <kate/viewmanager.h>
+#include <kate/pluginconfiginterface.h>
+#include <kate/pluginconfiginterfaceextension.h>
+
+#include <klibloader.h>
+#include <klocale.h>
+#include <ktoolbar.h>
+
+#include <qwidget.h>
+#include <qpushbutton.h>
+#include <qptrlist.h>
+
+class QBoxLayout;
+class QCheckBox;
+class KateTabBarButton;
+
+/**
+ * Same as QPtrList. Only difference is: overwrite comapreItems() for sorting reason.
+ */
+class MyPtrList : public QPtrList <KateTabBarButton>
+{
+ public:
+ MyPtrList() { QPtrList<KateTabBarButton>::QPtrList(); }
+
+ virtual int compareItems ( QPtrCollection::Item item1_, QPtrCollection::Item item2_ );
+};
+
+class KatePluginFactory : public KLibFactory
+{
+ Q_OBJECT
+
+ public:
+ KatePluginFactory();
+ virtual ~KatePluginFactory();
+
+ virtual QObject* createObject( QObject* parent = 0, const char* pname = 0,
+ const char* name = "QObject", const QStringList &args = QStringList() );
+
+ private:
+ static KInstance* s_instance;
+};
+
+/**
+ * This class implements a single tab. Every tab represents a document and shows
+ * the current flag (modified: true or false).
+ */
+class KateTabBarButton: public QPushButton
+{
+ Q_OBJECT
+
+ public:
+ /**
+ * constructor
+ * @param pViewManager pointer to kate's the view manager
+ * @param pDoc pointer to the document, that the tab button represents
+ * @param parent parent widget
+ * @param name name of the tab button
+ */
+ KateTabBarButton(Kate::ViewManager* pViewManager, Kate::Document *pDoc,
+ QWidget* parent = 0, const char * name = 0);
+
+ /**
+ * standard destructor (emtpy)
+ */
+ ~KateTabBarButton();
+
+ /**
+ * @return the unique document ID
+ */
+ uint documentNumber();
+
+ /**
+ * get the document's full name (eg. main.cpp), used for comparison
+ * @return the document's name
+ */
+ QString fullName() const;
+
+ /**
+ * negate the modified flag and change the button color
+ * (usually red or black)
+ */
+ void triggerModified();
+
+ /**
+ * dirty flag indicates whether the file was modified on disk
+ * @param d if true, a small warning icon appears
+ */
+ void setDirty(bool d);
+
+ /**
+ * set text for this tab
+ * @param newText new text
+ */
+ virtual void setText( const QString& newText);
+
+ signals:
+ /**
+ * signal that is only emitted when the toggle button toggles to state 'on'
+ * @param tab pointer to the button that emitted the signal
+ */
+ void myToggled(KateTabBarButton* tab);
+
+ public slots:
+ /**
+ * control the ToggleButton
+ * @param on if true, the button is toggled on
+ */
+ virtual void setOn(bool on);
+
+ private:
+ bool modified; ///< if true, doc is modified
+ uint myDocID; ///< unique document ID
+ Kate::Document *doc; ///< pointer to the doc
+ Kate::ViewManager *viewManager; ///< pointer to the view manager
+};
+
+/**
+ * This class handels all tabs and implements a full-featured "tabbar".
+ */
+class KateTabBarExtension : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ /**
+ * constructor
+ * @param pDocManager pointer to kate's document manager
+ * @param win pinter to the main window
+ * @param bHorizOrientation true, if orientation is Qt::Horizontal
+ * @param bSort true, if orientation is Qt::Horizontal
+ * @param parent parent widget
+ * @param name name of widget
+ * @param f widget flags
+ */
+ KateTabBarExtension( Kate::DocumentManager *pDocManager,
+ Kate::MainWindow *win, bool bHorizOrientation, bool bSort,
+ QWidget * parent = 0, const char * name = 0, WFlags f = 0 );
+
+ /** standard destructor */
+ ~KateTabBarExtension();
+
+ /**
+ * @return the tabbar's orientation
+ */
+ Qt::Orientation orientation() const;
+
+ /**
+ * @return true, when sorting is alphabetically
+ */
+ bool sortByName() const;
+
+ /**
+ * set sorting type
+ * @param sbn if true, sort by filename.lower()
+ */
+ void setSortByName(bool sbn);
+
+ /**
+ * sort all tabs
+ */
+ void updateSort();
+
+ public slots:
+ /**
+ * called when a new document is created/loaded
+ * @param doc the new document
+ */
+ void slotDocumentCreated (Kate::Document *doc);
+
+ /**
+ * called when an existing document is being deleted
+ * @param documentNumber ID of the document
+ */
+ void slotDocumentDeleted (uint documentNumber);
+
+ /**
+ * called whenever the view changes
+ * @param v pointer to the button that represents the active view
+ */
+ void slotActivateView(KateTabBarButton* v);
+
+ /**
+ * called when the document's modified flag changes
+ * @param doc the document
+ */
+ void slotModChanged (Kate::Document *doc);
+
+ /**
+ * called when the document changed on disk [NOT SUPPORTED AT THE MOMENT]
+ * @param doc the document
+ * @param b modified flag
+ * @param reason the reason why the file changed
+ */
+ void slotModifiedOnDisc (Kate::Document *doc, bool b, unsigned char reason);
+
+ /**
+ * called when the document's name changed
+ * @param doc the document
+ */
+ void slotNameChanged (Kate::Document *doc);
+
+ /**
+ * called when the active view changes
+ */
+ void slotViewChanged ();
+
+ /**
+ * called whenever the toolbar's orientation changes
+ * @param o new orientation [Qt::Horizontal or Qt::Vertical]
+ */
+ void slotMoved(Orientation o);
+
+ private:
+ KateTabBarButton* pCurrentTab; ///< pointer to the current tab
+ QBoxLayout* top; ///< layout that contains all tabs
+ Kate::MainWindow* m_win; ///< pointer to the main window
+ Kate::DocumentManager* m_docManager; ///< pointer to the document manager
+// QPtrList <KateTabBarButton> m_tabs; ///< list containing all tabs
+ MyPtrList m_tabs; ///< list containing all tabs
+ Qt::Orientation m_orientation; ///< save tabbar's orientation
+ bool m_sort; ///< how to sort
+};
+
+/**
+ * The tabbar's config page
+ */
+class KateTabBarExtensionConfigPage : public Kate::PluginConfigPage
+{
+ Q_OBJECT
+
+ friend class KatePluginTabBarExtension;
+
+ public:
+ KateTabBarExtensionConfigPage (QObject* parent = 0L, QWidget *parentWidget = 0L);
+ ~KateTabBarExtensionConfigPage ();
+
+ /**
+ * Reimplemented from Kate::PluginConfigPage
+ * just emits configPageApplyRequest( this ).
+ */
+ virtual void apply();
+
+ virtual void reset () { ; }
+ virtual void defaults () { ; }
+
+ signals:
+ /**
+ * Ask the plugin to set initial values
+ */
+ void configPageApplyRequest( KateTabBarExtensionConfigPage* );
+
+ /**
+ * Ask the plugin to apply changes
+ */
+ void configPageInitRequest( KateTabBarExtensionConfigPage* );
+
+ private:
+ QCheckBox* pSortAlpha;
+};
+
+class KatePluginTabBarExtension : public Kate::Plugin, Kate::PluginViewInterface, Kate::PluginConfigInterfaceExtension
+{
+ Q_OBJECT
+
+ public:
+ KatePluginTabBarExtension( QObject* parent = 0, const char* name = 0 );
+ virtual ~KatePluginTabBarExtension();
+
+ void addView (Kate::MainWindow *win);
+ void removeView (Kate::MainWindow *win);
+
+ uint configPages () const { return 1; }
+ Kate::PluginConfigPage *configPage (uint , QWidget *w, const char *name=0);
+ QString configPageName(uint) const { return i18n("Tab Bar Extension"); }
+ QString configPageFullName(uint) const { return i18n("Configure Tab Bar Extension"); }
+ QPixmap configPagePixmap (uint number = 0, int size = KIcon::SizeSmall) const { return 0L; }
+
+ public slots:
+ void applyConfig( KateTabBarExtensionConfigPage* );
+
+ private:
+ void initConfigPage( KateTabBarExtensionConfigPage* );
+
+ private:
+ QPtrList<class PluginView> m_views;
+ KConfig* pConfig;
+};
+
+#endif // _PLUGIN_TABBAREXTENSION_H_
diff --git a/kate/tabbarextension/ui.rc b/kate/tabbarextension/ui.rc
new file mode 100644
index 0000000..1c88db2
--- /dev/null
+++ b/kate/tabbarextension/ui.rc
@@ -0,0 +1,7 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="tabbarextension" library="libkatetabbarextensionplugin" version="1">
+<ToolBar name="tabbarExtensionToolBar">
+ <text>Tab Bar Extension</text>
+ <Action name="tabbar_widget"/>
+</ToolBar>
+</kpartplugin>
diff --git a/kate/textfilter/Makefile.am b/kate/textfilter/Makefile.am
new file mode 100644
index 0000000..32c2bc7
--- /dev/null
+++ b/kate/textfilter/Makefile.am
@@ -0,0 +1,21 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = katetextfilterplugin.la
+
+# This is all standard. Remove the LIB_KHTML reference if you are not
+# using the KHTML Part
+katetextfilterplugin_la_SOURCES = plugin_katetextfilter.cpp
+katetextfilterplugin_la_LIBADD = -lkateinterfaces
+katetextfilterplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+# Install the .rc file in the Part's directory (in this case, the part
+# is KHTMLPart)
+pluginsdir = $(kde_datadir)/kate/plugins/katetextfilter
+plugins_DATA = ui.rc
+
+kde_services_DATA = katetextfilter.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/katetextfilter.pot
diff --git a/kate/textfilter/katetextfilter.desktop b/kate/textfilter/katetextfilter.desktop
new file mode 100644
index 0000000..9ed27cd
--- /dev/null
+++ b/kate/textfilter/katetextfilter.desktop
@@ -0,0 +1,123 @@
+[Desktop Entry]
+Type=Service
+ServiceTypes=Kate/Plugin
+X-KDE-Library=katetextfilterplugin
+X-Kate-Version=2.5
+Name=Kate TextFilter
+Name[af]=Kate Teks-filter
+Name[br]=Sil skrid evit Kate
+Name[cs]=Textový filtr Kate
+Name[cy]=HidlTestun Kate
+Name[da]=Kate Tekstfilter
+Name[de]=Kate-Textfilter
+Name[el]=Φίλτρο κειμένου του Kate
+Name[eo]=Tekstfiltrilo por Kodredaktilo
+Name[es]=Filtrado de texto de Kate
+Name[et]=Kate tekstifilter
+Name[eu]=Kateren testu iragazkia
+Name[fi]=Kate tekstisuodatin
+Name[fo]=Kate Tekstfiltur
+Name[fr]=Filtre texte pour Kate
+Name[fy]=Kate Tekstfilter
+Name[gl]=Filtro de Texto para Kate
+Name[he]=מסנן הטקסט של Kate
+Name[hi]=के-एटीई टेक्स्ट-फ़िल्टर
+Name[hr]=Kate TekstFiltar
+Name[hu]=Kate szövegszűrő
+Name[it]=FiltroDiTesto di Kate
+Name[ja]=Kate テキストフィルタ
+Name[kk]=Kate мәтін сүзгісі
+Name[km]=​តម្រង​អត្ថបទ​របស់ Kate
+Name[lt]=Kate teksto filtras
+Name[lv]=Kate TekstaFiltrs
+Name[mk]=Текст. филтер за Кате
+Name[nds]=Kate-Textfilter
+Name[ne]=केट पाठ फिल्टर
+Name[nl]=Kate Textfilter
+Name[nn]=Kate Tekstfilter
+Name[nso]=Sesekodi sa Sengwalwana sa Kate
+Name[pa]=ਕੇਟ ਪਾਠ ਫਿਲਟਰ
+Name[pl]=Kate - Filtr Tekstu
+Name[pt]=Filtro de Texto do Kate
+Name[pt_BR]=Filtro Kate
+Name[ro]=Filtru text Kate
+Name[ru]=Текстовый фильтр Kate
+Name[sr]=Филтер текста за Kate
+Name[sr@Latn]=Filter teksta za Kate
+Name[sv]=Kate-textfilter
+Name[ta]=கேட் உரை வடிகட்டி
+Name[tg]=Филтри матнии Kate
+Name[th]=ตัวกรองข้อความของ Kate
+Name[tr]=Kate Metin Süzgeci
+Name[uk]=Текстовий фільтр Kate
+Name[ven]=Thekisithi filithara ya Kate
+Name[vi]=Bộ lọc văn bản Kate
+Name[xh]=Icebo lokucoca ulwelo lo mbhalo weKate
+Name[zh_CN]=Kate 文本文件过滤器
+Name[zh_TW]=Kate 文字過濾器
+Name[zu]=Ifayela Yokubhaliwe
+Comment=Easy text filtering
+Comment[af]=Maklike teks gefilter het
+Comment[ar]=نتقية سهلة للنص
+Comment[az]=Asan mətn süzülməsi
+Comment[bg]=Филтриране на текст чрез системата за вход-изход и пренасочване на команди в командния интерпретатор
+Comment[bs]=Lahko filtriranje teksta
+Comment[ca]=Filtra el text amb facilitat
+Comment[cs]=Jednoduchý textový filtr
+Comment[cy]=Hidl hawdd am destun
+Comment[da]=Nem tekstfiltrering
+Comment[de]=Einfacher Textfilter für Kate
+Comment[el]=Εύκολο φιλτράρισμα κειμένων
+Comment[eo]=Facila tekstfiltrado
+Comment[es]=Filtrado de texto de forma sencilla
+Comment[et]=Lihtne teksti filtreerimine
+Comment[eu]=Testu iragazpen erraza
+Comment[fa]=پالایش آسان متن
+Comment[fi]=Helppoa tekstinsuodatusta
+Comment[fr]=Filtrage de texte facile
+Comment[fy]=Ienfâldige tekstfiltering
+Comment[ga]=Scagadh téacs go héasca
+Comment[gl]=Filtraxe de texto simples
+Comment[he]=סינון קל של טקסט
+Comment[hi]=आसान पाठ फ़िल्टरिंग
+Comment[hr]=Lagano filtriranje teksta
+Comment[hu]=Egyszerű szövegszűrő
+Comment[is]=Einföld textasíun
+Comment[it]=Per un facile filtraggio dei testi
+Comment[ja]=簡単にテキストにフィルタをかけます
+Comment[ka]=ადვილი ტექსტის მფილტრავი
+Comment[kk]=Ыңғайлы мәтінді сүзгілеуі
+Comment[km]=ការ​ត្រង​អត្ថបទ​ដ៏​ងាយ​ស្រួល
+Comment[lt]=Paprastas teksto filtravimas
+Comment[lv]=Viegla teksta filtrēšana
+Comment[mk]=Лесно филтрирање на текст
+Comment[ms]=Penapisan teks mudah
+Comment[mt]=Filtru tat-test faċli
+Comment[nb]=Enkel tekstfiltrering
+Comment[nds]=Text eenfach filtern
+Comment[ne]=सजिलो पाठ फिल्टरिङ
+Comment[nl]=Eenvoudige tekstfiltering
+Comment[nn]=Enkel tekstfiltrering
+Comment[nso]=Nolofatsa tshekolo ya sengwalwana
+Comment[pa]=ਅਸਾਨ ਪਾਠ ਫਿਲਟਰਿੰਗ
+Comment[pl]=Łatwe filtrowanie tekstu
+Comment[pt]=Filtragem de texto simples
+Comment[pt_BR]=Filtro de Textos
+Comment[ro]=Filtrare uşoară texte
+Comment[ru]=Простое фильтрование текста
+Comment[sk]=Jednoduchý textový filter
+Comment[sl]=Preprosto filtriranje besedila
+Comment[sr]=Лако филтрирање текста
+Comment[sr@Latn]=Lako filtriranje teksta
+Comment[sv]=Enkel textfiltrering
+Comment[ta]=இலகு உரைவடிகட்டல்
+Comment[tg]=Филтри оддии матн
+Comment[th]=การกรองข้อความง่ายๆ
+Comment[tr]=Kolay metin filtreleme
+Comment[uk]=Проста текстова фільтрація
+Comment[ven]=thekisiti filithara yo leluwaho
+Comment[vi]=Lọc dễ dàng văn bản
+Comment[xh]=Ubhalo olu lula lwecebo loku coca ulwelo
+Comment[zh_CN]=轻松过滤文本
+Comment[zh_TW]=簡單文字過濾
+Comment[zu]=Icebo lokuhlanza kalula okubhaliweyo kwakhishelwa phansi
diff --git a/kate/textfilter/plugin_katetextfilter.cpp b/kate/textfilter/plugin_katetextfilter.cpp
new file mode 100644
index 0000000..b5cd1ac
--- /dev/null
+++ b/kate/textfilter/plugin_katetextfilter.cpp
@@ -0,0 +1,336 @@
+/***************************************************************************
+ plugin_katetextfilter.cpp - description
+ -------------------
+ begin : FRE Feb 23 2001
+ copyright : (C) 2001 by Joseph Wenninger
+ email : jowenn@bigfoot.com
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "plugin_katetextfilter.h"
+#include "plugin_katetextfilter.moc"
+
+#include <kaction.h>
+#include <kinstance.h>
+#include <klineeditdlg.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <cassert>
+#include <kdebug.h>
+#include <qstring.h>
+#include <ktexteditor/editinterfaceext.h>
+#include <kapplication.h>
+#include <kcompletion.h>
+#include <klineedit.h>
+#define POP_(x) kdDebug(13000) << #x " = " << flush << x << endl
+
+#include <kgenericfactory.h>
+
+K_EXPORT_COMPONENT_FACTORY( katetextfilterplugin, KGenericFactory<PluginKateTextFilter>( "katetextfilter" ) )
+
+class PluginView : public KXMLGUIClient
+{
+ friend class PluginKateTextFilter;
+
+ public:
+ Kate::MainWindow *win;
+};
+
+PluginKateTextFilter::PluginKateTextFilter( QObject* parent, const char* name, const QStringList& )
+ : Kate::Plugin ( (Kate::Application *)parent, name ),
+ Kate::Command(),
+ m_pFilterShellProcess (NULL)
+{
+ Kate::Document::registerCommand( this );
+}
+
+PluginKateTextFilter::~PluginKateTextFilter()
+{
+ delete m_pFilterShellProcess;
+ Kate::Document::unregisterCommand( this );
+}
+
+void PluginKateTextFilter::addView(Kate::MainWindow *win)
+{
+ // TODO: doesn't this have to be deleted?
+ PluginView *view = new PluginView ();
+
+ (void) new KAction ( i18n("Filter Te&xt..."), /*"edit_filter",*/ CTRL + Key_Backslash, this,
+ SLOT( slotEditFilter() ), view->actionCollection(), "edit_filter" );
+
+ view->setInstance (new KInstance("kate"));
+ view->setXMLFile( "plugins/katetextfilter/ui.rc" );
+ win->guiFactory()->addClient (view);
+ view->win = win;
+
+ m_views.append (view);
+}
+
+void PluginKateTextFilter::removeView(Kate::MainWindow *win)
+{
+ for (uint z=0; z < m_views.count(); z++)
+ if (m_views.at(z)->win == win)
+ {
+ PluginView *view = m_views.at(z);
+ m_views.remove (view);
+ win->guiFactory()->removeClient (view);
+ delete view;
+ }
+}
+
+ void
+splitString (QString q, char c, QStringList &list) // PCP
+{
+
+// screw the OnceAndOnlyOnce Principle!
+
+ int pos;
+ QString item;
+
+ while ( (pos = q.find(c)) >= 0)
+ {
+ item = q.left(pos);
+ list.append(item);
+ q.remove(0,pos+1);
+ }
+ list.append(q);
+}
+
+
+ static void // PCP
+slipInNewText (Kate::View & view, QString pre, QString marked, QString post, bool reselect)
+{
+
+ uint preDeleteLine = 0, preDeleteCol = 0;
+ view.cursorPosition (&preDeleteLine, &preDeleteCol);
+
+ if (marked.length() > 0)
+ view.keyDelete ();
+ uint line = 0, col = 0;
+ view.cursorPosition (&line, &col);
+ view.insertText (pre + marked + post);
+
+ // all this muck to leave the cursor exactly where the user
+ // put it...
+
+ // Someday we will can all this (unless if it already
+ // is canned and I didn't find it...)
+
+ // The second part of the if disrespects the display bugs
+ // when we try to reselect. TODO: fix those bugs, and we can
+ // un-break this if...
+
+ // TODO: fix OnceAndOnlyOnce between this module and plugin_katehtmltools.cpp
+
+ if (reselect && preDeleteLine == line && -1 == marked.find ('\n'))
+ if (preDeleteLine == line && preDeleteCol == col)
+ {
+ view.setCursorPosition (line, col + pre.length () + marked.length () - 1);
+
+ for (int x (marked.length()); x--;)
+ view.shiftCursorLeft ();
+ }
+ else
+ {
+ view.setCursorPosition (line, col += pre.length ());
+
+ for (int x (marked.length()); x--;)
+ view.shiftCursorRight ();
+ }
+
+}
+
+
+ static QString // PCP
+KatePrompt
+ (
+ const QString & strTitle,
+ const QString & strPrompt,
+ QWidget * that,
+ QStringList *completionList
+ )
+{
+ // TODO: Make this a "memory edit" field with a combo box
+ // containing prior entries
+
+ KLineEditDlg dlg(strPrompt, QString::null, that);
+ dlg.setCaption(strTitle);
+ KCompletion *comple=dlg.lineEdit()->completionObject();
+ comple->setItems(*completionList);
+ if (dlg.exec()) {
+ if (!dlg.text().isEmpty()) {
+ comple->addItem(dlg.text());
+ (*completionList)=comple->items();
+ }
+ return dlg.text();
+ }
+ else
+ return "";
+}
+
+
+ void
+PluginKateTextFilter::slotFilterReceivedStdout (KProcess * pProcess, char * got, int len)
+{
+
+ assert (pProcess == m_pFilterShellProcess);
+
+ if (got && len)
+ {
+
+ // TODO: got a better idea?
+
+// while (len--) m_strFilterOutput += *got++;
+ m_strFilterOutput += QString::fromLocal8Bit( got, len );
+// POP_(m_strFilterOutput);
+ }
+
+}
+
+
+ void
+PluginKateTextFilter::slotFilterReceivedStderr (KProcess * pProcess, char * got, int len)
+ {
+ slotFilterReceivedStdout (pProcess, got, len);
+ }
+
+
+ void
+PluginKateTextFilter::slotFilterProcessExited (KProcess * pProcess)
+{
+
+ assert (pProcess == m_pFilterShellProcess);
+ Kate::View * kv (application()->activeMainWindow()->viewManager()->activeView());
+ if (!kv) return;
+ KTextEditor::EditInterfaceExt *ext=KTextEditor::editInterfaceExt(kv->getDoc());
+ if (ext) ext->editBegin();
+ QString marked = kv->getDoc()->selection ();
+ if (marked.length() > 0)
+ kv -> keyDelete ();
+ kv -> insertText (m_strFilterOutput);
+ if (ext) ext->editEnd();
+// slipInNewText (*kv, "", m_strFilterOutput, "", false);
+ m_strFilterOutput = "";
+
+}
+
+
+ static void // PCP
+slipInFilter (KShellProcess & shell, Kate::View & view, QString command)
+{
+ QString marked = view.getDoc()->selection ();
+ if( marked.isEmpty())
+ return;
+// POP_(command.latin1 ());
+ shell.clearArguments ();
+ shell << command;
+
+ shell.start (KProcess::NotifyOnExit, KProcess::All);
+ shell.writeStdin (marked.local8Bit (), marked.length ());
+ // TODO: Put up a modal dialog to defend the text from further
+ // keystrokes while the command is out. With a cancel button...
+
+}
+
+
+ void
+PluginKateTextFilter::slotFilterCloseStdin (KProcess * pProcess)
+ {
+ assert (pProcess == m_pFilterShellProcess);
+ pProcess -> closeStdin ();
+ }
+
+
+ void
+PluginKateTextFilter::slotEditFilter () // PCP
+{
+ if (!kapp->authorize("shell_access")) {
+ KMessageBox::sorry(0,i18n(
+ "You are not allowed to execute arbitrary external applications. If "
+ "you want to be able to do this, contact your system administrator."),
+ i18n("Access Restrictions"));
+ return;
+ }
+ if (!application()->activeMainWindow())
+ return;
+
+ Kate::View * kv (application()->activeMainWindow()->viewManager()->activeView());
+ if (!kv) return;
+
+ QString text ( KatePrompt ( i18n("Filter"),
+ i18n("Enter command to pipe selected text through:"),
+ (QWidget*) kv,
+ &completionList
+ ) );
+
+ if ( !text.isEmpty () )
+ runFilter( kv, text );
+}
+
+void PluginKateTextFilter::runFilter( Kate::View *kv, const QString &filter )
+{
+ m_strFilterOutput = "";
+
+ if (!m_pFilterShellProcess)
+ {
+ m_pFilterShellProcess = new KShellProcess;
+
+ connect ( m_pFilterShellProcess, SIGNAL(wroteStdin(KProcess *)),
+ this, SLOT(slotFilterCloseStdin (KProcess *)));
+
+ connect ( m_pFilterShellProcess, SIGNAL(receivedStdout(KProcess*,char*,int)),
+ this, SLOT(slotFilterReceivedStdout(KProcess*,char*,int)) );
+
+ connect ( m_pFilterShellProcess, SIGNAL(receivedStderr(KProcess*,char*,int)),
+ this, SLOT(slotFilterReceivedStderr(KProcess*,char*,int)) );
+
+ connect ( m_pFilterShellProcess, SIGNAL(processExited(KProcess*)),
+ this, SLOT(slotFilterProcessExited(KProcess*) ) ) ;
+ }
+
+ slipInFilter (*m_pFilterShellProcess, *kv, filter);
+}
+
+//BEGIN Kate::Command methods
+QStringList PluginKateTextFilter::cmds()
+{
+ return QStringList("textfilter");
+}
+
+bool PluginKateTextFilter::help( Kate::View *, const QString&, QString &msg )
+{
+ msg = i18n(
+ "<qt><p>Usage: <code>textfilter COMMAND</code></p>"
+ "<p>Replace the selection with the output of the specified shell command.</p></qt>");
+ return true;
+}
+
+bool PluginKateTextFilter::exec( Kate::View *v, const QString &cmd, QString &msg )
+{
+ if (! v->getDoc()->hasSelection() )
+ {
+ msg = i18n("You need to have a selection to use textfilter");
+ return false;
+ }
+
+ QString filter = cmd.section( " ", 1 ).stripWhiteSpace();
+
+ if ( filter.isEmpty() )
+ {
+ msg = i18n("Usage: textfilter COMMAND");
+ return false;
+ }
+
+ runFilter( v, filter );
+ return true;
+}
+//END
+// kate: space-indent on; indent-width 2; replace-tabs on; mixed-indent off;
diff --git a/kate/textfilter/plugin_katetextfilter.h b/kate/textfilter/plugin_katetextfilter.h
new file mode 100644
index 0000000..1b27b89
--- /dev/null
+++ b/kate/textfilter/plugin_katetextfilter.h
@@ -0,0 +1,65 @@
+ /***************************************************************************
+ plugin_katetextfilter.h - description
+ -------------------
+ begin : FRE Feb 23 2001
+ copyright : (C) 2001 by Joseph Wenninger
+ email : jowenn@bigfoot.com
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _PLUGIN_KANT_TEXTFILTER_H
+#define _PLUGIN_KANT_TEXTFILTER_H
+
+#include <qstring.h>
+
+#include <kate/plugin.h>
+#include <kate/application.h>
+#include <kate/view.h>
+#include <kate/document.h>
+#include <kate/documentmanager.h>
+#include <kate/mainwindow.h>
+#include <kate/viewmanager.h>
+
+#include <kprocess.h>
+
+class PluginKateTextFilter : public Kate::Plugin, public Kate::PluginViewInterface, public Kate::Command
+{
+ Q_OBJECT
+
+ public:
+ PluginKateTextFilter( QObject* parent = 0, const char* name = 0, const QStringList& = QStringList() );
+ virtual ~PluginKateTextFilter();
+
+ void addView (Kate::MainWindow *win);
+ void removeView (Kate::MainWindow *win);
+
+ // Kate::Command
+ QStringList cmds ();
+ bool exec (Kate::View *view, const QString &cmd, QString &msg);
+ bool help (Kate::View *view, const QString &cmd, QString &msg);
+ private:
+ void runFilter( Kate::View *kv, const QString & filter );
+
+ private:
+ QString m_strFilterOutput;
+ KShellProcess * m_pFilterShellProcess;
+ QPtrList<class PluginView> m_views;
+ QStringList completionList;
+ public slots:
+ void slotEditFilter ();
+ void slotFilterReceivedStdout (KProcess * pProcess, char * got, int len);
+ void slotFilterReceivedStderr (KProcess * pProcess, char * got, int len);
+ void slotFilterProcessExited (KProcess * pProcess);
+ void slotFilterCloseStdin (KProcess *);
+};
+
+#endif // _PLUGIN_KANT_TEXTFILTER_H
+// kate: space-indent on; indent-width 2; replace-tabs on; mixed-indent off;
diff --git a/kate/textfilter/ui.rc b/kate/textfilter/ui.rc
new file mode 100644
index 0000000..c607d0a
--- /dev/null
+++ b/kate/textfilter/ui.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="katetextfilter" library="libkatetextfilterplugin" version="3">
+<MenuBar>
+ <Menu name="tools"><text>&amp;Tools</text>
+ <Action name="edit_filter" />
+ </Menu>
+</MenuBar>
+</kpartplugin>
diff --git a/kate/xmlcheck/Makefile.am b/kate/xmlcheck/Makefile.am
new file mode 100644
index 0000000..f6554c2
--- /dev/null
+++ b/kate/xmlcheck/Makefile.am
@@ -0,0 +1,21 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = katexmlcheckplugin.la
+
+# This is all standard. Remove the LIB_KHTML reference if you are not
+# using the KHTML Part
+katexmlcheckplugin_la_SOURCES = plugin_katexmlcheck.cpp
+katexmlcheckplugin_la_LIBADD = -lkateinterfaces
+katexmlcheckplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+# Install the .rc file in the Part's directory (in this case, the part
+# is KHTMLPart)
+pluginsdir = $(kde_datadir)/kate/plugins/katexmlcheck
+plugins_DATA = ui.rc
+
+kde_services_DATA = katexmlcheck.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/katexmlcheck.pot
diff --git a/kate/xmlcheck/katexmlcheck.desktop b/kate/xmlcheck/katexmlcheck.desktop
new file mode 100644
index 0000000..bc6d031
--- /dev/null
+++ b/kate/xmlcheck/katexmlcheck.desktop
@@ -0,0 +1,122 @@
+[Desktop Entry]
+Type=Service
+ServiceTypes=Kate/Plugin
+X-KDE-Library=katexmlcheckplugin
+X-Kate-Version=2.5
+Name=Kate XML Validation
+Name[af]=Kate Xml Bekragting
+Name[az]=Kate XML Doğrulaması
+Name[ca]=Validació XML per a Kate
+Name[cs]=Validace XML pro Kate
+Name[cy]=Dilysiad XML Kate
+Name[da]=Kate XML-gyldighedstjek
+Name[de]=Kate-XML-Überprüfung
+Name[el]=Έλεγχος εγκυρότητας XML του Kate
+Name[eo]=XML-kontrolo por Kodredaktilo
+Name[es]=Validación XML para Kate
+Name[et]=Kate XML süntaksi kontrollija
+Name[eu]=Kateren XML balidazioa
+Name[fa]=اعتبارسنجی Kate XML
+Name[fi]=Kate XML validointi
+Name[fr]=Validation XML pour Kate
+Name[fy]=Kate XML-falidaasje
+Name[gl]=Validación de XML para Kate
+Name[he]=וידוא XML ל־Kate
+Name[hi]=के-एटीई एक्सएमएल वेलिडेशन
+Name[hr]=Kate XML validacija
+Name[hu]=Kate XML-ellenőrző
+Name[is]=Kate XML villuleit
+Name[it]=Validazione XML di Kate
+Name[ja]=Kate XML 検証
+Name[ka]=Kate XML დამმოწმებელი
+Name[kk]=Kate XML тексеруі
+Name[km]=សុពល​កម្ម​របស់ Kate XML
+Name[lt]=Kate XML tikrinimas
+Name[mk]=Валидација на XML во Кате
+Name[ms]=Pengesahan Kate XML
+Name[nb]=XML-validering til Kate
+Name[nds]=XML-Prööv för Kate
+Name[ne]=केट एक्सएमएल प्रमाणीकरण
+Name[nl]=Kate XML-validatie
+Name[nn]=XML-validering til Kate
+Name[nso]=Netefatso ya XML ya Kate
+Name[pa]=ਕੇਟ XML ਪੜਤਾਲ
+Name[pl]=Sprawdzenie poprawności XML-a
+Name[pt]=Validação de XML do Kate
+Name[pt_BR]=Validação XML do Kate
+Name[ro]=Validare XML pentru Kate
+Name[ru]=Проверка XML в Kate
+Name[sk]=Kate XML validácia
+Name[sl]=Potrjevanje XML v Kate
+Name[sr]=Провера XML-а за Kate
+Name[sr@Latn]=Provera XML-a za Kate
+Name[sv]=Kates XML-validering
+Name[ta]=கேட் XML மதிப்பிடுதல்
+Name[tg]=Тафтиши XML дар Kate
+Name[tr]=Kate XML Denetleme
+Name[uk]=Перевірка XML для Kate
+Name[uz]=Kate XML tekshirish
+Name[uz@cyrillic]=Kate XML текшириш
+Name[vi]=Thẩm tra XML Kate
+Name[xh]=Uvavanyo lwesiqiniseko se Kate XML
+Name[zh_CN]=Kate XML 校验
+Name[zh_TW]=Kate XML 驗證
+Comment=Validates XML files using xmllint
+Comment[ar]=يقوم بالتأكد من صلاحية ملفات XML باستخدام xmllint
+Comment[az]=xmllint işlədərək XML fayllarının doğrulamasını edir
+Comment[bg]=Валидиране на текущия документ XML чрез xmllint
+Comment[bs]=Provjerava ispravnost XML datoteka koristeći xmllint
+Comment[ca]=Valida fitxers XML emprant xmllint
+Comment[cs]=Validuje XML pomocí xmllint
+Comment[cy]=Dilysu ffeiliau XML gan ddefnyddio xmllint
+Comment[da]=Gyldighedstjekker XML-filer vha. xmllint
+Comment[de]=Überprüfung einer XML-Datei mit "xmllint"
+Comment[el]=Κάνει έλεγχο εγκυρότητας XML χρησιμοποιώντας το xmllint
+Comment[eo]=Kontrolas XML-dosierojn per xmllint
+Comment[es]=Valida archivos XML utilizando xmllint
+Comment[et]=Kontrollib XML-faile xmllint'i abil
+Comment[eu]=XML fitxategiak balidatzen ditu xmllint erabiliz
+Comment[fa]=پروندۀ XML را با استفاده از xmllint اعتبارسنجی می‌کند
+Comment[fi]=Validoi XML tiedostoja käyttäen xmllint ohjelmaa
+Comment[fr]=Valide un fichier XML en utilisant « xmllint »
+Comment[fy]=Falidearret XML-triemmen fia xmllint
+Comment[ga]=Bailíochtaigh comhaid XML le xmllint
+Comment[gl]=Valida ficheiros XML utilizando xmllint
+Comment[he]=וידוא קבצי XML באמצעות xmllint
+Comment[hi]=xmllint के उपयोग से XML फ़ाइलों को वेलिडेट करता है
+Comment[hr]=Validacija XML datoteke pomoću xmllint
+Comment[hu]=XML fájlok ellenőrzése az xmllint segítségével
+Comment[is]=Villuleitar XML skrár með xmllint
+Comment[it]=Valida i file XML usando xmllint
+Comment[ja]=xmllint で XML ファイルを検証します
+Comment[ka]=XML ფაილებს xmllint-ით ამოწმებს
+Comment[kk]=XML файлдарды xmllint көмегімен тексеру
+Comment[km]=ធ្វើឲ្យ​​ឯកសារ XML មាន​សុពល​ភាព​ដោយ​ប្រើ xmllint
+Comment[lt]=Tikrina XML bylas naudojant xmllint
+Comment[mk]=Валидира XML-датотеки со xmllint
+Comment[ms]=Mengesahkan fail XML menggunakan xmllint
+Comment[nb]=Validerer XML-filer vha xmllint
+Comment[nds]=Pröövt XML-Dateien mit "xmllint"
+Comment[ne]=xmllint प्रयोग गरेर एक्सएमएल फाइल प्रमाणित गर्छ
+Comment[nl]=Valideert XML-bestanden via xmllint
+Comment[nn]=Validerer XML-filer ved hjelp av xmllint
+Comment[pl]=Sprawdza poprawność plików XML za pomocą xmllint
+Comment[pt]=Valida ficheiros XML utilizando xmllint
+Comment[pt_BR]=Valida arquivos XML usando o xmllint
+Comment[ro]=Validează fişierele XML folosind utilitarul "xmllint"
+Comment[ru]=Проверка правильности XML с использованием xmllint
+Comment[sk]=Skontroluje vaše XML súbory pomocou xmllint
+Comment[sl]=Potrdi datoteke XML z uporabo xmllint
+Comment[sr]=Проверава XML фајлове користећи xmllint
+Comment[sr@Latn]=Proverava XML fajlove koristeći xmllint
+Comment[sv]=Validerar XML-filer med XMLlint
+Comment[ta]= XML கோப்புகளை xmllint கொண்டு மதிப்பிடும்
+Comment[tg]=Тафтиши дурустии XML бо истифодабарии xmllint
+Comment[tr]=xmllint kullanarak XML dosyalarını denetler
+Comment[uk]=Перевіряє файли XML за допомогою xmlinit
+Comment[uz]=Xmllint yordamida XML-fayllarni tekshirish
+Comment[uz@cyrillic]=Xmllint ёрдамида XML-файлларни текшириш
+Comment[vi]=Thẩm tra tập tin XML bằng xmllint
+Comment[xh]=Ivavanya isiqiniseko sefayile se XML isebenzisa ixmllint
+Comment[zh_CN]=使用 XMLLINT 来校验 XML 文件
+Comment[zh_TW]=使用 xmllint 驗證 XML 檔
diff --git a/kate/xmlcheck/plugin_katexmlcheck.cpp b/kate/xmlcheck/plugin_katexmlcheck.cpp
new file mode 100644
index 0000000..120e04e
--- /dev/null
+++ b/kate/xmlcheck/plugin_katexmlcheck.cpp
@@ -0,0 +1,353 @@
+/***************************************************************************
+ plugin_katexmlcheck.cpp - checks XML files using xmllint
+ -------------------
+ begin : 2002-07-06
+ copyright : (C) 2002 by Daniel Naber
+ email : daniel.naber@t-online.de
+ ***************************************************************************/
+
+/***************************************************************************
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ ***************************************************************************/
+
+/*
+-fixme: show dock if "Validate XML" is selected (doesn't currently work when Kate
+ was just started and the dockwidget isn't yet visible)
+-fixme(?): doesn't correctly disappear when deactivated in config
+*/
+
+#include "plugin_katexmlcheck.h"
+#include "plugin_katexmlcheck.moc"
+
+#include <cassert>
+
+#include <config.h>
+#include <qfile.h>
+#include <qinputdialog.h>
+#include <qregexp.h>
+#include <qstring.h>
+#include <qtextstream.h>
+
+#include <kaction.h>
+#include <kcursor.h>
+#include <kdebug.h>
+#include <kdockwidget.h>
+#include <kinstance.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kstandarddirs.h>
+#include <ktempfile.h>
+#include <kate/toolviewmanager.h>
+#include <kgenericfactory.h>
+
+K_EXPORT_COMPONENT_FACTORY( katexmlcheckplugin, KGenericFactory<PluginKateXMLCheck>( "katexmlcheck" ) )
+
+PluginKateXMLCheck::PluginKateXMLCheck( QObject* parent, const char* name, const QStringList& )
+ : Kate::Plugin ( (Kate::Application *)parent, name )
+{
+}
+
+
+PluginKateXMLCheck::~PluginKateXMLCheck()
+{
+}
+
+
+void PluginKateXMLCheck::addView(Kate::MainWindow *win)
+{
+ Kate::ToolViewManager *viewmanager = win->toolViewManager();
+ QWidget *dock = viewmanager->createToolView("kate_plugin_xmlcheck_ouputview", Kate::ToolViewManager::Bottom, SmallIcon("misc"), i18n("XML Checker Output"));
+
+ PluginKateXMLCheckView *view = new PluginKateXMLCheckView (dock,win,"katexmlcheck_outputview");
+ view->dock = dock;
+
+ win->guiFactory()->addClient(view);
+ view->win = win;
+
+ m_views.append(view);
+}
+
+
+void PluginKateXMLCheck::removeView(Kate::MainWindow *win)
+{
+ for (uint z=0; z < m_views.count(); z++) {
+ if (m_views.at(z)->win == win) {
+ PluginKateXMLCheckView *view = m_views.at(z);
+ m_views.remove (view);
+ win->guiFactory()->removeClient (view);
+ delete view->dock; // this will delete view, too
+ }
+ }
+}
+
+
+//---------------------------------
+PluginKateXMLCheckView::PluginKateXMLCheckView(QWidget *parent,Kate::MainWindow *mainwin,const char* name)
+ :QListView(parent,name),KXMLGUIClient(),win(mainwin)
+{
+ m_tmp_file=0;
+ m_proc=0;
+ (void) new KAction ( i18n("Validate XML"), 0, this,
+ SLOT( slotValidate() ), actionCollection(), "xml_check" );
+ // TODO?:
+ //(void) new KAction ( i18n("Indent XML"), 0, this,
+ // SLOT( slotIndent() ), actionCollection(), "xml_indent" );
+
+ setInstance(new KInstance("kate"));
+ setXMLFile("plugins/katexmlcheck/ui.rc");
+
+
+ setFocusPolicy(QWidget::NoFocus);
+ addColumn(i18n("#"), -1);
+ addColumn(i18n("Line"), -1);
+ setColumnAlignment(1, AlignRight);
+ addColumn(i18n("Column"), -1);
+ setColumnAlignment(2, AlignRight);
+ addColumn(i18n("Message"), -1);
+ setAllColumnsShowFocus(true);
+ setResizeMode(QListView::LastColumn);
+ connect(this, SIGNAL(clicked(QListViewItem *)), SLOT(slotClicked(QListViewItem *)));
+
+/* TODO?: invalidate the listview when document has changed
+ Kate::View *kv = application()->activeMainWindow()->viewManager()->activeView();
+ if( ! kv ) {
+ kdDebug() << "Warning: no Kate::View" << endl;
+ return;
+ }
+ connect(kv, SIGNAL(modifiedChanged()), this, SLOT(slotUpdate()));
+*/
+
+ m_proc_stderr = "";
+ m_proc = new KProcess();
+ connect(m_proc, SIGNAL(processExited(KProcess*)), this, SLOT(slotProcExited(KProcess*)));
+ // we currently only want errors:
+ //connect(m_proc, SIGNAL(receivedStdout(KProcess*,char*,int)),
+ // this, SLOT(receivedProcStdout(KProcess*, char*, int)));
+ connect(m_proc, SIGNAL(receivedStderr(KProcess*,char*,int)),
+ this, SLOT(slotReceivedProcStderr(KProcess*, char*, int)));
+
+}
+
+
+PluginKateXMLCheckView::~PluginKateXMLCheckView()
+{
+ delete m_proc;
+ delete m_tmp_file;
+}
+
+
+
+
+void PluginKateXMLCheckView::slotReceivedProcStderr(KProcess *, char *result, int len)
+{
+ m_proc_stderr += QString::fromLocal8Bit( QCString(result, len+1) );
+}
+
+
+void PluginKateXMLCheckView::slotProcExited(KProcess*)
+{
+ // FIXME: doesn't work correct the first time:
+ //if( m_dockwidget->isDockBackPossible() ) {
+ // m_dockwidget->dockBack();
+// }
+
+ kdDebug() << "slotProcExited()" << endl;
+ //kdDebug() << "output: " << endl << m_proc_stderr << endl << endl;
+ QApplication::restoreOverrideCursor();
+ m_tmp_file->unlink();
+ clear();
+ uint list_count = 0;
+ uint err_count = 0;
+ if( ! m_validating ) {
+ // no i18n here, so we don't get an ugly English<->Non-english mixup:
+ QString msg;
+ if( m_dtdname.isEmpty() ) {
+ msg = "No DOCTYPE found, will only check well-formedness.";
+ } else {
+ msg = "'" + m_dtdname + "' not found, will only check well-formedness.";
+ }
+ (void)new QListViewItem(this, QString("1").rightJustify(4,' '), "", "", msg);
+ list_count++;
+ }
+ if( ! m_proc_stderr.isEmpty() ) {
+ QStringList lines = QStringList::split("\n", m_proc_stderr);
+ QListViewItem *item = 0;
+ QString linenumber, msg;
+ uint line_count = 0;
+ for(QStringList::Iterator it = lines.begin(); it != lines.end(); ++it) {
+ QString line = *it;
+ line_count++;
+ int semicolon_1 = line.find(':');
+ int semicolon_2 = line.find(':', semicolon_1+1);
+ int semicolon_3 = line.find(':', semicolon_2+2);
+ int caret_pos = line.find('^');
+ if( semicolon_1 != -1 && semicolon_2 != -1 && semicolon_3 != -1 ) {
+ linenumber = line.mid(semicolon_1+1, semicolon_2-semicolon_1-1).stripWhiteSpace();
+ linenumber = linenumber.rightJustify(6, ' '); // for sorting numbers
+ msg = line.mid(semicolon_3+1, line.length()-semicolon_3-1).stripWhiteSpace();
+ } else if( caret_pos != -1 || line_count == lines.size() ) {
+ // TODO: this fails if "^" occurs in the real text?!
+ if( line_count == lines.size() && caret_pos == -1 ) {
+ msg = msg+"\n"+line;
+ }
+ QString col = QString::number(caret_pos);
+ if( col == "-1" ) {
+ col = "";
+ }
+ err_count++;
+ list_count++;
+ item = new QListViewItem(this, QString::number(list_count).rightJustify(4,' '), linenumber, col, msg);
+ item->setMultiLinesEnabled(true);
+ } else {
+ msg = msg+"\n"+line;
+ }
+ }
+ sort(); // TODO?: insert in right order
+ }
+ if( err_count == 0 ) {
+ QString msg;
+ if( m_validating ) {
+ msg = "No errors found, document is valid."; // no i18n here
+ } else {
+ msg = "No errors found, document is well-formed."; // no i18n here
+ }
+ (void)new QListViewItem(this, QString::number(list_count+1).rightJustify(4,' '), "", "", msg);
+ }
+}
+
+
+void PluginKateXMLCheckView::slotClicked(QListViewItem *item)
+{
+ kdDebug() << "slotClicked" << endl;
+ if( item ) {
+ bool ok = true;
+ uint line = item->text(1).toUInt(&ok);
+ bool ok2 = true;
+ uint column = item->text(2).toUInt(&ok);
+ if( ok && ok2 ) {
+ Kate::View *kv = win->viewManager()->activeView();
+ if( ! kv ) {
+ kdDebug() << "Warning (slotClicked()): no Kate::View" << endl;
+ return;
+ }
+ kv->setCursorPositionReal(line-1, column);
+ }
+ }
+}
+
+
+void PluginKateXMLCheckView::slotUpdate()
+{
+ kdDebug() << "slotUpdate() (not implemented yet)" << endl;
+}
+
+
+bool PluginKateXMLCheckView::slotValidate()
+{
+ kdDebug() << "slotValidate()" << endl;
+
+ win->toolViewManager()->showToolView (this);
+
+ m_proc->clearArguments();
+ m_proc_stderr = "";
+ m_validating = false;
+ m_dtdname = "";
+
+ Kate::View *kv = win->viewManager()->activeView();
+ if( ! kv ) {
+ kdDebug() << "Error (slotValidate()): no Kate::View" << endl;
+ return false;
+ }
+ if( ! kv->getDoc() ) {
+ kdDebug() << "Error (slotValidate()): no kv->getDoc()" << endl;
+ return false;
+ }
+ Kate::Document *doc = (Kate::Document*)kv->document();
+
+ m_tmp_file = new KTempFile();
+ if( m_tmp_file->status() != 0 ) {
+ kdDebug() << "Error (slotValidate()): could not create '" << m_tmp_file->name() << "': " << m_tmp_file->status() << endl;
+ KMessageBox::error(0, i18n("<b>Error:</b> Could not create "
+ "temporary file '%1'.").arg(m_tmp_file->name()));
+ delete m_tmp_file;
+ m_tmp_file=0L;
+ return false;
+ }
+ QTextStream *s = m_tmp_file->textStream();
+ *s << kv->getDoc()->text();
+ bool removed = m_tmp_file->close();
+ if( ! removed ) {
+ kdDebug() << "Warning (slotValidate()): temp file '" << m_tmp_file->name() << "' not deleted: " << m_tmp_file->status() << endl;
+ }
+
+ QString exe = KStandardDirs::findExe("xmllint");
+ if( exe.isEmpty() ) {
+ exe = locate("exe", "xmllint");
+ }
+
+ // use catalogs for KDE docbook:
+ if( ! getenv("SGML_CATALOG_FILES") ) {
+ KInstance ins("katexmlcheckplugin");
+ QString catalogs;
+ catalogs += ins.dirs()->findResource("data", "ksgmltools2/customization/catalog");
+ catalogs += ":";
+ catalogs += ins.dirs()->findResource("data", "ksgmltools2/docbook/xml-dtd-4.1.2/docbook.cat");
+ kdDebug() << "catalogs: " << catalogs << endl;
+ setenv("SGML_CATALOG_FILES", QFile::encodeName( catalogs ).data(), 1);
+ }
+ //kdDebug() << "**catalogs: " << getenv("SGML_CATALOG_FILES") << endl;
+
+ *m_proc << exe << "--catalogs" << "--noout";
+
+ // heuristic: assume that the doctype is in the first 10,000 bytes:
+ QString text_start = kv->getDoc()->text().left(10000);
+ // remove comments before looking for doctype (as a doctype might be commented out
+ // and needs to be ignored then):
+ QRegExp re("<!--.*-->");
+ re.setMinimal(true);
+ text_start.replace(re, "");
+ QRegExp re_doctype("<!DOCTYPE\\s+(.*)\\s+(?:PUBLIC\\s+[\"'].*[\"']\\s+[\"'](.*)[\"']|SYSTEM\\s+[\"'](.*)[\"'])", false);
+ re_doctype.setMinimal(true);
+
+ if( re_doctype.search(text_start) != -1 ) {
+ QString dtdname;
+ if( ! re_doctype.cap(2).isEmpty() ) {
+ dtdname = re_doctype.cap(2);
+ } else {
+ dtdname = re_doctype.cap(3);
+ }
+ if( !dtdname.startsWith("http:") ) { // todo: u_dtd.isLocalFile() doesn't work :-(
+ // a local DTD is used
+ m_validating = true;
+ *m_proc << "--valid";
+ } else {
+ m_validating = true;
+ *m_proc << "--valid";
+ }
+ } else if( text_start.find("<!DOCTYPE") != -1 ) {
+ // DTD is inside the XML file
+ m_validating = true;
+ *m_proc << "--valid";
+ }
+ *m_proc << m_tmp_file->name();
+
+ if( ! m_proc->start(KProcess::NotifyOnExit, KProcess::AllOutput) ) {
+ KMessageBox::error(0, i18n("<b>Error:</b> Failed to execute xmllint. Please make "
+ "sure that xmllint is installed. It is part of libxml2."));
+ return false;
+ }
+ QApplication::setOverrideCursor(KCursor::waitCursor());
+ return true;
+}
diff --git a/kate/xmlcheck/plugin_katexmlcheck.h b/kate/xmlcheck/plugin_katexmlcheck.h
new file mode 100644
index 0000000..17c2e53
--- /dev/null
+++ b/kate/xmlcheck/plugin_katexmlcheck.h
@@ -0,0 +1,87 @@
+ /***************************************************************************
+ plugin_katexmlcheck.h
+ -------------------
+ begin : 2002-07-06
+ copyright : (C) 2002 by Daniel Naber
+ email : daniel.naber@t-online.de
+ ***************************************************************************/
+
+/***************************************************************************
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ ***************************************************************************/
+
+#ifndef _PLUGIN_KANT_XMLCHECK_H
+#define _PLUGIN_KANT_XMLCHECK_H
+
+#include <qlistview.h>
+#include <qstring.h>
+
+#include <kate/plugin.h>
+#include <kate/application.h>
+#include <kate/view.h>
+#include <kate/document.h>
+#include <kate/documentmanager.h>
+#include <kate/mainwindow.h>
+#include <kate/viewmanager.h>
+
+#include <kdockwidget.h>
+#include <kiconloader.h>
+#include <kprocess.h>
+#include <ktempfile.h>
+
+class PluginKateXMLCheckView : public QListView, public KXMLGUIClient
+{
+ Q_OBJECT
+
+ public:
+ PluginKateXMLCheckView(QWidget *parent,Kate::MainWindow *mainwin,const char* name);
+ virtual ~PluginKateXMLCheckView();
+
+ Kate::MainWindow *win;
+ QWidget *dock;
+
+ public slots:
+ bool slotValidate();
+ void slotClicked(QListViewItem *item);
+ void slotProcExited(KProcess*);
+ void slotReceivedProcStderr(KProcess*, char*, int);
+ void slotUpdate();
+
+ private:
+ KTempFile *m_tmp_file;
+ KParts::ReadOnlyPart *part;
+ bool m_validating;
+ KProcess *m_proc;
+ QString m_proc_stderr;
+ QString m_dtdname;
+};
+
+
+class PluginKateXMLCheck : public Kate::Plugin, Kate::PluginViewInterface
+{
+ Q_OBJECT
+
+ public:
+ PluginKateXMLCheck( QObject* parent = 0, const char* name = 0, const QStringList& = QStringList() );
+ virtual ~PluginKateXMLCheck();
+
+ void addView (Kate::MainWindow *win);
+ void removeView (Kate::MainWindow *win);
+
+ private:
+ QPtrList<PluginKateXMLCheckView> m_views;
+};
+
+#endif // _PLUGIN_KANT_XMLCHECK_H
diff --git a/kate/xmlcheck/ui.rc b/kate/xmlcheck/ui.rc
new file mode 100644
index 0000000..9f24edd
--- /dev/null
+++ b/kate/xmlcheck/ui.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="katexmlcheck" library="libkatexmlcheckplugin" version="4">
+<MenuBar>
+ <Menu name="xml"><Text>&amp;XML</Text>
+ <Action name="xml_check" />
+ </Menu>
+</MenuBar>
+</kpartplugin>
diff --git a/kate/xmltools/ChangeLog b/kate/xmltools/ChangeLog
new file mode 100644
index 0000000..1389d4a
--- /dev/null
+++ b/kate/xmltools/ChangeLog
@@ -0,0 +1,11 @@
+ChangeLog for the kate XML Tools plugin
+
+2005-04-15 Anders Lund <anders@alweb.dk>
+ * I'm taking over maintenence of this plugin.
+
+2005-04-14 Anders Lund <anders@alweb.dk>
+ * Smarter alegoritm for placing the cursor after inserting an element.
+
+2005-04-13 Anders Lund <anders@alweb.dk>
+ * Dont prevent others from listening to the charactersInterActively inserted
+ of katedocument. \ No newline at end of file
diff --git a/kate/xmltools/Makefile.am b/kate/xmltools/Makefile.am
new file mode 100644
index 0000000..64a9b60
--- /dev/null
+++ b/kate/xmltools/Makefile.am
@@ -0,0 +1,30 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = katexmltoolsplugin.la
+
+# This is all standard. Remove the LIB_KHTML reference if you are not
+# using the KHTML Part
+katexmltoolsplugin_la_SOURCES = pseudo_dtd.cpp plugin_katexmltools.cpp
+katexmltoolsplugin_la_LIBADD = -lkateinterfaces
+katexmltoolsplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+# Install the .rc file in the Part's directory (in this case, the part
+# is KHTMLPart)
+pluginsdir = $(kde_datadir)/kate/plugins/katexmltools
+plugins_DATA = ui.rc
+
+xmldir = $(kde_datadir)/katexmltools
+xml_DATA = html4-loose.dtd.xml html4-strict.dtd.xml kde-docbook.dtd.xml \
+ simplify_dtd.xsl xhtml1-frameset.dtd.xml xhtml1-strict.dtd.xml \
+ xhtml1-transitional.dtd.xml xslt-1.0.dtd.xml \
+ testcases.xml language.dtd.xml kpartgui.dtd.xml kcfg.dtd.xml
+
+#deskdir=$(kde_datadir)/kate/plugins
+#desk_DATA=katexmltools.desktop
+
+kde_services_DATA = katexmltools.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/katexmltools.pot
diff --git a/kate/xmltools/README b/kate/xmltools/README
new file mode 100644
index 0000000..4187023
--- /dev/null
+++ b/kate/xmltools/README
@@ -0,0 +1,43 @@
+Kate XML plugin 0.9, 2002-07-20, Daniel Naber <daniel.naber@t-online.de>
+
+This plugin gives hints about what's allowed at a certain position in
+an XML file, according to the file's DTD. It will list possible
+elements, attributes, attribute values or named entities, depending
+on the cursor position. It's also possible to close the nearest
+not-yet-closed element (this function's scope is limited to some
+hundred characters).
+
+-> See the user documentation available in Kate's Help menu
+
+CHANGES
+
+0.8.1 -> 0.9:
+-re-show the completion popup when it disappeared after a typo but
+ backspace was pressed
+-knows about empty elements
+-other small fixes
+
+0.8 -> 0.8.1:
+-Every open document can now have its own meta DTD. More than
+one view per document is still not supported correctly.
+
+0.7 -> 0.8:
+-Now uses the completion interface. Trigger completion with <, ", & or Space,
+depending on your cursor's position
+
+0.6.1 -> 0.7:
+-Ported to KDE3.0, makes some things faster
+
+0.6 -> 0.6.1:
+-Show if PCDATA is allowed inside an element
+-If the element is unknown, say so (vs. the element has no sub-elements etc)
+
+0.5 -> 0.6:
+-Comes with its own Makefile etc, i.e. doesn't need CVS stuff anymore
+ (thanks to Olaf Hartig)
+-Don't display some allowed elements twice
+-Network transparent loading of meta DTDs
+-New versions of the XHTML meta DTDs (second edition of XHTML 1.0)
+-Attribute values CDATA, ID etc. not taken literally anymore
+-Selected attribute values replace old values
+-Support for single quote as attribute value delimiter
diff --git a/kate/xmltools/html4-loose.dtd.xml b/kate/xmltools/html4-loose.dtd.xml
new file mode 100644
index 0000000..f7b48d0
--- /dev/null
+++ b/kate/xmltools/html4-loose.dtd.xml
@@ -0,0 +1,13498 @@
+<!DOCTYPE dtd PUBLIC "-//Norman Walsh//DTD DTDParse V2.0//EN"
+ "dtd.dtd" [
+<!ENTITY nbsp "&#160;">
+<!ENTITY iexcl "&#161;">
+<!ENTITY cent "&#162;">
+<!ENTITY pound "&#163;">
+<!ENTITY curren "&#164;">
+<!ENTITY yen "&#165;">
+<!ENTITY brvbar "&#166;">
+<!ENTITY sect "&#167;">
+<!ENTITY uml "&#168;">
+<!ENTITY copy "&#169;">
+<!ENTITY ordf "&#170;">
+<!ENTITY laquo "&#171;">
+<!ENTITY not "&#172;">
+<!ENTITY shy "&#173;">
+<!ENTITY reg "&#174;">
+<!ENTITY macr "&#175;">
+<!ENTITY deg "&#176;">
+<!ENTITY plusmn "&#177;">
+<!ENTITY sup2 "&#178;">
+<!ENTITY sup3 "&#179;">
+<!ENTITY acute "&#180;">
+<!ENTITY micro "&#181;">
+<!ENTITY para "&#182;">
+<!ENTITY middot "&#183;">
+<!ENTITY cedil "&#184;">
+<!ENTITY sup1 "&#185;">
+<!ENTITY ordm "&#186;">
+<!ENTITY raquo "&#187;">
+<!ENTITY frac14 "&#188;">
+<!ENTITY frac12 "&#189;">
+<!ENTITY frac34 "&#190;">
+<!ENTITY iquest "&#191;">
+<!ENTITY Agrave "&#192;">
+<!ENTITY Aacute "&#193;">
+<!ENTITY Acirc "&#194;">
+<!ENTITY Atilde "&#195;">
+<!ENTITY Auml "&#196;">
+<!ENTITY Aring "&#197;">
+<!ENTITY AElig "&#198;">
+<!ENTITY Ccedil "&#199;">
+<!ENTITY Egrave "&#200;">
+<!ENTITY Eacute "&#201;">
+<!ENTITY Ecirc "&#202;">
+<!ENTITY Euml "&#203;">
+<!ENTITY Igrave "&#204;">
+<!ENTITY Iacute "&#205;">
+<!ENTITY Icirc "&#206;">
+<!ENTITY Iuml "&#207;">
+<!ENTITY ETH "&#208;">
+<!ENTITY Ntilde "&#209;">
+<!ENTITY Ograve "&#210;">
+<!ENTITY Oacute "&#211;">
+<!ENTITY Ocirc "&#212;">
+<!ENTITY Otilde "&#213;">
+<!ENTITY Ouml "&#214;">
+<!ENTITY times "&#215;">
+<!ENTITY Oslash "&#216;">
+<!ENTITY Ugrave "&#217;">
+<!ENTITY Uacute "&#218;">
+<!ENTITY Ucirc "&#219;">
+<!ENTITY Uuml "&#220;">
+<!ENTITY Yacute "&#221;">
+<!ENTITY THORN "&#222;">
+<!ENTITY szlig "&#223;">
+<!ENTITY agrave "&#224;">
+<!ENTITY aacute "&#225;">
+<!ENTITY acirc "&#226;">
+<!ENTITY atilde "&#227;">
+<!ENTITY auml "&#228;">
+<!ENTITY aring "&#229;">
+<!ENTITY aelig "&#230;">
+<!ENTITY ccedil "&#231;">
+<!ENTITY egrave "&#232;">
+<!ENTITY eacute "&#233;">
+<!ENTITY ecirc "&#234;">
+<!ENTITY euml "&#235;">
+<!ENTITY igrave "&#236;">
+<!ENTITY iacute "&#237;">
+<!ENTITY icirc "&#238;">
+<!ENTITY iuml "&#239;">
+<!ENTITY eth "&#240;">
+<!ENTITY ntilde "&#241;">
+<!ENTITY ograve "&#242;">
+<!ENTITY oacute "&#243;">
+<!ENTITY ocirc "&#244;">
+<!ENTITY otilde "&#245;">
+<!ENTITY ouml "&#246;">
+<!ENTITY divide "&#247;">
+<!ENTITY oslash "&#248;">
+<!ENTITY ugrave "&#249;">
+<!ENTITY uacute "&#250;">
+<!ENTITY ucirc "&#251;">
+<!ENTITY uuml "&#252;">
+<!ENTITY yacute "&#253;">
+<!ENTITY thorn "&#254;">
+<!ENTITY yuml "&#255;">
+<!ENTITY fnof "&#402;">
+<!ENTITY Alpha "&#913;">
+<!ENTITY Beta "&#914;">
+<!ENTITY Gamma "&#915;">
+<!ENTITY Delta "&#916;">
+<!ENTITY Epsilon "&#917;">
+<!ENTITY Zeta "&#918;">
+<!ENTITY Eta "&#919;">
+<!ENTITY Theta "&#920;">
+<!ENTITY Iota "&#921;">
+<!ENTITY Kappa "&#922;">
+<!ENTITY Lambda "&#923;">
+<!ENTITY Mu "&#924;">
+<!ENTITY Nu "&#925;">
+<!ENTITY Xi "&#926;">
+<!ENTITY Omicron "&#927;">
+<!ENTITY Pi "&#928;">
+<!ENTITY Rho "&#929;">
+<!ENTITY Sigma "&#931;">
+<!ENTITY Tau "&#932;">
+<!ENTITY Upsilon "&#933;">
+<!ENTITY Phi "&#934;">
+<!ENTITY Chi "&#935;">
+<!ENTITY Psi "&#936;">
+<!ENTITY Omega "&#937;">
+<!ENTITY alpha "&#945;">
+<!ENTITY beta "&#946;">
+<!ENTITY gamma "&#947;">
+<!ENTITY delta "&#948;">
+<!ENTITY epsilon "&#949;">
+<!ENTITY zeta "&#950;">
+<!ENTITY eta "&#951;">
+<!ENTITY theta "&#952;">
+<!ENTITY iota "&#953;">
+<!ENTITY kappa "&#954;">
+<!ENTITY lambda "&#955;">
+<!ENTITY mu "&#956;">
+<!ENTITY nu "&#957;">
+<!ENTITY xi "&#958;">
+<!ENTITY omicron "&#959;">
+<!ENTITY pi "&#960;">
+<!ENTITY rho "&#961;">
+<!ENTITY sigmaf "&#962;">
+<!ENTITY sigma "&#963;">
+<!ENTITY tau "&#964;">
+<!ENTITY upsilon "&#965;">
+<!ENTITY phi "&#966;">
+<!ENTITY chi "&#967;">
+<!ENTITY psi "&#968;">
+<!ENTITY omega "&#969;">
+<!ENTITY thetasym "&#977;">
+<!ENTITY upsih "&#978;">
+<!ENTITY piv "&#982;">
+<!ENTITY bull "&#8226;">
+<!ENTITY hellip "&#8230;">
+<!ENTITY prime "&#8242;">
+<!ENTITY Prime "&#8243;">
+<!ENTITY oline "&#8254;">
+<!ENTITY frasl "&#8260;">
+<!ENTITY weierp "&#8472;">
+<!ENTITY image "&#8465;">
+<!ENTITY real "&#8476;">
+<!ENTITY trade "&#8482;">
+<!ENTITY alefsym "&#8501;">
+<!ENTITY larr "&#8592;">
+<!ENTITY uarr "&#8593;">
+<!ENTITY rarr "&#8594;">
+<!ENTITY darr "&#8595;">
+<!ENTITY harr "&#8596;">
+<!ENTITY crarr "&#8629;">
+<!ENTITY lArr "&#8656;">
+<!ENTITY uArr "&#8657;">
+<!ENTITY rArr "&#8658;">
+<!ENTITY dArr "&#8659;">
+<!ENTITY hArr "&#8660;">
+<!ENTITY forall "&#8704;">
+<!ENTITY part "&#8706;">
+<!ENTITY exist "&#8707;">
+<!ENTITY empty "&#8709;">
+<!ENTITY nabla "&#8711;">
+<!ENTITY isin "&#8712;">
+<!ENTITY notin "&#8713;">
+<!ENTITY ni "&#8715;">
+<!ENTITY prod "&#8719;">
+<!ENTITY sum "&#8721;">
+<!ENTITY minus "&#8722;">
+<!ENTITY lowast "&#8727;">
+<!ENTITY radic "&#8730;">
+<!ENTITY prop "&#8733;">
+<!ENTITY infin "&#8734;">
+<!ENTITY ang "&#8736;">
+<!ENTITY and "&#8743;">
+<!ENTITY or "&#8744;">
+<!ENTITY cap "&#8745;">
+<!ENTITY cup "&#8746;">
+<!ENTITY int "&#8747;">
+<!ENTITY there4 "&#8756;">
+<!ENTITY sim "&#8764;">
+<!ENTITY cong "&#8773;">
+<!ENTITY asymp "&#8776;">
+<!ENTITY ne "&#8800;">
+<!ENTITY equiv "&#8801;">
+<!ENTITY le "&#8804;">
+<!ENTITY ge "&#8805;">
+<!ENTITY sub "&#8834;">
+<!ENTITY sup "&#8835;">
+<!ENTITY nsub "&#8836;">
+<!ENTITY sube "&#8838;">
+<!ENTITY supe "&#8839;">
+<!ENTITY oplus "&#8853;">
+<!ENTITY otimes "&#8855;">
+<!ENTITY perp "&#8869;">
+<!ENTITY sdot "&#8901;">
+<!ENTITY lceil "&#8968;">
+<!ENTITY rceil "&#8969;">
+<!ENTITY lfloor "&#8970;">
+<!ENTITY rfloor "&#8971;">
+<!ENTITY lang "&#9001;">
+<!ENTITY rang "&#9002;">
+<!ENTITY loz "&#9674;">
+<!ENTITY spades "&#9824;">
+<!ENTITY clubs "&#9827;">
+<!ENTITY hearts "&#9829;">
+<!ENTITY diams "&#9830;">
+<!ENTITY quot "&#34;">
+<!ENTITY amp "&#38;#38;">
+<!ENTITY lt "&#38;#60;">
+<!ENTITY gt "&#62;">
+<!ENTITY OElig "&#338;">
+<!ENTITY oelig "&#339;">
+<!ENTITY Scaron "&#352;">
+<!ENTITY scaron "&#353;">
+<!ENTITY Yuml "&#376;">
+<!ENTITY circ "&#710;">
+<!ENTITY tilde "&#732;">
+<!ENTITY ensp "&#8194;">
+<!ENTITY emsp "&#8195;">
+<!ENTITY thinsp "&#8201;">
+<!ENTITY zwnj "&#8204;">
+<!ENTITY zwj "&#8205;">
+<!ENTITY lrm "&#8206;">
+<!ENTITY rlm "&#8207;">
+<!ENTITY ndash "&#8211;">
+<!ENTITY mdash "&#8212;">
+<!ENTITY lsquo "&#8216;">
+<!ENTITY rsquo "&#8217;">
+<!ENTITY sbquo "&#8218;">
+<!ENTITY ldquo "&#8220;">
+<!ENTITY rdquo "&#8221;">
+<!ENTITY bdquo "&#8222;">
+<!ENTITY dagger "&#8224;">
+<!ENTITY Dagger "&#8225;">
+<!ENTITY permil "&#8240;">
+<!ENTITY lsaquo "&#8249;">
+<!ENTITY rsaquo "&#8250;">
+<!ENTITY euro "&#8364;">
+]>
+<dtd version='1.0'
+ unexpanded='1'
+ title="?untitled?"
+ namecase-general="1"
+ namecase-entity="0"
+ xml="0"
+ system-id="loose.dtd"
+ public-id=""
+ declaration=""
+ created-by="DTDParse V2.0beta6"
+ created-on="Thu Sep 20 20:18:49 2001"
+>
+<entity name="HTML.Frameset"
+ type="param"
+>
+<text-expanded>IGNORE</text-expanded>
+<text>IGNORE</text>
+</entity>
+
+<entity name="HTML.Version"
+ type="param"
+>
+<text-expanded>-//W3C//DTD HTML 4.01 Transitional//EN</text-expanded>
+<text>-//W3C//DTD HTML 4.01 Transitional//EN</text>
+</entity>
+
+<entity name="LanguageCode"
+ type="param"
+>
+<text-expanded>NAME</text-expanded>
+<text>NAME</text>
+</entity>
+
+<entity name="html.content"
+ type="param"
+>
+<text-expanded>HEAD, BODY</text-expanded>
+<text>HEAD, BODY</text>
+</entity>
+
+<entity name="LAlign"
+ type="param"
+>
+<text-expanded>(top|bottom|left|right)</text-expanded>
+<text>(top|bottom|left|right)</text>
+</entity>
+
+<entity name="ULStyle"
+ type="param"
+>
+<text-expanded>(disc|square|circle)</text-expanded>
+<text>(disc|square|circle)</text>
+</entity>
+
+<entity name="Script"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="MultiLength"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="Color"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="cellvalign"
+ type="param"
+>
+<text-expanded>valign (top|middle|bottom|baseline) #IMPLIED</text-expanded>
+<text>valign (top|middle|bottom|baseline) #IMPLIED</text>
+</entity>
+
+<entity name="Text"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="TFrame"
+ type="param"
+>
+<text-expanded>(void|above|below|hsides|lhs|rhs|vsides|box|border)</text-expanded>
+<text>(void|above|below|hsides|lhs|rhs|vsides|box|border)</text>
+</entity>
+
+<entity name="reserved"
+ type="param"
+>
+<text-expanded></text-expanded>
+<text></text>
+</entity>
+
+<entity name="HTMLsymbol"
+ type="param"
+ public="-//W3C//ENTITIES Symbols//EN//HTML"
+ system="HTMLsymbol.ent"
+/>
+
+<entity name="list"
+ type="param"
+>
+<text-expanded>UL | OL | DIR | MENU</text-expanded>
+<text>UL | OL | DIR | MENU</text>
+</entity>
+
+<entity name="IAlign"
+ type="param"
+>
+<text-expanded>(top|middle|bottom|left|right)</text-expanded>
+<text>(top|middle|bottom|left|right)</text>
+</entity>
+
+<entity name="Character"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="URI"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="coreattrs"
+ type="param"
+>
+<text-expanded>id ID #IMPLIED -- document-wide unique id --
+ class CDATA #IMPLIED -- space-separated list of classes --
+ style CDATA #IMPLIED -- associated style info --
+ title CDATA #IMPLIED -- advisory title --</text-expanded>
+<text>id ID #IMPLIED -- document-wide unique id --
+ class CDATA #IMPLIED -- space-separated list of classes --
+ style %StyleSheet; #IMPLIED -- associated style info --
+ title %Text; #IMPLIED -- advisory title --</text>
+</entity>
+
+<entity name="Shape"
+ type="param"
+>
+<text-expanded>(rect|circle|poly|default)</text-expanded>
+<text>(rect|circle|poly|default)</text>
+</entity>
+
+<entity name="HTMLlat1"
+ type="param"
+ public="-//W3C//ENTITIES Latin1//EN//HTML"
+ system="HTMLlat1.ent"
+/>
+
+<entity name="TRules"
+ type="param"
+>
+<text-expanded>(none | groups | rows | cols | all)</text-expanded>
+<text>(none | groups | rows | cols | all)</text>
+</entity>
+
+<entity name="events"
+ type="param"
+>
+<text-expanded>onclick CDATA #IMPLIED -- a pointer button was clicked --
+ ondblclick CDATA #IMPLIED -- a pointer button was double clicked--
+ onmousedown CDATA #IMPLIED -- a pointer button was pressed down --
+ onmouseup CDATA #IMPLIED -- a pointer button was released --
+ onmouseover CDATA #IMPLIED -- a pointer was moved onto --
+ onmousemove CDATA #IMPLIED -- a pointer was moved within --
+ onmouseout CDATA #IMPLIED -- a pointer was moved away --
+ onkeypress CDATA #IMPLIED -- a key was pressed and released --
+ onkeydown CDATA #IMPLIED -- a key was pressed down --
+ onkeyup CDATA #IMPLIED -- a key was released --</text-expanded>
+<text>onclick %Script; #IMPLIED -- a pointer button was clicked --
+ ondblclick %Script; #IMPLIED -- a pointer button was double clicked--
+ onmousedown %Script; #IMPLIED -- a pointer button was pressed down --
+ onmouseup %Script; #IMPLIED -- a pointer button was released --
+ onmouseover %Script; #IMPLIED -- a pointer was moved onto --
+ onmousemove %Script; #IMPLIED -- a pointer was moved within --
+ onmouseout %Script; #IMPLIED -- a pointer was moved away --
+ onkeypress %Script; #IMPLIED -- a key was pressed and released --
+ onkeydown %Script; #IMPLIED -- a key was pressed down --
+ onkeyup %Script; #IMPLIED -- a key was released --</text>
+</entity>
+
+<entity name="preformatted"
+ type="param"
+>
+<text-expanded>PRE</text-expanded>
+<text>PRE</text>
+</entity>
+
+<entity name="inline"
+ type="param"
+>
+<text-expanded>#PCDATA | TT | I | B | U | S | STRIKE | BIG | SMALL | EM | STRONG | DFN | CODE |
+ SAMP | KBD | VAR | CITE | ABBR | ACRONYM | A | IMG | APPLET | OBJECT | FONT | BASEFONT | BR | SCRIPT |
+ MAP | Q | SUB | SUP | SPAN | BDO | IFRAME | INPUT | SELECT | TEXTAREA | LABEL | BUTTON</text-expanded>
+<text>#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;</text>
+</entity>
+
+<entity name="align"
+ type="param"
+>
+<text-expanded>align (left|center|right|justify) #IMPLIED</text-expanded>
+<text>align (left|center|right|justify) #IMPLIED</text>
+</entity>
+
+<entity name="version"
+ type="param"
+>
+<text-expanded>version CDATA #FIXED '-//W3C//DTD HTML 4.01 Transitional//EN'</text-expanded>
+<text>version CDATA #FIXED '%HTML.Version;'</text>
+</entity>
+
+<entity name="OLStyle"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="flow"
+ type="param"
+>
+<text-expanded>P | H1|H2|H3|H4|H5|H6 | UL | OL | DIR | MENU | PRE | DL | DIV | CENTER |
+ NOSCRIPT | NOFRAMES | BLOCKQUOTE | FORM | ISINDEX | HR |
+ TABLE | FIELDSET | ADDRESS | #PCDATA | TT | I | B | U | S | STRIKE | BIG | SMALL | EM | STRONG | DFN | CODE |
+ SAMP | KBD | VAR | CITE | ABBR | ACRONYM | A | IMG | APPLET | OBJECT | FONT | BASEFONT | BR | SCRIPT |
+ MAP | Q | SUB | SUP | SPAN | BDO | IFRAME | INPUT | SELECT | TEXTAREA | LABEL | BUTTON</text-expanded>
+<text>%block; | %inline;</text>
+</entity>
+
+<entity name="noframes.content"
+ type="param"
+>
+<text-expanded>(P | H1|H2|H3|H4|H5|H6 | UL | OL | DIR | MENU | PRE | DL | DIV | CENTER |
+ NOSCRIPT | NOFRAMES | BLOCKQUOTE | FORM | ISINDEX | HR |
+ TABLE | FIELDSET | ADDRESS | #PCDATA | TT | I | B | U | S | STRIKE | BIG | SMALL | EM | STRONG | DFN | CODE |
+ SAMP | KBD | VAR | CITE | ABBR | ACRONYM | A | IMG | APPLET | OBJECT | FONT | BASEFONT | BR | SCRIPT |
+ MAP | Q | SUB | SUP | SPAN | BDO | IFRAME | INPUT | SELECT | TEXTAREA | LABEL | BUTTON)*</text-expanded>
+<text>(%flow;)*</text>
+</entity>
+
+<entity name="Charsets"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="FrameTarget"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="ContentTypes"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="block"
+ type="param"
+>
+<text-expanded>P | H1|H2|H3|H4|H5|H6 | UL | OL | DIR | MENU | PRE | DL | DIV | CENTER |
+ NOSCRIPT | NOFRAMES | BLOCKQUOTE | FORM | ISINDEX | HR |
+ TABLE | FIELDSET | ADDRESS</text-expanded>
+<text>P | %heading; | %list; | %preformatted; | DL | DIV | CENTER |
+ NOSCRIPT | NOFRAMES | BLOCKQUOTE | FORM | ISINDEX | HR |
+ TABLE | FIELDSET | ADDRESS</text>
+</entity>
+
+<entity name="head.misc"
+ type="param"
+>
+<text-expanded>SCRIPT|STYLE|META|LINK|OBJECT</text-expanded>
+<text>SCRIPT|STYLE|META|LINK|OBJECT</text>
+</entity>
+
+<entity name="HTMLspecial"
+ type="param"
+ public="-//W3C//ENTITIES Special//EN//HTML"
+ system="HTMLspecial.ent"
+/>
+
+<entity name="special"
+ type="param"
+>
+<text-expanded>A | IMG | APPLET | OBJECT | FONT | BASEFONT | BR | SCRIPT |
+ MAP | Q | SUB | SUP | SPAN | BDO | IFRAME</text-expanded>
+<text>A | IMG | APPLET | OBJECT | FONT | BASEFONT | BR | SCRIPT |
+ MAP | Q | SUB | SUP | SPAN | BDO | IFRAME</text>
+</entity>
+
+<entity name="LinkTypes"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="Scope"
+ type="param"
+>
+<text-expanded>(row|col|rowgroup|colgroup)</text-expanded>
+<text>(row|col|rowgroup|colgroup)</text>
+</entity>
+
+<entity name="CAlign"
+ type="param"
+>
+<text-expanded>(top|bottom|left|right)</text-expanded>
+<text>(top|bottom|left|right)</text>
+</entity>
+
+<entity name="InputType"
+ type="param"
+>
+<text-expanded>(TEXT | PASSWORD | CHECKBOX |
+ RADIO | SUBMIT | RESET |
+ FILE | HIDDEN | IMAGE | BUTTON)</text-expanded>
+<text>(TEXT | PASSWORD | CHECKBOX |
+ RADIO | SUBMIT | RESET |
+ FILE | HIDDEN | IMAGE | BUTTON)</text>
+</entity>
+
+<entity name="Length"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="phrase"
+ type="param"
+>
+<text-expanded>EM | STRONG | DFN | CODE |
+ SAMP | KBD | VAR | CITE | ABBR | ACRONYM</text-expanded>
+<text>EM | STRONG | DFN | CODE |
+ SAMP | KBD | VAR | CITE | ABBR | ACRONYM</text>
+</entity>
+
+<entity name="ContentType"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="TAlign"
+ type="param"
+>
+<text-expanded>(left|center|right)</text-expanded>
+<text>(left|center|right)</text>
+</entity>
+
+<entity name="LIStyle"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="MediaDesc"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="StyleSheet"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="HTML.Reserved"
+ type="param"
+>
+<text-expanded>IGNORE</text-expanded>
+<text>IGNORE</text>
+</entity>
+
+<entity name="formctrl"
+ type="param"
+>
+<text-expanded>INPUT | SELECT | TEXTAREA | LABEL | BUTTON</text-expanded>
+<text>INPUT | SELECT | TEXTAREA | LABEL | BUTTON</text>
+</entity>
+
+<entity name="attrs"
+ type="param"
+>
+<text-expanded>id ID #IMPLIED -- document-wide unique id --
+ class CDATA #IMPLIED -- space-separated list of classes --
+ style CDATA #IMPLIED -- associated style info --
+ title CDATA #IMPLIED -- advisory title -- lang NAME #IMPLIED -- language code --
+ dir (ltr|rtl) #IMPLIED -- direction for weak/neutral text -- onclick CDATA #IMPLIED -- a pointer button was clicked --
+ ondblclick CDATA #IMPLIED -- a pointer button was double clicked--
+ onmousedown CDATA #IMPLIED -- a pointer button was pressed down --
+ onmouseup CDATA #IMPLIED -- a pointer button was released --
+ onmouseover CDATA #IMPLIED -- a pointer was moved onto --
+ onmousemove CDATA #IMPLIED -- a pointer was moved within --
+ onmouseout CDATA #IMPLIED -- a pointer was moved away --
+ onkeypress CDATA #IMPLIED -- a key was pressed and released --
+ onkeydown CDATA #IMPLIED -- a key was pressed down --
+ onkeyup CDATA #IMPLIED -- a key was released --</text-expanded>
+<text>%coreattrs; %i18n; %events;</text>
+</entity>
+
+<entity name="Pixels"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="cellhalign"
+ type="param"
+>
+<text-expanded>align (left|center|right|justify|char) #IMPLIED
+ char CDATA #IMPLIED -- alignment char, e.g. char=':' --
+ charoff CDATA #IMPLIED -- offset for alignment char --</text-expanded>
+<text>align (left|center|right|justify|char) #IMPLIED
+ char %Character; #IMPLIED -- alignment char, e.g. char=':' --
+ charoff %Length; #IMPLIED -- offset for alignment char --</text>
+</entity>
+
+<entity name="pre.exclusion"
+ type="param"
+>
+<text-expanded>IMG|OBJECT|APPLET|BIG|SMALL|SUB|SUP|FONT|BASEFONT</text-expanded>
+<text>IMG|OBJECT|APPLET|BIG|SMALL|SUB|SUP|FONT|BASEFONT</text>
+</entity>
+
+<entity name="Datetime"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="Coords"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="bodycolors"
+ type="param"
+>
+<text-expanded>
+ bgcolor CDATA #IMPLIED -- document background color --
+ text CDATA #IMPLIED -- document text color --
+ link CDATA #IMPLIED -- color of links --
+ vlink CDATA #IMPLIED -- color of visited links --
+ alink CDATA #IMPLIED -- color of selected links --
+ </text-expanded>
+<text>
+ bgcolor %Color; #IMPLIED -- document background color --
+ text %Color; #IMPLIED -- document text color --
+ link %Color; #IMPLIED -- color of links --
+ vlink %Color; #IMPLIED -- color of visited links --
+ alink %Color; #IMPLIED -- color of selected links --
+ </text>
+</entity>
+
+<entity name="head.content"
+ type="param"
+>
+<text-expanded>TITLE &amp; ISINDEX? &amp; BASE?</text-expanded>
+<text>TITLE &amp; ISINDEX? &amp; BASE?</text>
+</entity>
+
+<entity name="fontstyle"
+ type="param"
+>
+<text-expanded>TT | I | B | U | S | STRIKE | BIG | SMALL</text-expanded>
+<text>TT | I | B | U | S | STRIKE | BIG | SMALL</text>
+</entity>
+
+<entity name="Charset"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="heading"
+ type="param"
+>
+<text-expanded>H1|H2|H3|H4|H5|H6</text-expanded>
+<text>H1|H2|H3|H4|H5|H6</text>
+</entity>
+
+<entity name="i18n"
+ type="param"
+>
+<text-expanded>lang NAME #IMPLIED -- language code --
+ dir (ltr|rtl) #IMPLIED -- direction for weak/neutral text --</text-expanded>
+<text>lang %LanguageCode; #IMPLIED -- language code --
+ dir (ltr|rtl) #IMPLIED -- direction for weak/neutral text --</text>
+</entity>
+
+<entity name="ntilde"
+ type="cdata"
+>
+<text-expanded>&amp;#241;</text-expanded>
+<text>&amp;#241;</text>
+</entity>
+
+<entity name="prime"
+ type="cdata"
+>
+<text-expanded>&amp;#8242;</text-expanded>
+<text>&amp;#8242;</text>
+</entity>
+
+<entity name="quot"
+ type="cdata"
+>
+<text-expanded>&amp;#34;</text-expanded>
+<text>&amp;#34;</text>
+</entity>
+
+<entity name="rceil"
+ type="cdata"
+>
+<text-expanded>&amp;#8969;</text-expanded>
+<text>&amp;#8969;</text>
+</entity>
+
+<entity name="prod"
+ type="cdata"
+>
+<text-expanded>&amp;#8719;</text-expanded>
+<text>&amp;#8719;</text>
+</entity>
+
+<entity name="Euml"
+ type="cdata"
+>
+<text-expanded>&amp;#203;</text-expanded>
+<text>&amp;#203;</text>
+</entity>
+
+<entity name="loz"
+ type="cdata"
+>
+<text-expanded>&amp;#9674;</text-expanded>
+<text>&amp;#9674;</text>
+</entity>
+
+<entity name="Yacute"
+ type="cdata"
+>
+<text-expanded>&amp;#221;</text-expanded>
+<text>&amp;#221;</text>
+</entity>
+
+<entity name="rdquo"
+ type="cdata"
+>
+<text-expanded>&amp;#8221;</text-expanded>
+<text>&amp;#8221;</text>
+</entity>
+
+<entity name="ne"
+ type="cdata"
+>
+<text-expanded>&amp;#8800;</text-expanded>
+<text>&amp;#8800;</text>
+</entity>
+
+<entity name="igrave"
+ type="cdata"
+>
+<text-expanded>&amp;#236;</text-expanded>
+<text>&amp;#236;</text>
+</entity>
+
+<entity name="psi"
+ type="cdata"
+>
+<text-expanded>&amp;#968;</text-expanded>
+<text>&amp;#968;</text>
+</entity>
+
+<entity name="Oacute"
+ type="cdata"
+>
+<text-expanded>&amp;#211;</text-expanded>
+<text>&amp;#211;</text>
+</entity>
+
+<entity name="lsaquo"
+ type="cdata"
+>
+<text-expanded>&amp;#8249;</text-expanded>
+<text>&amp;#8249;</text>
+</entity>
+
+<entity name="ni"
+ type="cdata"
+>
+<text-expanded>&amp;#8715;</text-expanded>
+<text>&amp;#8715;</text>
+</entity>
+
+<entity name="frasl"
+ type="cdata"
+>
+<text-expanded>&amp;#8260;</text-expanded>
+<text>&amp;#8260;</text>
+</entity>
+
+<entity name="Epsilon"
+ type="cdata"
+>
+<text-expanded>&amp;#917;</text-expanded>
+<text>&amp;#917;</text>
+</entity>
+
+<entity name="rArr"
+ type="cdata"
+>
+<text-expanded>&amp;#8658;</text-expanded>
+<text>&amp;#8658;</text>
+</entity>
+
+<entity name="Eacute"
+ type="cdata"
+>
+<text-expanded>&amp;#201;</text-expanded>
+<text>&amp;#201;</text>
+</entity>
+
+<entity name="acute"
+ type="cdata"
+>
+<text-expanded>&amp;#180;</text-expanded>
+<text>&amp;#180;</text>
+</entity>
+
+<entity name="Pi"
+ type="cdata"
+>
+<text-expanded>&amp;#928;</text-expanded>
+<text>&amp;#928;</text>
+</entity>
+
+<entity name="radic"
+ type="cdata"
+>
+<text-expanded>&amp;#8730;</text-expanded>
+<text>&amp;#8730;</text>
+</entity>
+
+<entity name="Ugrave"
+ type="cdata"
+>
+<text-expanded>&amp;#217;</text-expanded>
+<text>&amp;#217;</text>
+</entity>
+
+<entity name="prop"
+ type="cdata"
+>
+<text-expanded>&amp;#8733;</text-expanded>
+<text>&amp;#8733;</text>
+</entity>
+
+<entity name="ccedil"
+ type="cdata"
+>
+<text-expanded>&amp;#231;</text-expanded>
+<text>&amp;#231;</text>
+</entity>
+
+<entity name="Iuml"
+ type="cdata"
+>
+<text-expanded>&amp;#207;</text-expanded>
+<text>&amp;#207;</text>
+</entity>
+
+<entity name="Agrave"
+ type="cdata"
+>
+<text-expanded>&amp;#192;</text-expanded>
+<text>&amp;#192;</text>
+</entity>
+
+<entity name="bull"
+ type="cdata"
+>
+<text-expanded>&amp;#8226;</text-expanded>
+<text>&amp;#8226;</text>
+</entity>
+
+<entity name="nu"
+ type="cdata"
+>
+<text-expanded>&amp;#957;</text-expanded>
+<text>&amp;#957;</text>
+</entity>
+
+<entity name="ge"
+ type="cdata"
+>
+<text-expanded>&amp;#8805;</text-expanded>
+<text>&amp;#8805;</text>
+</entity>
+
+<entity name="gamma"
+ type="cdata"
+>
+<text-expanded>&amp;#947;</text-expanded>
+<text>&amp;#947;</text>
+</entity>
+
+<entity name="Kappa"
+ type="cdata"
+>
+<text-expanded>&amp;#922;</text-expanded>
+<text>&amp;#922;</text>
+</entity>
+
+<entity name="aring"
+ type="cdata"
+>
+<text-expanded>&amp;#229;</text-expanded>
+<text>&amp;#229;</text>
+</entity>
+
+<entity name="cedil"
+ type="cdata"
+>
+<text-expanded>&amp;#184;</text-expanded>
+<text>&amp;#184;</text>
+</entity>
+
+<entity name="laquo"
+ type="cdata"
+>
+<text-expanded>&amp;#171;</text-expanded>
+<text>&amp;#171;</text>
+</entity>
+
+<entity name="Xi"
+ type="cdata"
+>
+<text-expanded>&amp;#926;</text-expanded>
+<text>&amp;#926;</text>
+</entity>
+
+<entity name="copy"
+ type="cdata"
+>
+<text-expanded>&amp;#169;</text-expanded>
+<text>&amp;#169;</text>
+</entity>
+
+<entity name="crarr"
+ type="cdata"
+>
+<text-expanded>&amp;#8629;</text-expanded>
+<text>&amp;#8629;</text>
+</entity>
+
+<entity name="sigma"
+ type="cdata"
+>
+<text-expanded>&amp;#963;</text-expanded>
+<text>&amp;#963;</text>
+</entity>
+
+<entity name="acirc"
+ type="cdata"
+>
+<text-expanded>&amp;#226;</text-expanded>
+<text>&amp;#226;</text>
+</entity>
+
+<entity name="clubs"
+ type="cdata"
+>
+<text-expanded>&amp;#9827;</text-expanded>
+<text>&amp;#9827;</text>
+</entity>
+
+<entity name="Otilde"
+ type="cdata"
+>
+<text-expanded>&amp;#213;</text-expanded>
+<text>&amp;#213;</text>
+</entity>
+
+<entity name="ETH"
+ type="cdata"
+>
+<text-expanded>&amp;#208;</text-expanded>
+<text>&amp;#208;</text>
+</entity>
+
+<entity name="iota"
+ type="cdata"
+>
+<text-expanded>&amp;#953;</text-expanded>
+<text>&amp;#953;</text>
+</entity>
+
+<entity name="gt"
+ type="cdata"
+>
+<text-expanded>&amp;#62;</text-expanded>
+<text>&amp;#62;</text>
+</entity>
+
+<entity name="tilde"
+ type="cdata"
+>
+<text-expanded>&amp;#732;</text-expanded>
+<text>&amp;#732;</text>
+</entity>
+
+<entity name="Chi"
+ type="cdata"
+>
+<text-expanded>&amp;#935;</text-expanded>
+<text>&amp;#935;</text>
+</entity>
+
+<entity name="Theta"
+ type="cdata"
+>
+<text-expanded>&amp;#920;</text-expanded>
+<text>&amp;#920;</text>
+</entity>
+
+<entity name="upsih"
+ type="cdata"
+>
+<text-expanded>&amp;#978;</text-expanded>
+<text>&amp;#978;</text>
+</entity>
+
+<entity name="ouml"
+ type="cdata"
+>
+<text-expanded>&amp;#246;</text-expanded>
+<text>&amp;#246;</text>
+</entity>
+
+<entity name="uacute"
+ type="cdata"
+>
+<text-expanded>&amp;#250;</text-expanded>
+<text>&amp;#250;</text>
+</entity>
+
+<entity name="uml"
+ type="cdata"
+>
+<text-expanded>&amp;#168;</text-expanded>
+<text>&amp;#168;</text>
+</entity>
+
+<entity name="mdash"
+ type="cdata"
+>
+<text-expanded>&amp;#8212;</text-expanded>
+<text>&amp;#8212;</text>
+</entity>
+
+<entity name="forall"
+ type="cdata"
+>
+<text-expanded>&amp;#8704;</text-expanded>
+<text>&amp;#8704;</text>
+</entity>
+
+<entity name="Phi"
+ type="cdata"
+>
+<text-expanded>&amp;#934;</text-expanded>
+<text>&amp;#934;</text>
+</entity>
+
+<entity name="euro"
+ type="cdata"
+>
+<text-expanded>&amp;#8364;</text-expanded>
+<text>&amp;#8364;</text>
+</entity>
+
+<entity name="aacute"
+ type="cdata"
+>
+<text-expanded>&amp;#225;</text-expanded>
+<text>&amp;#225;</text>
+</entity>
+
+<entity name="or"
+ type="cdata"
+>
+<text-expanded>&amp;#8744;</text-expanded>
+<text>&amp;#8744;</text>
+</entity>
+
+<entity name="ecirc"
+ type="cdata"
+>
+<text-expanded>&amp;#234;</text-expanded>
+<text>&amp;#234;</text>
+</entity>
+
+<entity name="iquest"
+ type="cdata"
+>
+<text-expanded>&amp;#191;</text-expanded>
+<text>&amp;#191;</text>
+</entity>
+
+<entity name="tau"
+ type="cdata"
+>
+<text-expanded>&amp;#964;</text-expanded>
+<text>&amp;#964;</text>
+</entity>
+
+<entity name="emsp"
+ type="cdata"
+>
+<text-expanded>&amp;#8195;</text-expanded>
+<text>&amp;#8195;</text>
+</entity>
+
+<entity name="weierp"
+ type="cdata"
+>
+<text-expanded>&amp;#8472;</text-expanded>
+<text>&amp;#8472;</text>
+</entity>
+
+<entity name="Ntilde"
+ type="cdata"
+>
+<text-expanded>&amp;#209;</text-expanded>
+<text>&amp;#209;</text>
+</entity>
+
+<entity name="lang"
+ type="cdata"
+>
+<text-expanded>&amp;#9001;</text-expanded>
+<text>&amp;#9001;</text>
+</entity>
+
+<entity name="lambda"
+ type="cdata"
+>
+<text-expanded>&amp;#955;</text-expanded>
+<text>&amp;#955;</text>
+</entity>
+
+<entity name="Delta"
+ type="cdata"
+>
+<text-expanded>&amp;#916;</text-expanded>
+<text>&amp;#916;</text>
+</entity>
+
+<entity name="Uuml"
+ type="cdata"
+>
+<text-expanded>&amp;#220;</text-expanded>
+<text>&amp;#220;</text>
+</entity>
+
+<entity name="oline"
+ type="cdata"
+>
+<text-expanded>&amp;#8254;</text-expanded>
+<text>&amp;#8254;</text>
+</entity>
+
+<entity name="Igrave"
+ type="cdata"
+>
+<text-expanded>&amp;#204;</text-expanded>
+<text>&amp;#204;</text>
+</entity>
+
+<entity name="Ocirc"
+ type="cdata"
+>
+<text-expanded>&amp;#212;</text-expanded>
+<text>&amp;#212;</text>
+</entity>
+
+<entity name="OElig"
+ type="cdata"
+>
+<text-expanded>&amp;#338;</text-expanded>
+<text>&amp;#338;</text>
+</entity>
+
+<entity name="isin"
+ type="cdata"
+>
+<text-expanded>&amp;#8712;</text-expanded>
+<text>&amp;#8712;</text>
+</entity>
+
+<entity name="icirc"
+ type="cdata"
+>
+<text-expanded>&amp;#238;</text-expanded>
+<text>&amp;#238;</text>
+</entity>
+
+<entity name="cup"
+ type="cdata"
+>
+<text-expanded>&amp;#8746;</text-expanded>
+<text>&amp;#8746;</text>
+</entity>
+
+<entity name="zeta"
+ type="cdata"
+>
+<text-expanded>&amp;#950;</text-expanded>
+<text>&amp;#950;</text>
+</entity>
+
+<entity name="pi"
+ type="cdata"
+>
+<text-expanded>&amp;#960;</text-expanded>
+<text>&amp;#960;</text>
+</entity>
+
+<entity name="Ccedil"
+ type="cdata"
+>
+<text-expanded>&amp;#199;</text-expanded>
+<text>&amp;#199;</text>
+</entity>
+
+<entity name="atilde"
+ type="cdata"
+>
+<text-expanded>&amp;#227;</text-expanded>
+<text>&amp;#227;</text>
+</entity>
+
+<entity name="dArr"
+ type="cdata"
+>
+<text-expanded>&amp;#8659;</text-expanded>
+<text>&amp;#8659;</text>
+</entity>
+
+<entity name="Yuml"
+ type="cdata"
+>
+<text-expanded>&amp;#376;</text-expanded>
+<text>&amp;#376;</text>
+</entity>
+
+<entity name="uArr"
+ type="cdata"
+>
+<text-expanded>&amp;#8657;</text-expanded>
+<text>&amp;#8657;</text>
+</entity>
+
+<entity name="there4"
+ type="cdata"
+>
+<text-expanded>&amp;#8756;</text-expanded>
+<text>&amp;#8756;</text>
+</entity>
+
+<entity name="minus"
+ type="cdata"
+>
+<text-expanded>&amp;#8722;</text-expanded>
+<text>&amp;#8722;</text>
+</entity>
+
+<entity name="upsilon"
+ type="cdata"
+>
+<text-expanded>&amp;#965;</text-expanded>
+<text>&amp;#965;</text>
+</entity>
+
+<entity name="lrm"
+ type="cdata"
+>
+<text-expanded>&amp;#8206;</text-expanded>
+<text>&amp;#8206;</text>
+</entity>
+
+<entity name="rho"
+ type="cdata"
+>
+<text-expanded>&amp;#961;</text-expanded>
+<text>&amp;#961;</text>
+</entity>
+
+<entity name="lowast"
+ type="cdata"
+>
+<text-expanded>&amp;#8727;</text-expanded>
+<text>&amp;#8727;</text>
+</entity>
+
+<entity name="xi"
+ type="cdata"
+>
+<text-expanded>&amp;#958;</text-expanded>
+<text>&amp;#958;</text>
+</entity>
+
+<entity name="Prime"
+ type="cdata"
+>
+<text-expanded>&amp;#8243;</text-expanded>
+<text>&amp;#8243;</text>
+</entity>
+
+<entity name="spades"
+ type="cdata"
+>
+<text-expanded>&amp;#9824;</text-expanded>
+<text>&amp;#9824;</text>
+</entity>
+
+<entity name="lceil"
+ type="cdata"
+>
+<text-expanded>&amp;#8968;</text-expanded>
+<text>&amp;#8968;</text>
+</entity>
+
+<entity name="hArr"
+ type="cdata"
+>
+<text-expanded>&amp;#8660;</text-expanded>
+<text>&amp;#8660;</text>
+</entity>
+
+<entity name="alpha"
+ type="cdata"
+>
+<text-expanded>&amp;#945;</text-expanded>
+<text>&amp;#945;</text>
+</entity>
+
+<entity name="iacute"
+ type="cdata"
+>
+<text-expanded>&amp;#237;</text-expanded>
+<text>&amp;#237;</text>
+</entity>
+
+<entity name="lfloor"
+ type="cdata"
+>
+<text-expanded>&amp;#8970;</text-expanded>
+<text>&amp;#8970;</text>
+</entity>
+
+<entity name="infin"
+ type="cdata"
+>
+<text-expanded>&amp;#8734;</text-expanded>
+<text>&amp;#8734;</text>
+</entity>
+
+<entity name="image"
+ type="cdata"
+>
+<text-expanded>&amp;#8465;</text-expanded>
+<text>&amp;#8465;</text>
+</entity>
+
+<entity name="sup1"
+ type="cdata"
+>
+<text-expanded>&amp;#185;</text-expanded>
+<text>&amp;#185;</text>
+</entity>
+
+<entity name="ldquo"
+ type="cdata"
+>
+<text-expanded>&amp;#8220;</text-expanded>
+<text>&amp;#8220;</text>
+</entity>
+
+<entity name="sup2"
+ type="cdata"
+>
+<text-expanded>&amp;#178;</text-expanded>
+<text>&amp;#178;</text>
+</entity>
+
+<entity name="sup3"
+ type="cdata"
+>
+<text-expanded>&amp;#179;</text-expanded>
+<text>&amp;#179;</text>
+</entity>
+
+<entity name="Beta"
+ type="cdata"
+>
+<text-expanded>&amp;#914;</text-expanded>
+<text>&amp;#914;</text>
+</entity>
+
+<entity name="brvbar"
+ type="cdata"
+>
+<text-expanded>&amp;#166;</text-expanded>
+<text>&amp;#166;</text>
+</entity>
+
+<entity name="oelig"
+ type="cdata"
+>
+<text-expanded>&amp;#339;</text-expanded>
+<text>&amp;#339;</text>
+</entity>
+
+<entity name="ograve"
+ type="cdata"
+>
+<text-expanded>&amp;#242;</text-expanded>
+<text>&amp;#242;</text>
+</entity>
+
+<entity name="rarr"
+ type="cdata"
+>
+<text-expanded>&amp;#8594;</text-expanded>
+<text>&amp;#8594;</text>
+</entity>
+
+<entity name="Uacute"
+ type="cdata"
+>
+<text-expanded>&amp;#218;</text-expanded>
+<text>&amp;#218;</text>
+</entity>
+
+<entity name="rsaquo"
+ type="cdata"
+>
+<text-expanded>&amp;#8250;</text-expanded>
+<text>&amp;#8250;</text>
+</entity>
+
+<entity name="sub"
+ type="cdata"
+>
+<text-expanded>&amp;#8834;</text-expanded>
+<text>&amp;#8834;</text>
+</entity>
+
+<entity name="zwj"
+ type="cdata"
+>
+<text-expanded>&amp;#8205;</text-expanded>
+<text>&amp;#8205;</text>
+</entity>
+
+<entity name="perp"
+ type="cdata"
+>
+<text-expanded>&amp;#8869;</text-expanded>
+<text>&amp;#8869;</text>
+</entity>
+
+<entity name="egrave"
+ type="cdata"
+>
+<text-expanded>&amp;#232;</text-expanded>
+<text>&amp;#232;</text>
+</entity>
+
+<entity name="thorn"
+ type="cdata"
+>
+<text-expanded>&amp;#254;</text-expanded>
+<text>&amp;#254;</text>
+</entity>
+
+<entity name="equiv"
+ type="cdata"
+>
+<text-expanded>&amp;#8801;</text-expanded>
+<text>&amp;#8801;</text>
+</entity>
+
+<entity name="lArr"
+ type="cdata"
+>
+<text-expanded>&amp;#8656;</text-expanded>
+<text>&amp;#8656;</text>
+</entity>
+
+<entity name="Aacute"
+ type="cdata"
+>
+<text-expanded>&amp;#193;</text-expanded>
+<text>&amp;#193;</text>
+</entity>
+
+<entity name="amp"
+ type="cdata"
+>
+<text-expanded>&amp;#38;</text-expanded>
+<text>&amp;#38;</text>
+</entity>
+
+<entity name="auml"
+ type="cdata"
+>
+<text-expanded>&amp;#228;</text-expanded>
+<text>&amp;#228;</text>
+</entity>
+
+<entity name="ndash"
+ type="cdata"
+>
+<text-expanded>&amp;#8211;</text-expanded>
+<text>&amp;#8211;</text>
+</entity>
+
+<entity name="Gamma"
+ type="cdata"
+>
+<text-expanded>&amp;#915;</text-expanded>
+<text>&amp;#915;</text>
+</entity>
+
+<entity name="otimes"
+ type="cdata"
+>
+<text-expanded>&amp;#8855;</text-expanded>
+<text>&amp;#8855;</text>
+</entity>
+
+<entity name="sum"
+ type="cdata"
+>
+<text-expanded>&amp;#8721;</text-expanded>
+<text>&amp;#8721;</text>
+</entity>
+
+<entity name="Aring"
+ type="cdata"
+>
+<text-expanded>&amp;#197;</text-expanded>
+<text>&amp;#197;</text>
+</entity>
+
+<entity name="pound"
+ type="cdata"
+>
+<text-expanded>&amp;#163;</text-expanded>
+<text>&amp;#163;</text>
+</entity>
+
+<entity name="oplus"
+ type="cdata"
+>
+<text-expanded>&amp;#8853;</text-expanded>
+<text>&amp;#8853;</text>
+</entity>
+
+<entity name="sup"
+ type="cdata"
+>
+<text-expanded>&amp;#8835;</text-expanded>
+<text>&amp;#8835;</text>
+</entity>
+
+<entity name="Upsilon"
+ type="cdata"
+>
+<text-expanded>&amp;#933;</text-expanded>
+<text>&amp;#933;</text>
+</entity>
+
+<entity name="exist"
+ type="cdata"
+>
+<text-expanded>&amp;#8707;</text-expanded>
+<text>&amp;#8707;</text>
+</entity>
+
+<entity name="Eta"
+ type="cdata"
+>
+<text-expanded>&amp;#919;</text-expanded>
+<text>&amp;#919;</text>
+</entity>
+
+<entity name="zwnj"
+ type="cdata"
+>
+<text-expanded>&amp;#8204;</text-expanded>
+<text>&amp;#8204;</text>
+</entity>
+
+<entity name="Acirc"
+ type="cdata"
+>
+<text-expanded>&amp;#194;</text-expanded>
+<text>&amp;#194;</text>
+</entity>
+
+<entity name="Lambda"
+ type="cdata"
+>
+<text-expanded>&amp;#923;</text-expanded>
+<text>&amp;#923;</text>
+</entity>
+
+<entity name="Sigma"
+ type="cdata"
+>
+<text-expanded>&amp;#931;</text-expanded>
+<text>&amp;#931;</text>
+</entity>
+
+<entity name="rsquo"
+ type="cdata"
+>
+<text-expanded>&amp;#8217;</text-expanded>
+<text>&amp;#8217;</text>
+</entity>
+
+<entity name="AElig"
+ type="cdata"
+>
+<text-expanded>&amp;#198;</text-expanded>
+<text>&amp;#198;</text>
+</entity>
+
+<entity name="deg"
+ type="cdata"
+>
+<text-expanded>&amp;#176;</text-expanded>
+<text>&amp;#176;</text>
+</entity>
+
+<entity name="euml"
+ type="cdata"
+>
+<text-expanded>&amp;#235;</text-expanded>
+<text>&amp;#235;</text>
+</entity>
+
+<entity name="ucirc"
+ type="cdata"
+>
+<text-expanded>&amp;#251;</text-expanded>
+<text>&amp;#251;</text>
+</entity>
+
+<entity name="chi"
+ type="cdata"
+>
+<text-expanded>&amp;#967;</text-expanded>
+<text>&amp;#967;</text>
+</entity>
+
+<entity name="and"
+ type="cdata"
+>
+<text-expanded>&amp;#8743;</text-expanded>
+<text>&amp;#8743;</text>
+</entity>
+
+<entity name="omega"
+ type="cdata"
+>
+<text-expanded>&amp;#969;</text-expanded>
+<text>&amp;#969;</text>
+</entity>
+
+<entity name="ang"
+ type="cdata"
+>
+<text-expanded>&amp;#8736;</text-expanded>
+<text>&amp;#8736;</text>
+</entity>
+
+<entity name="THORN"
+ type="cdata"
+>
+<text-expanded>&amp;#222;</text-expanded>
+<text>&amp;#222;</text>
+</entity>
+
+<entity name="Atilde"
+ type="cdata"
+>
+<text-expanded>&amp;#195;</text-expanded>
+<text>&amp;#195;</text>
+</entity>
+
+<entity name="hellip"
+ type="cdata"
+>
+<text-expanded>&amp;#8230;</text-expanded>
+<text>&amp;#8230;</text>
+</entity>
+
+<entity name="phi"
+ type="cdata"
+>
+<text-expanded>&amp;#966;</text-expanded>
+<text>&amp;#966;</text>
+</entity>
+
+<entity name="szlig"
+ type="cdata"
+>
+<text-expanded>&amp;#223;</text-expanded>
+<text>&amp;#223;</text>
+</entity>
+
+<entity name="Ecirc"
+ type="cdata"
+>
+<text-expanded>&amp;#202;</text-expanded>
+<text>&amp;#202;</text>
+</entity>
+
+<entity name="iuml"
+ type="cdata"
+>
+<text-expanded>&amp;#239;</text-expanded>
+<text>&amp;#239;</text>
+</entity>
+
+<entity name="nabla"
+ type="cdata"
+>
+<text-expanded>&amp;#8711;</text-expanded>
+<text>&amp;#8711;</text>
+</entity>
+
+<entity name="scaron"
+ type="cdata"
+>
+<text-expanded>&amp;#353;</text-expanded>
+<text>&amp;#353;</text>
+</entity>
+
+<entity name="macr"
+ type="cdata"
+>
+<text-expanded>&amp;#175;</text-expanded>
+<text>&amp;#175;</text>
+</entity>
+
+<entity name="dagger"
+ type="cdata"
+>
+<text-expanded>&amp;#8224;</text-expanded>
+<text>&amp;#8224;</text>
+</entity>
+
+<entity name="supe"
+ type="cdata"
+>
+<text-expanded>&amp;#8839;</text-expanded>
+<text>&amp;#8839;</text>
+</entity>
+
+<entity name="ensp"
+ type="cdata"
+>
+<text-expanded>&amp;#8194;</text-expanded>
+<text>&amp;#8194;</text>
+</entity>
+
+<entity name="cap"
+ type="cdata"
+>
+<text-expanded>&amp;#8745;</text-expanded>
+<text>&amp;#8745;</text>
+</entity>
+
+<entity name="Iacute"
+ type="cdata"
+>
+<text-expanded>&amp;#205;</text-expanded>
+<text>&amp;#205;</text>
+</entity>
+
+<entity name="aelig"
+ type="cdata"
+>
+<text-expanded>&amp;#230;</text-expanded>
+<text>&amp;#230;</text>
+</entity>
+
+<entity name="Iota"
+ type="cdata"
+>
+<text-expanded>&amp;#921;</text-expanded>
+<text>&amp;#921;</text>
+</entity>
+
+<entity name="Psi"
+ type="cdata"
+>
+<text-expanded>&amp;#936;</text-expanded>
+<text>&amp;#936;</text>
+</entity>
+
+<entity name="nsub"
+ type="cdata"
+>
+<text-expanded>&amp;#8836;</text-expanded>
+<text>&amp;#8836;</text>
+</entity>
+
+<entity name="Icirc"
+ type="cdata"
+>
+<text-expanded>&amp;#206;</text-expanded>
+<text>&amp;#206;</text>
+</entity>
+
+<entity name="iexcl"
+ type="cdata"
+>
+<text-expanded>&amp;#161;</text-expanded>
+<text>&amp;#161;</text>
+</entity>
+
+<entity name="Ograve"
+ type="cdata"
+>
+<text-expanded>&amp;#210;</text-expanded>
+<text>&amp;#210;</text>
+</entity>
+
+<entity name="yen"
+ type="cdata"
+>
+<text-expanded>&amp;#165;</text-expanded>
+<text>&amp;#165;</text>
+</entity>
+
+<entity name="Ouml"
+ type="cdata"
+>
+<text-expanded>&amp;#214;</text-expanded>
+<text>&amp;#214;</text>
+</entity>
+
+<entity name="frac12"
+ type="cdata"
+>
+<text-expanded>&amp;#189;</text-expanded>
+<text>&amp;#189;</text>
+</entity>
+
+<entity name="oslash"
+ type="cdata"
+>
+<text-expanded>&amp;#248;</text-expanded>
+<text>&amp;#248;</text>
+</entity>
+
+<entity name="alefsym"
+ type="cdata"
+>
+<text-expanded>&amp;#8501;</text-expanded>
+<text>&amp;#8501;</text>
+</entity>
+
+<entity name="Egrave"
+ type="cdata"
+>
+<text-expanded>&amp;#200;</text-expanded>
+<text>&amp;#200;</text>
+</entity>
+
+<entity name="frac14"
+ type="cdata"
+>
+<text-expanded>&amp;#188;</text-expanded>
+<text>&amp;#188;</text>
+</entity>
+
+<entity name="micro"
+ type="cdata"
+>
+<text-expanded>&amp;#181;</text-expanded>
+<text>&amp;#181;</text>
+</entity>
+
+<entity name="real"
+ type="cdata"
+>
+<text-expanded>&amp;#8476;</text-expanded>
+<text>&amp;#8476;</text>
+</entity>
+
+<entity name="int"
+ type="cdata"
+>
+<text-expanded>&amp;#8747;</text-expanded>
+<text>&amp;#8747;</text>
+</entity>
+
+<entity name="Mu"
+ type="cdata"
+>
+<text-expanded>&amp;#924;</text-expanded>
+<text>&amp;#924;</text>
+</entity>
+
+<entity name="bdquo"
+ type="cdata"
+>
+<text-expanded>&amp;#8222;</text-expanded>
+<text>&amp;#8222;</text>
+</entity>
+
+<entity name="darr"
+ type="cdata"
+>
+<text-expanded>&amp;#8595;</text-expanded>
+<text>&amp;#8595;</text>
+</entity>
+
+<entity name="permil"
+ type="cdata"
+>
+<text-expanded>&amp;#8240;</text-expanded>
+<text>&amp;#8240;</text>
+</entity>
+
+<entity name="uarr"
+ type="cdata"
+>
+<text-expanded>&amp;#8593;</text-expanded>
+<text>&amp;#8593;</text>
+</entity>
+
+<entity name="raquo"
+ type="cdata"
+>
+<text-expanded>&amp;#187;</text-expanded>
+<text>&amp;#187;</text>
+</entity>
+
+<entity name="kappa"
+ type="cdata"
+>
+<text-expanded>&amp;#954;</text-expanded>
+<text>&amp;#954;</text>
+</entity>
+
+<entity name="middot"
+ type="cdata"
+>
+<text-expanded>&amp;#183;</text-expanded>
+<text>&amp;#183;</text>
+</entity>
+
+<entity name="times"
+ type="cdata"
+>
+<text-expanded>&amp;#215;</text-expanded>
+<text>&amp;#215;</text>
+</entity>
+
+<entity name="sube"
+ type="cdata"
+>
+<text-expanded>&amp;#8838;</text-expanded>
+<text>&amp;#8838;</text>
+</entity>
+
+<entity name="piv"
+ type="cdata"
+>
+<text-expanded>&amp;#982;</text-expanded>
+<text>&amp;#982;</text>
+</entity>
+
+<entity name="sect"
+ type="cdata"
+>
+<text-expanded>&amp;#167;</text-expanded>
+<text>&amp;#167;</text>
+</entity>
+
+<entity name="le"
+ type="cdata"
+>
+<text-expanded>&amp;#8804;</text-expanded>
+<text>&amp;#8804;</text>
+</entity>
+
+<entity name="sbquo"
+ type="cdata"
+>
+<text-expanded>&amp;#8218;</text-expanded>
+<text>&amp;#8218;</text>
+</entity>
+
+<entity name="plusmn"
+ type="cdata"
+>
+<text-expanded>&amp;#177;</text-expanded>
+<text>&amp;#177;</text>
+</entity>
+
+<entity name="curren"
+ type="cdata"
+>
+<text-expanded>&amp;#164;</text-expanded>
+<text>&amp;#164;</text>
+</entity>
+
+<entity name="Alpha"
+ type="cdata"
+>
+<text-expanded>&amp;#913;</text-expanded>
+<text>&amp;#913;</text>
+</entity>
+
+<entity name="harr"
+ type="cdata"
+>
+<text-expanded>&amp;#8596;</text-expanded>
+<text>&amp;#8596;</text>
+</entity>
+
+<entity name="not"
+ type="cdata"
+>
+<text-expanded>&amp;#172;</text-expanded>
+<text>&amp;#172;</text>
+</entity>
+
+<entity name="uuml"
+ type="cdata"
+>
+<text-expanded>&amp;#252;</text-expanded>
+<text>&amp;#252;</text>
+</entity>
+
+<entity name="yacute"
+ type="cdata"
+>
+<text-expanded>&amp;#253;</text-expanded>
+<text>&amp;#253;</text>
+</entity>
+
+<entity name="cong"
+ type="cdata"
+>
+<text-expanded>&amp;#8773;</text-expanded>
+<text>&amp;#8773;</text>
+</entity>
+
+<entity name="omicron"
+ type="cdata"
+>
+<text-expanded>&amp;#959;</text-expanded>
+<text>&amp;#959;</text>
+</entity>
+
+<entity name="rfloor"
+ type="cdata"
+>
+<text-expanded>&amp;#8971;</text-expanded>
+<text>&amp;#8971;</text>
+</entity>
+
+<entity name="oacute"
+ type="cdata"
+>
+<text-expanded>&amp;#243;</text-expanded>
+<text>&amp;#243;</text>
+</entity>
+
+<entity name="trade"
+ type="cdata"
+>
+<text-expanded>&amp;#8482;</text-expanded>
+<text>&amp;#8482;</text>
+</entity>
+
+<entity name="shy"
+ type="cdata"
+>
+<text-expanded>&amp;#173;</text-expanded>
+<text>&amp;#173;</text>
+</entity>
+
+<entity name="Zeta"
+ type="cdata"
+>
+<text-expanded>&amp;#918;</text-expanded>
+<text>&amp;#918;</text>
+</entity>
+
+<entity name="theta"
+ type="cdata"
+>
+<text-expanded>&amp;#952;</text-expanded>
+<text>&amp;#952;</text>
+</entity>
+
+<entity name="ordf"
+ type="cdata"
+>
+<text-expanded>&amp;#170;</text-expanded>
+<text>&amp;#170;</text>
+</entity>
+
+<entity name="eacute"
+ type="cdata"
+>
+<text-expanded>&amp;#233;</text-expanded>
+<text>&amp;#233;</text>
+</entity>
+
+<entity name="thetasym"
+ type="cdata"
+>
+<text-expanded>&amp;#977;</text-expanded>
+<text>&amp;#977;</text>
+</entity>
+
+<entity name="ugrave"
+ type="cdata"
+>
+<text-expanded>&amp;#249;</text-expanded>
+<text>&amp;#249;</text>
+</entity>
+
+<entity name="lt"
+ type="cdata"
+>
+<text-expanded>&amp;#60;</text-expanded>
+<text>&amp;#60;</text>
+</entity>
+
+<entity name="fnof"
+ type="cdata"
+>
+<text-expanded>&amp;#402;</text-expanded>
+<text>&amp;#402;</text>
+</entity>
+
+<entity name="ordm"
+ type="cdata"
+>
+<text-expanded>&amp;#186;</text-expanded>
+<text>&amp;#186;</text>
+</entity>
+
+<entity name="para"
+ type="cdata"
+>
+<text-expanded>&amp;#182;</text-expanded>
+<text>&amp;#182;</text>
+</entity>
+
+<entity name="larr"
+ type="cdata"
+>
+<text-expanded>&amp;#8592;</text-expanded>
+<text>&amp;#8592;</text>
+</entity>
+
+<entity name="yuml"
+ type="cdata"
+>
+<text-expanded>&amp;#255;</text-expanded>
+<text>&amp;#255;</text>
+</entity>
+
+<entity name="Nu"
+ type="cdata"
+>
+<text-expanded>&amp;#925;</text-expanded>
+<text>&amp;#925;</text>
+</entity>
+
+<entity name="diams"
+ type="cdata"
+>
+<text-expanded>&amp;#9830;</text-expanded>
+<text>&amp;#9830;</text>
+</entity>
+
+<entity name="agrave"
+ type="cdata"
+>
+<text-expanded>&amp;#224;</text-expanded>
+<text>&amp;#224;</text>
+</entity>
+
+<entity name="divide"
+ type="cdata"
+>
+<text-expanded>&amp;#247;</text-expanded>
+<text>&amp;#247;</text>
+</entity>
+
+<entity name="Scaron"
+ type="cdata"
+>
+<text-expanded>&amp;#352;</text-expanded>
+<text>&amp;#352;</text>
+</entity>
+
+<entity name="rang"
+ type="cdata"
+>
+<text-expanded>&amp;#9002;</text-expanded>
+<text>&amp;#9002;</text>
+</entity>
+
+<entity name="Dagger"
+ type="cdata"
+>
+<text-expanded>&amp;#8225;</text-expanded>
+<text>&amp;#8225;</text>
+</entity>
+
+<entity name="Tau"
+ type="cdata"
+>
+<text-expanded>&amp;#932;</text-expanded>
+<text>&amp;#932;</text>
+</entity>
+
+<entity name="nbsp"
+ type="cdata"
+>
+<text-expanded>&amp;#160;</text-expanded>
+<text>&amp;#160;</text>
+</entity>
+
+<entity name="eta"
+ type="cdata"
+>
+<text-expanded>&amp;#951;</text-expanded>
+<text>&amp;#951;</text>
+</entity>
+
+<entity name="sim"
+ type="cdata"
+>
+<text-expanded>&amp;#8764;</text-expanded>
+<text>&amp;#8764;</text>
+</entity>
+
+<entity name="lsquo"
+ type="cdata"
+>
+<text-expanded>&amp;#8216;</text-expanded>
+<text>&amp;#8216;</text>
+</entity>
+
+<entity name="rlm"
+ type="cdata"
+>
+<text-expanded>&amp;#8207;</text-expanded>
+<text>&amp;#8207;</text>
+</entity>
+
+<entity name="delta"
+ type="cdata"
+>
+<text-expanded>&amp;#948;</text-expanded>
+<text>&amp;#948;</text>
+</entity>
+
+<entity name="Ucirc"
+ type="cdata"
+>
+<text-expanded>&amp;#219;</text-expanded>
+<text>&amp;#219;</text>
+</entity>
+
+<entity name="otilde"
+ type="cdata"
+>
+<text-expanded>&amp;#245;</text-expanded>
+<text>&amp;#245;</text>
+</entity>
+
+<entity name="part"
+ type="cdata"
+>
+<text-expanded>&amp;#8706;</text-expanded>
+<text>&amp;#8706;</text>
+</entity>
+
+<entity name="Omicron"
+ type="cdata"
+>
+<text-expanded>&amp;#927;</text-expanded>
+<text>&amp;#927;</text>
+</entity>
+
+<entity name="eth"
+ type="cdata"
+>
+<text-expanded>&amp;#240;</text-expanded>
+<text>&amp;#240;</text>
+</entity>
+
+<entity name="ocirc"
+ type="cdata"
+>
+<text-expanded>&amp;#244;</text-expanded>
+<text>&amp;#244;</text>
+</entity>
+
+<entity name="Omega"
+ type="cdata"
+>
+<text-expanded>&amp;#937;</text-expanded>
+<text>&amp;#937;</text>
+</entity>
+
+<entity name="beta"
+ type="cdata"
+>
+<text-expanded>&amp;#946;</text-expanded>
+<text>&amp;#946;</text>
+</entity>
+
+<entity name="Oslash"
+ type="cdata"
+>
+<text-expanded>&amp;#216;</text-expanded>
+<text>&amp;#216;</text>
+</entity>
+
+<entity name="epsilon"
+ type="cdata"
+>
+<text-expanded>&amp;#949;</text-expanded>
+<text>&amp;#949;</text>
+</entity>
+
+<entity name="notin"
+ type="cdata"
+>
+<text-expanded>&amp;#8713;</text-expanded>
+<text>&amp;#8713;</text>
+</entity>
+
+<entity name="empty"
+ type="cdata"
+>
+<text-expanded>&amp;#8709;</text-expanded>
+<text>&amp;#8709;</text>
+</entity>
+
+<entity name="reg"
+ type="cdata"
+>
+<text-expanded>&amp;#174;</text-expanded>
+<text>&amp;#174;</text>
+</entity>
+
+<entity name="hearts"
+ type="cdata"
+>
+<text-expanded>&amp;#9829;</text-expanded>
+<text>&amp;#9829;</text>
+</entity>
+
+<entity name="Auml"
+ type="cdata"
+>
+<text-expanded>&amp;#196;</text-expanded>
+<text>&amp;#196;</text>
+</entity>
+
+<entity name="frac34"
+ type="cdata"
+>
+<text-expanded>&amp;#190;</text-expanded>
+<text>&amp;#190;</text>
+</entity>
+
+<entity name="mu"
+ type="cdata"
+>
+<text-expanded>&amp;#956;</text-expanded>
+<text>&amp;#956;</text>
+</entity>
+
+<entity name="sdot"
+ type="cdata"
+>
+<text-expanded>&amp;#8901;</text-expanded>
+<text>&amp;#8901;</text>
+</entity>
+
+<entity name="asymp"
+ type="cdata"
+>
+<text-expanded>&amp;#8776;</text-expanded>
+<text>&amp;#8776;</text>
+</entity>
+
+<entity name="thinsp"
+ type="cdata"
+>
+<text-expanded>&amp;#8201;</text-expanded>
+<text>&amp;#8201;</text>
+</entity>
+
+<entity name="cent"
+ type="cdata"
+>
+<text-expanded>&amp;#162;</text-expanded>
+<text>&amp;#162;</text>
+</entity>
+
+<entity name="circ"
+ type="cdata"
+>
+<text-expanded>&amp;#710;</text-expanded>
+<text>&amp;#710;</text>
+</entity>
+
+<entity name="sigmaf"
+ type="cdata"
+>
+<text-expanded>&amp;#962;</text-expanded>
+<text>&amp;#962;</text>
+</entity>
+
+<entity name="Rho"
+ type="cdata"
+>
+<text-expanded>&amp;#929;</text-expanded>
+<text>&amp;#929;</text>
+</entity>
+
+<element name="TT" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="TT">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="FIELDSET" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ <element-name name="LEGEND"/>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="DIR"/>
+ <element-name name="MENU"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="CENTER"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="NOFRAMES"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="ISINDEX"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ <element-name name="LEGEND"/>
+ <sequence-group occurrence="*">
+ <parament-name name="flow"/>
+ </sequence-group>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="FIELDSET">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="STRIKE" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="STRIKE">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="STYLE" stagm="-" etagm="-"
+ content-type="cdata">
+<content-model-expanded>
+ <cdata/>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="StyleSheet"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="STYLE">
+<attdecl>
+ %i18n; -- lang, dir, for use with title --
+ type %ContentType; #REQUIRED -- content type of style language --
+ media %MediaDesc; #IMPLIED -- designed for use with these media --
+ title %Text; #IMPLIED -- advisory title --
+ </attdecl>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="media"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="PARAM" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="PARAM">
+<attdecl>
+ id ID #IMPLIED -- document-wide unique id --
+ name CDATA #REQUIRED -- property name --
+ value CDATA #IMPLIED -- property value --
+ valuetype (DATA|REF|OBJECT) DATA -- How to interpret value --
+ type %ContentType; #IMPLIED -- content type for value
+ when valuetype=ref --
+ </attdecl>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="value"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="valuetype"
+ type=""
+ enumeration="yes"
+ value="DATA REF OBJECT"
+ default="DATA"/>
+<attribute name="name"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="BIG" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="BIG">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="ACRONYM" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="ACRONYM">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="BLOCKQUOTE" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="DIR"/>
+ <element-name name="MENU"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="CENTER"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="NOFRAMES"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="ISINDEX"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="BLOCKQUOTE">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ cite %URI; #IMPLIED -- URI for source document or msg --
+ </attdecl>
+<attribute name="cite"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="CENTER" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="DIR"/>
+ <element-name name="MENU"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="CENTER"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="NOFRAMES"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="ISINDEX"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="CENTER">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="BASEFONT" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="BASEFONT">
+<attdecl>
+ id ID #IMPLIED -- document-wide unique id --
+ size CDATA #REQUIRED -- base font size for FONT elements --
+ color %Color; #IMPLIED -- text color --
+ face CDATA #IMPLIED -- comma-separated list of font names --
+ </attdecl>
+<attribute name="face"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="size"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="color"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="COLGROUP" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="*">
+ <element-name name="COL"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <element-name name="COL"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="COLGROUP">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ span NUMBER 1 -- default number of columns in group --
+ width %MultiLength; #IMPLIED -- default width for enclosed COLs --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="span"
+ type=""
+ value="NUMBER"
+ default="1"/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="KBD" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="KBD">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="NOFRAMES" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="DIR"/>
+ <element-name name="MENU"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="CENTER"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="NOFRAMES"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="ISINDEX"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="noframes.content"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="NOFRAMES">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="CAPTION" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="CAPTION">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ align %CAlign; #IMPLIED -- relative to table --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top bottom left right"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="META" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="META">
+<attdecl>
+ %i18n; -- lang, dir, for use with content --
+ http-equiv NAME #IMPLIED -- HTTP response header name --
+ name NAME #IMPLIED -- metainformation name --
+ content CDATA #REQUIRED -- associated information --
+ scheme CDATA #IMPLIED -- select form of content --
+ </attdecl>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="scheme"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="content"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="http-equiv"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+</attlist>
+
+<element name="LEGEND" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="LEGEND">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ align %LAlign; #IMPLIED -- relative to fieldset --
+ </attdecl>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top bottom left right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="BR" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="BR">
+<attdecl>
+ %coreattrs; -- id, class, style, title --
+ clear (left|all|right|none) none -- control of text flow --
+ </attdecl>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="clear"
+ type=""
+ enumeration="yes"
+ value="left all right none"
+ default="none"/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+</attlist>
+
+<element name="UL" stagm="-" etagm="-"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="LI"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="LI"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="UL">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ type %ULStyle; #IMPLIED -- bullet style --
+ compact (compact) #IMPLIED -- reduced interitem spacing --
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="compact"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="compact"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disc square circle"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="LINK" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="LINK">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ charset %Charset; #IMPLIED -- char encoding of linked resource --
+ href %URI; #IMPLIED -- URI for linked resource --
+ hreflang %LanguageCode; #IMPLIED -- language code --
+ type %ContentType; #IMPLIED -- advisory content type --
+ rel %LinkTypes; #IMPLIED -- forward link types --
+ rev %LinkTypes; #IMPLIED -- reverse link types --
+ media %MediaDesc; #IMPLIED -- for rendering on these media --
+ target %FrameTarget; #IMPLIED -- render in this frame --
+ </attdecl>
+<attribute name="rev"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="media"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="hreflang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="target"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="href"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="rel"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="PRE" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+<exclusions>
+ <or-group>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="APPLET"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ </or-group>
+</exclusions>
+</element>
+
+<attlist name="PRE">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ width NUMBER #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="NUMBER"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="NOSCRIPT" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="DIR"/>
+ <element-name name="MENU"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="CENTER"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="NOFRAMES"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="ISINDEX"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="NOSCRIPT">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="SCRIPT" stagm="-" etagm="-"
+ content-type="cdata">
+<content-model-expanded>
+ <cdata/>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Script"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="SCRIPT">
+<attdecl>
+ charset %Charset; #IMPLIED -- char encoding of linked resource --
+ type %ContentType; #REQUIRED -- content type of script language --
+ language CDATA #IMPLIED -- predefined script language name --
+ src %URI; #IMPLIED -- URI for an external script --
+ defer (defer) #IMPLIED -- UA may defer execution of script --
+ event CDATA #IMPLIED -- reserved for possible future use --
+ for %URI; #IMPLIED -- reserved for possible future use --
+ </attdecl>
+<attribute name="charset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="event"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="src"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="language"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="for"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="defer"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="defer"
+ default=""/>
+<attribute name="type"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="TBODY" stagm="O" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="TR"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="TR"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="TBODY">
+<attdecl> -- table section --
+ %attrs; -- %coreattrs, %i18n, %events --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="APPLET" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="PARAM"/>
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="DIR"/>
+ <element-name name="MENU"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="CENTER"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="NOFRAMES"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="ISINDEX"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="*">
+ <element-name name="PARAM"/>
+ <parament-name name="flow"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="APPLET">
+<attdecl>
+ %coreattrs; -- id, class, style, title --
+ codebase %URI; #IMPLIED -- optional base URI for applet --
+ archive CDATA #IMPLIED -- comma-separated archive list --
+ code CDATA #IMPLIED -- applet class file --
+ object CDATA #IMPLIED -- serialized applet file --
+ alt %Text; #IMPLIED -- short description --
+ name CDATA #IMPLIED -- allows applets to find each other --
+ width %Length; #REQUIRED -- initial width --
+ height %Length; #REQUIRED -- initial height --
+ align %IAlign; #IMPLIED -- vertical or horizontal alignment --
+ hspace %Pixels; #IMPLIED -- horizontal gutter --
+ vspace %Pixels; #IMPLIED -- vertical gutter --
+ </attdecl>
+<attribute name="hspace"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="codebase"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="code"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="width"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="vspace"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="archive"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="object"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="height"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="alt"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom left right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+</attlist>
+
+<element name="TFOOT" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="TR"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="TR"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="TFOOT">
+<attdecl> -- table section --
+ %attrs; -- %coreattrs, %i18n, %events --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="HTML" stagm="O" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="HEAD"/>
+ <element-name name="BODY"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="html.content"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="HTML">
+<attdecl>
+ %i18n; -- lang, dir --
+ %version;
+ </attdecl>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="version"
+ type="#FIXED"
+ value="CDATA"
+ default="%HTML.Version;"/>
+</attlist>
+
+<element name="SUB" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="SUB">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="CODE" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="CODE">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="ADDRESS" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <or-group>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+ <element-name name="P"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="*">
+ <sequence-group>
+ <parament-name name="inline"/>
+ </sequence-group>
+ <element-name name="P"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="ADDRESS">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="COL" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="COL">
+<attdecl> -- column groups and properties --
+ %attrs; -- %coreattrs, %i18n, %events --
+ span NUMBER 1 -- COL attributes affect N columns --
+ width %MultiLength; #IMPLIED -- column width specification --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="span"
+ type=""
+ value="NUMBER"
+ default="1"/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="SUP" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="SUP">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="STRONG" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="STRONG">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="HEAD" stagm="O" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <and-group>
+ <element-name name="TITLE"/>
+ <element-name name="ISINDEX" occurrence="?"/>
+ <element-name name="BASE" occurrence="?"/>
+ </and-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="head.content"/>
+ </sequence-group>
+</content-model>
+<inclusions>
+ <or-group>
+ <element-name name="SCRIPT"/>
+ <element-name name="STYLE"/>
+ <element-name name="META"/>
+ <element-name name="LINK"/>
+ <element-name name="OBJECT"/>
+ </or-group>
+</inclusions>
+</element>
+
+<attlist name="HEAD">
+<attdecl>
+ %i18n; -- lang, dir --
+ profile %URI; #IMPLIED -- named dictionary of meta info --
+ </attdecl>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="profile"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="VAR" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="VAR">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="MAP" stagm="-" etagm="-"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="+">
+ <or-group>
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="DIR"/>
+ <element-name name="MENU"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="CENTER"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="NOFRAMES"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="ISINDEX"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ </or-group>
+ <element-name name="AREA"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="+">
+ <sequence-group>
+ <parament-name name="block"/>
+ </sequence-group>
+ <element-name name="AREA"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="MAP">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ name CDATA #REQUIRED -- for reference by usemap --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="SAMP" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="SAMP">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="IMG" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="IMG">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ src %URI; #REQUIRED -- URI of image to embed --
+ alt %Text; #REQUIRED -- short description --
+ longdesc %URI; #IMPLIED -- link to long description
+ (complements alt) --
+ name CDATA #IMPLIED -- name of image for scripting --
+ height %Length; #IMPLIED -- override height --
+ width %Length; #IMPLIED -- override width --
+ usemap %URI; #IMPLIED -- use client-side image map --
+ ismap (ismap) #IMPLIED -- use server-side image map --
+ align %IAlign; #IMPLIED -- vertical or horizontal alignment --
+ border %Pixels; #IMPLIED -- link border width --
+ hspace %Pixels; #IMPLIED -- horizontal gutter --
+ vspace %Pixels; #IMPLIED -- vertical gutter --
+ </attdecl>
+<attribute name="ismap"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ismap"
+ default=""/>
+<attribute name="longdesc"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="vspace"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="src"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="hspace"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="alt"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="height"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="border"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom left right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="usemap"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="A" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+<exclusions>
+ <sequence-group>
+ <element-name name="A"/>
+ </sequence-group>
+</exclusions>
+</element>
+
+<attlist name="A">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ charset %Charset; #IMPLIED -- char encoding of linked resource --
+ type %ContentType; #IMPLIED -- advisory content type --
+ name CDATA #IMPLIED -- named link end --
+ href %URI; #IMPLIED -- URI for linked resource --
+ hreflang %LanguageCode; #IMPLIED -- language code --
+ target %FrameTarget; #IMPLIED -- render in this frame --
+ rel %LinkTypes; #IMPLIED -- forward link types --
+ rev %LinkTypes; #IMPLIED -- reverse link types --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ shape %Shape; rect -- for use with client-side image maps --
+ coords %Coords; #IMPLIED -- for use with client-side image maps --
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ </attdecl>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="NUMBER"
+ default=""/>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="rev"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="hreflang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="target"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="href"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="rel"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="shape"
+ type=""
+ enumeration="yes"
+ value="rect circle poly default"
+ default="rect"/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="coords"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="B" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="B">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="H1" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="H1">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ %align; -- align, text alignment --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="H2" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="H2">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ %align; -- align, text alignment --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="H3" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="H3">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ %align; -- align, text alignment --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="OPTGROUP" stagm="-" etagm="-"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="OPTION"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="OPTION"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="OPTGROUP">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ disabled (disabled) #IMPLIED -- unavailable in this context --
+ label %Text; #REQUIRED -- for use in hierarchical menus --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="label"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="H4" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="H4">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ %align; -- align, text alignment --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="LABEL" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+<exclusions>
+ <sequence-group>
+ <element-name name="LABEL"/>
+ </sequence-group>
+</exclusions>
+</element>
+
+<attlist name="LABEL">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ for IDREF #IMPLIED -- matches field ID value --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ </attdecl>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="for"
+ type="#IMPLIED"
+ value="IDREF"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="H5" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="H5">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ %align; -- align, text alignment --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="DEL" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="DIR"/>
+ <element-name name="MENU"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="CENTER"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="NOFRAMES"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="ISINDEX"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="DEL">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ cite %URI; #IMPLIED -- info on reason for change --
+ datetime %Datetime; #IMPLIED -- date and time of change --
+ </attdecl>
+<attribute name="cite"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="datetime"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="H6" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="H6">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ %align; -- align, text alignment --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="I" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="I">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="TEXTAREA" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="TEXTAREA">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ name CDATA #IMPLIED
+ rows NUMBER #REQUIRED
+ cols NUMBER #REQUIRED
+ disabled (disabled) #IMPLIED -- unavailable in this context --
+ readonly (readonly) #IMPLIED
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ onselect %Script; #IMPLIED -- some text was selected --
+ onchange %Script; #IMPLIED -- the element value was changed --
+ %reserved; -- reserved for possible future use --
+ </attdecl>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="NUMBER"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="rows"
+ type="#REQUIRED"
+ value="NUMBER"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onchange"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="cols"
+ type="#REQUIRED"
+ value="NUMBER"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onselect"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="readonly"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="readonly"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="OL" stagm="-" etagm="-"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="LI"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="LI"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="OL">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ type %OLStyle; #IMPLIED -- numbering style --
+ compact (compact) #IMPLIED -- reduced interitem spacing --
+ start NUMBER #IMPLIED -- starting sequence number --
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="compact"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="compact"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="start"
+ type="#IMPLIED"
+ value="NUMBER"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="DD" stagm="-" etagm="O"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="DIR"/>
+ <element-name name="MENU"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="CENTER"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="NOFRAMES"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="ISINDEX"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="DD">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="P" stagm="-" etagm="O"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="P">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ %align; -- align, text alignment --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="SELECT" stagm="-" etagm="-"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="+">
+ <element-name name="OPTGROUP"/>
+ <element-name name="OPTION"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="+">
+ <element-name name="OPTGROUP"/>
+ <element-name name="OPTION"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="SELECT">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ name CDATA #IMPLIED -- field name --
+ size NUMBER #IMPLIED -- rows visible --
+ multiple (multiple) #IMPLIED -- default is single selection --
+ disabled (disabled) #IMPLIED -- unavailable in this context --
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ onchange %Script; #IMPLIED -- the element value was changed --
+ %reserved; -- reserved for possible future use --
+ </attdecl>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="NUMBER"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="size"
+ type="#IMPLIED"
+ value="NUMBER"
+ default=""/>
+<attribute name="onchange"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="multiple"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="multiple"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="Q" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="Q">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ cite %URI; #IMPLIED -- URI for source document or msg --
+ </attdecl>
+<attribute name="cite"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="S" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="S">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="TABLE" stagm="-" etagm="-"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="CAPTION" occurrence="?"/>
+ <or-group>
+ <element-name name="COL" occurrence="*"/>
+ <element-name name="COLGROUP" occurrence="*"/>
+ </or-group>
+ <element-name name="THEAD" occurrence="?"/>
+ <element-name name="TFOOT" occurrence="?"/>
+ <element-name name="TBODY" occurrence="+"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="CAPTION" occurrence="?"/>
+ <or-group>
+ <element-name name="COL" occurrence="*"/>
+ <element-name name="COLGROUP" occurrence="*"/>
+ </or-group>
+ <element-name name="THEAD" occurrence="?"/>
+ <element-name name="TFOOT" occurrence="?"/>
+ <element-name name="TBODY" occurrence="+"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="TABLE">
+<attdecl> -- table element --
+ %attrs; -- %coreattrs, %i18n, %events --
+ summary %Text; #IMPLIED -- purpose/structure for speech output--
+ width %Length; #IMPLIED -- table width --
+ border %Pixels; #IMPLIED -- controls frame width around table --
+ frame %TFrame; #IMPLIED -- which parts of frame to render --
+ rules %TRules; #IMPLIED -- rulings between rows and cols --
+ cellspacing %Length; #IMPLIED -- spacing between cells --
+ cellpadding %Length; #IMPLIED -- spacing within cells --
+ align %TAlign; #IMPLIED -- table position relative to window --
+ bgcolor %Color; #IMPLIED -- background color for cells --
+ %reserved; -- reserved for possible future use --
+ datapagesize CDATA #IMPLIED -- reserved for possible future use --
+ </attdecl>
+<attribute name="rules"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="none groups rows cols all"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="bgcolor"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="summary"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="cellspacing"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="frame"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="void above below hsides lhs rhs vsides box border"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="cellpadding"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="border"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="datapagesize"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="DIR" stagm="-" etagm="-"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="LI"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="LI"/>
+ </sequence-group>
+</content-model>
+<exclusions>
+ <or-group>
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="DIR"/>
+ <element-name name="MENU"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="CENTER"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="NOFRAMES"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="ISINDEX"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ </or-group>
+</exclusions>
+</element>
+
+<attlist name="DIR">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ compact (compact) #IMPLIED -- reduced interitem spacing --
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="compact"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="compact"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="U" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="U">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="DL" stagm="-" etagm="-"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="+">
+ <element-name name="DT"/>
+ <element-name name="DD"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="+">
+ <element-name name="DT"/>
+ <element-name name="DD"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="DL">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ compact (compact) #IMPLIED -- reduced interitem spacing --
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="compact"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="compact"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="BUTTON" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="DIR"/>
+ <element-name name="MENU"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="CENTER"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="NOFRAMES"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="ISINDEX"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="flow"/>
+ </sequence-group>
+</content-model>
+<exclusions>
+ <or-group>
+ <element-name name="A"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ <element-name name="FORM"/>
+ <element-name name="ISINDEX"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="IFRAME"/>
+ </or-group>
+</exclusions>
+</element>
+
+<attlist name="BUTTON">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED -- sent to server when submitted --
+ type (button|submit|reset) submit -- for use as form button --
+ disabled (disabled) #IMPLIED -- unavailable in this context --
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ %reserved; -- reserved for possible future use --
+ </attdecl>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="NUMBER"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type=""
+ enumeration="yes"
+ value="button submit reset"
+ default="submit"/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="value"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="DIV" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="DIR"/>
+ <element-name name="MENU"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="CENTER"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="NOFRAMES"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="ISINDEX"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="DIV">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ %align; -- align, text alignment --
+ %reserved; -- reserved for possible future use --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="MENU" stagm="-" etagm="-"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="LI"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="LI"/>
+ </sequence-group>
+</content-model>
+<exclusions>
+ <or-group>
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="DIR"/>
+ <element-name name="MENU"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="CENTER"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="NOFRAMES"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="ISINDEX"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ </or-group>
+</exclusions>
+</element>
+
+<attlist name="MENU">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ compact (compact) #IMPLIED -- reduced interitem spacing --
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="compact"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="compact"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="FONT" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="FONT">
+<attdecl>
+ %coreattrs; -- id, class, style, title --
+ %i18n; -- lang, dir --
+ size CDATA #IMPLIED -- [+|-]nn e.g. size="+1", size="4" --
+ color %Color; #IMPLIED -- text color --
+ face CDATA #IMPLIED -- comma-separated list of font names --
+ </attdecl>
+<attribute name="face"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="size"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="color"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="FORM" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="DIR"/>
+ <element-name name="MENU"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="CENTER"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="NOFRAMES"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="ISINDEX"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="flow"/>
+ </sequence-group>
+</content-model>
+<exclusions>
+ <sequence-group>
+ <element-name name="FORM"/>
+ </sequence-group>
+</exclusions>
+</element>
+
+<attlist name="FORM">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ action %URI; #REQUIRED -- server-side form handler --
+ method (GET|POST) GET -- HTTP method used to submit the form--
+ enctype %ContentType; "application/x-www-form-urlencoded"
+ accept %ContentTypes; #IMPLIED -- list of MIME types for file upload --
+ name CDATA #IMPLIED -- name of form for scripting --
+ onsubmit %Script; #IMPLIED -- the form was submitted --
+ onreset %Script; #IMPLIED -- the form was reset --
+ target %FrameTarget; #IMPLIED -- render in this frame --
+ accept-charset %Charsets; #IMPLIED -- list of supported charsets --
+ </attdecl>
+<attribute name="accept-charset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onsubmit"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="method"
+ type=""
+ enumeration="yes"
+ value="GET POST"
+ default="GET"/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="target"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="accept"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onreset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="enctype"
+ type=""
+ value="CDATA"
+ default="application/x-www-form-urlencoded"/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="action"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="DT" stagm="-" etagm="O"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="DT">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="OBJECT" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="PARAM"/>
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="DIR"/>
+ <element-name name="MENU"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="CENTER"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="NOFRAMES"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="ISINDEX"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="*">
+ <element-name name="PARAM"/>
+ <parament-name name="flow"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="OBJECT">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ declare (declare) #IMPLIED -- declare but don't instantiate flag --
+ classid %URI; #IMPLIED -- identifies an implementation --
+ codebase %URI; #IMPLIED -- base URI for classid, data, archive--
+ data %URI; #IMPLIED -- reference to object's data --
+ type %ContentType; #IMPLIED -- content type for data --
+ codetype %ContentType; #IMPLIED -- content type for code --
+ archive CDATA #IMPLIED -- space-separated list of URIs --
+ standby %Text; #IMPLIED -- message to show while loading --
+ height %Length; #IMPLIED -- override height --
+ width %Length; #IMPLIED -- override width --
+ usemap %URI; #IMPLIED -- use client-side image map --
+ name CDATA #IMPLIED -- submit as part of form --
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ align %IAlign; #IMPLIED -- vertical or horizontal alignment --
+ border %Pixels; #IMPLIED -- link border width --
+ hspace %Pixels; #IMPLIED -- horizontal gutter --
+ vspace %Pixels; #IMPLIED -- vertical gutter --
+ %reserved; -- reserved for possible future use --
+ </attdecl>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="archive"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="codetype"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="hspace"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="border"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="standby"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom left right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="NUMBER"
+ default=""/>
+<attribute name="codebase"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="vspace"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="data"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="classid"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="height"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="declare"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="declare"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="usemap"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="BDO" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="BDO">
+<attdecl>
+ %coreattrs; -- id, class, style, title --
+ lang %LanguageCode; #IMPLIED -- language code --
+ dir (ltr|rtl) #REQUIRED -- directionality --
+ </attdecl>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#REQUIRED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+</attlist>
+
+<element name="THEAD" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="TR"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="TR"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="THEAD">
+<attdecl> -- table section --
+ %attrs; -- %coreattrs, %i18n, %events --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="SMALL" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="SMALL">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="LI" stagm="-" etagm="O"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="DIR"/>
+ <element-name name="MENU"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="CENTER"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="NOFRAMES"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="ISINDEX"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="LI">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ type %LIStyle; #IMPLIED -- list item style --
+ value NUMBER #IMPLIED -- reset sequence number --
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="value"
+ type="#IMPLIED"
+ value="NUMBER"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="HR" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="HR">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ align (left|center|right) #IMPLIED
+ noshade (noshade) #IMPLIED
+ size %Pixels; #IMPLIED
+ width %Length; #IMPLIED
+ </attdecl>
+<attribute name="noshade"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="noshade"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="size"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="ABBR" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="ABBR">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="IFRAME" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="DIR"/>
+ <element-name name="MENU"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="CENTER"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="NOFRAMES"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="ISINDEX"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="IFRAME">
+<attdecl>
+ %coreattrs; -- id, class, style, title --
+ longdesc %URI; #IMPLIED -- link to long description
+ (complements title) --
+ name CDATA #IMPLIED -- name of frame for targetting --
+ src %URI; #IMPLIED -- source of frame content --
+ frameborder (1|0) 1 -- request frame borders? --
+ marginwidth %Pixels; #IMPLIED -- margin widths in pixels --
+ marginheight %Pixels; #IMPLIED -- margin height in pixels --
+ scrolling (yes|no|auto) auto -- scrollbar or none --
+ align %IAlign; #IMPLIED -- vertical or horizontal alignment --
+ height %Length; #IMPLIED -- frame height --
+ width %Length; #IMPLIED -- frame width --
+ </attdecl>
+<attribute name="marginheight"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="longdesc"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="scrolling"
+ type=""
+ enumeration="yes"
+ value="yes no auto"
+ default="auto"/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="frameborder"
+ type=""
+ enumeration="yes"
+ value="1"
+ default="1"/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="height"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="src"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom left right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="marginwidth"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="DFN" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="DFN">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="TITLE" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+<exclusions>
+ <or-group>
+ <element-name name="SCRIPT"/>
+ <element-name name="STYLE"/>
+ <element-name name="META"/>
+ <element-name name="LINK"/>
+ <element-name name="OBJECT"/>
+ </or-group>
+</exclusions>
+</element>
+
+<attlist name="TITLE">
+<attdecl> %i18n</attdecl>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+</attlist>
+
+<element name="AREA" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="AREA">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ shape %Shape; rect -- controls interpretation of coords --
+ coords %Coords; #IMPLIED -- comma-separated list of lengths --
+ href %URI; #IMPLIED -- URI for linked resource --
+ target %FrameTarget; #IMPLIED -- render in this frame --
+ nohref (nohref) #IMPLIED -- this region has no action --
+ alt %Text; #REQUIRED -- short description --
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ </attdecl>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="NUMBER"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="target"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="href"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="shape"
+ type=""
+ enumeration="yes"
+ value="rect circle poly default"
+ default="rect"/>
+<attribute name="alt"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="nohref"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="nohref"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="coords"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="OPTION" stagm="-" etagm="O"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="OPTION">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ selected (selected) #IMPLIED
+ disabled (disabled) #IMPLIED -- unavailable in this context --
+ label %Text; #IMPLIED -- for use in hierarchical menus --
+ value CDATA #IMPLIED -- defaults to element content --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="value"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="label"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="selected"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="selected"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="TD" stagm="-" etagm="O"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="DIR"/>
+ <element-name name="MENU"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="CENTER"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="NOFRAMES"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="ISINDEX"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="TD">
+<attdecl> -- header or data cell --
+ %attrs; -- %coreattrs, %i18n, %events --
+ abbr %Text; #IMPLIED -- abbreviation for header cell --
+ axis CDATA #IMPLIED -- comma-separated list of related headers--
+ headers IDREFS #IMPLIED -- list of id's for header cells --
+ scope %Scope; #IMPLIED -- scope covered by header cells --
+ rowspan NUMBER 1 -- number of rows spanned by cell --
+ colspan NUMBER 1 -- number of cols spanned by cell --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ nowrap (nowrap) #IMPLIED -- suppress word wrap --
+ bgcolor %Color; #IMPLIED -- cell background color --
+ width %Length; #IMPLIED -- width for cell --
+ height %Length; #IMPLIED -- height for cell --
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="headers"
+ type="#IMPLIED"
+ value="IDREFS"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="abbr"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="scope"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="row col rowgroup colgroup"
+ default=""/>
+<attribute name="bgcolor"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="colspan"
+ type=""
+ value="NUMBER"
+ default="1"/>
+<attribute name="rowspan"
+ type=""
+ value="NUMBER"
+ default="1"/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="nowrap"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="nowrap"
+ default=""/>
+<attribute name="height"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="axis"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="INS" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="DIR"/>
+ <element-name name="MENU"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="CENTER"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="NOFRAMES"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="ISINDEX"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="INS">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ cite %URI; #IMPLIED -- info on reason for change --
+ datetime %Datetime; #IMPLIED -- date and time of change --
+ </attdecl>
+<attribute name="cite"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="datetime"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="ISINDEX" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="ISINDEX">
+<attdecl>
+ %coreattrs; -- id, class, style, title --
+ %i18n; -- lang, dir --
+ prompt %Text; #IMPLIED -- prompt message --</attdecl>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="prompt"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="TH" stagm="-" etagm="O"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="DIR"/>
+ <element-name name="MENU"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="CENTER"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="NOFRAMES"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="ISINDEX"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="TH">
+<attdecl> -- header or data cell --
+ %attrs; -- %coreattrs, %i18n, %events --
+ abbr %Text; #IMPLIED -- abbreviation for header cell --
+ axis CDATA #IMPLIED -- comma-separated list of related headers--
+ headers IDREFS #IMPLIED -- list of id's for header cells --
+ scope %Scope; #IMPLIED -- scope covered by header cells --
+ rowspan NUMBER 1 -- number of rows spanned by cell --
+ colspan NUMBER 1 -- number of cols spanned by cell --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ nowrap (nowrap) #IMPLIED -- suppress word wrap --
+ bgcolor %Color; #IMPLIED -- cell background color --
+ width %Length; #IMPLIED -- width for cell --
+ height %Length; #IMPLIED -- height for cell --
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="headers"
+ type="#IMPLIED"
+ value="IDREFS"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="abbr"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="scope"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="row col rowgroup colgroup"
+ default=""/>
+<attribute name="bgcolor"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="colspan"
+ type=""
+ value="NUMBER"
+ default="1"/>
+<attribute name="rowspan"
+ type=""
+ value="NUMBER"
+ default="1"/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="nowrap"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="nowrap"
+ default=""/>
+<attribute name="height"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="axis"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="SPAN" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="SPAN">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ %reserved; -- reserved for possible future use --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="EM" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="EM">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="CITE" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="CITE">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="BASE" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="BASE">
+<attdecl>
+ href %URI; #IMPLIED -- URI that acts as base URI --
+ target %FrameTarget; #IMPLIED -- render in this frame --
+ </attdecl>
+<attribute name="href"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="target"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="TR" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="+">
+ <element-name name="TH"/>
+ <element-name name="TD"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="+">
+ <element-name name="TH"/>
+ <element-name name="TD"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="TR">
+<attdecl> -- table row --
+ %attrs; -- %coreattrs, %i18n, %events --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ bgcolor %Color; #IMPLIED -- background color for row --
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="bgcolor"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="BODY" stagm="O" etagm="O"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="DIR"/>
+ <element-name name="MENU"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="CENTER"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="NOFRAMES"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="ISINDEX"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="U"/>
+ <element-name name="S"/>
+ <element-name name="STRIKE"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="APPLET"/>
+ <element-name name="OBJECT"/>
+ <element-name name="FONT"/>
+ <element-name name="BASEFONT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="IFRAME"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="flow"/>
+ </sequence-group>
+</content-model>
+<inclusions>
+ <or-group>
+ <element-name name="INS"/>
+ <element-name name="DEL"/>
+ </or-group>
+</inclusions>
+</element>
+
+<attlist name="BODY">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ onload %Script; #IMPLIED -- the document has been loaded --
+ onunload %Script; #IMPLIED -- the document has been removed --
+ background %URI; #IMPLIED -- texture tile for document
+ background --
+ %bodycolors; -- bgcolor, text, link, vlink, alink --
+ </attdecl>
+<attribute name="background"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="alink"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="bgcolor"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="vlink"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="text"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onload"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onunload"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="link"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="INPUT" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="INPUT">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ type %InputType; TEXT -- what kind of widget is needed --
+ name CDATA #IMPLIED -- submit as part of form --
+ value CDATA #IMPLIED -- Specify for radio buttons and checkboxes --
+ checked (checked) #IMPLIED -- for radio buttons and check boxes --
+ disabled (disabled) #IMPLIED -- unavailable in this context --
+ readonly (readonly) #IMPLIED -- for text and passwd --
+ size CDATA #IMPLIED -- specific to each type of field --
+ maxlength NUMBER #IMPLIED -- max chars for text fields --
+ src %URI; #IMPLIED -- for fields with images --
+ alt CDATA #IMPLIED -- short description --
+ usemap %URI; #IMPLIED -- use client-side image map --
+ ismap (ismap) #IMPLIED -- use server-side image map --
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ onselect %Script; #IMPLIED -- some text was selected --
+ onchange %Script; #IMPLIED -- the element value was changed --
+ accept %ContentTypes; #IMPLIED -- list of MIME types for file upload --
+ align %IAlign; #IMPLIED -- vertical or horizontal alignment --
+ %reserved; -- reserved for possible future use --
+ </attdecl>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="src"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="size"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="checked"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="checked"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="value"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="accept"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="alt"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom left right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="NUMBER"
+ default=""/>
+<attribute name="maxlength"
+ type="#IMPLIED"
+ value="NUMBER"
+ default=""/>
+<attribute name="ismap"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ismap"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type=""
+ enumeration="yes"
+ value="TEXT PASSWORD CHECKBOX RADIO SUBMIT RESET FILE HIDDEN IMAGE BUTTON"
+ default="TEXT"/>
+<attribute name="onchange"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onselect"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="readonly"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="readonly"
+ default=""/>
+<attribute name="usemap"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+</dtd>
diff --git a/kate/xmltools/html4-strict.dtd.xml b/kate/xmltools/html4-strict.dtd.xml
new file mode 100644
index 0000000..bbcf853
--- /dev/null
+++ b/kate/xmltools/html4-strict.dtd.xml
@@ -0,0 +1,11145 @@
+<!DOCTYPE dtd PUBLIC "-//Norman Walsh//DTD DTDParse V2.0//EN"
+ "dtd.dtd" [
+<!ENTITY nbsp "&#160;">
+<!ENTITY iexcl "&#161;">
+<!ENTITY cent "&#162;">
+<!ENTITY pound "&#163;">
+<!ENTITY curren "&#164;">
+<!ENTITY yen "&#165;">
+<!ENTITY brvbar "&#166;">
+<!ENTITY sect "&#167;">
+<!ENTITY uml "&#168;">
+<!ENTITY copy "&#169;">
+<!ENTITY ordf "&#170;">
+<!ENTITY laquo "&#171;">
+<!ENTITY not "&#172;">
+<!ENTITY shy "&#173;">
+<!ENTITY reg "&#174;">
+<!ENTITY macr "&#175;">
+<!ENTITY deg "&#176;">
+<!ENTITY plusmn "&#177;">
+<!ENTITY sup2 "&#178;">
+<!ENTITY sup3 "&#179;">
+<!ENTITY acute "&#180;">
+<!ENTITY micro "&#181;">
+<!ENTITY para "&#182;">
+<!ENTITY middot "&#183;">
+<!ENTITY cedil "&#184;">
+<!ENTITY sup1 "&#185;">
+<!ENTITY ordm "&#186;">
+<!ENTITY raquo "&#187;">
+<!ENTITY frac14 "&#188;">
+<!ENTITY frac12 "&#189;">
+<!ENTITY frac34 "&#190;">
+<!ENTITY iquest "&#191;">
+<!ENTITY Agrave "&#192;">
+<!ENTITY Aacute "&#193;">
+<!ENTITY Acirc "&#194;">
+<!ENTITY Atilde "&#195;">
+<!ENTITY Auml "&#196;">
+<!ENTITY Aring "&#197;">
+<!ENTITY AElig "&#198;">
+<!ENTITY Ccedil "&#199;">
+<!ENTITY Egrave "&#200;">
+<!ENTITY Eacute "&#201;">
+<!ENTITY Ecirc "&#202;">
+<!ENTITY Euml "&#203;">
+<!ENTITY Igrave "&#204;">
+<!ENTITY Iacute "&#205;">
+<!ENTITY Icirc "&#206;">
+<!ENTITY Iuml "&#207;">
+<!ENTITY ETH "&#208;">
+<!ENTITY Ntilde "&#209;">
+<!ENTITY Ograve "&#210;">
+<!ENTITY Oacute "&#211;">
+<!ENTITY Ocirc "&#212;">
+<!ENTITY Otilde "&#213;">
+<!ENTITY Ouml "&#214;">
+<!ENTITY times "&#215;">
+<!ENTITY Oslash "&#216;">
+<!ENTITY Ugrave "&#217;">
+<!ENTITY Uacute "&#218;">
+<!ENTITY Ucirc "&#219;">
+<!ENTITY Uuml "&#220;">
+<!ENTITY Yacute "&#221;">
+<!ENTITY THORN "&#222;">
+<!ENTITY szlig "&#223;">
+<!ENTITY agrave "&#224;">
+<!ENTITY aacute "&#225;">
+<!ENTITY acirc "&#226;">
+<!ENTITY atilde "&#227;">
+<!ENTITY auml "&#228;">
+<!ENTITY aring "&#229;">
+<!ENTITY aelig "&#230;">
+<!ENTITY ccedil "&#231;">
+<!ENTITY egrave "&#232;">
+<!ENTITY eacute "&#233;">
+<!ENTITY ecirc "&#234;">
+<!ENTITY euml "&#235;">
+<!ENTITY igrave "&#236;">
+<!ENTITY iacute "&#237;">
+<!ENTITY icirc "&#238;">
+<!ENTITY iuml "&#239;">
+<!ENTITY eth "&#240;">
+<!ENTITY ntilde "&#241;">
+<!ENTITY ograve "&#242;">
+<!ENTITY oacute "&#243;">
+<!ENTITY ocirc "&#244;">
+<!ENTITY otilde "&#245;">
+<!ENTITY ouml "&#246;">
+<!ENTITY divide "&#247;">
+<!ENTITY oslash "&#248;">
+<!ENTITY ugrave "&#249;">
+<!ENTITY uacute "&#250;">
+<!ENTITY ucirc "&#251;">
+<!ENTITY uuml "&#252;">
+<!ENTITY yacute "&#253;">
+<!ENTITY thorn "&#254;">
+<!ENTITY yuml "&#255;">
+<!ENTITY fnof "&#402;">
+<!ENTITY Alpha "&#913;">
+<!ENTITY Beta "&#914;">
+<!ENTITY Gamma "&#915;">
+<!ENTITY Delta "&#916;">
+<!ENTITY Epsilon "&#917;">
+<!ENTITY Zeta "&#918;">
+<!ENTITY Eta "&#919;">
+<!ENTITY Theta "&#920;">
+<!ENTITY Iota "&#921;">
+<!ENTITY Kappa "&#922;">
+<!ENTITY Lambda "&#923;">
+<!ENTITY Mu "&#924;">
+<!ENTITY Nu "&#925;">
+<!ENTITY Xi "&#926;">
+<!ENTITY Omicron "&#927;">
+<!ENTITY Pi "&#928;">
+<!ENTITY Rho "&#929;">
+<!ENTITY Sigma "&#931;">
+<!ENTITY Tau "&#932;">
+<!ENTITY Upsilon "&#933;">
+<!ENTITY Phi "&#934;">
+<!ENTITY Chi "&#935;">
+<!ENTITY Psi "&#936;">
+<!ENTITY Omega "&#937;">
+<!ENTITY alpha "&#945;">
+<!ENTITY beta "&#946;">
+<!ENTITY gamma "&#947;">
+<!ENTITY delta "&#948;">
+<!ENTITY epsilon "&#949;">
+<!ENTITY zeta "&#950;">
+<!ENTITY eta "&#951;">
+<!ENTITY theta "&#952;">
+<!ENTITY iota "&#953;">
+<!ENTITY kappa "&#954;">
+<!ENTITY lambda "&#955;">
+<!ENTITY mu "&#956;">
+<!ENTITY nu "&#957;">
+<!ENTITY xi "&#958;">
+<!ENTITY omicron "&#959;">
+<!ENTITY pi "&#960;">
+<!ENTITY rho "&#961;">
+<!ENTITY sigmaf "&#962;">
+<!ENTITY sigma "&#963;">
+<!ENTITY tau "&#964;">
+<!ENTITY upsilon "&#965;">
+<!ENTITY phi "&#966;">
+<!ENTITY chi "&#967;">
+<!ENTITY psi "&#968;">
+<!ENTITY omega "&#969;">
+<!ENTITY thetasym "&#977;">
+<!ENTITY upsih "&#978;">
+<!ENTITY piv "&#982;">
+<!ENTITY bull "&#8226;">
+<!ENTITY hellip "&#8230;">
+<!ENTITY prime "&#8242;">
+<!ENTITY Prime "&#8243;">
+<!ENTITY oline "&#8254;">
+<!ENTITY frasl "&#8260;">
+<!ENTITY weierp "&#8472;">
+<!ENTITY image "&#8465;">
+<!ENTITY real "&#8476;">
+<!ENTITY trade "&#8482;">
+<!ENTITY alefsym "&#8501;">
+<!ENTITY larr "&#8592;">
+<!ENTITY uarr "&#8593;">
+<!ENTITY rarr "&#8594;">
+<!ENTITY darr "&#8595;">
+<!ENTITY harr "&#8596;">
+<!ENTITY crarr "&#8629;">
+<!ENTITY lArr "&#8656;">
+<!ENTITY uArr "&#8657;">
+<!ENTITY rArr "&#8658;">
+<!ENTITY dArr "&#8659;">
+<!ENTITY hArr "&#8660;">
+<!ENTITY forall "&#8704;">
+<!ENTITY part "&#8706;">
+<!ENTITY exist "&#8707;">
+<!ENTITY empty "&#8709;">
+<!ENTITY nabla "&#8711;">
+<!ENTITY isin "&#8712;">
+<!ENTITY notin "&#8713;">
+<!ENTITY ni "&#8715;">
+<!ENTITY prod "&#8719;">
+<!ENTITY sum "&#8721;">
+<!ENTITY minus "&#8722;">
+<!ENTITY lowast "&#8727;">
+<!ENTITY radic "&#8730;">
+<!ENTITY prop "&#8733;">
+<!ENTITY infin "&#8734;">
+<!ENTITY ang "&#8736;">
+<!ENTITY and "&#8743;">
+<!ENTITY or "&#8744;">
+<!ENTITY cap "&#8745;">
+<!ENTITY cup "&#8746;">
+<!ENTITY int "&#8747;">
+<!ENTITY there4 "&#8756;">
+<!ENTITY sim "&#8764;">
+<!ENTITY cong "&#8773;">
+<!ENTITY asymp "&#8776;">
+<!ENTITY ne "&#8800;">
+<!ENTITY equiv "&#8801;">
+<!ENTITY le "&#8804;">
+<!ENTITY ge "&#8805;">
+<!ENTITY sub "&#8834;">
+<!ENTITY sup "&#8835;">
+<!ENTITY nsub "&#8836;">
+<!ENTITY sube "&#8838;">
+<!ENTITY supe "&#8839;">
+<!ENTITY oplus "&#8853;">
+<!ENTITY otimes "&#8855;">
+<!ENTITY perp "&#8869;">
+<!ENTITY sdot "&#8901;">
+<!ENTITY lceil "&#8968;">
+<!ENTITY rceil "&#8969;">
+<!ENTITY lfloor "&#8970;">
+<!ENTITY rfloor "&#8971;">
+<!ENTITY lang "&#9001;">
+<!ENTITY rang "&#9002;">
+<!ENTITY loz "&#9674;">
+<!ENTITY spades "&#9824;">
+<!ENTITY clubs "&#9827;">
+<!ENTITY hearts "&#9829;">
+<!ENTITY diams "&#9830;">
+<!ENTITY quot "&#34;">
+<!ENTITY amp "&#38;#38;">
+<!ENTITY lt "&#38;#60;">
+<!ENTITY gt "&#62;">
+<!ENTITY OElig "&#338;">
+<!ENTITY oelig "&#339;">
+<!ENTITY Scaron "&#352;">
+<!ENTITY scaron "&#353;">
+<!ENTITY Yuml "&#376;">
+<!ENTITY circ "&#710;">
+<!ENTITY tilde "&#732;">
+<!ENTITY ensp "&#8194;">
+<!ENTITY emsp "&#8195;">
+<!ENTITY thinsp "&#8201;">
+<!ENTITY zwnj "&#8204;">
+<!ENTITY zwj "&#8205;">
+<!ENTITY lrm "&#8206;">
+<!ENTITY rlm "&#8207;">
+<!ENTITY ndash "&#8211;">
+<!ENTITY mdash "&#8212;">
+<!ENTITY lsquo "&#8216;">
+<!ENTITY rsquo "&#8217;">
+<!ENTITY sbquo "&#8218;">
+<!ENTITY ldquo "&#8220;">
+<!ENTITY rdquo "&#8221;">
+<!ENTITY bdquo "&#8222;">
+<!ENTITY dagger "&#8224;">
+<!ENTITY Dagger "&#8225;">
+<!ENTITY permil "&#8240;">
+<!ENTITY lsaquo "&#8249;">
+<!ENTITY rsaquo "&#8250;">
+<!ENTITY euro "&#8364;">
+]>
+<dtd version='1.0'
+ unexpanded='1'
+ title="?untitled?"
+ namecase-general="1"
+ namecase-entity="0"
+ xml="0"
+ system-id="strict.dtd"
+ public-id=""
+ declaration=""
+ created-by="DTDParse V2.0beta6"
+ created-on="Thu Sep 20 20:18:37 2001"
+>
+<entity name="HTML.Frameset"
+ type="param"
+>
+<text-expanded>IGNORE</text-expanded>
+<text>IGNORE</text>
+</entity>
+
+<entity name="LanguageCode"
+ type="param"
+>
+<text-expanded>NAME</text-expanded>
+<text>NAME</text>
+</entity>
+
+<entity name="html.content"
+ type="param"
+>
+<text-expanded>HEAD, BODY</text-expanded>
+<text>HEAD, BODY</text>
+</entity>
+
+<entity name="Script"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="MultiLength"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="cellvalign"
+ type="param"
+>
+<text-expanded>valign (top|middle|bottom|baseline) #IMPLIED</text-expanded>
+<text>valign (top|middle|bottom|baseline) #IMPLIED</text>
+</entity>
+
+<entity name="Text"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="TFrame"
+ type="param"
+>
+<text-expanded>(void|above|below|hsides|lhs|rhs|vsides|box|border)</text-expanded>
+<text>(void|above|below|hsides|lhs|rhs|vsides|box|border)</text>
+</entity>
+
+<entity name="reserved"
+ type="param"
+>
+<text-expanded></text-expanded>
+<text></text>
+</entity>
+
+<entity name="HTMLsymbol"
+ type="param"
+ public="-//W3C//ENTITIES Symbols//EN//HTML"
+ system="HTMLsymbol.ent"
+/>
+
+<entity name="list"
+ type="param"
+>
+<text-expanded>UL | OL</text-expanded>
+<text>UL | OL</text>
+</entity>
+
+<entity name="Character"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="URI"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="coreattrs"
+ type="param"
+>
+<text-expanded>id ID #IMPLIED -- document-wide unique id --
+ class CDATA #IMPLIED -- space-separated list of classes --
+ style CDATA #IMPLIED -- associated style info --
+ title CDATA #IMPLIED -- advisory title --</text-expanded>
+<text>id ID #IMPLIED -- document-wide unique id --
+ class CDATA #IMPLIED -- space-separated list of classes --
+ style %StyleSheet; #IMPLIED -- associated style info --
+ title %Text; #IMPLIED -- advisory title --</text>
+</entity>
+
+<entity name="Shape"
+ type="param"
+>
+<text-expanded>(rect|circle|poly|default)</text-expanded>
+<text>(rect|circle|poly|default)</text>
+</entity>
+
+<entity name="HTMLlat1"
+ type="param"
+ public="-//W3C//ENTITIES Latin1//EN//HTML"
+ system="HTMLlat1.ent"
+/>
+
+<entity name="TRules"
+ type="param"
+>
+<text-expanded>(none | groups | rows | cols | all)</text-expanded>
+<text>(none | groups | rows | cols | all)</text>
+</entity>
+
+<entity name="events"
+ type="param"
+>
+<text-expanded>onclick CDATA #IMPLIED -- a pointer button was clicked --
+ ondblclick CDATA #IMPLIED -- a pointer button was double clicked--
+ onmousedown CDATA #IMPLIED -- a pointer button was pressed down --
+ onmouseup CDATA #IMPLIED -- a pointer button was released --
+ onmouseover CDATA #IMPLIED -- a pointer was moved onto --
+ onmousemove CDATA #IMPLIED -- a pointer was moved within --
+ onmouseout CDATA #IMPLIED -- a pointer was moved away --
+ onkeypress CDATA #IMPLIED -- a key was pressed and released --
+ onkeydown CDATA #IMPLIED -- a key was pressed down --
+ onkeyup CDATA #IMPLIED -- a key was released --</text-expanded>
+<text>onclick %Script; #IMPLIED -- a pointer button was clicked --
+ ondblclick %Script; #IMPLIED -- a pointer button was double clicked--
+ onmousedown %Script; #IMPLIED -- a pointer button was pressed down --
+ onmouseup %Script; #IMPLIED -- a pointer button was released --
+ onmouseover %Script; #IMPLIED -- a pointer was moved onto --
+ onmousemove %Script; #IMPLIED -- a pointer was moved within --
+ onmouseout %Script; #IMPLIED -- a pointer was moved away --
+ onkeypress %Script; #IMPLIED -- a key was pressed and released --
+ onkeydown %Script; #IMPLIED -- a key was pressed down --
+ onkeyup %Script; #IMPLIED -- a key was released --</text>
+</entity>
+
+<entity name="preformatted"
+ type="param"
+>
+<text-expanded>PRE</text-expanded>
+<text>PRE</text>
+</entity>
+
+<entity name="inline"
+ type="param"
+>
+<text-expanded>#PCDATA | TT | I | B | BIG | SMALL | EM | STRONG | DFN | CODE |
+ SAMP | KBD | VAR | CITE | ABBR | ACRONYM | A | IMG | OBJECT | BR | SCRIPT | MAP | Q | SUB | SUP | SPAN | BDO | INPUT | SELECT | TEXTAREA | LABEL | BUTTON</text-expanded>
+<text>#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;</text>
+</entity>
+
+<entity name="flow"
+ type="param"
+>
+<text-expanded>P | H1|H2|H3|H4|H5|H6 | UL | OL | PRE | DL | DIV | NOSCRIPT |
+ BLOCKQUOTE | FORM | HR | TABLE | FIELDSET | ADDRESS | #PCDATA | TT | I | B | BIG | SMALL | EM | STRONG | DFN | CODE |
+ SAMP | KBD | VAR | CITE | ABBR | ACRONYM | A | IMG | OBJECT | BR | SCRIPT | MAP | Q | SUB | SUP | SPAN | BDO | INPUT | SELECT | TEXTAREA | LABEL | BUTTON</text-expanded>
+<text>%block; | %inline;</text>
+</entity>
+
+<entity name="Charsets"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="ContentTypes"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="head.misc"
+ type="param"
+>
+<text-expanded>SCRIPT|STYLE|META|LINK|OBJECT</text-expanded>
+<text>SCRIPT|STYLE|META|LINK|OBJECT</text>
+</entity>
+
+<entity name="HTMLspecial"
+ type="param"
+ public="-//W3C//ENTITIES Special//EN//HTML"
+ system="HTMLspecial.ent"
+/>
+
+<entity name="block"
+ type="param"
+>
+<text-expanded>P | H1|H2|H3|H4|H5|H6 | UL | OL | PRE | DL | DIV | NOSCRIPT |
+ BLOCKQUOTE | FORM | HR | TABLE | FIELDSET | ADDRESS</text-expanded>
+<text>P | %heading; | %list; | %preformatted; | DL | DIV | NOSCRIPT |
+ BLOCKQUOTE | FORM | HR | TABLE | FIELDSET | ADDRESS</text>
+</entity>
+
+<entity name="LinkTypes"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="special"
+ type="param"
+>
+<text-expanded>A | IMG | OBJECT | BR | SCRIPT | MAP | Q | SUB | SUP | SPAN | BDO</text-expanded>
+<text>A | IMG | OBJECT | BR | SCRIPT | MAP | Q | SUB | SUP | SPAN | BDO</text>
+</entity>
+
+<entity name="Scope"
+ type="param"
+>
+<text-expanded>(row|col|rowgroup|colgroup)</text-expanded>
+<text>(row|col|rowgroup|colgroup)</text>
+</entity>
+
+<entity name="InputType"
+ type="param"
+>
+<text-expanded>(TEXT | PASSWORD | CHECKBOX |
+ RADIO | SUBMIT | RESET |
+ FILE | HIDDEN | IMAGE | BUTTON)</text-expanded>
+<text>(TEXT | PASSWORD | CHECKBOX |
+ RADIO | SUBMIT | RESET |
+ FILE | HIDDEN | IMAGE | BUTTON)</text>
+</entity>
+
+<entity name="Length"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="phrase"
+ type="param"
+>
+<text-expanded>EM | STRONG | DFN | CODE |
+ SAMP | KBD | VAR | CITE | ABBR | ACRONYM</text-expanded>
+<text>EM | STRONG | DFN | CODE |
+ SAMP | KBD | VAR | CITE | ABBR | ACRONYM</text>
+</entity>
+
+<entity name="ContentType"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="TAlign"
+ type="param"
+>
+<text-expanded>(left|center|right)</text-expanded>
+<text>(left|center|right)</text>
+</entity>
+
+<entity name="MediaDesc"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="StyleSheet"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="HTML.Reserved"
+ type="param"
+>
+<text-expanded>IGNORE</text-expanded>
+<text>IGNORE</text>
+</entity>
+
+<entity name="attrs"
+ type="param"
+>
+<text-expanded>id ID #IMPLIED -- document-wide unique id --
+ class CDATA #IMPLIED -- space-separated list of classes --
+ style CDATA #IMPLIED -- associated style info --
+ title CDATA #IMPLIED -- advisory title -- lang NAME #IMPLIED -- language code --
+ dir (ltr|rtl) #IMPLIED -- direction for weak/neutral text -- onclick CDATA #IMPLIED -- a pointer button was clicked --
+ ondblclick CDATA #IMPLIED -- a pointer button was double clicked--
+ onmousedown CDATA #IMPLIED -- a pointer button was pressed down --
+ onmouseup CDATA #IMPLIED -- a pointer button was released --
+ onmouseover CDATA #IMPLIED -- a pointer was moved onto --
+ onmousemove CDATA #IMPLIED -- a pointer was moved within --
+ onmouseout CDATA #IMPLIED -- a pointer was moved away --
+ onkeypress CDATA #IMPLIED -- a key was pressed and released --
+ onkeydown CDATA #IMPLIED -- a key was pressed down --
+ onkeyup CDATA #IMPLIED -- a key was released --</text-expanded>
+<text>%coreattrs; %i18n; %events;</text>
+</entity>
+
+<entity name="formctrl"
+ type="param"
+>
+<text-expanded>INPUT | SELECT | TEXTAREA | LABEL | BUTTON</text-expanded>
+<text>INPUT | SELECT | TEXTAREA | LABEL | BUTTON</text>
+</entity>
+
+<entity name="Pixels"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="cellhalign"
+ type="param"
+>
+<text-expanded>align (left|center|right|justify|char) #IMPLIED
+ char CDATA #IMPLIED -- alignment char, e.g. char=':' --
+ charoff CDATA #IMPLIED -- offset for alignment char --</text-expanded>
+<text>align (left|center|right|justify|char) #IMPLIED
+ char %Character; #IMPLIED -- alignment char, e.g. char=':' --
+ charoff %Length; #IMPLIED -- offset for alignment char --</text>
+</entity>
+
+<entity name="pre.exclusion"
+ type="param"
+>
+<text-expanded>IMG|OBJECT|BIG|SMALL|SUB|SUP</text-expanded>
+<text>IMG|OBJECT|BIG|SMALL|SUB|SUP</text>
+</entity>
+
+<entity name="Datetime"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="Coords"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="head.content"
+ type="param"
+>
+<text-expanded>TITLE &amp; BASE?</text-expanded>
+<text>TITLE &amp; BASE?</text>
+</entity>
+
+<entity name="fontstyle"
+ type="param"
+>
+<text-expanded>TT | I | B | BIG | SMALL</text-expanded>
+<text>TT | I | B | BIG | SMALL</text>
+</entity>
+
+<entity name="heading"
+ type="param"
+>
+<text-expanded>H1|H2|H3|H4|H5|H6</text-expanded>
+<text>H1|H2|H3|H4|H5|H6</text>
+</entity>
+
+<entity name="Charset"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="i18n"
+ type="param"
+>
+<text-expanded>lang NAME #IMPLIED -- language code --
+ dir (ltr|rtl) #IMPLIED -- direction for weak/neutral text --</text-expanded>
+<text>lang %LanguageCode; #IMPLIED -- language code --
+ dir (ltr|rtl) #IMPLIED -- direction for weak/neutral text --</text>
+</entity>
+
+<entity name="ntilde"
+ type="cdata"
+>
+<text-expanded>&amp;#241;</text-expanded>
+<text>&amp;#241;</text>
+</entity>
+
+<entity name="prime"
+ type="cdata"
+>
+<text-expanded>&amp;#8242;</text-expanded>
+<text>&amp;#8242;</text>
+</entity>
+
+<entity name="quot"
+ type="cdata"
+>
+<text-expanded>&amp;#34;</text-expanded>
+<text>&amp;#34;</text>
+</entity>
+
+<entity name="rceil"
+ type="cdata"
+>
+<text-expanded>&amp;#8969;</text-expanded>
+<text>&amp;#8969;</text>
+</entity>
+
+<entity name="prod"
+ type="cdata"
+>
+<text-expanded>&amp;#8719;</text-expanded>
+<text>&amp;#8719;</text>
+</entity>
+
+<entity name="Euml"
+ type="cdata"
+>
+<text-expanded>&amp;#203;</text-expanded>
+<text>&amp;#203;</text>
+</entity>
+
+<entity name="loz"
+ type="cdata"
+>
+<text-expanded>&amp;#9674;</text-expanded>
+<text>&amp;#9674;</text>
+</entity>
+
+<entity name="Yacute"
+ type="cdata"
+>
+<text-expanded>&amp;#221;</text-expanded>
+<text>&amp;#221;</text>
+</entity>
+
+<entity name="rdquo"
+ type="cdata"
+>
+<text-expanded>&amp;#8221;</text-expanded>
+<text>&amp;#8221;</text>
+</entity>
+
+<entity name="ne"
+ type="cdata"
+>
+<text-expanded>&amp;#8800;</text-expanded>
+<text>&amp;#8800;</text>
+</entity>
+
+<entity name="igrave"
+ type="cdata"
+>
+<text-expanded>&amp;#236;</text-expanded>
+<text>&amp;#236;</text>
+</entity>
+
+<entity name="psi"
+ type="cdata"
+>
+<text-expanded>&amp;#968;</text-expanded>
+<text>&amp;#968;</text>
+</entity>
+
+<entity name="Oacute"
+ type="cdata"
+>
+<text-expanded>&amp;#211;</text-expanded>
+<text>&amp;#211;</text>
+</entity>
+
+<entity name="lsaquo"
+ type="cdata"
+>
+<text-expanded>&amp;#8249;</text-expanded>
+<text>&amp;#8249;</text>
+</entity>
+
+<entity name="ni"
+ type="cdata"
+>
+<text-expanded>&amp;#8715;</text-expanded>
+<text>&amp;#8715;</text>
+</entity>
+
+<entity name="frasl"
+ type="cdata"
+>
+<text-expanded>&amp;#8260;</text-expanded>
+<text>&amp;#8260;</text>
+</entity>
+
+<entity name="Epsilon"
+ type="cdata"
+>
+<text-expanded>&amp;#917;</text-expanded>
+<text>&amp;#917;</text>
+</entity>
+
+<entity name="rArr"
+ type="cdata"
+>
+<text-expanded>&amp;#8658;</text-expanded>
+<text>&amp;#8658;</text>
+</entity>
+
+<entity name="Eacute"
+ type="cdata"
+>
+<text-expanded>&amp;#201;</text-expanded>
+<text>&amp;#201;</text>
+</entity>
+
+<entity name="acute"
+ type="cdata"
+>
+<text-expanded>&amp;#180;</text-expanded>
+<text>&amp;#180;</text>
+</entity>
+
+<entity name="Pi"
+ type="cdata"
+>
+<text-expanded>&amp;#928;</text-expanded>
+<text>&amp;#928;</text>
+</entity>
+
+<entity name="radic"
+ type="cdata"
+>
+<text-expanded>&amp;#8730;</text-expanded>
+<text>&amp;#8730;</text>
+</entity>
+
+<entity name="Ugrave"
+ type="cdata"
+>
+<text-expanded>&amp;#217;</text-expanded>
+<text>&amp;#217;</text>
+</entity>
+
+<entity name="prop"
+ type="cdata"
+>
+<text-expanded>&amp;#8733;</text-expanded>
+<text>&amp;#8733;</text>
+</entity>
+
+<entity name="ccedil"
+ type="cdata"
+>
+<text-expanded>&amp;#231;</text-expanded>
+<text>&amp;#231;</text>
+</entity>
+
+<entity name="Iuml"
+ type="cdata"
+>
+<text-expanded>&amp;#207;</text-expanded>
+<text>&amp;#207;</text>
+</entity>
+
+<entity name="Agrave"
+ type="cdata"
+>
+<text-expanded>&amp;#192;</text-expanded>
+<text>&amp;#192;</text>
+</entity>
+
+<entity name="bull"
+ type="cdata"
+>
+<text-expanded>&amp;#8226;</text-expanded>
+<text>&amp;#8226;</text>
+</entity>
+
+<entity name="nu"
+ type="cdata"
+>
+<text-expanded>&amp;#957;</text-expanded>
+<text>&amp;#957;</text>
+</entity>
+
+<entity name="ge"
+ type="cdata"
+>
+<text-expanded>&amp;#8805;</text-expanded>
+<text>&amp;#8805;</text>
+</entity>
+
+<entity name="gamma"
+ type="cdata"
+>
+<text-expanded>&amp;#947;</text-expanded>
+<text>&amp;#947;</text>
+</entity>
+
+<entity name="Kappa"
+ type="cdata"
+>
+<text-expanded>&amp;#922;</text-expanded>
+<text>&amp;#922;</text>
+</entity>
+
+<entity name="aring"
+ type="cdata"
+>
+<text-expanded>&amp;#229;</text-expanded>
+<text>&amp;#229;</text>
+</entity>
+
+<entity name="cedil"
+ type="cdata"
+>
+<text-expanded>&amp;#184;</text-expanded>
+<text>&amp;#184;</text>
+</entity>
+
+<entity name="laquo"
+ type="cdata"
+>
+<text-expanded>&amp;#171;</text-expanded>
+<text>&amp;#171;</text>
+</entity>
+
+<entity name="Xi"
+ type="cdata"
+>
+<text-expanded>&amp;#926;</text-expanded>
+<text>&amp;#926;</text>
+</entity>
+
+<entity name="copy"
+ type="cdata"
+>
+<text-expanded>&amp;#169;</text-expanded>
+<text>&amp;#169;</text>
+</entity>
+
+<entity name="crarr"
+ type="cdata"
+>
+<text-expanded>&amp;#8629;</text-expanded>
+<text>&amp;#8629;</text>
+</entity>
+
+<entity name="sigma"
+ type="cdata"
+>
+<text-expanded>&amp;#963;</text-expanded>
+<text>&amp;#963;</text>
+</entity>
+
+<entity name="acirc"
+ type="cdata"
+>
+<text-expanded>&amp;#226;</text-expanded>
+<text>&amp;#226;</text>
+</entity>
+
+<entity name="clubs"
+ type="cdata"
+>
+<text-expanded>&amp;#9827;</text-expanded>
+<text>&amp;#9827;</text>
+</entity>
+
+<entity name="Otilde"
+ type="cdata"
+>
+<text-expanded>&amp;#213;</text-expanded>
+<text>&amp;#213;</text>
+</entity>
+
+<entity name="ETH"
+ type="cdata"
+>
+<text-expanded>&amp;#208;</text-expanded>
+<text>&amp;#208;</text>
+</entity>
+
+<entity name="iota"
+ type="cdata"
+>
+<text-expanded>&amp;#953;</text-expanded>
+<text>&amp;#953;</text>
+</entity>
+
+<entity name="gt"
+ type="cdata"
+>
+<text-expanded>&amp;#62;</text-expanded>
+<text>&amp;#62;</text>
+</entity>
+
+<entity name="tilde"
+ type="cdata"
+>
+<text-expanded>&amp;#732;</text-expanded>
+<text>&amp;#732;</text>
+</entity>
+
+<entity name="Chi"
+ type="cdata"
+>
+<text-expanded>&amp;#935;</text-expanded>
+<text>&amp;#935;</text>
+</entity>
+
+<entity name="Theta"
+ type="cdata"
+>
+<text-expanded>&amp;#920;</text-expanded>
+<text>&amp;#920;</text>
+</entity>
+
+<entity name="upsih"
+ type="cdata"
+>
+<text-expanded>&amp;#978;</text-expanded>
+<text>&amp;#978;</text>
+</entity>
+
+<entity name="ouml"
+ type="cdata"
+>
+<text-expanded>&amp;#246;</text-expanded>
+<text>&amp;#246;</text>
+</entity>
+
+<entity name="uacute"
+ type="cdata"
+>
+<text-expanded>&amp;#250;</text-expanded>
+<text>&amp;#250;</text>
+</entity>
+
+<entity name="uml"
+ type="cdata"
+>
+<text-expanded>&amp;#168;</text-expanded>
+<text>&amp;#168;</text>
+</entity>
+
+<entity name="mdash"
+ type="cdata"
+>
+<text-expanded>&amp;#8212;</text-expanded>
+<text>&amp;#8212;</text>
+</entity>
+
+<entity name="forall"
+ type="cdata"
+>
+<text-expanded>&amp;#8704;</text-expanded>
+<text>&amp;#8704;</text>
+</entity>
+
+<entity name="Phi"
+ type="cdata"
+>
+<text-expanded>&amp;#934;</text-expanded>
+<text>&amp;#934;</text>
+</entity>
+
+<entity name="euro"
+ type="cdata"
+>
+<text-expanded>&amp;#8364;</text-expanded>
+<text>&amp;#8364;</text>
+</entity>
+
+<entity name="aacute"
+ type="cdata"
+>
+<text-expanded>&amp;#225;</text-expanded>
+<text>&amp;#225;</text>
+</entity>
+
+<entity name="or"
+ type="cdata"
+>
+<text-expanded>&amp;#8744;</text-expanded>
+<text>&amp;#8744;</text>
+</entity>
+
+<entity name="ecirc"
+ type="cdata"
+>
+<text-expanded>&amp;#234;</text-expanded>
+<text>&amp;#234;</text>
+</entity>
+
+<entity name="iquest"
+ type="cdata"
+>
+<text-expanded>&amp;#191;</text-expanded>
+<text>&amp;#191;</text>
+</entity>
+
+<entity name="tau"
+ type="cdata"
+>
+<text-expanded>&amp;#964;</text-expanded>
+<text>&amp;#964;</text>
+</entity>
+
+<entity name="emsp"
+ type="cdata"
+>
+<text-expanded>&amp;#8195;</text-expanded>
+<text>&amp;#8195;</text>
+</entity>
+
+<entity name="weierp"
+ type="cdata"
+>
+<text-expanded>&amp;#8472;</text-expanded>
+<text>&amp;#8472;</text>
+</entity>
+
+<entity name="Ntilde"
+ type="cdata"
+>
+<text-expanded>&amp;#209;</text-expanded>
+<text>&amp;#209;</text>
+</entity>
+
+<entity name="lang"
+ type="cdata"
+>
+<text-expanded>&amp;#9001;</text-expanded>
+<text>&amp;#9001;</text>
+</entity>
+
+<entity name="lambda"
+ type="cdata"
+>
+<text-expanded>&amp;#955;</text-expanded>
+<text>&amp;#955;</text>
+</entity>
+
+<entity name="Delta"
+ type="cdata"
+>
+<text-expanded>&amp;#916;</text-expanded>
+<text>&amp;#916;</text>
+</entity>
+
+<entity name="Uuml"
+ type="cdata"
+>
+<text-expanded>&amp;#220;</text-expanded>
+<text>&amp;#220;</text>
+</entity>
+
+<entity name="oline"
+ type="cdata"
+>
+<text-expanded>&amp;#8254;</text-expanded>
+<text>&amp;#8254;</text>
+</entity>
+
+<entity name="Igrave"
+ type="cdata"
+>
+<text-expanded>&amp;#204;</text-expanded>
+<text>&amp;#204;</text>
+</entity>
+
+<entity name="Ocirc"
+ type="cdata"
+>
+<text-expanded>&amp;#212;</text-expanded>
+<text>&amp;#212;</text>
+</entity>
+
+<entity name="OElig"
+ type="cdata"
+>
+<text-expanded>&amp;#338;</text-expanded>
+<text>&amp;#338;</text>
+</entity>
+
+<entity name="isin"
+ type="cdata"
+>
+<text-expanded>&amp;#8712;</text-expanded>
+<text>&amp;#8712;</text>
+</entity>
+
+<entity name="icirc"
+ type="cdata"
+>
+<text-expanded>&amp;#238;</text-expanded>
+<text>&amp;#238;</text>
+</entity>
+
+<entity name="cup"
+ type="cdata"
+>
+<text-expanded>&amp;#8746;</text-expanded>
+<text>&amp;#8746;</text>
+</entity>
+
+<entity name="zeta"
+ type="cdata"
+>
+<text-expanded>&amp;#950;</text-expanded>
+<text>&amp;#950;</text>
+</entity>
+
+<entity name="pi"
+ type="cdata"
+>
+<text-expanded>&amp;#960;</text-expanded>
+<text>&amp;#960;</text>
+</entity>
+
+<entity name="Ccedil"
+ type="cdata"
+>
+<text-expanded>&amp;#199;</text-expanded>
+<text>&amp;#199;</text>
+</entity>
+
+<entity name="atilde"
+ type="cdata"
+>
+<text-expanded>&amp;#227;</text-expanded>
+<text>&amp;#227;</text>
+</entity>
+
+<entity name="dArr"
+ type="cdata"
+>
+<text-expanded>&amp;#8659;</text-expanded>
+<text>&amp;#8659;</text>
+</entity>
+
+<entity name="Yuml"
+ type="cdata"
+>
+<text-expanded>&amp;#376;</text-expanded>
+<text>&amp;#376;</text>
+</entity>
+
+<entity name="uArr"
+ type="cdata"
+>
+<text-expanded>&amp;#8657;</text-expanded>
+<text>&amp;#8657;</text>
+</entity>
+
+<entity name="there4"
+ type="cdata"
+>
+<text-expanded>&amp;#8756;</text-expanded>
+<text>&amp;#8756;</text>
+</entity>
+
+<entity name="minus"
+ type="cdata"
+>
+<text-expanded>&amp;#8722;</text-expanded>
+<text>&amp;#8722;</text>
+</entity>
+
+<entity name="upsilon"
+ type="cdata"
+>
+<text-expanded>&amp;#965;</text-expanded>
+<text>&amp;#965;</text>
+</entity>
+
+<entity name="lrm"
+ type="cdata"
+>
+<text-expanded>&amp;#8206;</text-expanded>
+<text>&amp;#8206;</text>
+</entity>
+
+<entity name="rho"
+ type="cdata"
+>
+<text-expanded>&amp;#961;</text-expanded>
+<text>&amp;#961;</text>
+</entity>
+
+<entity name="lowast"
+ type="cdata"
+>
+<text-expanded>&amp;#8727;</text-expanded>
+<text>&amp;#8727;</text>
+</entity>
+
+<entity name="xi"
+ type="cdata"
+>
+<text-expanded>&amp;#958;</text-expanded>
+<text>&amp;#958;</text>
+</entity>
+
+<entity name="Prime"
+ type="cdata"
+>
+<text-expanded>&amp;#8243;</text-expanded>
+<text>&amp;#8243;</text>
+</entity>
+
+<entity name="spades"
+ type="cdata"
+>
+<text-expanded>&amp;#9824;</text-expanded>
+<text>&amp;#9824;</text>
+</entity>
+
+<entity name="lceil"
+ type="cdata"
+>
+<text-expanded>&amp;#8968;</text-expanded>
+<text>&amp;#8968;</text>
+</entity>
+
+<entity name="hArr"
+ type="cdata"
+>
+<text-expanded>&amp;#8660;</text-expanded>
+<text>&amp;#8660;</text>
+</entity>
+
+<entity name="alpha"
+ type="cdata"
+>
+<text-expanded>&amp;#945;</text-expanded>
+<text>&amp;#945;</text>
+</entity>
+
+<entity name="iacute"
+ type="cdata"
+>
+<text-expanded>&amp;#237;</text-expanded>
+<text>&amp;#237;</text>
+</entity>
+
+<entity name="lfloor"
+ type="cdata"
+>
+<text-expanded>&amp;#8970;</text-expanded>
+<text>&amp;#8970;</text>
+</entity>
+
+<entity name="infin"
+ type="cdata"
+>
+<text-expanded>&amp;#8734;</text-expanded>
+<text>&amp;#8734;</text>
+</entity>
+
+<entity name="image"
+ type="cdata"
+>
+<text-expanded>&amp;#8465;</text-expanded>
+<text>&amp;#8465;</text>
+</entity>
+
+<entity name="sup1"
+ type="cdata"
+>
+<text-expanded>&amp;#185;</text-expanded>
+<text>&amp;#185;</text>
+</entity>
+
+<entity name="ldquo"
+ type="cdata"
+>
+<text-expanded>&amp;#8220;</text-expanded>
+<text>&amp;#8220;</text>
+</entity>
+
+<entity name="sup2"
+ type="cdata"
+>
+<text-expanded>&amp;#178;</text-expanded>
+<text>&amp;#178;</text>
+</entity>
+
+<entity name="sup3"
+ type="cdata"
+>
+<text-expanded>&amp;#179;</text-expanded>
+<text>&amp;#179;</text>
+</entity>
+
+<entity name="Beta"
+ type="cdata"
+>
+<text-expanded>&amp;#914;</text-expanded>
+<text>&amp;#914;</text>
+</entity>
+
+<entity name="brvbar"
+ type="cdata"
+>
+<text-expanded>&amp;#166;</text-expanded>
+<text>&amp;#166;</text>
+</entity>
+
+<entity name="oelig"
+ type="cdata"
+>
+<text-expanded>&amp;#339;</text-expanded>
+<text>&amp;#339;</text>
+</entity>
+
+<entity name="ograve"
+ type="cdata"
+>
+<text-expanded>&amp;#242;</text-expanded>
+<text>&amp;#242;</text>
+</entity>
+
+<entity name="rarr"
+ type="cdata"
+>
+<text-expanded>&amp;#8594;</text-expanded>
+<text>&amp;#8594;</text>
+</entity>
+
+<entity name="Uacute"
+ type="cdata"
+>
+<text-expanded>&amp;#218;</text-expanded>
+<text>&amp;#218;</text>
+</entity>
+
+<entity name="rsaquo"
+ type="cdata"
+>
+<text-expanded>&amp;#8250;</text-expanded>
+<text>&amp;#8250;</text>
+</entity>
+
+<entity name="sub"
+ type="cdata"
+>
+<text-expanded>&amp;#8834;</text-expanded>
+<text>&amp;#8834;</text>
+</entity>
+
+<entity name="zwj"
+ type="cdata"
+>
+<text-expanded>&amp;#8205;</text-expanded>
+<text>&amp;#8205;</text>
+</entity>
+
+<entity name="perp"
+ type="cdata"
+>
+<text-expanded>&amp;#8869;</text-expanded>
+<text>&amp;#8869;</text>
+</entity>
+
+<entity name="egrave"
+ type="cdata"
+>
+<text-expanded>&amp;#232;</text-expanded>
+<text>&amp;#232;</text>
+</entity>
+
+<entity name="thorn"
+ type="cdata"
+>
+<text-expanded>&amp;#254;</text-expanded>
+<text>&amp;#254;</text>
+</entity>
+
+<entity name="equiv"
+ type="cdata"
+>
+<text-expanded>&amp;#8801;</text-expanded>
+<text>&amp;#8801;</text>
+</entity>
+
+<entity name="lArr"
+ type="cdata"
+>
+<text-expanded>&amp;#8656;</text-expanded>
+<text>&amp;#8656;</text>
+</entity>
+
+<entity name="Aacute"
+ type="cdata"
+>
+<text-expanded>&amp;#193;</text-expanded>
+<text>&amp;#193;</text>
+</entity>
+
+<entity name="amp"
+ type="cdata"
+>
+<text-expanded>&amp;#38;</text-expanded>
+<text>&amp;#38;</text>
+</entity>
+
+<entity name="auml"
+ type="cdata"
+>
+<text-expanded>&amp;#228;</text-expanded>
+<text>&amp;#228;</text>
+</entity>
+
+<entity name="ndash"
+ type="cdata"
+>
+<text-expanded>&amp;#8211;</text-expanded>
+<text>&amp;#8211;</text>
+</entity>
+
+<entity name="Gamma"
+ type="cdata"
+>
+<text-expanded>&amp;#915;</text-expanded>
+<text>&amp;#915;</text>
+</entity>
+
+<entity name="otimes"
+ type="cdata"
+>
+<text-expanded>&amp;#8855;</text-expanded>
+<text>&amp;#8855;</text>
+</entity>
+
+<entity name="sum"
+ type="cdata"
+>
+<text-expanded>&amp;#8721;</text-expanded>
+<text>&amp;#8721;</text>
+</entity>
+
+<entity name="Aring"
+ type="cdata"
+>
+<text-expanded>&amp;#197;</text-expanded>
+<text>&amp;#197;</text>
+</entity>
+
+<entity name="pound"
+ type="cdata"
+>
+<text-expanded>&amp;#163;</text-expanded>
+<text>&amp;#163;</text>
+</entity>
+
+<entity name="oplus"
+ type="cdata"
+>
+<text-expanded>&amp;#8853;</text-expanded>
+<text>&amp;#8853;</text>
+</entity>
+
+<entity name="sup"
+ type="cdata"
+>
+<text-expanded>&amp;#8835;</text-expanded>
+<text>&amp;#8835;</text>
+</entity>
+
+<entity name="Upsilon"
+ type="cdata"
+>
+<text-expanded>&amp;#933;</text-expanded>
+<text>&amp;#933;</text>
+</entity>
+
+<entity name="exist"
+ type="cdata"
+>
+<text-expanded>&amp;#8707;</text-expanded>
+<text>&amp;#8707;</text>
+</entity>
+
+<entity name="Eta"
+ type="cdata"
+>
+<text-expanded>&amp;#919;</text-expanded>
+<text>&amp;#919;</text>
+</entity>
+
+<entity name="zwnj"
+ type="cdata"
+>
+<text-expanded>&amp;#8204;</text-expanded>
+<text>&amp;#8204;</text>
+</entity>
+
+<entity name="Acirc"
+ type="cdata"
+>
+<text-expanded>&amp;#194;</text-expanded>
+<text>&amp;#194;</text>
+</entity>
+
+<entity name="Lambda"
+ type="cdata"
+>
+<text-expanded>&amp;#923;</text-expanded>
+<text>&amp;#923;</text>
+</entity>
+
+<entity name="Sigma"
+ type="cdata"
+>
+<text-expanded>&amp;#931;</text-expanded>
+<text>&amp;#931;</text>
+</entity>
+
+<entity name="rsquo"
+ type="cdata"
+>
+<text-expanded>&amp;#8217;</text-expanded>
+<text>&amp;#8217;</text>
+</entity>
+
+<entity name="AElig"
+ type="cdata"
+>
+<text-expanded>&amp;#198;</text-expanded>
+<text>&amp;#198;</text>
+</entity>
+
+<entity name="deg"
+ type="cdata"
+>
+<text-expanded>&amp;#176;</text-expanded>
+<text>&amp;#176;</text>
+</entity>
+
+<entity name="euml"
+ type="cdata"
+>
+<text-expanded>&amp;#235;</text-expanded>
+<text>&amp;#235;</text>
+</entity>
+
+<entity name="ucirc"
+ type="cdata"
+>
+<text-expanded>&amp;#251;</text-expanded>
+<text>&amp;#251;</text>
+</entity>
+
+<entity name="chi"
+ type="cdata"
+>
+<text-expanded>&amp;#967;</text-expanded>
+<text>&amp;#967;</text>
+</entity>
+
+<entity name="and"
+ type="cdata"
+>
+<text-expanded>&amp;#8743;</text-expanded>
+<text>&amp;#8743;</text>
+</entity>
+
+<entity name="omega"
+ type="cdata"
+>
+<text-expanded>&amp;#969;</text-expanded>
+<text>&amp;#969;</text>
+</entity>
+
+<entity name="ang"
+ type="cdata"
+>
+<text-expanded>&amp;#8736;</text-expanded>
+<text>&amp;#8736;</text>
+</entity>
+
+<entity name="THORN"
+ type="cdata"
+>
+<text-expanded>&amp;#222;</text-expanded>
+<text>&amp;#222;</text>
+</entity>
+
+<entity name="Atilde"
+ type="cdata"
+>
+<text-expanded>&amp;#195;</text-expanded>
+<text>&amp;#195;</text>
+</entity>
+
+<entity name="hellip"
+ type="cdata"
+>
+<text-expanded>&amp;#8230;</text-expanded>
+<text>&amp;#8230;</text>
+</entity>
+
+<entity name="phi"
+ type="cdata"
+>
+<text-expanded>&amp;#966;</text-expanded>
+<text>&amp;#966;</text>
+</entity>
+
+<entity name="szlig"
+ type="cdata"
+>
+<text-expanded>&amp;#223;</text-expanded>
+<text>&amp;#223;</text>
+</entity>
+
+<entity name="Ecirc"
+ type="cdata"
+>
+<text-expanded>&amp;#202;</text-expanded>
+<text>&amp;#202;</text>
+</entity>
+
+<entity name="iuml"
+ type="cdata"
+>
+<text-expanded>&amp;#239;</text-expanded>
+<text>&amp;#239;</text>
+</entity>
+
+<entity name="nabla"
+ type="cdata"
+>
+<text-expanded>&amp;#8711;</text-expanded>
+<text>&amp;#8711;</text>
+</entity>
+
+<entity name="scaron"
+ type="cdata"
+>
+<text-expanded>&amp;#353;</text-expanded>
+<text>&amp;#353;</text>
+</entity>
+
+<entity name="macr"
+ type="cdata"
+>
+<text-expanded>&amp;#175;</text-expanded>
+<text>&amp;#175;</text>
+</entity>
+
+<entity name="dagger"
+ type="cdata"
+>
+<text-expanded>&amp;#8224;</text-expanded>
+<text>&amp;#8224;</text>
+</entity>
+
+<entity name="supe"
+ type="cdata"
+>
+<text-expanded>&amp;#8839;</text-expanded>
+<text>&amp;#8839;</text>
+</entity>
+
+<entity name="ensp"
+ type="cdata"
+>
+<text-expanded>&amp;#8194;</text-expanded>
+<text>&amp;#8194;</text>
+</entity>
+
+<entity name="cap"
+ type="cdata"
+>
+<text-expanded>&amp;#8745;</text-expanded>
+<text>&amp;#8745;</text>
+</entity>
+
+<entity name="Iacute"
+ type="cdata"
+>
+<text-expanded>&amp;#205;</text-expanded>
+<text>&amp;#205;</text>
+</entity>
+
+<entity name="aelig"
+ type="cdata"
+>
+<text-expanded>&amp;#230;</text-expanded>
+<text>&amp;#230;</text>
+</entity>
+
+<entity name="Iota"
+ type="cdata"
+>
+<text-expanded>&amp;#921;</text-expanded>
+<text>&amp;#921;</text>
+</entity>
+
+<entity name="Psi"
+ type="cdata"
+>
+<text-expanded>&amp;#936;</text-expanded>
+<text>&amp;#936;</text>
+</entity>
+
+<entity name="nsub"
+ type="cdata"
+>
+<text-expanded>&amp;#8836;</text-expanded>
+<text>&amp;#8836;</text>
+</entity>
+
+<entity name="Icirc"
+ type="cdata"
+>
+<text-expanded>&amp;#206;</text-expanded>
+<text>&amp;#206;</text>
+</entity>
+
+<entity name="iexcl"
+ type="cdata"
+>
+<text-expanded>&amp;#161;</text-expanded>
+<text>&amp;#161;</text>
+</entity>
+
+<entity name="Ograve"
+ type="cdata"
+>
+<text-expanded>&amp;#210;</text-expanded>
+<text>&amp;#210;</text>
+</entity>
+
+<entity name="yen"
+ type="cdata"
+>
+<text-expanded>&amp;#165;</text-expanded>
+<text>&amp;#165;</text>
+</entity>
+
+<entity name="Ouml"
+ type="cdata"
+>
+<text-expanded>&amp;#214;</text-expanded>
+<text>&amp;#214;</text>
+</entity>
+
+<entity name="frac12"
+ type="cdata"
+>
+<text-expanded>&amp;#189;</text-expanded>
+<text>&amp;#189;</text>
+</entity>
+
+<entity name="oslash"
+ type="cdata"
+>
+<text-expanded>&amp;#248;</text-expanded>
+<text>&amp;#248;</text>
+</entity>
+
+<entity name="alefsym"
+ type="cdata"
+>
+<text-expanded>&amp;#8501;</text-expanded>
+<text>&amp;#8501;</text>
+</entity>
+
+<entity name="Egrave"
+ type="cdata"
+>
+<text-expanded>&amp;#200;</text-expanded>
+<text>&amp;#200;</text>
+</entity>
+
+<entity name="frac14"
+ type="cdata"
+>
+<text-expanded>&amp;#188;</text-expanded>
+<text>&amp;#188;</text>
+</entity>
+
+<entity name="micro"
+ type="cdata"
+>
+<text-expanded>&amp;#181;</text-expanded>
+<text>&amp;#181;</text>
+</entity>
+
+<entity name="real"
+ type="cdata"
+>
+<text-expanded>&amp;#8476;</text-expanded>
+<text>&amp;#8476;</text>
+</entity>
+
+<entity name="int"
+ type="cdata"
+>
+<text-expanded>&amp;#8747;</text-expanded>
+<text>&amp;#8747;</text>
+</entity>
+
+<entity name="Mu"
+ type="cdata"
+>
+<text-expanded>&amp;#924;</text-expanded>
+<text>&amp;#924;</text>
+</entity>
+
+<entity name="bdquo"
+ type="cdata"
+>
+<text-expanded>&amp;#8222;</text-expanded>
+<text>&amp;#8222;</text>
+</entity>
+
+<entity name="darr"
+ type="cdata"
+>
+<text-expanded>&amp;#8595;</text-expanded>
+<text>&amp;#8595;</text>
+</entity>
+
+<entity name="permil"
+ type="cdata"
+>
+<text-expanded>&amp;#8240;</text-expanded>
+<text>&amp;#8240;</text>
+</entity>
+
+<entity name="uarr"
+ type="cdata"
+>
+<text-expanded>&amp;#8593;</text-expanded>
+<text>&amp;#8593;</text>
+</entity>
+
+<entity name="raquo"
+ type="cdata"
+>
+<text-expanded>&amp;#187;</text-expanded>
+<text>&amp;#187;</text>
+</entity>
+
+<entity name="kappa"
+ type="cdata"
+>
+<text-expanded>&amp;#954;</text-expanded>
+<text>&amp;#954;</text>
+</entity>
+
+<entity name="middot"
+ type="cdata"
+>
+<text-expanded>&amp;#183;</text-expanded>
+<text>&amp;#183;</text>
+</entity>
+
+<entity name="times"
+ type="cdata"
+>
+<text-expanded>&amp;#215;</text-expanded>
+<text>&amp;#215;</text>
+</entity>
+
+<entity name="sube"
+ type="cdata"
+>
+<text-expanded>&amp;#8838;</text-expanded>
+<text>&amp;#8838;</text>
+</entity>
+
+<entity name="piv"
+ type="cdata"
+>
+<text-expanded>&amp;#982;</text-expanded>
+<text>&amp;#982;</text>
+</entity>
+
+<entity name="sect"
+ type="cdata"
+>
+<text-expanded>&amp;#167;</text-expanded>
+<text>&amp;#167;</text>
+</entity>
+
+<entity name="le"
+ type="cdata"
+>
+<text-expanded>&amp;#8804;</text-expanded>
+<text>&amp;#8804;</text>
+</entity>
+
+<entity name="sbquo"
+ type="cdata"
+>
+<text-expanded>&amp;#8218;</text-expanded>
+<text>&amp;#8218;</text>
+</entity>
+
+<entity name="plusmn"
+ type="cdata"
+>
+<text-expanded>&amp;#177;</text-expanded>
+<text>&amp;#177;</text>
+</entity>
+
+<entity name="curren"
+ type="cdata"
+>
+<text-expanded>&amp;#164;</text-expanded>
+<text>&amp;#164;</text>
+</entity>
+
+<entity name="Alpha"
+ type="cdata"
+>
+<text-expanded>&amp;#913;</text-expanded>
+<text>&amp;#913;</text>
+</entity>
+
+<entity name="harr"
+ type="cdata"
+>
+<text-expanded>&amp;#8596;</text-expanded>
+<text>&amp;#8596;</text>
+</entity>
+
+<entity name="not"
+ type="cdata"
+>
+<text-expanded>&amp;#172;</text-expanded>
+<text>&amp;#172;</text>
+</entity>
+
+<entity name="uuml"
+ type="cdata"
+>
+<text-expanded>&amp;#252;</text-expanded>
+<text>&amp;#252;</text>
+</entity>
+
+<entity name="yacute"
+ type="cdata"
+>
+<text-expanded>&amp;#253;</text-expanded>
+<text>&amp;#253;</text>
+</entity>
+
+<entity name="cong"
+ type="cdata"
+>
+<text-expanded>&amp;#8773;</text-expanded>
+<text>&amp;#8773;</text>
+</entity>
+
+<entity name="omicron"
+ type="cdata"
+>
+<text-expanded>&amp;#959;</text-expanded>
+<text>&amp;#959;</text>
+</entity>
+
+<entity name="rfloor"
+ type="cdata"
+>
+<text-expanded>&amp;#8971;</text-expanded>
+<text>&amp;#8971;</text>
+</entity>
+
+<entity name="oacute"
+ type="cdata"
+>
+<text-expanded>&amp;#243;</text-expanded>
+<text>&amp;#243;</text>
+</entity>
+
+<entity name="trade"
+ type="cdata"
+>
+<text-expanded>&amp;#8482;</text-expanded>
+<text>&amp;#8482;</text>
+</entity>
+
+<entity name="shy"
+ type="cdata"
+>
+<text-expanded>&amp;#173;</text-expanded>
+<text>&amp;#173;</text>
+</entity>
+
+<entity name="Zeta"
+ type="cdata"
+>
+<text-expanded>&amp;#918;</text-expanded>
+<text>&amp;#918;</text>
+</entity>
+
+<entity name="theta"
+ type="cdata"
+>
+<text-expanded>&amp;#952;</text-expanded>
+<text>&amp;#952;</text>
+</entity>
+
+<entity name="ordf"
+ type="cdata"
+>
+<text-expanded>&amp;#170;</text-expanded>
+<text>&amp;#170;</text>
+</entity>
+
+<entity name="eacute"
+ type="cdata"
+>
+<text-expanded>&amp;#233;</text-expanded>
+<text>&amp;#233;</text>
+</entity>
+
+<entity name="thetasym"
+ type="cdata"
+>
+<text-expanded>&amp;#977;</text-expanded>
+<text>&amp;#977;</text>
+</entity>
+
+<entity name="ugrave"
+ type="cdata"
+>
+<text-expanded>&amp;#249;</text-expanded>
+<text>&amp;#249;</text>
+</entity>
+
+<entity name="lt"
+ type="cdata"
+>
+<text-expanded>&amp;#60;</text-expanded>
+<text>&amp;#60;</text>
+</entity>
+
+<entity name="fnof"
+ type="cdata"
+>
+<text-expanded>&amp;#402;</text-expanded>
+<text>&amp;#402;</text>
+</entity>
+
+<entity name="ordm"
+ type="cdata"
+>
+<text-expanded>&amp;#186;</text-expanded>
+<text>&amp;#186;</text>
+</entity>
+
+<entity name="para"
+ type="cdata"
+>
+<text-expanded>&amp;#182;</text-expanded>
+<text>&amp;#182;</text>
+</entity>
+
+<entity name="larr"
+ type="cdata"
+>
+<text-expanded>&amp;#8592;</text-expanded>
+<text>&amp;#8592;</text>
+</entity>
+
+<entity name="yuml"
+ type="cdata"
+>
+<text-expanded>&amp;#255;</text-expanded>
+<text>&amp;#255;</text>
+</entity>
+
+<entity name="Nu"
+ type="cdata"
+>
+<text-expanded>&amp;#925;</text-expanded>
+<text>&amp;#925;</text>
+</entity>
+
+<entity name="diams"
+ type="cdata"
+>
+<text-expanded>&amp;#9830;</text-expanded>
+<text>&amp;#9830;</text>
+</entity>
+
+<entity name="agrave"
+ type="cdata"
+>
+<text-expanded>&amp;#224;</text-expanded>
+<text>&amp;#224;</text>
+</entity>
+
+<entity name="divide"
+ type="cdata"
+>
+<text-expanded>&amp;#247;</text-expanded>
+<text>&amp;#247;</text>
+</entity>
+
+<entity name="Scaron"
+ type="cdata"
+>
+<text-expanded>&amp;#352;</text-expanded>
+<text>&amp;#352;</text>
+</entity>
+
+<entity name="rang"
+ type="cdata"
+>
+<text-expanded>&amp;#9002;</text-expanded>
+<text>&amp;#9002;</text>
+</entity>
+
+<entity name="Dagger"
+ type="cdata"
+>
+<text-expanded>&amp;#8225;</text-expanded>
+<text>&amp;#8225;</text>
+</entity>
+
+<entity name="Tau"
+ type="cdata"
+>
+<text-expanded>&amp;#932;</text-expanded>
+<text>&amp;#932;</text>
+</entity>
+
+<entity name="nbsp"
+ type="cdata"
+>
+<text-expanded>&amp;#160;</text-expanded>
+<text>&amp;#160;</text>
+</entity>
+
+<entity name="eta"
+ type="cdata"
+>
+<text-expanded>&amp;#951;</text-expanded>
+<text>&amp;#951;</text>
+</entity>
+
+<entity name="sim"
+ type="cdata"
+>
+<text-expanded>&amp;#8764;</text-expanded>
+<text>&amp;#8764;</text>
+</entity>
+
+<entity name="lsquo"
+ type="cdata"
+>
+<text-expanded>&amp;#8216;</text-expanded>
+<text>&amp;#8216;</text>
+</entity>
+
+<entity name="rlm"
+ type="cdata"
+>
+<text-expanded>&amp;#8207;</text-expanded>
+<text>&amp;#8207;</text>
+</entity>
+
+<entity name="delta"
+ type="cdata"
+>
+<text-expanded>&amp;#948;</text-expanded>
+<text>&amp;#948;</text>
+</entity>
+
+<entity name="Ucirc"
+ type="cdata"
+>
+<text-expanded>&amp;#219;</text-expanded>
+<text>&amp;#219;</text>
+</entity>
+
+<entity name="otilde"
+ type="cdata"
+>
+<text-expanded>&amp;#245;</text-expanded>
+<text>&amp;#245;</text>
+</entity>
+
+<entity name="part"
+ type="cdata"
+>
+<text-expanded>&amp;#8706;</text-expanded>
+<text>&amp;#8706;</text>
+</entity>
+
+<entity name="Omicron"
+ type="cdata"
+>
+<text-expanded>&amp;#927;</text-expanded>
+<text>&amp;#927;</text>
+</entity>
+
+<entity name="eth"
+ type="cdata"
+>
+<text-expanded>&amp;#240;</text-expanded>
+<text>&amp;#240;</text>
+</entity>
+
+<entity name="ocirc"
+ type="cdata"
+>
+<text-expanded>&amp;#244;</text-expanded>
+<text>&amp;#244;</text>
+</entity>
+
+<entity name="Omega"
+ type="cdata"
+>
+<text-expanded>&amp;#937;</text-expanded>
+<text>&amp;#937;</text>
+</entity>
+
+<entity name="beta"
+ type="cdata"
+>
+<text-expanded>&amp;#946;</text-expanded>
+<text>&amp;#946;</text>
+</entity>
+
+<entity name="Oslash"
+ type="cdata"
+>
+<text-expanded>&amp;#216;</text-expanded>
+<text>&amp;#216;</text>
+</entity>
+
+<entity name="epsilon"
+ type="cdata"
+>
+<text-expanded>&amp;#949;</text-expanded>
+<text>&amp;#949;</text>
+</entity>
+
+<entity name="notin"
+ type="cdata"
+>
+<text-expanded>&amp;#8713;</text-expanded>
+<text>&amp;#8713;</text>
+</entity>
+
+<entity name="empty"
+ type="cdata"
+>
+<text-expanded>&amp;#8709;</text-expanded>
+<text>&amp;#8709;</text>
+</entity>
+
+<entity name="reg"
+ type="cdata"
+>
+<text-expanded>&amp;#174;</text-expanded>
+<text>&amp;#174;</text>
+</entity>
+
+<entity name="hearts"
+ type="cdata"
+>
+<text-expanded>&amp;#9829;</text-expanded>
+<text>&amp;#9829;</text>
+</entity>
+
+<entity name="Auml"
+ type="cdata"
+>
+<text-expanded>&amp;#196;</text-expanded>
+<text>&amp;#196;</text>
+</entity>
+
+<entity name="frac34"
+ type="cdata"
+>
+<text-expanded>&amp;#190;</text-expanded>
+<text>&amp;#190;</text>
+</entity>
+
+<entity name="mu"
+ type="cdata"
+>
+<text-expanded>&amp;#956;</text-expanded>
+<text>&amp;#956;</text>
+</entity>
+
+<entity name="sdot"
+ type="cdata"
+>
+<text-expanded>&amp;#8901;</text-expanded>
+<text>&amp;#8901;</text>
+</entity>
+
+<entity name="asymp"
+ type="cdata"
+>
+<text-expanded>&amp;#8776;</text-expanded>
+<text>&amp;#8776;</text>
+</entity>
+
+<entity name="thinsp"
+ type="cdata"
+>
+<text-expanded>&amp;#8201;</text-expanded>
+<text>&amp;#8201;</text>
+</entity>
+
+<entity name="cent"
+ type="cdata"
+>
+<text-expanded>&amp;#162;</text-expanded>
+<text>&amp;#162;</text>
+</entity>
+
+<entity name="circ"
+ type="cdata"
+>
+<text-expanded>&amp;#710;</text-expanded>
+<text>&amp;#710;</text>
+</entity>
+
+<entity name="sigmaf"
+ type="cdata"
+>
+<text-expanded>&amp;#962;</text-expanded>
+<text>&amp;#962;</text>
+</entity>
+
+<entity name="Rho"
+ type="cdata"
+>
+<text-expanded>&amp;#929;</text-expanded>
+<text>&amp;#929;</text>
+</entity>
+
+<element name="TT" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="TT">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="FIELDSET" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ <element-name name="LEGEND"/>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ <element-name name="LEGEND"/>
+ <sequence-group occurrence="*">
+ <parament-name name="flow"/>
+ </sequence-group>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="FIELDSET">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="STYLE" stagm="-" etagm="-"
+ content-type="cdata">
+<content-model-expanded>
+ <cdata/>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="StyleSheet"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="STYLE">
+<attdecl>
+ %i18n; -- lang, dir, for use with title --
+ type %ContentType; #REQUIRED -- content type of style language --
+ media %MediaDesc; #IMPLIED -- designed for use with these media --
+ title %Text; #IMPLIED -- advisory title --
+ </attdecl>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="media"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="PARAM" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="PARAM">
+<attdecl>
+ id ID #IMPLIED -- document-wide unique id --
+ name CDATA #REQUIRED -- property name --
+ value CDATA #IMPLIED -- property value --
+ valuetype (DATA|REF|OBJECT) DATA -- How to interpret value --
+ type %ContentType; #IMPLIED -- content type for value
+ when valuetype=ref --
+ </attdecl>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="value"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="valuetype"
+ type=""
+ enumeration="yes"
+ value="DATA REF OBJECT"
+ default="DATA"/>
+<attribute name="name"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="BIG" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="BIG">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="ACRONYM" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="ACRONYM">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="BLOCKQUOTE" stagm="-" etagm="-"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="+">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <element-name name="SCRIPT"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="+">
+ <parament-name name="block"/>
+ <element-name name="SCRIPT"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="BLOCKQUOTE">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ cite %URI; #IMPLIED -- URI for source document or msg --
+ </attdecl>
+<attribute name="cite"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="COLGROUP" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="*">
+ <element-name name="COL"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <element-name name="COL"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="COLGROUP">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ span NUMBER 1 -- default number of columns in group --
+ width %MultiLength; #IMPLIED -- default width for enclosed COLs --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="span"
+ type=""
+ value="NUMBER"
+ default="1"/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="KBD" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="KBD">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="CAPTION" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="CAPTION">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="META" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="META">
+<attdecl>
+ %i18n; -- lang, dir, for use with content --
+ http-equiv NAME #IMPLIED -- HTTP response header name --
+ name NAME #IMPLIED -- metainformation name --
+ content CDATA #REQUIRED -- associated information --
+ scheme CDATA #IMPLIED -- select form of content --
+ </attdecl>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="scheme"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="content"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="http-equiv"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+</attlist>
+
+<element name="LEGEND" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="LEGEND">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ </attdecl>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="BR" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="BR">
+<attdecl>
+ %coreattrs; -- id, class, style, title --
+ </attdecl>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+</attlist>
+
+<element name="UL" stagm="-" etagm="-"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="LI"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="LI"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="UL">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="LINK" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="LINK">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ charset %Charset; #IMPLIED -- char encoding of linked resource --
+ href %URI; #IMPLIED -- URI for linked resource --
+ hreflang %LanguageCode; #IMPLIED -- language code --
+ type %ContentType; #IMPLIED -- advisory content type --
+ rel %LinkTypes; #IMPLIED -- forward link types --
+ rev %LinkTypes; #IMPLIED -- reverse link types --
+ media %MediaDesc; #IMPLIED -- for rendering on these media --
+ </attdecl>
+<attribute name="rev"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="media"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="hreflang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="href"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="rel"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="PRE" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+<exclusions>
+ <or-group>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ </or-group>
+</exclusions>
+</element>
+
+<attlist name="PRE">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="NOSCRIPT" stagm="-" etagm="-"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="+">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <parament-name name="block"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="NOSCRIPT">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="SCRIPT" stagm="-" etagm="-"
+ content-type="cdata">
+<content-model-expanded>
+ <cdata/>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Script"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="SCRIPT">
+<attdecl>
+ charset %Charset; #IMPLIED -- char encoding of linked resource --
+ type %ContentType; #REQUIRED -- content type of script language --
+ src %URI; #IMPLIED -- URI for an external script --
+ defer (defer) #IMPLIED -- UA may defer execution of script --
+ event CDATA #IMPLIED -- reserved for possible future use --
+ for %URI; #IMPLIED -- reserved for possible future use --
+ </attdecl>
+<attribute name="charset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="event"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="src"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="for"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="defer"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="defer"
+ default=""/>
+<attribute name="type"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="TBODY" stagm="O" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="TR"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="TR"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="TBODY">
+<attdecl> -- table section --
+ %attrs; -- %coreattrs, %i18n, %events --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="TFOOT" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="TR"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="TR"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="TFOOT">
+<attdecl> -- table section --
+ %attrs; -- %coreattrs, %i18n, %events --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="HTML" stagm="O" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="HEAD"/>
+ <element-name name="BODY"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="html.content"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="HTML">
+<attdecl>
+ %i18n; -- lang, dir --
+ </attdecl>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+</attlist>
+
+<element name="SUB" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="SUB">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="CODE" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="CODE">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="ADDRESS" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="ADDRESS">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="COL" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="COL">
+<attdecl> -- column groups and properties --
+ %attrs; -- %coreattrs, %i18n, %events --
+ span NUMBER 1 -- COL attributes affect N columns --
+ width %MultiLength; #IMPLIED -- column width specification --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="span"
+ type=""
+ value="NUMBER"
+ default="1"/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="SUP" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="SUP">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="STRONG" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="STRONG">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="HEAD" stagm="O" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <and-group>
+ <element-name name="TITLE"/>
+ <element-name name="BASE" occurrence="?"/>
+ </and-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="head.content"/>
+ </sequence-group>
+</content-model>
+<inclusions>
+ <or-group>
+ <element-name name="SCRIPT"/>
+ <element-name name="STYLE"/>
+ <element-name name="META"/>
+ <element-name name="LINK"/>
+ <element-name name="OBJECT"/>
+ </or-group>
+</inclusions>
+</element>
+
+<attlist name="HEAD">
+<attdecl>
+ %i18n; -- lang, dir --
+ profile %URI; #IMPLIED -- named dictionary of meta info --
+ </attdecl>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="profile"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="VAR" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="VAR">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="MAP" stagm="-" etagm="-"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="+">
+ <or-group>
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ </or-group>
+ <element-name name="AREA"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="+">
+ <sequence-group>
+ <parament-name name="block"/>
+ </sequence-group>
+ <element-name name="AREA"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="MAP">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ name CDATA #REQUIRED -- for reference by usemap --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="SAMP" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="SAMP">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="IMG" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="IMG">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ src %URI; #REQUIRED -- URI of image to embed --
+ alt %Text; #REQUIRED -- short description --
+ longdesc %URI; #IMPLIED -- link to long description
+ (complements alt) --
+ name CDATA #IMPLIED -- name of image for scripting --
+ height %Length; #IMPLIED -- override height --
+ width %Length; #IMPLIED -- override width --
+ usemap %URI; #IMPLIED -- use client-side image map --
+ ismap (ismap) #IMPLIED -- use server-side image map --
+ </attdecl>
+<attribute name="ismap"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ismap"
+ default=""/>
+<attribute name="longdesc"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="src"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="alt"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="height"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="usemap"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="A" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+<exclusions>
+ <sequence-group>
+ <element-name name="A"/>
+ </sequence-group>
+</exclusions>
+</element>
+
+<attlist name="A">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ charset %Charset; #IMPLIED -- char encoding of linked resource --
+ type %ContentType; #IMPLIED -- advisory content type --
+ name CDATA #IMPLIED -- named link end --
+ href %URI; #IMPLIED -- URI for linked resource --
+ hreflang %LanguageCode; #IMPLIED -- language code --
+ rel %LinkTypes; #IMPLIED -- forward link types --
+ rev %LinkTypes; #IMPLIED -- reverse link types --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ shape %Shape; rect -- for use with client-side image maps --
+ coords %Coords; #IMPLIED -- for use with client-side image maps --
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ </attdecl>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="NUMBER"
+ default=""/>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="rev"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="hreflang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="href"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="rel"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="shape"
+ type=""
+ enumeration="yes"
+ value="rect circle poly default"
+ default="rect"/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="coords"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="B" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="B">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="H1" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="H1">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="H2" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="H2">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="H3" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="H3">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="OPTGROUP" stagm="-" etagm="-"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="OPTION"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="OPTION"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="OPTGROUP">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ disabled (disabled) #IMPLIED -- unavailable in this context --
+ label %Text; #REQUIRED -- for use in hierarchical menus --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="label"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="H4" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="H4">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="LABEL" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+<exclusions>
+ <sequence-group>
+ <element-name name="LABEL"/>
+ </sequence-group>
+</exclusions>
+</element>
+
+<attlist name="LABEL">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ for IDREF #IMPLIED -- matches field ID value --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ </attdecl>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="for"
+ type="#IMPLIED"
+ value="IDREF"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="H5" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="H5">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="DEL" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="DEL">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ cite %URI; #IMPLIED -- info on reason for change --
+ datetime %Datetime; #IMPLIED -- date and time of change --
+ </attdecl>
+<attribute name="cite"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="datetime"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="H6" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="H6">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="I" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="I">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="OL" stagm="-" etagm="-"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="LI"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="LI"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="OL">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="TEXTAREA" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="TEXTAREA">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ name CDATA #IMPLIED
+ rows NUMBER #REQUIRED
+ cols NUMBER #REQUIRED
+ disabled (disabled) #IMPLIED -- unavailable in this context --
+ readonly (readonly) #IMPLIED
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ onselect %Script; #IMPLIED -- some text was selected --
+ onchange %Script; #IMPLIED -- the element value was changed --
+ %reserved; -- reserved for possible future use --
+ </attdecl>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="NUMBER"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="rows"
+ type="#REQUIRED"
+ value="NUMBER"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onchange"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="cols"
+ type="#REQUIRED"
+ value="NUMBER"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onselect"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="readonly"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="readonly"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="DD" stagm="-" etagm="O"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="DD">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="P" stagm="-" etagm="O"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="P">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="SELECT" stagm="-" etagm="-"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="+">
+ <element-name name="OPTGROUP"/>
+ <element-name name="OPTION"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="+">
+ <element-name name="OPTGROUP"/>
+ <element-name name="OPTION"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="SELECT">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ name CDATA #IMPLIED -- field name --
+ size NUMBER #IMPLIED -- rows visible --
+ multiple (multiple) #IMPLIED -- default is single selection --
+ disabled (disabled) #IMPLIED -- unavailable in this context --
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ onchange %Script; #IMPLIED -- the element value was changed --
+ %reserved; -- reserved for possible future use --
+ </attdecl>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="NUMBER"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="size"
+ type="#IMPLIED"
+ value="NUMBER"
+ default=""/>
+<attribute name="onchange"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="multiple"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="multiple"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="Q" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="Q">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ cite %URI; #IMPLIED -- URI for source document or msg --
+ </attdecl>
+<attribute name="cite"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="TABLE" stagm="-" etagm="-"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="CAPTION" occurrence="?"/>
+ <or-group>
+ <element-name name="COL" occurrence="*"/>
+ <element-name name="COLGROUP" occurrence="*"/>
+ </or-group>
+ <element-name name="THEAD" occurrence="?"/>
+ <element-name name="TFOOT" occurrence="?"/>
+ <element-name name="TBODY" occurrence="+"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="CAPTION" occurrence="?"/>
+ <or-group>
+ <element-name name="COL" occurrence="*"/>
+ <element-name name="COLGROUP" occurrence="*"/>
+ </or-group>
+ <element-name name="THEAD" occurrence="?"/>
+ <element-name name="TFOOT" occurrence="?"/>
+ <element-name name="TBODY" occurrence="+"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="TABLE">
+<attdecl> -- table element --
+ %attrs; -- %coreattrs, %i18n, %events --
+ summary %Text; #IMPLIED -- purpose/structure for speech output--
+ width %Length; #IMPLIED -- table width --
+ border %Pixels; #IMPLIED -- controls frame width around table --
+ frame %TFrame; #IMPLIED -- which parts of frame to render --
+ rules %TRules; #IMPLIED -- rulings between rows and cols --
+ cellspacing %Length; #IMPLIED -- spacing between cells --
+ cellpadding %Length; #IMPLIED -- spacing within cells --
+ %reserved; -- reserved for possible future use --
+ datapagesize CDATA #IMPLIED -- reserved for possible future use --
+ </attdecl>
+<attribute name="rules"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="none groups rows cols all"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="summary"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="cellspacing"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="frame"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="void above below hsides lhs rhs vsides box border"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="cellpadding"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="border"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="datapagesize"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="DL" stagm="-" etagm="-"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="+">
+ <element-name name="DT"/>
+ <element-name name="DD"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="+">
+ <element-name name="DT"/>
+ <element-name name="DD"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="DL">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="DIV" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="DIV">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ %reserved; -- reserved for possible future use --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="BUTTON" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="flow"/>
+ </sequence-group>
+</content-model>
+<exclusions>
+ <or-group>
+ <element-name name="A"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ <element-name name="FORM"/>
+ <element-name name="FIELDSET"/>
+ </or-group>
+</exclusions>
+</element>
+
+<attlist name="BUTTON">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED -- sent to server when submitted --
+ type (button|submit|reset) submit -- for use as form button --
+ disabled (disabled) #IMPLIED -- unavailable in this context --
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ %reserved; -- reserved for possible future use --
+ </attdecl>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="NUMBER"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type=""
+ enumeration="yes"
+ value="button submit reset"
+ default="submit"/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="value"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="FORM" stagm="-" etagm="-"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="+">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <element-name name="SCRIPT"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="+">
+ <parament-name name="block"/>
+ <element-name name="SCRIPT"/>
+ </or-group>
+</content-model>
+<exclusions>
+ <sequence-group>
+ <element-name name="FORM"/>
+ </sequence-group>
+</exclusions>
+</element>
+
+<attlist name="FORM">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ action %URI; #REQUIRED -- server-side form handler --
+ method (GET|POST) GET -- HTTP method used to submit the form--
+ enctype %ContentType; "application/x-www-form-urlencoded"
+ accept %ContentTypes; #IMPLIED -- list of MIME types for file upload --
+ name CDATA #IMPLIED -- name of form for scripting --
+ onsubmit %Script; #IMPLIED -- the form was submitted --
+ onreset %Script; #IMPLIED -- the form was reset --
+ accept-charset %Charsets; #IMPLIED -- list of supported charsets --
+ </attdecl>
+<attribute name="accept-charset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onsubmit"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="method"
+ type=""
+ enumeration="yes"
+ value="GET POST"
+ default="GET"/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="accept"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onreset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="enctype"
+ type=""
+ value="CDATA"
+ default="application/x-www-form-urlencoded"/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="action"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="DT" stagm="-" etagm="O"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="DT">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="OBJECT" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="PARAM"/>
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="*">
+ <element-name name="PARAM"/>
+ <parament-name name="flow"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="OBJECT">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ declare (declare) #IMPLIED -- declare but don't instantiate flag --
+ classid %URI; #IMPLIED -- identifies an implementation --
+ codebase %URI; #IMPLIED -- base URI for classid, data, archive--
+ data %URI; #IMPLIED -- reference to object's data --
+ type %ContentType; #IMPLIED -- content type for data --
+ codetype %ContentType; #IMPLIED -- content type for code --
+ archive CDATA #IMPLIED -- space-separated list of URIs --
+ standby %Text; #IMPLIED -- message to show while loading --
+ height %Length; #IMPLIED -- override height --
+ width %Length; #IMPLIED -- override width --
+ usemap %URI; #IMPLIED -- use client-side image map --
+ name CDATA #IMPLIED -- submit as part of form --
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ %reserved; -- reserved for possible future use --
+ </attdecl>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="NUMBER"
+ default=""/>
+<attribute name="codebase"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="archive"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="data"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="codetype"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="classid"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="height"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="standby"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="declare"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="declare"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="usemap"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="BDO" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="BDO">
+<attdecl>
+ %coreattrs; -- id, class, style, title --
+ lang %LanguageCode; #IMPLIED -- language code --
+ dir (ltr|rtl) #REQUIRED -- directionality --
+ </attdecl>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#REQUIRED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+</attlist>
+
+<element name="THEAD" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="TR"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="TR"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="THEAD">
+<attdecl> -- table section --
+ %attrs; -- %coreattrs, %i18n, %events --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="SMALL" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="SMALL">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="LI" stagm="-" etagm="O"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="LI">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="HR" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="HR">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="ABBR" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="ABBR">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="DFN" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="DFN">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="TITLE" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+<exclusions>
+ <or-group>
+ <element-name name="SCRIPT"/>
+ <element-name name="STYLE"/>
+ <element-name name="META"/>
+ <element-name name="LINK"/>
+ <element-name name="OBJECT"/>
+ </or-group>
+</exclusions>
+</element>
+
+<attlist name="TITLE">
+<attdecl> %i18n</attdecl>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+</attlist>
+
+<element name="AREA" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="AREA">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ shape %Shape; rect -- controls interpretation of coords --
+ coords %Coords; #IMPLIED -- comma-separated list of lengths --
+ href %URI; #IMPLIED -- URI for linked resource --
+ nohref (nohref) #IMPLIED -- this region has no action --
+ alt %Text; #REQUIRED -- short description --
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ </attdecl>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="NUMBER"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="href"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="shape"
+ type=""
+ enumeration="yes"
+ value="rect circle poly default"
+ default="rect"/>
+<attribute name="alt"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="nohref"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="nohref"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="coords"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="OPTION" stagm="-" etagm="O"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="OPTION">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ selected (selected) #IMPLIED
+ disabled (disabled) #IMPLIED -- unavailable in this context --
+ label %Text; #IMPLIED -- for use in hierarchical menus --
+ value CDATA #IMPLIED -- defaults to element content --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="value"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="label"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="selected"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="selected"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="TD" stagm="-" etagm="O"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="TD">
+<attdecl> -- header or data cell --
+ %attrs; -- %coreattrs, %i18n, %events --
+ abbr %Text; #IMPLIED -- abbreviation for header cell --
+ axis CDATA #IMPLIED -- comma-separated list of related headers--
+ headers IDREFS #IMPLIED -- list of id's for header cells --
+ scope %Scope; #IMPLIED -- scope covered by header cells --
+ rowspan NUMBER 1 -- number of rows spanned by cell --
+ colspan NUMBER 1 -- number of cols spanned by cell --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="headers"
+ type="#IMPLIED"
+ value="IDREFS"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="abbr"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="scope"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="row col rowgroup colgroup"
+ default=""/>
+<attribute name="colspan"
+ type=""
+ value="NUMBER"
+ default="1"/>
+<attribute name="rowspan"
+ type=""
+ value="NUMBER"
+ default="1"/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="axis"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="INS" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="INS">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ cite %URI; #IMPLIED -- info on reason for change --
+ datetime %Datetime; #IMPLIED -- date and time of change --
+ </attdecl>
+<attribute name="cite"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="datetime"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="TH" stagm="-" etagm="O"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="TH">
+<attdecl> -- header or data cell --
+ %attrs; -- %coreattrs, %i18n, %events --
+ abbr %Text; #IMPLIED -- abbreviation for header cell --
+ axis CDATA #IMPLIED -- comma-separated list of related headers--
+ headers IDREFS #IMPLIED -- list of id's for header cells --
+ scope %Scope; #IMPLIED -- scope covered by header cells --
+ rowspan NUMBER 1 -- number of rows spanned by cell --
+ colspan NUMBER 1 -- number of cols spanned by cell --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="headers"
+ type="#IMPLIED"
+ value="IDREFS"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="abbr"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="scope"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="row col rowgroup colgroup"
+ default=""/>
+<attribute name="colspan"
+ type=""
+ value="NUMBER"
+ default="1"/>
+<attribute name="rowspan"
+ type=""
+ value="NUMBER"
+ default="1"/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="axis"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="SPAN" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="SPAN">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ %reserved; -- reserved for possible future use --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="EM" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="EM">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="CITE" stagm="-" etagm="-"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="TT"/>
+ <element-name name="I"/>
+ <element-name name="B"/>
+ <element-name name="BIG"/>
+ <element-name name="SMALL"/>
+ <element-name name="EM"/>
+ <element-name name="STRONG"/>
+ <element-name name="DFN"/>
+ <element-name name="CODE"/>
+ <element-name name="SAMP"/>
+ <element-name name="KBD"/>
+ <element-name name="VAR"/>
+ <element-name name="CITE"/>
+ <element-name name="ABBR"/>
+ <element-name name="ACRONYM"/>
+ <element-name name="A"/>
+ <element-name name="IMG"/>
+ <element-name name="OBJECT"/>
+ <element-name name="BR"/>
+ <element-name name="SCRIPT"/>
+ <element-name name="MAP"/>
+ <element-name name="Q"/>
+ <element-name name="SUB"/>
+ <element-name name="SUP"/>
+ <element-name name="SPAN"/>
+ <element-name name="BDO"/>
+ <element-name name="INPUT"/>
+ <element-name name="SELECT"/>
+ <element-name name="TEXTAREA"/>
+ <element-name name="LABEL"/>
+ <element-name name="BUTTON"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <parament-name name="inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="CITE">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="BASE" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="BASE">
+<attdecl>
+ href %URI; #REQUIRED -- URI that acts as base URI --
+ </attdecl>
+<attribute name="href"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="TR" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="+">
+ <element-name name="TH"/>
+ <element-name name="TD"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="+">
+ <element-name name="TH"/>
+ <element-name name="TD"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="TR">
+<attdecl> -- table row --
+ %attrs; -- %coreattrs, %i18n, %events --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="BODY" stagm="O" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="+">
+ <element-name name="P"/>
+ <element-name name="H1"/>
+ <element-name name="H2"/>
+ <element-name name="H3"/>
+ <element-name name="H4"/>
+ <element-name name="H5"/>
+ <element-name name="H6"/>
+ <element-name name="UL"/>
+ <element-name name="OL"/>
+ <element-name name="PRE"/>
+ <element-name name="DL"/>
+ <element-name name="DIV"/>
+ <element-name name="NOSCRIPT"/>
+ <element-name name="BLOCKQUOTE"/>
+ <element-name name="FORM"/>
+ <element-name name="HR"/>
+ <element-name name="TABLE"/>
+ <element-name name="FIELDSET"/>
+ <element-name name="ADDRESS"/>
+ <element-name name="SCRIPT"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="+">
+ <parament-name name="block"/>
+ <element-name name="SCRIPT"/>
+ </or-group>
+</content-model>
+<inclusions>
+ <or-group>
+ <element-name name="INS"/>
+ <element-name name="DEL"/>
+ </or-group>
+</inclusions>
+</element>
+
+<attlist name="BODY">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ onload %Script; #IMPLIED -- the document has been loaded --
+ onunload %Script; #IMPLIED -- the document has been removed --
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onload"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onunload"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="INPUT" stagm="-" etagm="O"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="INPUT">
+<attdecl>
+ %attrs; -- %coreattrs, %i18n, %events --
+ type %InputType; TEXT -- what kind of widget is needed --
+ name CDATA #IMPLIED -- submit as part of form --
+ value CDATA #IMPLIED -- Specify for radio buttons and checkboxes --
+ checked (checked) #IMPLIED -- for radio buttons and check boxes --
+ disabled (disabled) #IMPLIED -- unavailable in this context --
+ readonly (readonly) #IMPLIED -- for text and passwd --
+ size CDATA #IMPLIED -- specific to each type of field --
+ maxlength NUMBER #IMPLIED -- max chars for text fields --
+ src %URI; #IMPLIED -- for fields with images --
+ alt CDATA #IMPLIED -- short description --
+ usemap %URI; #IMPLIED -- use client-side image map --
+ ismap (ismap) #IMPLIED -- use server-side image map --
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ onselect %Script; #IMPLIED -- some text was selected --
+ onchange %Script; #IMPLIED -- the element value was changed --
+ accept %ContentTypes; #IMPLIED -- list of MIME types for file upload --
+ %reserved; -- reserved for possible future use --
+ </attdecl>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NAME"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="src"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="size"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="checked"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="checked"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="value"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="accept"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="alt"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="NUMBER"
+ default=""/>
+<attribute name="maxlength"
+ type="#IMPLIED"
+ value="NUMBER"
+ default=""/>
+<attribute name="ismap"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ismap"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type=""
+ enumeration="yes"
+ value="TEXT PASSWORD CHECKBOX RADIO SUBMIT RESET FILE HIDDEN IMAGE BUTTON"
+ default="TEXT"/>
+<attribute name="onchange"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onselect"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="readonly"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="readonly"
+ default=""/>
+<attribute name="usemap"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+</dtd>
diff --git a/kate/xmltools/katexmltools.desktop b/kate/xmltools/katexmltools.desktop
new file mode 100644
index 0000000..ca3f7e8
--- /dev/null
+++ b/kate/xmltools/katexmltools.desktop
@@ -0,0 +1,129 @@
+[Desktop Entry]
+Type=Service
+ServiceTypes=Kate/Plugin
+X-KDE-Library=katexmltoolsplugin
+X-Kate-Version=2.5
+Name=Kate XML Completion
+Name[af]=Kate Xml Voltooiïng
+Name[az]=Kate XML Tamamlaması
+Name[bs]=Kate XML dovršavanje
+Name[ca]=Completat XML per a Kate
+Name[cs]=Kate modul pro doplňování XML
+Name[cy]=Cwblhad XML Kate
+Name[da]=Kate XML-Komplettering
+Name[de]=XML-Vervollständigung
+Name[el]=Kate XML συμπλήρωση
+Name[eo]=XML-kompletigo por Kodredaktilo
+Name[es]=Completado XML para Kate
+Name[et]=Kate XML soovitaja
+Name[eu]=Kateren XML osaketa
+Name[fa]=تکمیل Kate XML
+Name[fi]=Kate XML täydennys
+Name[fo]=Kate XML-ístingur
+Name[fr]=Complètement XML pour Kate
+Name[fy]=Kate XML-oanfolling
+Name[gl]=Completación de XML para Kate
+Name[he]=השלמת XML ל־Kate
+Name[hi]=के-एटीई एक्सएमएल कम्पलीशन
+Name[hr]=Kate XML dopunjavanje
+Name[hu]=Kate XML-szerkesztő
+Name[is]=Kate XML taga-lokun
+Name[it]=Completamento di XML di Kate
+Name[ja]=Kate XML 補完
+Name[ka]=XML დასრულება
+Name[kk]=Kate XML толтыру
+Name[km]=ការ​បំពេញ​របស់ Kate XML
+Name[lt]=Kate XML pabaigimas
+Name[mk]=XML-довршување за Кате
+Name[ms]=Kate XML Siap
+Name[nb]=Kate XML-fullføring
+Name[nds]=XML-Kompletteren för Kate
+Name[ne]=केट एक्सएमएल समाप्ति
+Name[nl]=Kate XML-aanvulling
+Name[nn]=Kate XML-fullføring
+Name[nso]=Phetso ya XML ya Kate
+Name[pa]=ਕੇਟ XML ਪੂਰਨਤਾ
+Name[pl]=Dopełnienie tekstu w XML
+Name[pt]=Completação de XML do Kate
+Name[pt_BR]=Complementação XML do Kate
+Name[ro]=Completare XML pentru Kate
+Name[ru]=Модуль Kate для заполнения XML
+Name[sk]=Kate XML dopĺňanie
+Name[sl]=Zaključevanje XML v Kate
+Name[sr]=Довршавање XML-а за Kate
+Name[sr@Latn]=Dovršavanje XML-a za Kate
+Name[sv]=Kates XML-komplettering
+Name[ta]=கேட் XML முழுமையாக்கம்
+Name[tg]=Модули Kate барои пур кардани XML
+Name[th]=ปลั๊กอินทำ XML ให้สมบูรณ์ของ Kate
+Name[tr]=Kate XML Tamamlama
+Name[uk]=Доповнення XML для Kate
+Name[uz]=Kate uchun XML toʻldirish
+Name[uz@cyrillic]=Kate учун XML тўлдириш
+Name[vi]=Gõ xong XML Kate
+Name[xh]=Ugqityo lwe Kate XML
+Name[zh_CN]=Kate XML 补齐
+Name[zh_TW]=Kate XML 補完
+Comment=Lists XML elements, attributes, attribute values and entities allowed by DTD
+Comment[af]=Lyste Xml elemente, eienskappe, kenmerk waardes en entiteite toegelaat deur Dtd
+Comment[az]=DTD tərəfindən qəbul edilən XML elementlərini, atributlarını, atribut qiymətlərini sıralayar
+Comment[bg]=Помощ при вмъкване на елементи, тагове и атрибути в документ XML
+Comment[bs]=Izlistava XML elemente, atribute, vrijednosti atributa i entitete koje dozvoljava DTD
+Comment[ca]=Llista els elements, atributs, valors dels atributs i entitats XML permeses per la DTD
+Comment[cs]=Vypisuje seznam XML prvků, atributů, hodnot atributů a entit povolených v DTD
+Comment[cy]=Rhestru elfennau, priodoleddau, gwerthoedd priodoleddau, ac endidau XML a chaniateir gan y DTD
+Comment[da]=Lister af XML-elementer, attributter, attributværdier og entiteter tilladt af DTD
+Comment[de]=Listet von der DTD erlaubte XML-Elemente, -Attribute, Attributwerte und Entities auf
+Comment[el]=Εμφανίζει στοιχεία (elements), ιδιότητες (attributes), τιμές ιδιοτήτων και οντότητες (entities) που επιτρέπει το DTD
+Comment[eo]=Listigas XML-erojn, atributojn, atribut-valorojn kaj unuojn permesitajn de la DTD
+Comment[es]=Listas de elementos XML, atributos, valores del atributo y entidades permitidas por DTD
+Comment[et]=XML elementide, atribuutide, atribuudiväärtuste ja DTD lubatud olemite nimekiri
+Comment[eu]=DTDk onartutako XML elementuak, atributuak, atributuen balioak eta entitateak zerrendatzen ditu
+Comment[fa]=عناصر XML، خصیصه‌ها، مقادیر خصیصه و هستارهای اجازه داده‌شده توسط DTD را فهرست می‌کند
+Comment[fi]=Listaa XML-elementit, attribuutit, attribuuttiarvot ja DTD:n sallimat entityt
+Comment[fo]=Vísir XML-eindir, eginleikir, eginleikisvirði og styttingar loyvdir av skjalaslagnum (DTD'in).
+Comment[fr]=Liste les éléments, attributs, valeurs d'attribut et entités XML autorisés par une DTD
+Comment[fy]=Opsomming fan XML-eleminten, attributen, attribútwearden en entiteiten tastien troch DTD
+Comment[ga]=Liostaigh eilimintí XML, aitreabúidí, luachanna aitreabúide agus aonáin atá ceadaithe ag an DTD
+Comment[gl]=Lista os elementos, atributos, valores de atributos e entidades permitidas en XML polo DTD
+Comment[he]=הצגת רשימה של מרכיבים, מאפיינים, ערכי מאפיינים וישויות XML שה־DTD מתיר
+Comment[hi]=डीटीडी के द्वारा स्वीकार्य एक्सएमएल अवयवों, एट्रिब्यूट्स, एट्रिब्यूट मूल्य तथा एंटिटीस को सूचीबद्ध करता है
+Comment[hr]=Ispisuje XML elemente, atribute, vrijednosti atributa i entitete dopuštene od strane DTD-a
+Comment[hu]=Kilistázza az XML elemeket, attribútumokat, attribútumértékeket és a DTD alapján az engedélyezett entitásokat
+Comment[is]=Sýnir XML stök, eiginleika, gildi og einindi sem leyfð eru af DTD
+Comment[it]=Elenca gli elementi XML, gli attributi, i valori degli attributi e le entità permesse dal DTD
+Comment[ja]=DTD で許可されている XML のエレメント、アトリビュートおよびその値やエンティティを表示します
+Comment[ka]=ჩამოთვლის XML ელემენტებს, ატრიბუტებს, ატრიბუტთა მნიშვნელობებს და DTD-ს მიერ ნებადართულ ელემენტებს
+Comment[kk]=DTD анықтаған XML элементтер, атрибуттер, атрибуттің мәндерін, жазуларын тізімдеу
+Comment[km]=រាយ​ធាតុ XML គុណលក្ខណៈ តម្លៃ​គុណលក្ខណៈ និង​ធាតុ​​​បាន​អនុញ្ញាត​ដោយ DTD
+Comment[lt]=Pateikia XML elementus, atributus, atributų reikšmes ir esybes (entities), leistas DTD
+Comment[lv]=Rāda XML elementus, atribūtus, atribūtu vērtības un titlus ko atļauj DTD
+Comment[mk]=Листа XML-елементи, атрибути, вредности на атрибути и ентитети дозволени од DTD
+Comment[ms]=Senarai unsur, atribut, nilai atribut dan entiti XML yang dibenarkan oleh DTD
+Comment[mt]=Jillistja l-elementi, attributi, valuri u entitajiet XML aċċettati mid-DTD
+Comment[nb]=Lister opp alle XML-elementer, attributter, attributtverdier og entiteter som DTD tillater
+Comment[nds]= List de vun de DTD verlöövten XML-Elementen, -Attributen, Attributweerten un Eenheiten op
+Comment[ne]=एक्सएमएल तत्व, विशेषता, विशेषता मान र डीटीडीद्वारा अनुमति प्राप्त वस्तु सूचीकृत गर्छ
+Comment[nl]=Opsomming van XML-elementen, attributen, attribuutwaarden en entiteiten toegestaan door DTD
+Comment[nn]=Listar opp XML-element, attributt, attributtverdiar og entitetar som DTD-en tillet
+Comment[pl]=Wymienia elementy, atrybuty, wartości atrybutów i obiekty XML dozwolone przez DTD
+Comment[pt]=Lista os elementos, atributos, valores de atributos e entidades permitidas em XML pelo DTD
+Comment[pt_BR]=Lista elementos XML, atributos, valores de atributos e entidades aceitas pelo DTD
+Comment[ro]=Listează elementele XML, atributele, valorile atributelor şi entităţile permise de DTD
+Comment[ru]=Перечисляет элементы XML, их атрибуты, значения атрибутов и записи, разрешённые DTD
+Comment[sk]=Vypisuje zoznam prvok XML, atribútov, hodnôt atribútov a entitít podľa DTD
+Comment[sl]=Poda elemente XML, njihove atribute, vrednosti atributov in entitete, ki jih dovoljuje DTD
+Comment[sr]=Листа XML елементе, атрибуте, вредности атрибута и ентитете које DTD дозвољава
+Comment[sr@Latn]=Lista XML elemente, atribute, vrednosti atributa i entitete koje DTD dozvoljava
+Comment[sv]=Listar XML-element, attribut, attributvärden och objekt som tillåts av DTD
+Comment[ta]=XML நிகழ்வுகளை பட்டியலிடுதல், பண்புகள், DTDஆல் அனுமதிக்கப்பட்ட மதிப்புகள் மற்றும் உள்ளீடுகளை மதிப்பிடு
+Comment[tg]=Номбар кардани ҷузъҳои XML, хусусиятҳои онҳо, вусъати хусусиятҳо ва сабтҳо, ҳалшавандаҳои DTD
+Comment[th]=รายการอีลีเมนต์ XML, แอตทริบิวต์, ค่าแอตทริบิวต์ และเอนติตี ซึ่งอนุญาตโดย DTD
+Comment[tr]=DTD'nin izin verdiği XML elemanlarını, özelliklerini, özellik değerlerini ve varlıklarını listeler
+Comment[uk]=Показує елементи XML, а також атрибути та їх значення і записи, дозволені за DTD
+Comment[ven]=Mutevhe wa XML elements, attributes, atributes values na entities zwo tendelwa nga DTD
+Comment[vi]=Liệt kê phần tử XML, thuộc tính, giá trị thuộc tính và các hạng mục cho phép bởi DTD
+Comment[xh]=Idwelisa iingxenye ze XML, iimpahla, amaxabiso empahla kunye nezinto ezivunyelwe yi DTD
+Comment[zh_CN]=列出 DTD 允许的 XML 元素、属性、属性值和实体
+Comment[zh_TW]=列舉 XML 元件,屬性,屬性值和實體
+Comment[zu]=Biza uluhlu lwezingcezu ze XML, izakhi, zakhi izimilo kanye nezinye izinto kuvunyelwe yi DTD
diff --git a/kate/xmltools/kcfg.dtd.xml b/kate/xmltools/kcfg.dtd.xml
new file mode 100644
index 0000000..84c5e13
--- /dev/null
+++ b/kate/xmltools/kcfg.dtd.xml
@@ -0,0 +1,354 @@
+<!DOCTYPE dtd PUBLIC "-//Norman Walsh//DTD DTDParse V2.0//EN"
+ "dtd.dtd" [
+]>
+<dtd version='1.0'
+ unexpanded='1'
+ title="?untitled?"
+ namecase-general="1"
+ namecase-entity="0"
+ xml="0"
+ system-id="kcfg.dtd"
+ public-id=""
+ declaration=""
+ created-by="DTDParse V2.0beta6"
+ created-on="Thu Jan 13 15:07:42 2005"
+>
+<element name="entry"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="parameter" occurrence="?"/>
+ <element-name name="label" occurrence="?"/>
+ <element-name name="whatsthis" occurrence="?"/>
+ <element-name name="choices" occurrence="?"/>
+ <element-name name="code" occurrence="?"/>
+ <element-name name="default" occurrence="*"/>
+ <element-name name="min" occurrence="?"/>
+ <element-name name="max" occurrence="?"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="parameter" occurrence="?"/>
+ <element-name name="label" occurrence="?"/>
+ <element-name name="whatsthis" occurrence="?"/>
+ <element-name name="choices" occurrence="?"/>
+ <element-name name="code" occurrence="?"/>
+ <element-name name="default" occurrence="*"/>
+ <element-name name="min" occurrence="?"/>
+ <element-name name="max" occurrence="?"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="entry">
+<attdecl>
+ name CDATA #IMPLIED
+ type (String|StringList|Font|Rect|Size|Color|
+ Point|Int|UInt|Bool|Double|DateTime|
+ Int64|UInt64|IntList|Enum|Path|Password) #REQUIRED
+ key CDATA #IMPLIED
+ hidden (true|false) #IMPLIED</attdecl>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="hidden"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="true false"
+ default=""/>
+<attribute name="type"
+ type="#REQUIRED"
+ enumeration="yes"
+ value="String StringList Font Rect Size Color Point Int UInt Bool Double DateTime Int64 UInt64 IntList Enum Path Password"
+ default=""/>
+<attribute name="key"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="max"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="max">
+<attdecl> code (true|false) #IMPLIED</attdecl>
+<attribute name="code"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="true false"
+ default=""/>
+</attlist>
+
+<element name="include"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<element name="choices"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="choice" occurrence="+"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="choice" occurrence="+"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<element name="group"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="entry" occurrence="*"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="entry" occurrence="*"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="group">
+<attdecl> name CDATA #REQUIRED</attdecl>
+<attribute name="name"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="choice"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="label" occurrence="?"/>
+ <element-name name="whatsthis" occurrence="?"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="label" occurrence="?"/>
+ <element-name name="whatsthis" occurrence="?"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="choice">
+<attdecl> name CDATA #REQUIRED</attdecl>
+<attribute name="name"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="code"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<element name="kcfgfile"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="parameter" occurrence="*"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="parameter" occurrence="*"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="kcfgfile">
+<attdecl>
+ name CDATA #IMPLIED
+ arg (true|false) #IMPLIED</attdecl>
+<attribute name="arg"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="true false"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="value"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<element name="min"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="min">
+<attdecl> code (true|false) #IMPLIED</attdecl>
+<attribute name="code"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="true false"
+ default=""/>
+</attlist>
+
+<element name="values"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="value" occurrence="+"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="value" occurrence="+"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<element name="whatsthis"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<element name="default"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="default">
+<attdecl> code (true|false) #IMPLIED</attdecl>
+<attribute name="code"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="true false"
+ default=""/>
+</attlist>
+
+<element name="parameter"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="values" occurrence="?"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="values" occurrence="?"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="parameter">
+<attdecl> name CDATA #REQUIRED</attdecl>
+<attribute name="name"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="kcfg"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="include" occurrence="*"/>
+ <element-name name="kcfgfile"/>
+ <element-name name="group" occurrence="*"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="include" occurrence="*"/>
+ <element-name name="kcfgfile"/>
+ <element-name name="group" occurrence="*"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<element name="label"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+</dtd>
diff --git a/kate/xmltools/kde-docbook.dtd.xml b/kate/xmltools/kde-docbook.dtd.xml
new file mode 100644
index 0000000..bf01b59
--- /dev/null
+++ b/kate/xmltools/kde-docbook.dtd.xml
@@ -0,0 +1,21489 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE dtd
+ PUBLIC "-//Norman Walsh//DTD DTDParse V2.0//EN" "dtd.dtd">
+<dtd version="1.0" unexpanded="1" title="?untitled?"
+ namecase-general="1" namecase-entity="0" xml="0"
+ system-id="kdex.dtd" public-id="" declaration=""
+ created-by="XSLT Simplifier"
+ created-on="Sun Jan 20 02:18:36 2002 (original version)">
+
+<entity name="frown" type="gen">
+<text-expanded>&amp;#x2322;</text-expanded>
+</entity>
+<entity name="bsime" type="gen">
+<text-expanded>&amp;#x22CD;</text-expanded>
+</entity>
+<entity name="b.kappa" type="gen">
+<text-expanded>&amp;#x03BA;</text-expanded>
+</entity>
+<entity name="kspread" type="gen">
+<text-expanded>
+<application>KSpread</application>
+</text-expanded>
+</entity>
+<entity name="dashv" type="gen">
+<text-expanded>&amp;#x22A3;</text-expanded>
+</entity>
+<entity name="iacgr" type="gen">
+<text-expanded>&amp;#x03AF;</text-expanded>
+</entity>
+<entity name="ogon" type="gen">
+<text-expanded>&amp;#x02DB;</text-expanded>
+</entity>
+<entity name="acute" type="gen">
+<text-expanded>&amp;#x00B4;</text-expanded>
+</entity>
+<entity name="nhArr" type="gen">
+<text-expanded>&amp;#x21CE;</text-expanded>
+</entity>
+<entity name="radic" type="gen">
+<text-expanded>&amp;#x221A;</text-expanded>
+</entity>
+<entity name="shchcy" type="gen">
+<text-expanded>&amp;#x0449;</text-expanded>
+</entity>
+<entity name="URI" type="gen">
+<text-expanded>
+<acronym>URI</acronym>
+</text-expanded>
+</entity>
+<entity name="sccue" type="gen">
+<text-expanded>&amp;#x227D;</text-expanded>
+</entity>
+<entity name="Iuml" type="gen">
+<text-expanded>&amp;#x00CF;</text-expanded>
+</entity>
+<entity name="URL" type="gen">
+<text-expanded>
+<acronym>URL</acronym>
+</text-expanded>
+</entity>
+<entity name="Linux-Mandrake" type="gen">
+<text-expanded>
+<trademark>Linux-Mandrake</trademark>
+</text-expanded>
+</entity>
+<entity name="ominus" type="gen">
+<text-expanded>&amp;#x2296;</text-expanded>
+</entity>
+<entity name="IOcy" type="gen">
+<text-expanded>&amp;#x0401;</text-expanded>
+</entity>
+<entity name="ksysguard" type="gen">
+<text-expanded>
+<application>KSysguard</application>
+</text-expanded>
+</entity>
+<entity name="cedil" type="gen">
+<text-expanded>&amp;#x00B8;</text-expanded>
+</entity>
+<entity name="krayon" type="gen">
+<text-expanded>
+<application>Krayon</application>
+</text-expanded>
+</entity>
+<entity name="rtimes" type="gen">
+<text-expanded>&amp;#x22CA;</text-expanded>
+</entity>
+<entity name="b.epsis" type="gen">
+<text-expanded>&amp;#x03B5;</text-expanded>
+</entity>
+<entity name="planck" type="gen">
+<text-expanded>&amp;#x210F;</text-expanded>
+</entity>
+<entity name="sqcap" type="gen">
+<text-expanded>&amp;#x2293;</text-expanded>
+</entity>
+<entity name="uml" type="gen">
+<text-expanded>&amp;#x00A8;</text-expanded>
+</entity>
+<entity name="Sendmail" type="gen">
+<text-expanded>
+<application>
+<trademark class="registered">sendmail</trademark>
+</application>
+</text-expanded>
+</entity>
+<entity name="b.epsiv" type="gen">
+<text-expanded>&amp;#x03B5;</text-expanded>
+</entity>
+<entity name="Xgr" type="gen">
+<text-expanded>&amp;#x039E;</text-expanded>
+</entity>
+<entity name="mdash" type="gen">
+<text-expanded>&amp;#x2014;</text-expanded>
+</entity>
+<entity name="b.chi" type="gen">
+<text-expanded>&amp;#x03C7;</text-expanded>
+</entity>
+<entity name="ncy" type="gen">
+<text-expanded>&amp;#x043D;</text-expanded>
+</entity>
+<entity name="kbackgammon" type="gen">
+<text-expanded>
+<application>KBackgammon</application>
+</text-expanded>
+</entity>
+<entity name="Ocy" type="gen">
+<text-expanded>&amp;#x041E;</text-expanded>
+</entity>
+<entity name="aacute" type="gen">
+<text-expanded>&amp;#x00E1;</text-expanded>
+</entity>
+<entity name="ecirc" type="gen">
+<text-expanded>&amp;#x00EA;</text-expanded>
+</entity>
+<entity name="aleph" type="gen">
+<text-expanded>&amp;#x2135;</text-expanded>
+</entity>
+<entity name="nsmid" type="gen">
+<text-expanded>&amp;#xE2AA;</text-expanded>
+</entity>
+<entity name="Ubreve" type="gen">
+<text-expanded>&amp;#x016C;</text-expanded>
+</entity>
+<entity name="khexedit" type="gen">
+<text-expanded>
+<application>KHexEdit</application>
+</text-expanded>
+</entity>
+<entity name="eogon" type="gen">
+<text-expanded>&amp;#x0119;</text-expanded>
+</entity>
+<entity name="keystone" type="gen">
+<text-expanded>
+<application>Keystone</application>
+</text-expanded>
+</entity>
+<entity name="kuickshow" type="gen">
+<text-expanded>
+<application>KuickShow</application>
+</text-expanded>
+</entity>
+<entity name="zeta" type="gen">
+<text-expanded>&amp;#x03B6;</text-expanded>
+</entity>
+<entity name="lcaron" type="gen">
+<text-expanded>&amp;#x013E;</text-expanded>
+</entity>
+<entity name="kspaceduel" type="gen">
+<text-expanded>
+<application>KSpaceDuel</application>
+</text-expanded>
+</entity>
+<entity name="khgr" type="gen">
+<text-expanded>&amp;#x03C7;</text-expanded>
+</entity>
+<entity name="ksame" type="gen">
+<text-expanded>
+<application>KSame</application>
+</text-expanded>
+</entity>
+<entity name="xcirc" type="gen">
+<text-expanded>&amp;#x25CB;</text-expanded>
+</entity>
+<entity name="Lacute" type="gen">
+<text-expanded>&amp;#x0139;</text-expanded>
+</entity>
+<entity name="sung" type="gen">
+<text-expanded>&amp;#x2669;</text-expanded>
+</entity>
+<entity name="lowbar" type="gen">
+<text-expanded>&amp;#x005F;</text-expanded>
+</entity>
+<entity name="kde-http" type="gen">
+<text-expanded>
+<ulink url="http://www.kde.org/">http://www.kde.org/</ulink>
+</text-expanded>
+</entity>
+<entity name="xi" type="gen">
+<text-expanded>&amp;#x03BE;</text-expanded>
+</entity>
+<entity name="epsi" type="gen">
+<text-expanded>&amp;#x220A;</text-expanded>
+</entity>
+<entity name="Prime" type="gen">
+<text-expanded>&amp;#x2033;</text-expanded>
+</entity>
+<entity name="DotDot" type="gen">
+<text-expanded>&amp;#x20DC;</text-expanded>
+</entity>
+<entity name="Lcedil" type="gen">
+<text-expanded>&amp;#x013B;</text-expanded>
+</entity>
+<entity name="image" type="gen">
+<text-expanded>&amp;#x2111;</text-expanded>
+</entity>
+<entity name="sup1" type="gen">
+<text-expanded>&amp;#x00B9;</text-expanded>
+</entity>
+<entity name="sup2" type="gen">
+<text-expanded>&amp;#x00B2;</text-expanded>
+</entity>
+<entity name="subnE" type="gen">
+<text-expanded>&amp;#x228A;</text-expanded>
+</entity>
+<entity name="sup3" type="gen">
+<text-expanded>&amp;#x00B3;</text-expanded>
+</entity>
+<entity name="b.sigma" type="gen">
+<text-expanded>&amp;#x03C3;</text-expanded>
+</entity>
+<entity name="underArtisticLicense" type="gen"/>
+<entity name="brvbar" type="gen">
+<text-expanded>&amp;#x00A6;</text-expanded>
+</entity>
+<entity name="FDL-html" type="ndata"/>
+<entity name="target" type="gen">
+<text-expanded>&amp;#x2316;</text-expanded>
+</entity>
+<entity name="rarr" type="gen">
+<text-expanded>&amp;#x2192;</text-expanded>
+</entity>
+<entity name="sub" type="gen">
+<text-expanded>&amp;#x2282;</text-expanded>
+</entity>
+<entity name="perp" type="gen">
+<text-expanded>&amp;#x22A5;</text-expanded>
+</entity>
+<entity name="vsubnE" type="gen">
+<text-expanded>&amp;#xE2B8;</text-expanded>
+</entity>
+<entity name="b.Theta" type="gen">
+<text-expanded>&amp;#x0398;</text-expanded>
+</entity>
+<entity name="Dgr" type="gen">
+<text-expanded>&amp;#x0394;</text-expanded>
+</entity>
+<entity name="ycy" type="gen">
+<text-expanded>&amp;#x044B;</text-expanded>
+</entity>
+<entity name="wedgeq" type="gen">
+<text-expanded>&amp;#x2259;</text-expanded>
+</entity>
+<entity name="amp" type="gen">
+<text-expanded>&amp;#38;#38;</text-expanded>
+</entity>
+<entity name="Zcy" type="gen">
+<text-expanded>&amp;#x0417;</text-expanded>
+</entity>
+<entity name="korn" type="gen">
+<text-expanded>
+<application>KOrn</application>
+</text-expanded>
+</entity>
+<entity name="sum" type="gen">
+<text-expanded>&amp;#x2211;</text-expanded>
+</entity>
+<entity name="napos" type="gen">
+<text-expanded>&amp;#x0149;</text-expanded>
+</entity>
+<entity name="supE" type="gen">
+<text-expanded>&amp;#x2287;</text-expanded>
+</entity>
+<entity name="sup" type="gen">
+<text-expanded>&amp;#x2283;</text-expanded>
+</entity>
+<entity name="racute" type="gen">
+<text-expanded>&amp;#x0155;</text-expanded>
+</entity>
+<entity name="prnsim" type="gen">
+<text-expanded>&amp;#x22E8;</text-expanded>
+</entity>
+<entity name="exist" type="gen">
+<text-expanded>&amp;#x2203;</text-expanded>
+</entity>
+<entity name="lagran" type="gen">
+<text-expanded>&amp;#x2112;</text-expanded>
+</entity>
+<entity name="rsquo" type="gen">
+<text-expanded>&amp;#x2019;</text-expanded>
+</entity>
+<entity name="kotalkd" type="gen">
+<text-expanded>
+<application>KOTalkd</application>
+</text-expanded>
+</entity>
+<entity name="ngE" type="gen">
+<text-expanded>&amp;#x2271;</text-expanded>
+</entity>
+<entity name="drkonqi" type="gen">
+<text-expanded>
+<application>DrKonqi</application>
+</text-expanded>
+</entity>
+<entity name="b.Delta" type="gen">
+<text-expanded>&amp;#x0394;</text-expanded>
+</entity>
+<entity name="subne" type="gen">
+<text-expanded>&amp;#x228A;</text-expanded>
+</entity>
+<entity name="chi" type="gen">
+<text-expanded>&amp;#x03C7;</text-expanded>
+</entity>
+<entity name="and" type="gen">
+<text-expanded>&amp;#x2227;</text-expanded>
+</entity>
+<entity name="rcedil" type="gen">
+<text-expanded>&amp;#x0157;</text-expanded>
+</entity>
+<entity name="angmsd" type="gen">
+<text-expanded>&amp;#x2221;</text-expanded>
+</entity>
+<entity name="sqsube" type="gen">
+<text-expanded>&amp;#x2291;</text-expanded>
+</entity>
+<entity name="ang" type="gen">
+<text-expanded>&amp;#x2220;</text-expanded>
+</entity>
+<entity name="kwuftpd" type="gen">
+<text-expanded>
+<application>kwuftpd</application>
+</text-expanded>
+</entity>
+<entity name="hellip" type="gen">
+<text-expanded>&amp;#x2026;</text-expanded>
+</entity>
+<entity name="vsubne" type="gen">
+<text-expanded>&amp;#x228A;</text-expanded>
+</entity>
+<entity name="kaboodle" type="gen">
+<text-expanded>
+<application>Kaboodle</application>
+</text-expanded>
+</entity>
+<entity name="iuml" type="gen">
+<text-expanded>&amp;#x00EF;</text-expanded>
+</entity>
+<entity name="b.Upsi" type="gen">
+<text-expanded>&amp;#x03D2;</text-expanded>
+</entity>
+<entity name="kjcy" type="gen">
+<text-expanded>&amp;#x045C;</text-expanded>
+</entity>
+<entity name="ldot" type="gen">
+<text-expanded>&amp;#x22D6;</text-expanded>
+</entity>
+<entity name="LGPLNotice" type="gen"/>
+<entity name="supe" type="gen">
+<text-expanded>&amp;#x2287;</text-expanded>
+</entity>
+<entity name="GJcy" type="gen">
+<text-expanded>&amp;#x0403;</text-expanded>
+</entity>
+<entity name="aelig" type="gen">
+<text-expanded>&amp;#x00E6;</text-expanded>
+</entity>
+<entity name="nge" type="gen">
+<text-expanded>&amp;#x2271;</text-expanded>
+</entity>
+<entity name="yen" type="gen">
+<text-expanded>&amp;#x00A5;</text-expanded>
+</entity>
+<entity name="lnE" type="gen">
+<text-expanded>&amp;#x2268;</text-expanded>
+</entity>
+<entity name="par" type="gen">
+<text-expanded>&amp;#x2225;</text-expanded>
+</entity>
+<entity name="oslash" type="gen">
+<text-expanded>&amp;#x00F8;</text-expanded>
+</entity>
+<entity name="kab2" type="gen">
+<text-expanded>
+<application>Kab2</application>
+</text-expanded>
+</entity>
+<entity name="ngr" type="gen">
+<text-expanded>&amp;#x03BD;</text-expanded>
+</entity>
+<entity name="cir" type="gen">
+<text-expanded>&amp;#x25CB;</text-expanded>
+</entity>
+<entity name="Ogr" type="gen">
+<text-expanded>&amp;#x039F;</text-expanded>
+</entity>
+<entity name="Ubrcy" type="gen">
+<text-expanded>&amp;#x040E;</text-expanded>
+</entity>
+<entity name="ngt" type="gen">
+<text-expanded>&amp;#x226F;</text-expanded>
+</entity>
+<entity name="ecy" type="gen">
+<text-expanded>&amp;#x044D;</text-expanded>
+</entity>
+<entity name="knode" type="gen">
+<text-expanded>
+<application>KNode</application>
+</text-expanded>
+</entity>
+<entity name="kdvi" type="gen">
+<text-expanded>
+<application>kdvi</application>
+</text-expanded>
+</entity>
+<entity name="permil" type="gen">
+<text-expanded>&amp;#x2030;</text-expanded>
+</entity>
+<entity name="Fcy" type="gen">
+<text-expanded>&amp;#x0424;</text-expanded>
+</entity>
+<entity name="underGPL" type="gen"/>
+<entity name="spar" type="gen">
+<text-expanded>&amp;#x2225;</text-expanded>
+</entity>
+<entity name="gsdot" type="gen">
+<text-expanded>&amp;#x22D7;</text-expanded>
+</entity>
+<entity name="sect" type="gen">
+<text-expanded>&amp;#x00A7;</text-expanded>
+</entity>
+<entity name="nmid" type="gen">
+<text-expanded>&amp;#x2224;</text-expanded>
+</entity>
+<entity name="prnE" type="gen">
+<text-expanded>&amp;#xE2B3;</text-expanded>
+</entity>
+<entity name="olarr" type="gen">
+<text-expanded>&amp;#x21BA;</text-expanded>
+</entity>
+<entity name="harr" type="gen">
+<text-expanded>&amp;#x2194;</text-expanded>
+</entity>
+<entity name="order" type="gen">
+<text-expanded>&amp;#x2134;</text-expanded>
+</entity>
+<entity name="lne" type="gen">
+<text-expanded>&amp;#x2268;</text-expanded>
+</entity>
+<entity name="Solaris" type="gen">
+<text-expanded>
+<trademark>Solaris</trademark>
+</text-expanded>
+</entity>
+<entity name="ape" type="gen">
+<text-expanded>&amp;#x224A;</text-expanded>
+</entity>
+<entity name="conint" type="gen">
+<text-expanded>&amp;#x222E;</text-expanded>
+</entity>
+<entity name="b.kappav" type="gen">
+<text-expanded>&amp;#x03F0;</text-expanded>
+</entity>
+<entity name="Scaron" type="gen">
+<text-expanded>&amp;#x0160;</text-expanded>
+</entity>
+<entity name="smile" type="gen">
+<text-expanded>&amp;#x2323;</text-expanded>
+</entity>
+<entity name="veebar" type="gen">
+<text-expanded>&amp;#x22BB;</text-expanded>
+</entity>
+<entity name="b.phis" type="gen">
+<text-expanded>&amp;#x03C6;</text-expanded>
+</entity>
+<entity name="uhblk" type="gen">
+<text-expanded>&amp;#x2580;</text-expanded>
+</entity>
+<entity name="b.phiv" type="gen">
+<text-expanded>&amp;#x03D5;</text-expanded>
+</entity>
+<entity name="lsquo" type="gen">
+<text-expanded>&amp;#x2018;</text-expanded>
+</entity>
+<entity name="nacute" type="gen">
+<text-expanded>&amp;#x0144;</text-expanded>
+</entity>
+<entity name="Omega" type="gen">
+<text-expanded>&amp;#x03A9;</text-expanded>
+</entity>
+<entity name="Handspring" type="gen">
+<text-expanded>
+<trademark>Handspring</trademark>
+</text-expanded>
+</entity>
+<entity name="curarr" type="gen">
+<text-expanded>&amp;#x21B7;</text-expanded>
+</entity>
+<entity name="drcorn" type="gen">
+<text-expanded>&amp;#x231F;</text-expanded>
+</entity>
+<entity name="ncedil" type="gen">
+<text-expanded>&amp;#x0146;</text-expanded>
+</entity>
+<entity name="b.Xi" type="gen">
+<text-expanded>&amp;#x039E;</text-expanded>
+</entity>
+<entity name="Zgr" type="gen">
+<text-expanded>&amp;#x0396;</text-expanded>
+</entity>
+<entity name="pcy" type="gen">
+<text-expanded>&amp;#x043F;</text-expanded>
+</entity>
+<entity name="sqsub" type="gen">
+<text-expanded>&amp;#x228F;</text-expanded>
+</entity>
+<entity name="Ycirc" type="gen">
+<text-expanded>&amp;#x0176;</text-expanded>
+</entity>
+<entity name="ktalk" type="gen">
+<text-expanded>
+<application>KTalk</application>
+</text-expanded>
+</entity>
+<entity name="Lmidot" type="gen">
+<text-expanded>&amp;#x013F;</text-expanded>
+</entity>
+<entity name="konquest" type="gen">
+<text-expanded>
+<application>Konquest</application>
+</text-expanded>
+</entity>
+<entity name="prime" type="gen">
+<text-expanded>&amp;#x2032;</text-expanded>
+</entity>
+<entity name="khelpcenter" type="gen">
+<text-expanded>
+<application>KHelpcenter</application>
+</text-expanded>
+</entity>
+<entity name="prod" type="gen">
+<text-expanded>&amp;#x220F;</text-expanded>
+</entity>
+<entity name="loz" type="gen">
+<text-expanded>&amp;#x25CA;</text-expanded>
+</entity>
+<entity name="dtri" type="gen">
+<text-expanded>&amp;#x25BF;</text-expanded>
+</entity>
+<entity name="Yacute" type="gen">
+<text-expanded>&amp;#x00DD;</text-expanded>
+</entity>
+<entity name="sqsup" type="gen">
+<text-expanded>&amp;#x2290;</text-expanded>
+</entity>
+<entity name="vprime" type="gen">
+<text-expanded>&amp;#x2032;</text-expanded>
+</entity>
+<entity name="SHcy" type="gen">
+<text-expanded>&amp;#x0428;</text-expanded>
+</entity>
+<entity name="erDot" type="gen">
+<text-expanded>&amp;#x2253;</text-expanded>
+</entity>
+<entity name="prop" type="gen">
+<text-expanded>&amp;#x221D;</text-expanded>
+</entity>
+<entity name="ELF" type="gen">
+<text-expanded>
+<acronym>ELF</acronym>
+</text-expanded>
+</entity>
+<entity name="dblac" type="gen">
+<text-expanded>&amp;#x02DD;</text-expanded>
+</entity>
+<entity name="klaptopdaemon" type="gen">
+<text-expanded>
+<application>klaptopdaemon</application>
+</text-expanded>
+</entity>
+<entity name="telrec" type="gen">
+<text-expanded>&amp;#x2315;</text-expanded>
+</entity>
+<entity name="b.upsi" type="gen">
+<text-expanded>&amp;#x03C5;</text-expanded>
+</entity>
+<entity name="thksim" type="gen">
+<text-expanded>&amp;#x223C;</text-expanded>
+</entity>
+<entity name="ktalkd" type="gen">
+<text-expanded>
+<application>KTalkd</application>
+</text-expanded>
+</entity>
+<entity name="ark" type="gen">
+<text-expanded>
+<application>Ark</application>
+</text-expanded>
+</entity>
+<entity name="iecy" type="gen">
+<text-expanded>&amp;#x0435;</text-expanded>
+</entity>
+<entity name="dcaron" type="gen">
+<text-expanded>&amp;#x010F;</text-expanded>
+</entity>
+<entity name="xharr" type="gen">
+<text-expanded>&amp;#x2194;</text-expanded>
+</entity>
+<entity name="klipper" type="gen">
+<text-expanded>
+<application>Klipper</application>
+</text-expanded>
+</entity>
+<entity name="Otilde" type="gen">
+<text-expanded>&amp;#x00D5;</text-expanded>
+</entity>
+<entity name="equals" type="gen">
+<text-expanded>&amp;#x003D;</text-expanded>
+</entity>
+<entity name="b.delta" type="gen">
+<text-expanded>&amp;#x03B4;</text-expanded>
+</entity>
+<entity name="CD" type="gen">
+<text-expanded>
+<acronym>CD</acronym>
+</text-expanded>
+</entity>
+<entity name="nlE" type="gen">
+<text-expanded>&amp;#x2270;</text-expanded>
+</entity>
+<entity name="boxDL" type="gen">
+<text-expanded>&amp;#x2555;</text-expanded>
+</entity>
+<entity name="gap" type="gen">
+<text-expanded>&amp;#x2273;</text-expanded>
+</entity>
+<entity name="copysr" type="gen">
+<text-expanded>&amp;#x2117;</text-expanded>
+</entity>
+<entity name="Cdot" type="gen">
+<text-expanded>&amp;#x010A;</text-expanded>
+</entity>
+<entity name="boxDR" type="gen">
+<text-expanded>&amp;#x2552;</text-expanded>
+</entity>
+<entity name="urcorn" type="gen">
+<text-expanded>&amp;#x231D;</text-expanded>
+</entity>
+<entity name="egr" type="gen">
+<text-expanded>&amp;#x03B5;</text-expanded>
+</entity>
+<entity name="tshcy" type="gen">
+<text-expanded>&amp;#x045B;</text-expanded>
+</entity>
+<entity name="egs" type="gen">
+<text-expanded>&amp;#x22DD;</text-expanded>
+</entity>
+<entity name="samalg" type="gen">
+<text-expanded>&amp;#x2210;</text-expanded>
+</entity>
+<entity name="scnE" type="gen">
+<text-expanded>&amp;#xE2B5;</text-expanded>
+</entity>
+<entity name="Uuml" type="gen">
+<text-expanded>&amp;#x00DC;</text-expanded>
+</entity>
+<entity name="ast" type="gen">
+<text-expanded>&amp;#x002A;</text-expanded>
+</entity>
+<entity name="CSS" type="gen">
+<text-expanded>
+<trademark>CSS</trademark>
+</text-expanded>
+</entity>
+<entity name="OElig" type="gen">
+<text-expanded>&amp;#x0152;</text-expanded>
+</entity>
+<entity name="XEmacs" type="gen">
+<text-expanded>
+<application>XEmacs</application>
+</text-expanded>
+</entity>
+<entity name="utilde" type="gen">
+<text-expanded>&amp;#x0169;</text-expanded>
+</entity>
+<entity name="nle" type="gen">
+<text-expanded>&amp;#x2270;</text-expanded>
+</entity>
+<entity name="Iukcy" type="gen">
+<text-expanded>&amp;#x0406;</text-expanded>
+</entity>
+<entity name="boxDl" type="gen">
+<text-expanded>&amp;#x2557;</text-expanded>
+</entity>
+<entity name="UNIX" type="gen">
+<text-expanded>
+<trademark class="registered">UNIX</trademark>
+</text-expanded>
+</entity>
+<entity name="dlcorn" type="gen">
+<text-expanded>&amp;#x231E;</text-expanded>
+</entity>
+<entity name="dArr" type="gen">
+<text-expanded>&amp;#x21D3;</text-expanded>
+</entity>
+<entity name="nexist" type="gen">
+<text-expanded>&amp;#x2204;</text-expanded>
+</entity>
+<entity name="ubrcy" type="gen">
+<text-expanded>&amp;#x045E;</text-expanded>
+</entity>
+<entity name="boxDr" type="gen">
+<text-expanded>&amp;#x2553;</text-expanded>
+</entity>
+<entity name="ENG" type="gen">
+<text-expanded>&amp;#x014A;</text-expanded>
+</entity>
+<entity name="ljcy" type="gen">
+<text-expanded>&amp;#x0459;</text-expanded>
+</entity>
+<entity name="excl" type="gen">
+<text-expanded>&amp;#x0021;</text-expanded>
+</entity>
+<entity name="Scirc" type="gen">
+<text-expanded>&amp;#x015C;</text-expanded>
+</entity>
+<entity name="wreath" type="gen">
+<text-expanded>&amp;#x2240;</text-expanded>
+</entity>
+<entity name="nlt" type="gen">
+<text-expanded>&amp;#x226E;</text-expanded>
+</entity>
+<entity name="xdtri" type="gen">
+<text-expanded>&amp;#x25BD;</text-expanded>
+</entity>
+<entity name="gcc" type="gen">
+<text-expanded>
+<command>gcc</command>
+</text-expanded>
+</entity>
+<entity name="b.piv" type="gen">
+<text-expanded>&amp;#x03D6;</text-expanded>
+</entity>
+<entity name="dzcy" type="gen">
+<text-expanded>&amp;#x045F;</text-expanded>
+</entity>
+<entity name="Uacute" type="gen">
+<text-expanded>&amp;#x00DA;</text-expanded>
+</entity>
+<entity name="minusb" type="gen">
+<text-expanded>&amp;#x229F;</text-expanded>
+</entity>
+<entity name="GIF" type="gen">
+<text-expanded>
+<acronym>GIF</acronym>
+</text-expanded>
+</entity>
+<entity name="rsquor" type="gen">
+<text-expanded>&amp;#x2018;</text-expanded>
+</entity>
+<entity name="thorn" type="gen">
+<text-expanded>&amp;#x00FE;</text-expanded>
+</entity>
+<entity name="kmoon" type="gen">
+<text-expanded>
+<application>Moon Phase</application>
+</text-expanded>
+</entity>
+<entity name="rhard" type="gen">
+<text-expanded>&amp;#x21C1;</text-expanded>
+</entity>
+<entity name="ndash" type="gen">
+<text-expanded>&amp;#x2013;</text-expanded>
+</entity>
+<entity name="Gamma" type="gen">
+<text-expanded>&amp;#x0393;</text-expanded>
+</entity>
+<entity name="kword" type="gen">
+<text-expanded>
+<application>KWord</application>
+</text-expanded>
+</entity>
+<entity name="pgr" type="gen">
+<text-expanded>&amp;#x03C0;</text-expanded>
+</entity>
+<entity name="lsh" type="gen">
+<text-expanded>&amp;#x21B0;</text-expanded>
+</entity>
+<entity name="gcy" type="gen">
+<text-expanded>&amp;#x0433;</text-expanded>
+</entity>
+<entity name="ohacgr" type="gen">
+<text-expanded>&amp;#x03CE;</text-expanded>
+</entity>
+<entity name="ksirtet" type="gen">
+<text-expanded>
+<application>KSirtet</application>
+</text-expanded>
+</entity>
+<entity name="Dot" type="gen">
+<text-expanded>&amp;#x00A8;</text-expanded>
+</entity>
+<entity name="rharu" type="gen">
+<text-expanded>&amp;#x21C0;</text-expanded>
+</entity>
+<entity name="PMX" type="gen">
+<text-expanded>
+<application>PMX</application>
+</text-expanded>
+</entity>
+<entity name="ksnake" type="gen">
+<text-expanded>
+<application>KSnake</application>
+</text-expanded>
+</entity>
+<entity name="rcub" type="gen">
+<text-expanded>&amp;#x007D;</text-expanded>
+</entity>
+<entity name="omega" type="gen">
+<text-expanded>&amp;#x03C9;</text-expanded>
+</entity>
+<entity name="colone" type="gen">
+<text-expanded>&amp;#x2254;</text-expanded>
+</entity>
+<entity name="vrtri" type="gen">
+<text-expanded>&amp;#x22B3;</text-expanded>
+</entity>
+<entity name="Windows" type="gen">
+<text-expanded>
+<trademark class="registered">Windows</trademark>
+</text-expanded>
+</entity>
+<entity name="lsim" type="gen">
+<text-expanded>&amp;#x2272;</text-expanded>
+</entity>
+<entity name="ulcorn" type="gen">
+<text-expanded>&amp;#x231C;</text-expanded>
+</entity>
+<entity name="kfind" type="gen">
+<text-expanded>
+<application>KFind</application>
+</text-expanded>
+</entity>
+<entity name="ycirc" type="gen">
+<text-expanded>&amp;#x0177;</text-expanded>
+</entity>
+<entity name="dagger" type="gen">
+<text-expanded>&amp;#x2020;</text-expanded>
+</entity>
+<entity name="kpoker" type="gen">
+<text-expanded>
+<application>KPoker</application>
+</text-expanded>
+</entity>
+<entity name="kchart" type="gen">
+<text-expanded>
+<application>KChart</application>
+</text-expanded>
+</entity>
+<entity name="Ograve" type="gen">
+<text-expanded>&amp;#x00D2;</text-expanded>
+</entity>
+<entity name="IRIX" type="gen">
+<text-expanded>
+<trademark class="registered">IRIX</trademark>
+</text-expanded>
+</entity>
+<entity name="EEgr" type="gen">
+<text-expanded>&amp;#x0397;</text-expanded>
+</entity>
+<entity name="chcy" type="gen">
+<text-expanded>&amp;#x0447;</text-expanded>
+</entity>
+<entity name="boxHD" type="gen">
+<text-expanded>&amp;#x2565;</text-expanded>
+</entity>
+<entity name="comp" type="gen">
+<text-expanded>&amp;#x2201;</text-expanded>
+</entity>
+<entity name="RedHat" type="gen">
+<text-expanded>
+<trademark class="registered">Red Hat</trademark>
+</text-expanded>
+</entity>
+<entity name="cuepr" type="gen">
+<text-expanded>&amp;#x22DE;</text-expanded>
+</entity>
+<entity name="gel" type="gen">
+<text-expanded>&amp;#x22DB;</text-expanded>
+</entity>
+<entity name="LZW" type="gen">
+<text-expanded>
+<acronym>LZW</acronym>
+</text-expanded>
+</entity>
+<entity name="cdot" type="gen">
+<text-expanded>&amp;#x010B;</text-expanded>
+</entity>
+<entity name="b.gammad" type="gen">
+<text-expanded>&amp;#x03DC;</text-expanded>
+</entity>
+<entity name="ksokoban" type="gen">
+<text-expanded>
+<application>KSokoban</application>
+</text-expanded>
+</entity>
+<entity name="ges" type="gen">
+<text-expanded>&amp;#x2265;</text-expanded>
+</entity>
+<entity name="HP-UX" type="gen">
+<text-expanded>
+<trademark class="registered">HP-UX</trademark>
+</text-expanded>
+</entity>
+<entity name="rcy" type="gen">
+<text-expanded>&amp;#x0440;</text-expanded>
+</entity>
+<entity name="Scy" type="gen">
+<text-expanded>&amp;#x0421;</text-expanded>
+</entity>
+<entity name="piv" type="gen">
+<text-expanded>&amp;#x03D6;</text-expanded>
+</entity>
+<entity name="boxHU" type="gen">
+<text-expanded>&amp;#x2568;</text-expanded>
+</entity>
+<entity name="curren" type="gen">
+<text-expanded>&amp;#x00A4;</text-expanded>
+</entity>
+<entity name="not" type="gen">
+<text-expanded>&amp;#x00AC;</text-expanded>
+</entity>
+<entity name="uuml" type="gen">
+<text-expanded>&amp;#x00FC;</text-expanded>
+</entity>
+<entity name="cong" type="gen">
+<text-expanded>&amp;#x2245;</text-expanded>
+</entity>
+<entity name="trade" type="gen">
+<text-expanded>[tm]</text-expanded>
+</entity>
+<entity name="ugrave" type="gen">
+<text-expanded>&amp;#x00F9;</text-expanded>
+</entity>
+<entity name="boxHd" type="gen">
+<text-expanded>&amp;#x2566;</text-expanded>
+</entity>
+<entity name="klatin" type="gen">
+<text-expanded>
+<application>KLatin</application>
+</text-expanded>
+</entity>
+<entity name="lhard" type="gen">
+<text-expanded>&amp;#x21BD;</text-expanded>
+</entity>
+<entity name="plusb" type="gen">
+<text-expanded>&amp;#x229E;</text-expanded>
+</entity>
+<entity name="larrhk" type="gen">
+<text-expanded>&amp;#x21A9;</text-expanded>
+</entity>
+<entity name="Gg" type="gen">
+<text-expanded>&amp;#x22D9;</text-expanded>
+</entity>
+<entity name="ell" type="gen">
+<text-expanded>&amp;#x2113;</text-expanded>
+</entity>
+<entity name="nbsp" type="gen">
+<text-expanded>&amp;#x00A0;</text-expanded>
+</entity>
+<entity name="tkmidi" type="gen">
+<text-expanded>
+<application>tkmidi</application>
+</text-expanded>
+</entity>
+<entity name="b.tau" type="gen">
+<text-expanded>&amp;#x03C4;</text-expanded>
+</entity>
+<entity name="boxHu" type="gen">
+<text-expanded>&amp;#x2569;</text-expanded>
+</entity>
+<entity name="HP" type="gen">
+<text-expanded>
+<trademark class="registered">HP</trademark>
+</text-expanded>
+</entity>
+<entity name="els" type="gen">
+<text-expanded>&amp;#x22DC;</text-expanded>
+</entity>
+<entity name="lthree" type="gen">
+<text-expanded>&amp;#x22CB;</text-expanded>
+</entity>
+<entity name="XHTML" type="gen">
+<text-expanded>
+<trademark>XHTML</trademark>
+</text-expanded>
+</entity>
+<entity name="npr" type="gen">
+<text-expanded>&amp;#x2280;</text-expanded>
+</entity>
+<entity name="PPP" type="gen">
+<text-expanded>
+<acronym>PPP</acronym>
+</text-expanded>
+</entity>
+<entity name="Gt" type="gen">
+<text-expanded>&amp;#x226B;</text-expanded>
+</entity>
+<entity name="lharu" type="gen">
+<text-expanded>&amp;#x21BC;</text-expanded>
+</entity>
+<entity name="coprod" type="gen">
+<text-expanded>&amp;#x2210;</text-expanded>
+</entity>
+<entity name="bsim" type="gen">
+<text-expanded>&amp;#x223D;</text-expanded>
+</entity>
+<entity name="reg" type="gen">
+<text-expanded>(R)</text-expanded>
+</entity>
+<entity name="iukcy" type="gen">
+<text-expanded>&amp;#x0456;</text-expanded>
+</entity>
+<entity name="Auml" type="gen">
+<text-expanded>&amp;#x00C4;</text-expanded>
+</entity>
+<entity name="caret" type="gen">
+<text-expanded>&amp;#x2041;</text-expanded>
+</entity>
+<entity name="HARDcy" type="gen">
+<text-expanded>&amp;#x042A;</text-expanded>
+</entity>
+<entity name="ktimemon" type="gen">
+<text-expanded>
+<application>KTimemon</application>
+</text-expanded>
+</entity>
+<entity name="scirc" type="gen">
+<text-expanded>&amp;#x015D;</text-expanded>
+</entity>
+<entity name="ggr" type="gen">
+<text-expanded>&amp;#x03B3;</text-expanded>
+</entity>
+<entity name="Motif" type="gen">
+<text-expanded>
+<trademark class="registered">Motif</trademark>
+</text-expanded>
+</entity>
+<entity name="b.rho" type="gen">
+<text-expanded>&amp;#x03C1;</text-expanded>
+</entity>
+<entity name="LinuxPPC" type="gen">
+<text-expanded>
+<trademark>LinuxPPC</trademark>
+</text-expanded>
+</entity>
+<entity name="YIcy" type="gen">
+<text-expanded>&amp;#x0407;</text-expanded>
+</entity>
+<entity name="GMT" type="gen">
+<text-expanded>
+<acronym>GMT</acronym>
+</text-expanded>
+</entity>
+<entity name="semi" type="gen">
+<text-expanded>&amp;#x003B;</text-expanded>
+</entity>
+<entity name="cuesc" type="gen">
+<text-expanded>&amp;#x22DF;</text-expanded>
+</entity>
+<entity name="sigmav" type="gen">
+<text-expanded>&amp;#x03C2;</text-expanded>
+</entity>
+<entity name="harrw" type="gen">
+<text-expanded>&amp;#x21AD;</text-expanded>
+</entity>
+<entity name="filig" type="gen">
+<text-expanded>&amp;#xFB01;</text-expanded>
+</entity>
+<entity name="rlhar2" type="gen">
+<text-expanded>&amp;#x21CC;</text-expanded>
+</entity>
+<entity name="TScy" type="gen">
+<text-expanded>&amp;#x0426;</text-expanded>
+</entity>
+<entity name="artscontrol" type="gen">
+<text-expanded>
+<application>artscontrol</application>
+</text-expanded>
+</entity>
+<entity name="gamma" type="gen">
+<text-expanded>&amp;#x03B3;</text-expanded>
+</entity>
+<entity name="eng" type="gen">
+<text-expanded>&amp;#x014B;</text-expanded>
+</entity>
+<entity name="kalarm" type="gen">
+<text-expanded>
+<application>KAlarm</application>
+</text-expanded>
+</entity>
+<entity name="copy" type="gen">
+<text-expanded>(c)</text-expanded>
+</entity>
+<entity name="Gcirc" type="gen">
+<text-expanded>&amp;#x011C;</text-expanded>
+</entity>
+<entity name="GPLNotice" type="gen"/>
+<entity name="nearr" type="gen">
+<text-expanded>&amp;#x2197;</text-expanded>
+</entity>
+<entity name="ETH" type="gen">
+<text-expanded>&amp;#x00D0;</text-expanded>
+</entity>
+<entity name="mnplus" type="gen">
+<text-expanded>&amp;#x2213;</text-expanded>
+</entity>
+<entity name="hybull" type="gen">
+<text-expanded>&amp;#x2043;</text-expanded>
+</entity>
+<entity name="cupre" type="gen">
+<text-expanded>&amp;#x227C;</text-expanded>
+</entity>
+<entity name="GNU" type="gen">
+<text-expanded>
+<acronym>GNU</acronym>
+</text-expanded>
+</entity>
+<entity name="Emacr" type="gen">
+<text-expanded>&amp;#x0112;</text-expanded>
+</entity>
+<entity name="Emacs" type="gen">
+<text-expanded>
+<application>Emacs</application>
+</text-expanded>
+</entity>
+<entity name="RMB" type="gen">
+<text-expanded>
+<mousebutton>right</mousebutton> mouse button</text-expanded>
+</entity>
+<entity name="boxH" type="gen">
+<text-expanded>&amp;#x2550;</text-expanded>
+</entity>
+<entity name="tau" type="gen">
+<text-expanded>&amp;#x03C4;</text-expanded>
+</entity>
+<entity name="nsc" type="gen">
+<text-expanded>&amp;#x2281;</text-expanded>
+</entity>
+<entity name="rgr" type="gen">
+<text-expanded>&amp;#x03C1;</text-expanded>
+</entity>
+<entity name="dtrif" type="gen">
+<text-expanded>&amp;#x25BE;</text-expanded>
+</entity>
+<entity name="Sgr" type="gen">
+<text-expanded>&amp;#x03A3;</text-expanded>
+</entity>
+<entity name="ktouch" type="gen">
+<text-expanded>
+<application>KTouch</application>
+</text-expanded>
+</entity>
+<entity name="Java" type="gen">
+<text-expanded>
+<trademark>Java</trademark>
+</text-expanded>
+</entity>
+<entity name="lozf" type="gen">
+<text-expanded>&amp;#x2726;</text-expanded>
+</entity>
+<entity name="icy" type="gen">
+<text-expanded>&amp;#x0438;</text-expanded>
+</entity>
+<entity name="Jcy" type="gen">
+<text-expanded>&amp;#x0419;</text-expanded>
+</entity>
+<entity name="boxV" type="gen">
+<text-expanded>&amp;#x2551;</text-expanded>
+</entity>
+<entity name="uarr2" type="gen">
+<text-expanded>&amp;#x21C8;</text-expanded>
+</entity>
+<entity name="star" type="gen">
+<text-expanded>&amp;#x22C6;</text-expanded>
+</entity>
+<entity name="nsce" type="gen">
+<text-expanded>&amp;#x22E1;</text-expanded>
+</entity>
+<entity name="nsubE" type="gen">
+<text-expanded>&amp;#x2288;</text-expanded>
+</entity>
+<entity name="kfloppy" type="gen">
+<text-expanded>
+<application>Kfloppy</application>
+</text-expanded>
+</entity>
+<entity name="Abreve" type="gen">
+<text-expanded>&amp;#x0102;</text-expanded>
+</entity>
+<entity name="kedit" type="gen">
+<text-expanded>
+<application>KEdit</application>
+</text-expanded>
+</entity>
+<entity name="cup" type="gen">
+<text-expanded>&amp;#x222A;</text-expanded>
+</entity>
+<entity name="THgr" type="gen">
+<text-expanded>&amp;#x0398;</text-expanded>
+</entity>
+<entity name="sfrown" type="gen">
+<text-expanded>&amp;#x2322;</text-expanded>
+</entity>
+<entity name="Eacgr" type="gen">
+<text-expanded>&amp;#x0388;</text-expanded>
+</entity>
+<entity name="models" type="gen">
+<text-expanded>&amp;#x22A7;</text-expanded>
+</entity>
+<entity name="kpackage" type="gen">
+<text-expanded>
+<application>KPackage</application>
+</text-expanded>
+</entity>
+<entity name="jsercy" type="gen">
+<text-expanded>&amp;#x0458;</text-expanded>
+</entity>
+<entity name="kappfinder" type="gen">
+<text-expanded>
+<application>Kappfinder</application>
+</text-expanded>
+</entity>
+<entity name="boxh" type="gen">
+<text-expanded>&amp;#x2500;</text-expanded>
+</entity>
+<entity name="tstrok" type="gen">
+<text-expanded>&amp;#x0167;</text-expanded>
+</entity>
+<entity name="kscreensaver" type="gen">
+<text-expanded>
+<application>KScreensaver</application>
+</text-expanded>
+</entity>
+<entity name="kwin" type="gen">
+<text-expanded>
+<application>KWin</application>
+</text-expanded>
+</entity>
+<entity name="rho" type="gen">
+<text-expanded>&amp;#x03C1;</text-expanded>
+</entity>
+<entity name="sacute" type="gen">
+<text-expanded>&amp;#x015B;</text-expanded>
+</entity>
+<entity name="b.beta" type="gen">
+<text-expanded>&amp;#x03B2;</text-expanded>
+</entity>
+<entity name="larrlp" type="gen">
+<text-expanded>&amp;#x21AB;</text-expanded>
+</entity>
+<entity name="GPL" type="ndata"/>
+<entity name="boxv" type="gen">
+<text-expanded>&amp;#x2502;</text-expanded>
+</entity>
+<entity name="FDLFrontCoverText" type="gen">
+<text-expanded>no Front-Cover Texts</text-expanded>
+</entity>
+<entity name="nsube" type="gen">
+<text-expanded>&amp;#x2288;</text-expanded>
+</entity>
+<entity name="oelig" type="gen">
+<text-expanded>&amp;#x0153;</text-expanded>
+</entity>
+<entity name="sqsupe" type="gen">
+<text-expanded>&amp;#x2292;</text-expanded>
+</entity>
+<entity name="gbreve" type="gen">
+<text-expanded>&amp;#x011F;</text-expanded>
+</entity>
+<entity name="scedil" type="gen">
+<text-expanded>&amp;#x015F;</text-expanded>
+</entity>
+<entity name="Udblac" type="gen">
+<text-expanded>&amp;#x0170;</text-expanded>
+</entity>
+<entity name="kandy" type="gen">
+<text-expanded>
+<application>Kandy</application>
+</text-expanded>
+</entity>
+<entity name="auml" type="gen">
+<text-expanded>&amp;#x00E4;</text-expanded>
+</entity>
+<entity name="Ccaron" type="gen">
+<text-expanded>&amp;#x010C;</text-expanded>
+</entity>
+<entity name="otimes" type="gen">
+<text-expanded>&amp;#x2297;</text-expanded>
+</entity>
+<entity name="ksysv" type="gen">
+<text-expanded>
+<application>ksysv</application>
+</text-expanded>
+</entity>
+<entity name="angsph" type="gen">
+<text-expanded>&amp;#x2222;</text-expanded>
+</entity>
+<entity name="itilde" type="gen">
+<text-expanded>&amp;#x0129;</text-expanded>
+</entity>
+<entity name="Acirc" type="gen">
+<text-expanded>&amp;#x00C2;</text-expanded>
+</entity>
+<entity name="Lambda" type="gen">
+<text-expanded>&amp;#x039B;</text-expanded>
+</entity>
+<entity name="tcy" type="gen">
+<text-expanded>&amp;#x0442;</text-expanded>
+</entity>
+<entity name="Ucy" type="gen">
+<text-expanded>&amp;#x0423;</text-expanded>
+</entity>
+<entity name="CD-ROM" type="gen">
+<text-expanded>
+<acronym>CD-ROM</acronym>
+</text-expanded>
+</entity>
+<entity name="b.eta" type="gen">
+<text-expanded>&amp;#x03B7;</text-expanded>
+</entity>
+<entity name="Ll" type="gen">
+<text-expanded>&amp;#x22D8;</text-expanded>
+</entity>
+<entity name="num" type="gen">
+<text-expanded>&amp;#x0023;</text-expanded>
+</entity>
+<entity name="Aogon" type="gen">
+<text-expanded>&amp;#x0104;</text-expanded>
+</entity>
+<entity name="Lt" type="gen">
+<text-expanded>&amp;#x226A;</text-expanded>
+</entity>
+<entity name="iff" type="gen">
+<text-expanded>&amp;#x21D4;</text-expanded>
+</entity>
+<entity name="Jukcy" type="gen">
+<text-expanded>&amp;#x0404;</text-expanded>
+</entity>
+<entity name="nabla" type="gen">
+<text-expanded>&amp;#x2207;</text-expanded>
+</entity>
+<entity name="lnap" type="gen">
+<text-expanded>&amp;#xE2A2;</text-expanded>
+</entity>
+<entity name="lsqb" type="gen">
+<text-expanded>&amp;#x005B;</text-expanded>
+</entity>
+<entity name="macr" type="gen">
+<text-expanded>&amp;#x00AF;</text-expanded>
+</entity>
+<entity name="kpat" type="gen">
+<text-expanded>
+<application>KPatience</application>
+</text-expanded>
+</entity>
+<entity name="kugar" type="gen">
+<text-expanded>
+<application>Kugar</application>
+</text-expanded>
+</entity>
+<entity name="Iacute" type="gen">
+<text-expanded>&amp;#x00CD;</text-expanded>
+</entity>
+<entity name="kwmpager" type="gen">
+<text-expanded>
+<application>kwmpager</application>
+</text-expanded>
+</entity>
+<entity name="b.alpha" type="gen">
+<text-expanded>&amp;#x03B1;</text-expanded>
+</entity>
+<entity name="kab" type="gen">
+<text-expanded>
+<application>Kab</application>
+</text-expanded>
+</entity>
+<entity name="b.psi" type="gen">
+<text-expanded>&amp;#x03C8;</text-expanded>
+</entity>
+<entity name="dscy" type="gen">
+<text-expanded>&amp;#x0455;</text-expanded>
+</entity>
+<entity name="eeacgr" type="gen">
+<text-expanded>&amp;#x03AE;</text-expanded>
+</entity>
+<entity name="bsol" type="gen">
+<text-expanded>&amp;#x005C;</text-expanded>
+</entity>
+<entity name="uarr" type="gen">
+<text-expanded>&amp;#x2191;</text-expanded>
+</entity>
+<entity name="raquo" type="gen">
+<text-expanded>&amp;#x00BB;</text-expanded>
+</entity>
+<entity name="odash" type="gen">
+<text-expanded>&amp;#x229D;</text-expanded>
+</entity>
+<entity name="Edot" type="gen">
+<text-expanded>&amp;#x0116;</text-expanded>
+</entity>
+<entity name="gnE" type="gen">
+<text-expanded>&amp;#x2269;</text-expanded>
+</entity>
+<entity name="underFDL" type="gen"/>
+<entity name="kpilot" type="gen">
+<text-expanded>
+<application>KPilot</application>
+</text-expanded>
+</entity>
+<entity name="Tcaron" type="gen">
+<text-expanded>&amp;#x0164;</text-expanded>
+</entity>
+<entity name="kblackbox" type="gen">
+<text-expanded>
+<application>KBlackbox</application>
+</text-expanded>
+</entity>
+<entity name="gcirc" type="gen">
+<text-expanded>&amp;#x011D;</text-expanded>
+</entity>
+<entity name="X-Server" type="gen">
+<text-expanded>
+<application>X-Server</application>
+</text-expanded>
+</entity>
+<entity name="cuvee" type="gen">
+<text-expanded>&amp;#x22CE;</text-expanded>
+</entity>
+<entity name="igr" type="gen">
+<text-expanded>&amp;#x03B9;</text-expanded>
+</entity>
+<entity name="sharp" type="gen">
+<text-expanded>&amp;#x266F;</text-expanded>
+</entity>
+<entity name="Acy" type="gen">
+<text-expanded>&amp;#x0410;</text-expanded>
+</entity>
+<entity name="oacute" type="gen">
+<text-expanded>&amp;#x00F3;</text-expanded>
+</entity>
+<entity name="rfloor" type="gen">
+<text-expanded>&amp;#x230B;</text-expanded>
+</entity>
+<entity name="dlarr" type="gen">
+<text-expanded>&amp;#x2199;</text-expanded>
+</entity>
+<entity name="nltri" type="gen">
+<text-expanded>&amp;#x22EA;</text-expanded>
+</entity>
+<entity name="natur" type="gen">
+<text-expanded>&amp;#x266E;</text-expanded>
+</entity>
+<entity name="verbar" type="gen">
+<text-expanded>&amp;#x007C;</text-expanded>
+</entity>
+<entity name="Zdot" type="gen">
+<text-expanded>&amp;#x017B;</text-expanded>
+</entity>
+<entity name="OS" type="gen">
+<text-expanded>operating system</text-expanded>
+</entity>
+<entity name="sqcup" type="gen">
+<text-expanded>&amp;#x2294;</text-expanded>
+</entity>
+<entity name="emacr" type="gen">
+<text-expanded>&amp;#x0113;</text-expanded>
+</entity>
+<entity name="gne" type="gen">
+<text-expanded>&amp;#x2269;</text-expanded>
+</entity>
+<entity name="eta" type="gen">
+<text-expanded>&amp;#x03B7;</text-expanded>
+</entity>
+<entity name="kdesktop" type="gen">
+<text-expanded>
+<application>KDesktop</application>
+</text-expanded>
+</entity>
+<entity name="njcy" type="gen">
+<text-expanded>&amp;#x045A;</text-expanded>
+</entity>
+<entity name="etc" type="gen">
+<text-expanded>
+<abbrev>etc.</abbrev>
+</text-expanded>
+</entity>
+<entity name="pre" type="gen">
+<text-expanded>&amp;#x227C;</text-expanded>
+</entity>
+<entity name="zcaron" type="gen">
+<text-expanded>&amp;#x017E;</text-expanded>
+</entity>
+<entity name="odot" type="gen">
+<text-expanded>&amp;#x2299;</text-expanded>
+</entity>
+<entity name="eth" type="gen">
+<text-expanded>&amp;#x00F0;</text-expanded>
+</entity>
+<entity name="ATAPI" type="gen">
+<text-expanded>
+<acronym>ATAPI</acronym>
+</text-expanded>
+</entity>
+<entity name="Zacute" type="gen">
+<text-expanded>&amp;#x0179;</text-expanded>
+</entity>
+<entity name="KHcy" type="gen">
+<text-expanded>&amp;#x0425;</text-expanded>
+</entity>
+<entity name="kcontrolcenter" type="gen">
+<text-expanded>
+<application>&amp;kde; Control Center</application>
+</text-expanded>
+</entity>
+<entity name="olinktype" type="gen">
+<text-expanded>kde-installation</text-expanded>
+</entity>
+<entity name="kde.modespec" type="gen">
+<text-expanded>
+<modespec id="kdems-help">help:</modespec>
+<modespec id="kdems-man">man:</modespec>
+</text-expanded>
+</entity>
+<entity name="hyphen" type="gen">
+<text-expanded>&amp;#x002D;</text-expanded>
+</entity>
+<entity name="ring" type="gen">
+<text-expanded>&amp;#x02DA;</text-expanded>
+</entity>
+<entity name="eacgr" type="gen">
+<text-expanded>&amp;#x03AD;</text-expanded>
+</entity>
+<entity name="thinsp" type="gen">
+<text-expanded>&amp;#x2009;</text-expanded>
+</entity>
+<entity name="angst" type="gen">
+<text-expanded>&amp;#x212B;</text-expanded>
+</entity>
+<entity name="Vdash" type="gen">
+<text-expanded>&amp;#x22A9;</text-expanded>
+</entity>
+<entity name="cervisia" type="gen">
+<text-expanded>
+<application>Cervisia</application>
+</text-expanded>
+</entity>
+<entity name="mldr" type="gen">
+<text-expanded>&amp;#x2026;</text-expanded>
+</entity>
+<entity name="ang90" type="gen">
+<text-expanded>&amp;#x221F;</text-expanded>
+</entity>
+<entity name="ldquor" type="gen">
+<text-expanded>&amp;#x201E;</text-expanded>
+</entity>
+<entity name="ecaron" type="gen">
+<text-expanded>&amp;#x011B;</text-expanded>
+</entity>
+<entity name="tgr" type="gen">
+<text-expanded>&amp;#x03C4;</text-expanded>
+</entity>
+<entity name="igrave" type="gen">
+<text-expanded>&amp;#x00EC;</text-expanded>
+</entity>
+<entity name="Ugr" type="gen">
+<text-expanded>&amp;#x03A5;</text-expanded>
+</entity>
+<entity name="psi" type="gen">
+<text-expanded>&amp;#x03C8;</text-expanded>
+</entity>
+<entity name="kcy" type="gen">
+<text-expanded>&amp;#x043A;</text-expanded>
+</entity>
+<entity name="Lcy" type="gen">
+<text-expanded>&amp;#x041B;</text-expanded>
+</entity>
+<entity name="karm" type="gen">
+<text-expanded>
+<application>KArm</application>
+</text-expanded>
+</entity>
+<entity name="Eacute" type="gen">
+<text-expanded>&amp;#x00C9;</text-expanded>
+</entity>
+<entity name="klpq" type="gen">
+<text-expanded>
+<application>Klpq</application>
+</text-expanded>
+</entity>
+<entity name="Pi" type="gen">
+<text-expanded>&amp;#x03A0;</text-expanded>
+</entity>
+<entity name="GUI" type="gen">
+<text-expanded>
+<acronym>GUI</acronym>
+</text-expanded>
+</entity>
+<entity name="bprime" type="gen">
+<text-expanded>&amp;#x2035;</text-expanded>
+</entity>
+<entity name="kikbd" type="gen">
+<text-expanded>
+<application>kikbd</application>
+</text-expanded>
+</entity>
+<entity name="kde" type="gen">
+<text-expanded>
+<acronym>KDE</acronym>
+</text-expanded>
+</entity>
+<entity name="kfract" type="gen">
+<text-expanded>
+<application>KFract</application>
+</text-expanded>
+</entity>
+<entity name="kdf" type="gen">
+<text-expanded>
+<application>kdf</application>
+</text-expanded>
+</entity>
+<entity name="bull" type="gen">
+<text-expanded>&amp;#x2022;</text-expanded>
+</entity>
+<entity name="laquo" type="gen">
+<text-expanded>&amp;#x00AB;</text-expanded>
+</entity>
+<entity name="nsim" type="gen">
+<text-expanded>&amp;#x2241;</text-expanded>
+</entity>
+<entity name="HTTP" type="gen">
+<text-expanded>
+<acronym>HTTP</acronym>
+</text-expanded>
+</entity>
+<entity name="nlArr" type="gen">
+<text-expanded>&amp;#x21CD;</text-expanded>
+</entity>
+<entity name="vDash" type="gen">
+<text-expanded>&amp;#x22A8;</text-expanded>
+</entity>
+<entity name="kdm" type="gen">
+<text-expanded>
+<application>kdm</application>
+</text-expanded>
+</entity>
+<entity name="acirc" type="gen">
+<text-expanded>&amp;#x00E2;</text-expanded>
+</entity>
+<entity name="scnsim" type="gen">
+<text-expanded>&amp;#x22E9;</text-expanded>
+</entity>
+<entity name="CUPS" type="gen">
+<text-expanded>
+<acronym>CUPS</acronym>
+</text-expanded>
+</entity>
+<entity name="vellip" type="gen">
+<text-expanded>&amp;#x22EE;</text-expanded>
+</entity>
+<entity name="numsp" type="gen">
+<text-expanded>&amp;#x2007;</text-expanded>
+</entity>
+<entity name="setmn" type="gen">
+<text-expanded>&amp;#x2216;</text-expanded>
+</entity>
+<entity name="tilde" type="gen">
+<text-expanded>&amp;#x02DC;</text-expanded>
+</entity>
+<entity name="lstrok" type="gen">
+<text-expanded>&amp;#x0142;</text-expanded>
+</entity>
+<entity name="rpargt" type="gen">
+<text-expanded>&amp;#xE291;</text-expanded>
+</entity>
+<entity name="ssmile" type="gen">
+<text-expanded>&amp;#x2323;</text-expanded>
+</entity>
+<entity name="aogon" type="gen">
+<text-expanded>&amp;#x0105;</text-expanded>
+</entity>
+<entity name="jukcy" type="gen">
+<text-expanded>&amp;#x0454;</text-expanded>
+</entity>
+<entity name="FDLNotice" type="gen"/>
+<entity name="b.rhov" type="gen">
+<text-expanded>&amp;#x03F1;</text-expanded>
+</entity>
+<entity name="djcy" type="gen">
+<text-expanded>&amp;#x0452;</text-expanded>
+</entity>
+<entity name="blk12" type="gen">
+<text-expanded>&amp;#x2592;</text-expanded>
+</entity>
+<entity name="Qt" type="gen">
+<text-expanded>
+<trademark>Qt</trademark>
+</text-expanded>
+</entity>
+<entity name="kmail" type="gen">
+<text-expanded>
+<application>KMail</application>
+</text-expanded>
+</entity>
+<entity name="iquest" type="gen">
+<text-expanded>&amp;#x00BF;</text-expanded>
+</entity>
+<entity name="blk14" type="gen">
+<text-expanded>&amp;#x2591;</text-expanded>
+</entity>
+<entity name="emsp" type="gen">
+<text-expanded>&amp;#x2003;</text-expanded>
+</entity>
+<entity name="bump" type="gen">
+<text-expanded>&amp;#x224E;</text-expanded>
+</entity>
+<entity name="edot" type="gen">
+<text-expanded>&amp;#x0117;</text-expanded>
+</entity>
+<entity name="knewsticker" type="gen">
+<text-expanded>
+<application>KNewsTicker</application>
+</text-expanded>
+</entity>
+<entity name="kcedil" type="gen">
+<text-expanded>&amp;#x0137;</text-expanded>
+</entity>
+<entity name="lang" type="gen">
+<text-expanded>&amp;#x3008;</text-expanded>
+</entity>
+<entity name="Cap" type="gen">
+<text-expanded>&amp;#x22D2;</text-expanded>
+</entity>
+<entity name="Udigr" type="gen">
+<text-expanded>&amp;#x03AB;</text-expanded>
+</entity>
+<entity name="caron" type="gen">
+<text-expanded>&amp;#x02C7;</text-expanded>
+</entity>
+<entity name="kate" type="gen">
+<text-expanded>
+<application>Kate</application>
+</text-expanded>
+</entity>
+<entity name="trie" type="gen">
+<text-expanded>&amp;#x225C;</text-expanded>
+</entity>
+<entity name="vcy" type="gen">
+<text-expanded>&amp;#x0432;</text-expanded>
+</entity>
+<entity name="Agr" type="gen">
+<text-expanded>&amp;#x0391;</text-expanded>
+</entity>
+<entity name="zhcy" type="gen">
+<text-expanded>&amp;#x0436;</text-expanded>
+</entity>
+<entity name="FDLBackCoverText" type="gen">
+<text-expanded>no Back-Cover Texts</text-expanded>
+</entity>
+<entity name="atilde" type="gen">
+<text-expanded>&amp;#x00E3;</text-expanded>
+</entity>
+<entity name="zdot" type="gen">
+<text-expanded>&amp;#x017C;</text-expanded>
+</entity>
+<entity name="nVDash" type="gen">
+<text-expanded>&amp;#x22AF;</text-expanded>
+</entity>
+<entity name="Larr" type="gen">
+<text-expanded>&amp;#x219E;</text-expanded>
+</entity>
+<entity name="b.lambda" type="gen">
+<text-expanded>&amp;#x03BB;</text-expanded>
+</entity>
+<entity name="lEg" type="gen">
+<text-expanded>&amp;#x22DA;</text-expanded>
+</entity>
+<entity name="bernou" type="gen">
+<text-expanded>&amp;#x212C;</text-expanded>
+</entity>
+<entity name="help.menu.documentation" type="gen"/>
+<entity name="lpar" type="gen">
+<text-expanded>&amp;#x0028;</text-expanded>
+</entity>
+<entity name="ohgr" type="gen">
+<text-expanded>&amp;#x03C9;</text-expanded>
+</entity>
+<entity name="pixie" type="gen">
+<text-expanded>
+<application>Pixie</application>
+</text-expanded>
+</entity>
+<entity name="kfm" type="gen">
+<text-expanded>
+<application>KFM</application>
+</text-expanded>
+</entity>
+<entity name="Hcirc" type="gen">
+<text-expanded>&amp;#x0124;</text-expanded>
+</entity>
+<entity name="gvnE" type="gen">
+<text-expanded>&amp;#x2269;</text-expanded>
+</entity>
+<entity name="ecolon" type="gen">
+<text-expanded>&amp;#x2255;</text-expanded>
+</entity>
+<entity name="KHgr" type="gen">
+<text-expanded>&amp;#x03A7;</text-expanded>
+</entity>
+<entity name="egrave" type="gen">
+<text-expanded>&amp;#x00E8;</text-expanded>
+</entity>
+<entity name="twixt" type="gen">
+<text-expanded>&amp;#x226C;</text-expanded>
+</entity>
+<entity name="larrtl" type="gen">
+<text-expanded>&amp;#x21A2;</text-expanded>
+</entity>
+<entity name="boxUL" type="gen">
+<text-expanded>&amp;#x255B;</text-expanded>
+</entity>
+<entity name="Aacute" type="gen">
+<text-expanded>&amp;#x00C1;</text-expanded>
+</entity>
+<entity name="intcal" type="gen">
+<text-expanded>&amp;#x22BA;</text-expanded>
+</entity>
+<entity name="boxUR" type="gen">
+<text-expanded>&amp;#x2558;</text-expanded>
+</entity>
+<entity name="bumpe" type="gen">
+<text-expanded>&amp;#x224F;</text-expanded>
+</entity>
+<entity name="Linux" type="gen">
+<text-expanded>
+<trademark class="registered">Linux</trademark>
+</text-expanded>
+</entity>
+<entity name="pound" type="gen">
+<text-expanded>&amp;#x00A3;</text-expanded>
+</entity>
+<entity name="varr" type="gen">
+<text-expanded>&amp;#x2195;</text-expanded>
+</entity>
+<entity name="blk34" type="gen">
+<text-expanded>&amp;#x2593;</text-expanded>
+</entity>
+<entity name="map" type="gen">
+<text-expanded>&amp;#x21A6;</text-expanded>
+</entity>
+<entity name="kiconedit" type="gen">
+<text-expanded>
+<application>KIconEdit</application>
+</text-expanded>
+</entity>
+<entity name="lrarr2" type="gen">
+<text-expanded>&amp;#x21C6;</text-expanded>
+</entity>
+<entity name="numero" type="gen">
+<text-expanded>&amp;#x2116;</text-expanded>
+</entity>
+<entity name="kgr" type="gen">
+<text-expanded>&amp;#x03BA;</text-expanded>
+</entity>
+<entity name="kcharselect" type="gen">
+<text-expanded>
+<application>kcharselect</application>
+</text-expanded>
+</entity>
+<entity name="sext" type="gen">
+<text-expanded>&amp;#x2736;</text-expanded>
+</entity>
+<entity name="Lgr" type="gen">
+<text-expanded>&amp;#x039B;</text-expanded>
+</entity>
+<entity name="ksgmltools" type="gen">
+<text-expanded>
+<application>ksgmltools</application>
+</text-expanded>
+</entity>
+<entity name="bcy" type="gen">
+<text-expanded>&amp;#x0431;</text-expanded>
+</entity>
+<entity name="Lcaron" type="gen">
+<text-expanded>&amp;#x013D;</text-expanded>
+</entity>
+<entity name="MusiXTeX" type="gen">
+<text-expanded>
+<application>MusiXTeX</application>
+</text-expanded>
+</entity>
+<entity name="yucy" type="gen">
+<text-expanded>&amp;#x044E;</text-expanded>
+</entity>
+<entity name="boxVH" type="gen">
+<text-expanded>&amp;#x256B;</text-expanded>
+</entity>
+<entity name="hstrok" type="gen">
+<text-expanded>&amp;#x0127;</text-expanded>
+</entity>
+<entity name="divonx" type="gen">
+<text-expanded>&amp;#x22C7;</text-expanded>
+</entity>
+<entity name="sime" type="gen">
+<text-expanded>&amp;#x2243;</text-expanded>
+</entity>
+<entity name="boxUl" type="gen">
+<text-expanded>&amp;#x255C;</text-expanded>
+</entity>
+<entity name="boxVL" type="gen">
+<text-expanded>&amp;#x2562;</text-expanded>
+</entity>
+<entity name="gacute" type="gen">
+<text-expanded>&amp;#x01F5;</text-expanded>
+</entity>
+<entity name="boxUr" type="gen">
+<text-expanded>&amp;#x255A;</text-expanded>
+</entity>
+<entity name="boxVR" type="gen">
+<text-expanded>&amp;#x255F;</text-expanded>
+</entity>
+<entity name="b.iota" type="gen">
+<text-expanded>&amp;#x03B9;</text-expanded>
+</entity>
+<entity name="vdash" type="gen">
+<text-expanded>&amp;#x22A2;</text-expanded>
+</entity>
+<entity name="artsbuilder" type="gen">
+<text-expanded>
+<application>aRts-builder</application>
+</text-expanded>
+</entity>
+<entity name="rAarr" type="gen">
+<text-expanded>&amp;#x21DB;</text-expanded>
+</entity>
+<entity name="kgeo" type="gen">
+<text-expanded>
+<application>KGeo</application>
+</text-expanded>
+</entity>
+<entity name="block" type="gen">
+<text-expanded>&amp;#x2588;</text-expanded>
+</entity>
+<entity name="Shift" type="gen">
+<text-expanded>
+<keycap>Shift</keycap>
+</text-expanded>
+</entity>
+<entity name="colon" type="gen">
+<text-expanded>&amp;#x003A;</text-expanded>
+</entity>
+<entity name="ksmiletris" type="gen">
+<text-expanded>
+<application>KSmiletris</application>
+</text-expanded>
+</entity>
+<entity name="cross" type="gen">
+<text-expanded>&amp;#x2717;</text-expanded>
+</entity>
+<entity name="grave" type="gen">
+<text-expanded>&amp;#x0060;</text-expanded>
+</entity>
+<entity name="boxVh" type="gen">
+<text-expanded>&amp;#x256C;</text-expanded>
+</entity>
+<entity name="KJcy" type="gen">
+<text-expanded>&amp;#x040C;</text-expanded>
+</entity>
+<entity name="int" type="gen">
+<text-expanded>&amp;#x222B;</text-expanded>
+</entity>
+<entity name="rcaron" type="gen">
+<text-expanded>&amp;#x0159;</text-expanded>
+</entity>
+<entity name="TSHcy" type="gen">
+<text-expanded>&amp;#x040B;</text-expanded>
+</entity>
+<entity name="ffilig" type="gen">
+<text-expanded>&amp;#xFB03;</text-expanded>
+</entity>
+<entity name="boxVl" type="gen">
+<text-expanded>&amp;#x2563;</text-expanded>
+</entity>
+<entity name="Racute" type="gen">
+<text-expanded>&amp;#x0154;</text-expanded>
+</entity>
+<entity name="boxVr" type="gen">
+<text-expanded>&amp;#x2560;</text-expanded>
+</entity>
+<entity name="rtri" type="gen">
+<text-expanded>&amp;#x25B9;</text-expanded>
+</entity>
+<entity name="male" type="gen">
+<text-expanded>&amp;#x2642;</text-expanded>
+</entity>
+<entity name="nldr" type="gen">
+<text-expanded>&amp;#x2025;</text-expanded>
+</entity>
+<entity name="GPL-html" type="ndata"/>
+<entity name="kompare" type="gen">
+<text-expanded>
+<application>Kompare</application>
+</text-expanded>
+</entity>
+<entity name="Rcedil" type="gen">
+<text-expanded>&amp;#x0156;</text-expanded>
+</entity>
+<entity name="b.mu" type="gen">
+<text-expanded>&amp;#x03BC;</text-expanded>
+</entity>
+<entity name="phone" type="gen">
+<text-expanded>&amp;#x260E;</text-expanded>
+</entity>
+<entity name="rsh" type="gen">
+<text-expanded>&amp;#x21B1;</text-expanded>
+</entity>
+<entity name="malt" type="gen">
+<text-expanded>&amp;#x2720;</text-expanded>
+</entity>
+<entity name="mcy" type="gen">
+<text-expanded>&amp;#x043C;</text-expanded>
+</entity>
+<entity name="kit" type="gen">
+<text-expanded>
+<application>Kit</application>
+</text-expanded>
+</entity>
+<entity name="install.intro.documentation" type="gen"/>
+<entity name="odblac" type="gen">
+<text-expanded>&amp;#x0151;</text-expanded>
+</entity>
+<entity name="Ncy" type="gen">
+<text-expanded>&amp;#x041D;</text-expanded>
+</entity>
+<entity name="yacy" type="gen">
+<text-expanded>&amp;#x044F;</text-expanded>
+</entity>
+<entity name="larr" type="gen">
+<text-expanded>&amp;#x2190;</text-expanded>
+</entity>
+<entity name="nVdash" type="gen">
+<text-expanded>&amp;#x22AE;</text-expanded>
+</entity>
+<entity name="agrave" type="gen">
+<text-expanded>&amp;#x00E0;</text-expanded>
+</entity>
+<entity name="bottom" type="gen">
+<text-expanded>&amp;#x22A5;</text-expanded>
+</entity>
+<entity name="quest" type="gen">
+<text-expanded>&amp;#x003F;</text-expanded>
+</entity>
+<entity name="udigr" type="gen">
+<text-expanded>&amp;#x03CB;</text-expanded>
+</entity>
+<entity name="Ucirc" type="gen">
+<text-expanded>&amp;#x00DB;</text-expanded>
+</entity>
+<entity name="nles" type="gen">
+<text-expanded>&amp;#x2270;</text-expanded>
+</entity>
+<entity name="khangman" type="gen">
+<text-expanded>
+<application>KHangMan</application>
+</text-expanded>
+</entity>
+<entity name="starf" type="gen">
+<text-expanded>&amp;#x2605;</text-expanded>
+</entity>
+<entity name="Oslash" type="gen">
+<text-expanded>&amp;#x00D8;</text-expanded>
+</entity>
+<entity name="b.nu" type="gen">
+<text-expanded>&amp;#x03BD;</text-expanded>
+</entity>
+<entity name="lskat" type="gen">
+<text-expanded>
+<application>Lskat</application>
+</text-expanded>
+</entity>
+<entity name="notin" type="gen">
+<text-expanded>&amp;#x2209;</text-expanded>
+</entity>
+<entity name="b.thetas" type="gen">
+<text-expanded>&amp;#x03B8;</text-expanded>
+</entity>
+<entity name="kcalc" type="gen">
+<text-expanded>
+<application>KCalc</application>
+</text-expanded>
+</entity>
+<entity name="quantaplus" type="gen">
+<text-expanded>
+<application>Quanta Plus</application>
+</text-expanded>
+</entity>
+<entity name="hearts" type="gen">
+<text-expanded>&amp;#x2665;</text-expanded>
+</entity>
+<entity name="b.thetav" type="gen">
+<text-expanded>&amp;#x03D1;</text-expanded>
+</entity>
+<entity name="Uogon" type="gen">
+<text-expanded>&amp;#x0172;</text-expanded>
+</entity>
+<entity name="nvDash" type="gen">
+<text-expanded>&amp;#x22AD;</text-expanded>
+</entity>
+<entity name="Alt" type="gen">
+<text-expanded>
+<keycap>Alt</keycap>
+</text-expanded>
+</entity>
+<entity name="ktron" type="gen">
+<text-expanded>
+<application>KTron</application>
+</text-expanded>
+</entity>
+<entity name="konsole" type="gen">
+<text-expanded>
+<application>Konsole</application>
+</text-expanded>
+</entity>
+<entity name="dstrok" type="gen">
+<text-expanded>&amp;#x0111;</text-expanded>
+</entity>
+<entity name="ntilde" type="gen">
+<text-expanded>&amp;#x00F1;</text-expanded>
+</entity>
+<entity name="cacute" type="gen">
+<text-expanded>&amp;#x0107;</text-expanded>
+</entity>
+<entity name="hcirc" type="gen">
+<text-expanded>&amp;#x0125;</text-expanded>
+</entity>
+<entity name="Idigr" type="gen">
+<text-expanded>&amp;#x03AA;</text-expanded>
+</entity>
+<entity name="artsshell" type="gen">
+<text-expanded>
+<application>artsshell</application>
+</text-expanded>
+</entity>
+<entity name="lAarr" type="gen">
+<text-expanded>&amp;#x21DA;</text-expanded>
+</entity>
+<entity name="rtrie" type="gen">
+<text-expanded>&amp;#x22B5;</text-expanded>
+</entity>
+<entity name="kpanel" type="gen">
+<text-expanded>
+<application>kpanel</application>
+</text-expanded>
+</entity>
+<entity name="rtrif" type="gen">
+<text-expanded>&amp;#x25B8;</text-expanded>
+</entity>
+<entity name="FAQ" type="gen">
+<text-expanded>
+<acronym>FAQ</acronym>
+</text-expanded>
+</entity>
+<entity name="install.compile.documentation" type="gen"/>
+<entity name="rArr" type="gen">
+<text-expanded>&amp;#x21D2;</text-expanded>
+</entity>
+<entity name="Sub" type="gen">
+<text-expanded>&amp;#x22D0;</text-expanded>
+</entity>
+<entity name="bgr" type="gen">
+<text-expanded>&amp;#x03B2;</text-expanded>
+</entity>
+<entity name="ccedil" type="gen">
+<text-expanded>&amp;#x00E7;</text-expanded>
+</entity>
+<entity name="Ycy" type="gen">
+<text-expanded>&amp;#x042B;</text-expanded>
+</entity>
+<entity name="top" type="gen">
+<text-expanded>&amp;#x22A4;</text-expanded>
+</entity>
+<entity name="ksirc" type="gen">
+<text-expanded>
+<application>KSirc</application>
+</text-expanded>
+</entity>
+<entity name="nrarr" type="gen">
+<text-expanded>&amp;#x219B;</text-expanded>
+</entity>
+<entity name="uplus" type="gen">
+<text-expanded>&amp;#x228E;</text-expanded>
+</entity>
+<entity name="Sup" type="gen">
+<text-expanded>&amp;#x22D1;</text-expanded>
+</entity>
+<entity name="ncaron" type="gen">
+<text-expanded>&amp;#x0148;</text-expanded>
+</entity>
+<entity name="ktuberling" type="gen">
+<text-expanded>
+<application>KTuberling</application>
+</text-expanded>
+</entity>
+<entity name="Xi" type="gen">
+<text-expanded>&amp;#x039E;</text-expanded>
+</entity>
+<entity name="OHacgr" type="gen">
+<text-expanded>&amp;#x038F;</text-expanded>
+</entity>
+<entity name="Upsi" type="gen">
+<text-expanded>&amp;#x03D2;</text-expanded>
+</entity>
+<entity name="SuSE" type="gen">
+<text-expanded>
+<trademark class="registered">
+<acronym>SuSE</acronym>
+</trademark>
+</text-expanded>
+</entity>
+<entity name="Nacute" type="gen">
+<text-expanded>&amp;#x0143;</text-expanded>
+</entity>
+<entity name="phgr" type="gen">
+<text-expanded>&amp;#x03C6;</text-expanded>
+</entity>
+<entity name="nsupE" type="gen">
+<text-expanded>&amp;#x2289;</text-expanded>
+</entity>
+<entity name="b.pi" type="gen">
+<text-expanded>&amp;#x03C0;</text-expanded>
+</entity>
+<entity name="b.Omega" type="gen">
+<text-expanded>&amp;#x03A9;</text-expanded>
+</entity>
+<entity name="Ncedil" type="gen">
+<text-expanded>&amp;#x0145;</text-expanded>
+</entity>
+<entity name="hardcy" type="gen">
+<text-expanded>&amp;#x044A;</text-expanded>
+</entity>
+<entity name="lnsim" type="gen">
+<text-expanded>&amp;#x22E6;</text-expanded>
+</entity>
+<entity name="IEcy" type="gen">
+<text-expanded>&amp;#x0415;</text-expanded>
+</entity>
+<entity name="emsp13" type="gen">
+<text-expanded>&amp;#x2004;</text-expanded>
+</entity>
+<entity name="emsp14" type="gen">
+<text-expanded>&amp;#x2005;</text-expanded>
+</entity>
+<entity name="brahms" type="gen">
+<text-expanded>
+<application>Brahms</application>
+</text-expanded>
+</entity>
+<entity name="Gdot" type="gen">
+<text-expanded>&amp;#x0120;</text-expanded>
+</entity>
+<entity name="nsupe" type="gen">
+<text-expanded>&amp;#x2289;</text-expanded>
+</entity>
+<entity name="Ocirc" type="gen">
+<text-expanded>&amp;#x00D4;</text-expanded>
+</entity>
+<entity name="MMB" type="gen">
+<text-expanded>
+<mousebutton>middle</mousebutton> mouse button</text-expanded>
+</entity>
+<entity name="kivio" type="gen">
+<text-expanded>
+<application>Kivio</application>
+</text-expanded>
+</entity>
+<entity name="mgr" type="gen">
+<text-expanded>&amp;#x03BC;</text-expanded>
+</entity>
+<entity name="Ngr" type="gen">
+<text-expanded>&amp;#x039D;</text-expanded>
+</entity>
+<entity name="Jini" type="gen">
+<text-expanded>
+<trademark>Jini</trademark>
+</text-expanded>
+</entity>
+<entity name="dcy" type="gen">
+<text-expanded>&amp;#x0434;</text-expanded>
+</entity>
+<entity name="Yuml" type="gen">
+<text-expanded>&amp;#x0178;</text-expanded>
+</entity>
+<entity name="Ecy" type="gen">
+<text-expanded>&amp;#x042D;</text-expanded>
+</entity>
+<entity name="cularr" type="gen">
+<text-expanded>&amp;#x21B6;</text-expanded>
+</entity>
+<entity name="tcedil" type="gen">
+<text-expanded>&amp;#x0163;</text-expanded>
+</entity>
+<entity name="koffice" type="gen">
+<text-expanded>
+<application>KOffice</application>
+</text-expanded>
+</entity>
+<entity name="fllig" type="gen">
+<text-expanded>&amp;#xFB02;</text-expanded>
+</entity>
+<entity name="barwed" type="gen">
+<text-expanded>&amp;#x22BC;</text-expanded>
+</entity>
+<entity name="Dcaron" type="gen">
+<text-expanded>&amp;#x010E;</text-expanded>
+</entity>
+<entity name="prsim" type="gen">
+<text-expanded>&amp;#x227E;</text-expanded>
+</entity>
+<entity name="hArr" type="gen">
+<text-expanded>&amp;#x21D4;</text-expanded>
+</entity>
+<entity name="psgr" type="gen">
+<text-expanded>&amp;#x03C8;</text-expanded>
+</entity>
+<entity name="nspar" type="gen">
+<text-expanded>&amp;#x2226;</text-expanded>
+</entity>
+<entity name="kworldwatch" type="gen">
+<text-expanded>
+<application>KWorldClock</application>
+</text-expanded>
+</entity>
+<entity name="xrArr" type="gen">
+<text-expanded>&amp;#x21D2;</text-expanded>
+</entity>
+<entity name="ltrie" type="gen">
+<text-expanded>&amp;#x22B4;</text-expanded>
+</entity>
+<entity name="phis" type="gen">
+<text-expanded>&amp;#x03C6;</text-expanded>
+</entity>
+<entity name="ltrif" type="gen">
+<text-expanded>&amp;#x25C2;</text-expanded>
+</entity>
+<entity name="FDL" type="ndata"/>
+<entity name="phiv" type="gen">
+<text-expanded>&amp;#x03D5;</text-expanded>
+</entity>
+<entity name="nharr" type="gen">
+<text-expanded>&amp;#x21AE;</text-expanded>
+</entity>
+<entity name="Mandrake" type="gen">
+<text-expanded>
+<trademark>Mandrake</trademark>
+</text-expanded>
+</entity>
+<entity name="nvdash" type="gen">
+<text-expanded>&amp;#x22AC;</text-expanded>
+</entity>
+<entity name="LGPL-html" type="ndata"/>
+<entity name="LJcy" type="gen">
+<text-expanded>&amp;#x0409;</text-expanded>
+</entity>
+<entity name="square" type="gen">
+<text-expanded>&amp;#x25A1;</text-expanded>
+</entity>
+<entity name="oplus" type="gen">
+<text-expanded>&amp;#x2295;</text-expanded>
+</entity>
+<entity name="Sigma" type="gen">
+<text-expanded>&amp;#x03A3;</text-expanded>
+</entity>
+<entity name="mid" type="gen">
+<text-expanded>&amp;#x2223;</text-expanded>
+</entity>
+<entity name="deg" type="gen">
+<text-expanded>&amp;#x00B0;</text-expanded>
+</entity>
+<entity name="ucirc" type="gen">
+<text-expanded>&amp;#x00FB;</text-expanded>
+</entity>
+<entity name="DZcy" type="gen">
+<text-expanded>&amp;#x040F;</text-expanded>
+</entity>
+<entity name="Utilde" type="gen">
+<text-expanded>&amp;#x0168;</text-expanded>
+</entity>
+<entity name="kbattleship" type="gen">
+<text-expanded>
+<application>KBattleship</application>
+</text-expanded>
+</entity>
+<entity name="xgr" type="gen">
+<text-expanded>&amp;#x03BE;</text-expanded>
+</entity>
+<entity name="XML" type="gen">
+<text-expanded>
+<trademark>XML</trademark>
+</text-expanded>
+</entity>
+<entity name="smid" type="gen">
+<text-expanded>&amp;#xE301;</text-expanded>
+</entity>
+<entity name="ocy" type="gen">
+<text-expanded>&amp;#x043E;</text-expanded>
+</entity>
+<entity name="uogon" type="gen">
+<text-expanded>&amp;#x0173;</text-expanded>
+</entity>
+<entity name="Pcy" type="gen">
+<text-expanded>&amp;#x041F;</text-expanded>
+</entity>
+<entity name="kppp" type="gen">
+<text-expanded>
+<application>kppp</application>
+</text-expanded>
+</entity>
+<entity name="LGPL" type="ndata"/>
+<entity name="dollar" type="gen">
+<text-expanded>&amp;#x0024;</text-expanded>
+</entity>
+<entity name="fork" type="gen">
+<text-expanded>&amp;#x22D4;</text-expanded>
+</entity>
+<entity name="upsi" type="gen">
+<text-expanded>&amp;#x03C5;</text-expanded>
+</entity>
+<entity name="idigr" type="gen">
+<text-expanded>&amp;#x03CA;</text-expanded>
+</entity>
+<entity name="aktion" type="gen">
+<text-expanded>
+<application>aKtion</application>
+</text-expanded>
+</entity>
+<entity name="nsub" type="gen">
+<text-expanded>&amp;#x2284;</text-expanded>
+</entity>
+<entity name="Icirc" type="gen">
+<text-expanded>&amp;#x00CE;</text-expanded>
+</entity>
+<entity name="osol" type="gen">
+<text-expanded>&amp;#x2298;</text-expanded>
+</entity>
+<entity name="marker" type="gen">
+<text-expanded>&amp;#x25AE;</text-expanded>
+</entity>
+<entity name="Ouml" type="gen">
+<text-expanded>&amp;#x00D6;</text-expanded>
+</entity>
+<entity name="micro" type="gen">
+<text-expanded>&amp;#x00B5;</text-expanded>
+</entity>
+<entity name="darr2" type="gen">
+<text-expanded>&amp;#x21CA;</text-expanded>
+</entity>
+<entity name="scsim" type="gen">
+<text-expanded>&amp;#x227F;</text-expanded>
+</entity>
+<entity name="kpm" type="gen">
+<text-expanded>
+<application>Kpm</application>
+</text-expanded>
+</entity>
+<entity name="nsup" type="gen">
+<text-expanded>&amp;#x2285;</text-expanded>
+</entity>
+<entity name="Iogon" type="gen">
+<text-expanded>&amp;#x012E;</text-expanded>
+</entity>
+<entity name="sbsol" type="gen">
+<text-expanded>&amp;#xFE68;</text-expanded>
+</entity>
+<entity name="kview" type="gen">
+<text-expanded>
+<application>KView</application>
+</text-expanded>
+</entity>
+<entity name="kappa" type="gen">
+<text-expanded>&amp;#x03BA;</text-expanded>
+</entity>
+<entity name="b.Gamma" type="gen">
+<text-expanded>&amp;#x0393;</text-expanded>
+</entity>
+<entity name="xhArr" type="gen">
+<text-expanded>&amp;#x2194;</text-expanded>
+</entity>
+<entity name="kappav" type="gen">
+<text-expanded>&amp;#x03F0;</text-expanded>
+</entity>
+<entity name="b.zeta" type="gen">
+<text-expanded>&amp;#x03B6;</text-expanded>
+</entity>
+<entity name="konqueror" type="gen">
+<text-expanded>
+<application>Konqueror</application>
+</text-expanded>
+</entity>
+<entity name="katomic" type="gen">
+<text-expanded>
+<application>KAtomic</application>
+</text-expanded>
+</entity>
+<entity name="gdot" type="gen">
+<text-expanded>&amp;#x0121;</text-expanded>
+</entity>
+<entity name="kspell" type="gen">
+<text-expanded>
+<application>KSpell</application>
+</text-expanded>
+</entity>
+<entity name="ltimes" type="gen">
+<text-expanded>&amp;#x22C9;</text-expanded>
+</entity>
+<entity name="kteatime" type="gen">
+<text-expanded>
+<application>KTeaTime</application>
+</text-expanded>
+</entity>
+<entity name="kjezz" type="gen">
+<text-expanded>
+<application>KJezzball</application>
+</text-expanded>
+</entity>
+<entity name="bepsi" type="gen">
+<text-expanded>&amp;#x220D;</text-expanded>
+</entity>
+<entity name="CHcy" type="gen">
+<text-expanded>&amp;#x0427;</text-expanded>
+</entity>
+<entity name="DCOP" type="gen">
+<text-expanded>
+<acronym>DCOP</acronym>
+</text-expanded>
+</entity>
+<entity name="apos" type="gen">
+<text-expanded>&amp;#x0027;</text-expanded>
+</entity>
+<entity name="b.omega" type="gen">
+<text-expanded>&amp;#x03C9;</text-expanded>
+</entity>
+<entity name="SMTP" type="gen">
+<text-expanded>
+<acronym>SMTP</acronym>
+</text-expanded>
+</entity>
+<entity name="dgr" type="gen">
+<text-expanded>&amp;#x03B4;</text-expanded>
+</entity>
+<entity name="zcy" type="gen">
+<text-expanded>&amp;#x0437;</text-expanded>
+</entity>
+<entity name="Egr" type="gen">
+<text-expanded>&amp;#x0395;</text-expanded>
+</entity>
+<entity name="b.epsi" type="gen">
+<text-expanded>&amp;#x03B5;</text-expanded>
+</entity>
+<entity name="yuml" type="gen">
+<text-expanded>&amp;#x00FF;</text-expanded>
+</entity>
+<entity name="b.Phi" type="gen">
+<text-expanded>&amp;#x03A6;</text-expanded>
+</entity>
+<entity name="reporting.bugs" type="gen"/>
+<entity name="hairsp" type="gen">
+<text-expanded>&amp;#x200A;</text-expanded>
+</entity>
+<entity name="Dagger" type="gen">
+<text-expanded>&amp;#x2021;</text-expanded>
+</entity>
+<entity name="nrtrie" type="gen">
+<text-expanded>&amp;#x22ED;</text-expanded>
+</entity>
+<entity name="PostScript" type="gen">
+<text-expanded>
+<trademark class="registered">PostScript</trademark>
+</text-expanded>
+</entity>
+<entity name="kdebugdialog" type="gen">
+<text-expanded>
+<application>KDebugDialog</application>
+</text-expanded>
+</entity>
+<entity name="epsis" type="gen">
+<text-expanded>&amp;#x220A;</text-expanded>
+</entity>
+<entity name="npar" type="gen">
+<text-expanded>&amp;#x2226;</text-expanded>
+</entity>
+<entity name="ocirc" type="gen">
+<text-expanded>&amp;#x00F4;</text-expanded>
+</entity>
+<entity name="noatun" type="gen">
+<text-expanded>
+<application>Noatun</application>
+</text-expanded>
+</entity>
+<entity name="epsiv" type="gen">
+<text-expanded>&amp;#x03B5;</text-expanded>
+</entity>
+<entity name="horbar" type="gen">
+<text-expanded>&amp;#x2015;</text-expanded>
+</entity>
+<entity name="lcub" type="gen">
+<text-expanded>&amp;#x007B;</text-expanded>
+</entity>
+<entity name="kshisen" type="gen">
+<text-expanded>
+<application>KShisen</application>
+</text-expanded>
+</entity>
+<entity name="koncd" type="gen">
+<text-expanded>
+<application>KOnCD</application>
+</text-expanded>
+</entity>
+<entity name="asymp" type="gen">
+<text-expanded>&amp;#x224D;</text-expanded>
+</entity>
+<entity name="vltri" type="gen">
+<text-expanded>&amp;#x22B2;</text-expanded>
+</entity>
+<entity name="iocy" type="gen">
+<text-expanded>&amp;#x0451;</text-expanded>
+</entity>
+<entity name="Microsoft" type="gen">
+<text-expanded>
+<trademark class="registered">Microsoft</trademark>
+</text-expanded>
+</entity>
+<entity name="ubreve" type="gen">
+<text-expanded>&amp;#x016D;</text-expanded>
+</entity>
+<entity name="Euml" type="gen">
+<text-expanded>&amp;#x00CB;</text-expanded>
+</entity>
+<entity name="MRU" type="gen">
+<text-expanded>
+<acronym>MRU</acronym>
+</text-expanded>
+</entity>
+<entity name="ksnapshot" type="gen">
+<text-expanded>
+<application>KSnapshot</application>
+</text-expanded>
+</entity>
+<entity name="kabalone" type="gen">
+<text-expanded>
+<application>KAbalone</application>
+</text-expanded>
+</entity>
+<entity name="rdquo" type="gen">
+<text-expanded>&amp;#x201D;</text-expanded>
+</entity>
+<entity name="die" type="gen">
+<text-expanded>&amp;#x00A8;</text-expanded>
+</entity>
+<entity name="Ccirc" type="gen">
+<text-expanded>&amp;#x0108;</text-expanded>
+</entity>
+<entity name="documentation.index" type="gen">
+<text-expanded>
+<index/>
+</text-expanded>
+</entity>
+<entity name="Ugrave" type="gen">
+<text-expanded>&amp;#x00D9;</text-expanded>
+</entity>
+<entity name="ogr" type="gen">
+<text-expanded>&amp;#x03BF;</text-expanded>
+</entity>
+<entity name="lacute" type="gen">
+<text-expanded>&amp;#x013A;</text-expanded>
+</entity>
+<entity name="Pgr" type="gen">
+<text-expanded>&amp;#x03A0;</text-expanded>
+</entity>
+<entity name="fcy" type="gen">
+<text-expanded>&amp;#x0444;</text-expanded>
+</entity>
+<entity name="klines" type="gen">
+<text-expanded>
+<application>Kolor Lines</application>
+</text-expanded>
+</entity>
+<entity name="Gcy" type="gen">
+<text-expanded>&amp;#x0413;</text-expanded>
+</entity>
+<entity name="sigma" type="gen">
+<text-expanded>&amp;#x03C3;</text-expanded>
+</entity>
+<entity name="Amacr" type="gen">
+<text-expanded>&amp;#x0100;</text-expanded>
+</entity>
+<entity name="kruler" type="gen">
+<text-expanded>
+<application>KRuler</application>
+</text-expanded>
+</entity>
+<entity name="lcedil" type="gen">
+<text-expanded>&amp;#x013C;</text-expanded>
+</entity>
+<entity name="Theta" type="gen">
+<text-expanded>&amp;#x0398;</text-expanded>
+</entity>
+<entity name="kmahjongg" type="gen">
+<text-expanded>
+<application>KMahjongg</application>
+</text-expanded>
+</entity>
+<entity name="udiagr" type="gen">
+<text-expanded>&amp;#x03B0;</text-expanded>
+</entity>
+<entity name="ouml" type="gen">
+<text-expanded>&amp;#x00F6;</text-expanded>
+</entity>
+<entity name="Phi" type="gen">
+<text-expanded>&amp;#x03A6;</text-expanded>
+</entity>
+<entity name="ohm" type="gen">
+<text-expanded>&amp;#x2126;</text-expanded>
+</entity>
+<entity name="b.xi" type="gen">
+<text-expanded>&amp;#x03BE;</text-expanded>
+</entity>
+<entity name="ktip" type="gen">
+<text-expanded>
+<application>Ktip</application>
+</text-expanded>
+</entity>
+<entity name="weierp" type="gen">
+<text-expanded>&amp;#x2118;</text-expanded>
+</entity>
+<entity name="rarrhk" type="gen">
+<text-expanded>&amp;#x21AA;</text-expanded>
+</entity>
+<entity name="tprime" type="gen">
+<text-expanded>&amp;#x2034;</text-expanded>
+</entity>
+<entity name="flat" type="gen">
+<text-expanded>&amp;#x266D;</text-expanded>
+</entity>
+<entity name="Aacgr" type="gen">
+<text-expanded>&amp;#x0386;</text-expanded>
+</entity>
+<entity name="nltrie" type="gen">
+<text-expanded>&amp;#x22EC;</text-expanded>
+</entity>
+<entity name="killustrator" type="gen">
+<text-expanded>
+<application>Kontour</application>
+</text-expanded>
+</entity>
+<entity name="Delta" type="gen">
+<text-expanded>&amp;#x0394;</text-expanded>
+</entity>
+<entity name="rthree" type="gen">
+<text-expanded>&amp;#x22CC;</text-expanded>
+</entity>
+<entity name="Visor" type="gen">
+<text-expanded>
+<trademark>Visor</trademark>
+</text-expanded>
+</entity>
+<entity name="MTU" type="gen">
+<text-expanded>
+<acronym>MTU</acronym>
+</text-expanded>
+</entity>
+<entity name="kmessedwords" type="gen">
+<text-expanded>
+<application>KMessedWords</application>
+</text-expanded>
+</entity>
+<entity name="icirc" type="gen">
+<text-expanded>&amp;#x00EE;</text-expanded>
+</entity>
+<entity name="uharl" type="gen">
+<text-expanded>&amp;#x21BF;</text-expanded>
+</entity>
+<entity name="uharr" type="gen">
+<text-expanded>&amp;#x21BE;</text-expanded>
+</entity>
+<entity name="EEacgr" type="gen">
+<text-expanded>&amp;#x0389;</text-expanded>
+</entity>
+<entity name="sdotb" type="gen">
+<text-expanded>&amp;#x22A1;</text-expanded>
+</entity>
+<entity name="zgr" type="gen">
+<text-expanded>&amp;#x03B6;</text-expanded>
+</entity>
+<entity name="ap" type="gen">
+<text-expanded>&amp;#x2248;</text-expanded>
+</entity>
+<entity name="kpager" type="gen">
+<text-expanded>
+<application>KPager</application>
+</text-expanded>
+</entity>
+<entity name="bowtie" type="gen">
+<text-expanded>&amp;#x22C8;</text-expanded>
+</entity>
+<entity name="iogon" type="gen">
+<text-expanded>&amp;#x012F;</text-expanded>
+</entity>
+<entity name="kviewshell" type="gen">
+<text-expanded>
+<application>KViewshell</application>
+</text-expanded>
+</entity>
+<entity name="orarr" type="gen">
+<text-expanded>&amp;#x21BB;</text-expanded>
+</entity>
+<entity name="minus" type="gen">
+<text-expanded>&amp;#x2212;</text-expanded>
+</entity>
+<entity name="Rcy" type="gen">
+<text-expanded>&amp;#x0420;</text-expanded>
+</entity>
+<entity name="b.gamma" type="gen">
+<text-expanded>&amp;#x03B3;</text-expanded>
+</entity>
+<entity name="XSL" type="gen">
+<text-expanded>
+<trademark>XSL</trademark>
+</text-expanded>
+</entity>
+<entity name="kghostview" type="gen">
+<text-expanded>
+<application>Kghostview</application>
+</text-expanded>
+</entity>
+<entity name="prnap" type="gen">
+<text-expanded>&amp;#x22E8;</text-expanded>
+</entity>
+<entity name="ldquo" type="gen">
+<text-expanded>&amp;#x201C;</text-expanded>
+</entity>
+<entity name="boxdL" type="gen">
+<text-expanded>&amp;#x2556;</text-expanded>
+</entity>
+<entity name="ncong" type="gen">
+<text-expanded>&amp;#x2247;</text-expanded>
+</entity>
+<entity name="gEl" type="gen">
+<text-expanded>&amp;#x22DB;</text-expanded>
+</entity>
+<entity name="lhblk" type="gen">
+<text-expanded>&amp;#x2584;</text-expanded>
+</entity>
+<entity name="boxdR" type="gen">
+<text-expanded>&amp;#x2554;</text-expanded>
+</entity>
+<entity name="Aring" type="gen">
+<text-expanded>&amp;#x00C5;</text-expanded>
+</entity>
+<entity name="kbiff" type="gen">
+<text-expanded>
+<application>KBiff</application>
+</text-expanded>
+</entity>
+<entity name="ssetmn" type="gen">
+<text-expanded>&amp;#x2216;</text-expanded>
+</entity>
+<entity name="IJlig" type="gen">
+<text-expanded>&amp;#x0132;</text-expanded>
+</entity>
+<entity name="kworldclock" type="gen">
+<text-expanded>
+<application>KWorldClock</application>
+</text-expanded>
+</entity>
+<entity name="gjcy" type="gen">
+<text-expanded>&amp;#x0453;</text-expanded>
+</entity>
+<entity name="euml" type="gen">
+<text-expanded>&amp;#x00EB;</text-expanded>
+</entity>
+<entity name="kvt" type="gen">
+<text-expanded>
+<application>KVT</application>
+</text-expanded>
+</entity>
+<entity name="percnt" type="gen">
+<text-expanded>&amp;#x0025;</text-expanded>
+</entity>
+<entity name="cdrom" type="gen">
+<text-expanded>
+<hardware>CD-ROM drive</hardware>
+</text-expanded>
+</entity>
+<entity name="boxdl" type="gen">
+<text-expanded>&amp;#x2510;</text-expanded>
+</entity>
+<entity name="plusdo" type="gen">
+<text-expanded>&amp;#x2214;</text-expanded>
+</entity>
+<entity name="Jsercy" type="gen">
+<text-expanded>&amp;#x0408;</text-expanded>
+</entity>
+<entity name="boxdr" type="gen">
+<text-expanded>&amp;#x250C;</text-expanded>
+</entity>
+<entity name="Tstrok" type="gen">
+<text-expanded>&amp;#x0166;</text-expanded>
+</entity>
+<entity name="scaron" type="gen">
+<text-expanded>&amp;#x0161;</text-expanded>
+</entity>
+<entity name="Ggr" type="gen">
+<text-expanded>&amp;#x0393;</text-expanded>
+</entity>
+<entity name="SOFTcy" type="gen">
+<text-expanded>&amp;#x042C;</text-expanded>
+</entity>
+<entity name="Sacute" type="gen">
+<text-expanded>&amp;#x015A;</text-expanded>
+</entity>
+<entity name="gammad" type="gen">
+<text-expanded>&amp;#x03DC;</text-expanded>
+</entity>
+<entity name="female" type="gen">
+<text-expanded>&amp;#x2640;</text-expanded>
+</entity>
+<entity name="kwm" type="gen">
+<text-expanded>
+<application>kwm</application>
+</text-expanded>
+</entity>
+<entity name="kmidi" type="gen">
+<text-expanded>
+<application>KMidi</application>
+</text-expanded>
+</entity>
+<entity name="thkap" type="gen">
+<text-expanded>&amp;#x2248;</text-expanded>
+</entity>
+<entity name="sfgr" type="gen">
+<text-expanded>&amp;#x03C2;</text-expanded>
+</entity>
+<entity name="ccirc" type="gen">
+<text-expanded>&amp;#x0109;</text-expanded>
+</entity>
+<entity name="Gbreve" type="gen">
+<text-expanded>&amp;#x011E;</text-expanded>
+</entity>
+<entity name="frac12" type="gen">
+<text-expanded>&amp;#x00BD;</text-expanded>
+</entity>
+<entity name="compfn" type="gen">
+<text-expanded>&amp;#x2218;</text-expanded>
+</entity>
+<entity name="frac13" type="gen">
+<text-expanded>&amp;#x2153;</text-expanded>
+</entity>
+<entity name="Scedil" type="gen">
+<text-expanded>&amp;#x015E;</text-expanded>
+</entity>
+<entity name="frac14" type="gen">
+<text-expanded>&amp;#x00BC;</text-expanded>
+</entity>
+<entity name="frac15" type="gen">
+<text-expanded>&amp;#x2155;</text-expanded>
+</entity>
+<entity name="frac16" type="gen">
+<text-expanded>&amp;#x2159;</text-expanded>
+</entity>
+<entity name="frac18" type="gen">
+<text-expanded>&amp;#x215B;</text-expanded>
+</entity>
+<entity name="ocir" type="gen">
+<text-expanded>&amp;#x229A;</text-expanded>
+</entity>
+<entity name="darr" type="gen">
+<text-expanded>&amp;#x2193;</text-expanded>
+</entity>
+<entity name="drcrop" type="gen">
+<text-expanded>&amp;#x230C;</text-expanded>
+</entity>
+<entity name="MIME" type="gen">
+<text-expanded>
+<acronym>MIME</acronym>
+</text-expanded>
+</entity>
+<entity name="scnap" type="gen">
+<text-expanded>&amp;#x22E9;</text-expanded>
+</entity>
+<entity name="lmidot" type="gen">
+<text-expanded>&amp;#x0140;</text-expanded>
+</entity>
+<entity name="PalmPilot" type="gen">
+<text-expanded>
+<productname>
+<trademark>PalmPilot</trademark>
+</productname>
+</text-expanded>
+</entity>
+<entity name="gsim" type="gen">
+<text-expanded>&amp;#x2273;</text-expanded>
+</entity>
+<entity name="Itilde" type="gen">
+<text-expanded>&amp;#x0128;</text-expanded>
+</entity>
+<entity name="amacr" type="gen">
+<text-expanded>&amp;#x0101;</text-expanded>
+</entity>
+<entity name="yacute" type="gen">
+<text-expanded>&amp;#x00FD;</text-expanded>
+</entity>
+<entity name="rarrlp" type="gen">
+<text-expanded>&amp;#x21AC;</text-expanded>
+</entity>
+<entity name="SHCHcy" type="gen">
+<text-expanded>&amp;#x0429;</text-expanded>
+</entity>
+<entity name="Idot" type="gen">
+<text-expanded>&amp;#x0130;</text-expanded>
+</entity>
+<entity name="dash" type="gen">
+<text-expanded>&amp;#x2010;</text-expanded>
+</entity>
+<entity name="kfaxview" type="gen">
+<text-expanded>
+<application>Kfaxview</application>
+</text-expanded>
+</entity>
+<entity name="kljettool" type="gen">
+<text-expanded>
+<application>KLjettool</application>
+</text-expanded>
+</entity>
+<entity name="frac23" type="gen">
+<text-expanded>&amp;#x2154;</text-expanded>
+</entity>
+<entity name="DScy" type="gen">
+<text-expanded>&amp;#x0405;</text-expanded>
+</entity>
+<entity name="supnE" type="gen">
+<text-expanded>&amp;#x228B;</text-expanded>
+</entity>
+<entity name="frac25" type="gen">
+<text-expanded>&amp;#x2156;</text-expanded>
+</entity>
+<entity name="eg" type="gen">
+<text-expanded>
+<abbrev>e.g.</abbrev>
+</text-expanded>
+</entity>
+<entity name="SGI" type="gen">
+<text-expanded>
+<trademark>SGI</trademark>
+</text-expanded>
+</entity>
+<entity name="vsupnE" type="gen">
+<text-expanded>&amp;#x228B;</text-expanded>
+</entity>
+<entity name="Rgr" type="gen">
+<text-expanded>&amp;#x03A1;</text-expanded>
+</entity>
+<entity name="aacgr" type="gen">
+<text-expanded>&amp;#x03AC;</text-expanded>
+</entity>
+<entity name="gnsim" type="gen">
+<text-expanded>&amp;#x22E7;</text-expanded>
+</entity>
+<entity name="Icy" type="gen">
+<text-expanded>&amp;#x0418;</text-expanded>
+</entity>
+<entity name="delta" type="gen">
+<text-expanded>&amp;#x03B4;</text-expanded>
+</entity>
+<entity name="otilde" type="gen">
+<text-expanded>&amp;#x00F5;</text-expanded>
+</entity>
+<entity name="dot" type="gen">
+<text-expanded>&amp;#x02D9;</text-expanded>
+</entity>
+<entity name="inodot" type="gen">
+<text-expanded>&amp;#x0131;</text-expanded>
+</entity>
+<entity name="Cup" type="gen">
+<text-expanded>&amp;#x22D3;</text-expanded>
+</entity>
+<entity name="beta" type="gen">
+<text-expanded>&amp;#x03B2;</text-expanded>
+</entity>
+<entity name="kmenuedit" type="gen">
+<text-expanded>
+<application>kmenuedit</application>
+</text-expanded>
+</entity>
+<entity name="Jcirc" type="gen">
+<text-expanded>&amp;#x0134;</text-expanded>
+</entity>
+<entity name="shcy" type="gen">
+<text-expanded>&amp;#x0448;</text-expanded>
+</entity>
+<entity name="boxhD" type="gen">
+<text-expanded>&amp;#x2564;</text-expanded>
+</entity>
+<entity name="beth" type="gen">
+<text-expanded>&amp;#x2136;</text-expanded>
+</entity>
+<entity name="supne" type="gen">
+<text-expanded>&amp;#x228B;</text-expanded>
+</entity>
+<entity name="frac34" type="gen">
+<text-expanded>&amp;#x00BE;</text-expanded>
+</entity>
+<entity name="frac35" type="gen">
+<text-expanded>&amp;#x2157;</text-expanded>
+</entity>
+<entity name="sdot" type="gen">
+<text-expanded>&amp;#x22C5;</text-expanded>
+</entity>
+<entity name="nges" type="gen">
+<text-expanded>&amp;#x2271;</text-expanded>
+</entity>
+<entity name="gE" type="gen">
+<text-expanded>&amp;#x2267;</text-expanded>
+</entity>
+<entity name="cent" type="gen">
+<text-expanded>&amp;#x00A2;</text-expanded>
+</entity>
+<entity name="kwrite" type="gen">
+<text-expanded>
+<application>KWrite</application>
+</text-expanded>
+</entity>
+<entity name="frac38" type="gen">
+<text-expanded>&amp;#x215C;</text-expanded>
+</entity>
+<entity name="kdat" type="gen">
+<text-expanded>
+<application>Kdat</application>
+</text-expanded>
+</entity>
+<entity name="urcrop" type="gen">
+<text-expanded>&amp;#x230E;</text-expanded>
+</entity>
+<entity name="vsupne" type="gen">
+<text-expanded>&amp;#x228B;</text-expanded>
+</entity>
+<entity name="dpi" type="gen">
+<text-expanded>
+<acronym>dpi</acronym>
+</text-expanded>
+</entity>
+<entity name="kontour" type="gen">
+<text-expanded>
+<application>Kontour</application>
+</text-expanded>
+</entity>
+<entity name="check" type="gen">
+<text-expanded>&amp;#x2713;</text-expanded>
+</entity>
+<entity name="NJcy" type="gen">
+<text-expanded>&amp;#x040A;</text-expanded>
+</entity>
+<entity name="ffllig" type="gen">
+<text-expanded>&amp;#xFB04;</text-expanded>
+</entity>
+<entity name="ktop" type="gen">
+<text-expanded>
+<application>KTop</application>
+</text-expanded>
+</entity>
+<entity name="boxhU" type="gen">
+<text-expanded>&amp;#x2567;</text-expanded>
+</entity>
+<entity name="rceil" type="gen">
+<text-expanded>&amp;#x2309;</text-expanded>
+</entity>
+<entity name="DVI" type="gen">
+<text-expanded>
+<acronym>DVI</acronym>
+</text-expanded>
+</entity>
+<entity name="Oacute" type="gen">
+<text-expanded>&amp;#x00D3;</text-expanded>
+</entity>
+<entity name="utri" type="gen">
+<text-expanded>&amp;#x25B5;</text-expanded>
+</entity>
+<entity name="sce" type="gen">
+<text-expanded>&amp;#x227D;</text-expanded>
+</entity>
+<entity name="LaserJet" type="gen">
+<text-expanded>
+<trademark class="registered">LaserJet</trademark>
+</text-expanded>
+</entity>
+<entity name="kpresenter" type="gen">
+<text-expanded>
+<application>KPresenter</application>
+</text-expanded>
+</entity>
+<entity name="ecir" type="gen">
+<text-expanded>&amp;#x2256;</text-expanded>
+</entity>
+<entity name="lsquor" type="gen">
+<text-expanded>&amp;#x201A;</text-expanded>
+</entity>
+<entity name="koshell" type="gen">
+<text-expanded>
+<application>KOShell</application>
+</text-expanded>
+</entity>
+<entity name="boxhd" type="gen">
+<text-expanded>&amp;#x252C;</text-expanded>
+</entity>
+<entity name="Verbar" type="gen">
+<text-expanded>&amp;#x2016;</text-expanded>
+</entity>
+<entity name="frac45" type="gen">
+<text-expanded>&amp;#x2158;</text-expanded>
+</entity>
+<entity name="dlcrop" type="gen">
+<text-expanded>&amp;#x230D;</text-expanded>
+</entity>
+<entity name="ge" type="gen">
+<text-expanded>&amp;#x2265;</text-expanded>
+</entity>
+<entity name="aring" type="gen">
+<text-expanded>&amp;#x00E5;</text-expanded>
+</entity>
+<entity name="gl" type="gen">
+<text-expanded>&amp;#x2277;</text-expanded>
+</entity>
+<entity name="scy" type="gen">
+<text-expanded>&amp;#x0441;</text-expanded>
+</entity>
+<entity name="Tcy" type="gen">
+<text-expanded>&amp;#x0422;</text-expanded>
+</entity>
+<entity name="boxhu" type="gen">
+<text-expanded>&amp;#x2534;</text-expanded>
+</entity>
+<entity name="b.sigmav" type="gen">
+<text-expanded>&amp;#x03C2;</text-expanded>
+</entity>
+<entity name="Zcaron" type="gen">
+<text-expanded>&amp;#x017D;</text-expanded>
+</entity>
+<entity name="kgreen" type="gen">
+<text-expanded>&amp;#x0138;</text-expanded>
+</entity>
+<entity name="gt" type="gen">
+<text-expanded>&amp;#x003E;</text-expanded>
+</entity>
+<entity name="klettres" type="gen">
+<text-expanded>
+<application>KLettres</application>
+</text-expanded>
+</entity>
+<entity name="uacute" type="gen">
+<text-expanded>&amp;#x00FA;</text-expanded>
+</entity>
+<entity name="forall" type="gen">
+<text-expanded>&amp;#x2200;</text-expanded>
+</entity>
+<entity name="esdot" type="gen">
+<text-expanded>&amp;#x2250;</text-expanded>
+</entity>
+<entity name="euro" type="gen">
+<text-expanded>&amp;#x20AC;</text-expanded>
+</entity>
+<entity name="bcong" type="gen">
+<text-expanded>&amp;#x224C;</text-expanded>
+</entity>
+<entity name="Netscape" type="gen">
+<text-expanded>
+<trademark class="registered">Netscape</trademark>
+</text-expanded>
+</entity>
+<entity name="frac56" type="gen">
+<text-expanded>&amp;#x215A;</text-expanded>
+</entity>
+<entity name="frac58" type="gen">
+<text-expanded>&amp;#x215D;</text-expanded>
+</entity>
+<entity name="sstarf" type="gen">
+<text-expanded>&amp;#x22C6;</text-expanded>
+</entity>
+<entity name="arts" type="gen">
+<text-expanded>
+<application>aRts</application>
+</text-expanded>
+</entity>
+<entity name="Ecaron" type="gen">
+<text-expanded>&amp;#x011A;</text-expanded>
+</entity>
+<entity name="oast" type="gen">
+<text-expanded>&amp;#x229B;</text-expanded>
+</entity>
+<entity name="Igrave" type="gen">
+<text-expanded>&amp;#x00CC;</text-expanded>
+</entity>
+<entity name="kjumpingcube" type="gen">
+<text-expanded>
+<application>KJumpingCube</application>
+</text-expanded>
+</entity>
+<entity name="lrhar2" type="gen">
+<text-expanded>&amp;#x21CB;</text-expanded>
+</entity>
+<entity name="b.Psi" type="gen">
+<text-expanded>&amp;#x03A8;</text-expanded>
+</entity>
+<entity name="windowmaker" type="gen">
+<text-expanded>
+<application>Window Maker</application>
+</text-expanded>
+</entity>
+<entity name="DJcy" type="gen">
+<text-expanded>&amp;#x0402;</text-expanded>
+</entity>
+<entity name="uArr" type="gen">
+<text-expanded>&amp;#x21D1;</text-expanded>
+</entity>
+<entity name="ie" type="gen">
+<text-expanded>
+<abbrev>i.e.</abbrev>
+</text-expanded>
+</entity>
+<entity name="kalarmd" type="gen">
+<text-expanded>
+<application>KAlarmd</application>
+</text-expanded>
+</entity>
+<entity name="ulcrop" type="gen">
+<text-expanded>&amp;#x230F;</text-expanded>
+</entity>
+<entity name="Esc" type="gen">
+<text-expanded>
+<keycap>Esc</keycap>
+</text-expanded>
+</entity>
+<entity name="lowast" type="gen">
+<text-expanded>&amp;#x2217;</text-expanded>
+</entity>
+<entity name="kmines" type="gen">
+<text-expanded>
+<application>KMines</application>
+</text-expanded>
+</entity>
+<entity name="HotSync" type="gen">
+<text-expanded>
+<trademark class="registered">HotSync</trademark>
+</text-expanded>
+</entity>
+<entity name="idiagr" type="gen">
+<text-expanded>&amp;#x0390;</text-expanded>
+</entity>
+<entity name="Igr" type="gen">
+<text-expanded>&amp;#x0399;</text-expanded>
+</entity>
+<entity name="lceil" type="gen">
+<text-expanded>&amp;#x2308;</text-expanded>
+</entity>
+<entity name="xutri" type="gen">
+<text-expanded>&amp;#x25B3;</text-expanded>
+</entity>
+<entity name="rdquor" type="gen">
+<text-expanded>&amp;#x201C;</text-expanded>
+</entity>
+<entity name="Lstrok" type="gen">
+<text-expanded>&amp;#x0141;</text-expanded>
+</entity>
+<entity name="ZHcy" type="gen">
+<text-expanded>&amp;#x0416;</text-expanded>
+</entity>
+<entity name="kwin4" type="gen">
+<text-expanded>
+<application>K Four Wins</application>
+</text-expanded>
+</entity>
+<entity name="ograve" type="gen">
+<text-expanded>&amp;#x00F2;</text-expanded>
+</entity>
+<entity name="Wcirc" type="gen">
+<text-expanded>&amp;#x0174;</text-expanded>
+</entity>
+<entity name="underX11License" type="gen"/>
+<entity name="equiv" type="gen">
+<text-expanded>&amp;#x2261;</text-expanded>
+</entity>
+<entity name="kmid" type="gen">
+<text-expanded>
+<application>kmid</application>
+</text-expanded>
+</entity>
+<entity name="Backspace" type="gen">
+<text-expanded>
+<keycap>Backspace</keycap>
+</text-expanded>
+</entity>
+<entity name="rarr2" type="gen">
+<text-expanded>&amp;#x21C9;</text-expanded>
+</entity>
+<entity name="kfouleggs" type="gen">
+<text-expanded>
+<application>KFoulEggs</application>
+</text-expanded>
+</entity>
+<entity name="OHgr" type="gen">
+<text-expanded>&amp;#x03A9;</text-expanded>
+</entity>
+<entity name="Kcedil" type="gen">
+<text-expanded>&amp;#x0136;</text-expanded>
+</entity>
+<entity name="frac78" type="gen">
+<text-expanded>&amp;#x215E;</text-expanded>
+</entity>
+<entity name="artsserver" type="gen">
+<text-expanded>
+<application>artsserver</application>
+</text-expanded>
+</entity>
+<entity name="kthesaurus" type="gen">
+<text-expanded>
+<application>KThesaurus</application>
+</text-expanded>
+</entity>
+<entity name="diam" type="gen">
+<text-expanded>&amp;#x22C4;</text-expanded>
+</entity>
+<entity name="Umacr" type="gen">
+<text-expanded>&amp;#x016A;</text-expanded>
+</entity>
+<entity name="kmix" type="gen">
+<text-expanded>
+<application>KMix</application>
+</text-expanded>
+</entity>
+<entity name="eegr" type="gen">
+<text-expanded>&amp;#x03B7;</text-expanded>
+</entity>
+<entity name="jcirc" type="gen">
+<text-expanded>&amp;#x0135;</text-expanded>
+</entity>
+<entity name="korganizer" type="gen">
+<text-expanded>
+<application>KOrganizer</application>
+</text-expanded>
+</entity>
+<entity name="knotes" type="gen">
+<text-expanded>
+<application>KNotes</application>
+</text-expanded>
+</entity>
+<entity name="Atilde" type="gen">
+<text-expanded>&amp;#x00C3;</text-expanded>
+</entity>
+<entity name="FTP" type="gen">
+<text-expanded>
+<acronym>FTP</acronym>
+</text-expanded>
+</entity>
+<entity name="b.Lambda" type="gen">
+<text-expanded>&amp;#x039B;</text-expanded>
+</entity>
+<entity name="NeXTSTEP" type="gen">
+<text-expanded>
+<trademark>NeXTSTEP</trademark>
+</text-expanded>
+</entity>
+<entity name="kodo" type="gen">
+<text-expanded>
+<application>KOdometer</application>
+</text-expanded>
+</entity>
+<entity name="daleth" type="gen">
+<text-expanded>&amp;#x2138;</text-expanded>
+</entity>
+<entity name="subE" type="gen">
+<text-expanded>&amp;#x2286;</text-expanded>
+</entity>
+<entity name="lE" type="gen">
+<text-expanded>&amp;#x2266;</text-expanded>
+</entity>
+<entity name="ijlig" type="gen">
+<text-expanded>&amp;#x0133;</text-expanded>
+</entity>
+<entity name="kappname" type="gen">
+<text-expanded>this application</text-expanded>
+</entity>
+<entity name="sgr" type="gen">
+<text-expanded>&amp;#x03C3;</text-expanded>
+</entity>
+<entity name="Uacgr" type="gen">
+<text-expanded>&amp;#x038E;</text-expanded>
+</entity>
+<entity name="Tgr" type="gen">
+<text-expanded>&amp;#x03A4;</text-expanded>
+</entity>
+<entity name="jcy" type="gen">
+<text-expanded>&amp;#x0439;</text-expanded>
+</entity>
+<entity name="Psi" type="gen">
+<text-expanded>&amp;#x03A8;</text-expanded>
+</entity>
+<entity name="Kcy" type="gen">
+<text-expanded>&amp;#x041A;</text-expanded>
+</entity>
+<entity name="iexcl" type="gen">
+<text-expanded>&amp;#x00A1;</text-expanded>
+</entity>
+<entity name="kdict" type="gen">
+<text-expanded>
+<application>KDict</application>
+</text-expanded>
+</entity>
+<entity name="YUcy" type="gen">
+<text-expanded>&amp;#x042E;</text-expanded>
+</entity>
+<entity name="Egrave" type="gen">
+<text-expanded>&amp;#x00C8;</text-expanded>
+</entity>
+<entity name="tdot" type="gen">
+<text-expanded>&amp;#x20DB;</text-expanded>
+</entity>
+<entity name="middot" type="gen">
+<text-expanded>&amp;#x00B7;</text-expanded>
+</entity>
+<entity name="PalmOS" type="gen">
+<text-expanded>
+<trademark class="registered">Palm OS</trademark>
+</text-expanded>
+</entity>
+<entity name="rarrw" type="gen">
+<text-expanded>&amp;#x219D;</text-expanded>
+</entity>
+<entity name="rhov" type="gen">
+<text-expanded>&amp;#x03F1;</text-expanded>
+</entity>
+<entity name="sube" type="gen">
+<text-expanded>&amp;#x2286;</text-expanded>
+</entity>
+<entity name="X-Window" type="gen">
+<text-expanded>
+<trademark class="registered">X Window
+ System</trademark>
+</text-expanded>
+</entity>
+<entity name="le" type="gen">
+<text-expanded>&amp;#x2264;</text-expanded>
+</entity>
+<entity name="keduca" type="gen">
+<text-expanded>
+<application>KEduca</application>
+</text-expanded>
+</entity>
+<entity name="kaddressbook" type="gen">
+<text-expanded>
+<application>KAddressBook</application>
+</text-expanded>
+</entity>
+<entity name="kfax" type="gen">
+<text-expanded>
+<application>kfax</application>
+</text-expanded>
+</entity>
+<entity name="lg" type="gen">
+<text-expanded>&amp;#x2276;</text-expanded>
+</entity>
+<entity name="gnap" type="gen">
+<text-expanded>&amp;#xE411;</text-expanded>
+</entity>
+<entity name="plusmn" type="gen">
+<text-expanded>&amp;#x00B1;</text-expanded>
+</entity>
+<entity name="shy" type="gen">
+<text-expanded>&amp;#x00AD;</text-expanded>
+</entity>
+<entity name="ordf" type="gen">
+<text-expanded>&amp;#x00AA;</text-expanded>
+</entity>
+<entity name="kregexpeditor" type="gen">
+<text-expanded>
+<application>KRegExpEditor</application>
+</text-expanded>
+</entity>
+<entity name="Hstrok" type="gen">
+<text-expanded>&amp;#x0126;</text-expanded>
+</entity>
+<entity name="lt" type="gen">
+<text-expanded>&amp;#38;#60;</text-expanded>
+</entity>
+<entity name="ordm" type="gen">
+<text-expanded>&amp;#x00BA;</text-expanded>
+</entity>
+<entity name="para" type="gen">
+<text-expanded>&amp;#x00B6;</text-expanded>
+</entity>
+<entity name="rarrtl" type="gen">
+<text-expanded>&amp;#x21A3;</text-expanded>
+</entity>
+<entity name="kvoctrain" type="gen">
+<text-expanded>
+<application>kvoctrain</application>
+</text-expanded>
+</entity>
+<entity name="larr2" type="gen">
+<text-expanded>&amp;#x21C7;</text-expanded>
+</entity>
+<entity name="eDot" type="gen">
+<text-expanded>&amp;#x2251;</text-expanded>
+</entity>
+<entity name="Uring" type="gen">
+<text-expanded>&amp;#x016E;</text-expanded>
+</entity>
+<entity name="kdepasswd" type="gen">
+<text-expanded>
+<application>kdepasswd</application>
+</text-expanded>
+</entity>
+<entity name="breve" type="gen">
+<text-expanded>&amp;#x02D8;</text-expanded>
+</entity>
+<entity name="sim" type="gen">
+<text-expanded>&amp;#x223C;</text-expanded>
+</entity>
+<entity name="vprop" type="gen">
+<text-expanded>&amp;#x221D;</text-expanded>
+</entity>
+<entity name="ksysctrl" type="gen">
+<text-expanded>
+<application>KSysctrl</application>
+</text-expanded>
+</entity>
+<entity name="Vvdash" type="gen">
+<text-expanded>&amp;#x22AA;</text-expanded>
+</entity>
+<entity name="ucy" type="gen">
+<text-expanded>&amp;#x0443;</text-expanded>
+</entity>
+<entity name="part" type="gen">
+<text-expanded>&amp;#x2202;</text-expanded>
+</entity>
+<entity name="Gcedil" type="gen">
+<text-expanded>&amp;#x0122;</text-expanded>
+</entity>
+<entity name="Omacr" type="gen">
+<text-expanded>&amp;#x014C;</text-expanded>
+</entity>
+<entity name="Vcy" type="gen">
+<text-expanded>&amp;#x0412;</text-expanded>
+</entity>
+<entity name="yicy" type="gen">
+<text-expanded>&amp;#x0457;</text-expanded>
+</entity>
+<entity name="amalg" type="gen">
+<text-expanded>&amp;#x2210;</text-expanded>
+</entity>
+<entity name="empty" type="gen">
+<text-expanded>&amp;#x2205;</text-expanded>
+</entity>
+<entity name="YAcy" type="gen">
+<text-expanded>&amp;#x042F;</text-expanded>
+</entity>
+<entity name="Rcaron" type="gen">
+<text-expanded>&amp;#x0158;</text-expanded>
+</entity>
+<entity name="kcron" type="gen">
+<text-expanded>
+<application>Kcron</application>
+</text-expanded>
+</entity>
+<entity name="kreversi" type="gen">
+<text-expanded>
+<application>KReversi</application>
+</text-expanded>
+</entity>
+<entity name="mu" type="gen">
+<text-expanded>&amp;#x03BC;</text-expanded>
+</entity>
+<entity name="tscy" type="gen">
+<text-expanded>&amp;#x0446;</text-expanded>
+</entity>
+<entity name="kcontrol" type="gen">
+<text-expanded>
+<application>KControl</application>
+</text-expanded>
+</entity>
+<entity name="lisa" type="gen">
+<text-expanded>
+<application>Lisa</application>
+</text-expanded>
+</entity>
+<entity name="quot" type="gen">
+<text-expanded>&amp;#x0022;</text-expanded>
+</entity>
+<entity name="artsd" type="gen">
+<text-expanded>
+<application>artsd</application>
+</text-expanded>
+</entity>
+<entity name="Oacgr" type="gen">
+<text-expanded>&amp;#x038C;</text-expanded>
+</entity>
+<entity name="ne" type="gen">
+<text-expanded>&amp;#x2260;</text-expanded>
+</entity>
+<entity name="abreve" type="gen">
+<text-expanded>&amp;#x0103;</text-expanded>
+</entity>
+<entity name="ni" type="gen">
+<text-expanded>&amp;#x220D;</text-expanded>
+</entity>
+<entity name="Odblac" type="gen">
+<text-expanded>&amp;#x0150;</text-expanded>
+</entity>
+<entity name="wcirc" type="gen">
+<text-expanded>&amp;#x0175;</text-expanded>
+</entity>
+<entity name="Mac" type="gen">
+<text-expanded>
+<trademark class="registered">Mac</trademark>
+</text-expanded>
+</entity>
+<entity name="oS" type="gen">
+<text-expanded>&amp;#x24C8;</text-expanded>
+</entity>
+<entity name="Agrave" type="gen">
+<text-expanded>&amp;#x00C0;</text-expanded>
+</entity>
+<entity name="nu" type="gen">
+<text-expanded>&amp;#x03BD;</text-expanded>
+</entity>
+<entity name="vArr" type="gen">
+<text-expanded>&amp;#x21D5;</text-expanded>
+</entity>
+<entity name="npre" type="gen">
+<text-expanded>&amp;#x22E0;</text-expanded>
+</entity>
+<entity name="kstars" type="gen">
+<text-expanded>
+<application>KStars</application>
+</text-expanded>
+</entity>
+<entity name="lap" type="gen">
+<text-expanded>&amp;#x2272;</text-expanded>
+</entity>
+<entity name="kstart" type="gen">
+<text-expanded>
+<application>kstart</application>
+</text-expanded>
+</entity>
+<entity name="underBSDLicense" type="gen"/>
+<entity name="reslisa" type="gen">
+<text-expanded>
+<application>ResLisa</application>
+</text-expanded>
+</entity>
+<entity name="clubs" type="gen">
+<text-expanded>&amp;#x2663;</text-expanded>
+</entity>
+<entity name="cuwed" type="gen">
+<text-expanded>&amp;#x22CF;</text-expanded>
+</entity>
+<entity name="ltri" type="gen">
+<text-expanded>&amp;#x25C3;</text-expanded>
+</entity>
+<entity name="iota" type="gen">
+<text-expanded>&amp;#x03B9;</text-expanded>
+</entity>
+<entity name="umacr" type="gen">
+<text-expanded>&amp;#x016B;</text-expanded>
+</entity>
+<entity name="Kgr" type="gen">
+<text-expanded>&amp;#x039A;</text-expanded>
+</entity>
+<entity name="acy" type="gen">
+<text-expanded>&amp;#x0430;</text-expanded>
+</entity>
+<entity name="Bcy" type="gen">
+<text-expanded>&amp;#x0411;</text-expanded>
+</entity>
+<entity name="artswrapper" type="gen">
+<text-expanded>
+<application>artswrapper</application>
+</text-expanded>
+</entity>
+<entity name="klprfax" type="gen">
+<text-expanded>
+<application>Klprfax</application>
+</text-expanded>
+</entity>
+<entity name="rsqb" type="gen">
+<text-expanded>&amp;#x005D;</text-expanded>
+</entity>
+<entity name="gimel" type="gen">
+<text-expanded>&amp;#x2137;</text-expanded>
+</entity>
+<entity name="AIX" type="gen">
+<text-expanded>
+<trademark>AIX</trademark>
+</text-expanded>
+</entity>
+<entity name="thgr" type="gen">
+<text-expanded>&amp;#x03B8;</text-expanded>
+</entity>
+<entity name="prap" type="gen">
+<text-expanded>&amp;#x227E;</text-expanded>
+</entity>
+<entity name="udblac" type="gen">
+<text-expanded>&amp;#x0171;</text-expanded>
+</entity>
+<entity name="or" type="gen">
+<text-expanded>&amp;#x2228;</text-expanded>
+</entity>
+<entity name="Dstrok" type="gen">
+<text-expanded>&amp;#x0110;</text-expanded>
+</entity>
+<entity name="ccaron" type="gen">
+<text-expanded>&amp;#x010D;</text-expanded>
+</entity>
+<entity name="nsime" type="gen">
+<text-expanded>&amp;#x2244;</text-expanded>
+</entity>
+<entity name="CDE" type="gen">
+<text-expanded>
+<acronym>CDE</acronym>
+</text-expanded>
+</entity>
+<entity name="lvnE" type="gen">
+<text-expanded>&amp;#x2268;</text-expanded>
+</entity>
+<entity name="Ntilde" type="gen">
+<text-expanded>&amp;#x00D1;</text-expanded>
+</entity>
+<entity name="kdesu" type="gen">
+<text-expanded>
+<application>KDE su</application>
+</text-expanded>
+</entity>
+<entity name="Cacute" type="gen">
+<text-expanded>&amp;#x0106;</text-expanded>
+</entity>
+<entity name="lambda" type="gen">
+<text-expanded>&amp;#x03BB;</text-expanded>
+</entity>
+<entity name="PHgr" type="gen">
+<text-expanded>&amp;#x03A6;</text-expanded>
+</entity>
+<entity name="uacgr" type="gen">
+<text-expanded>&amp;#x03CD;</text-expanded>
+</entity>
+<entity name="rlarr2" type="gen">
+<text-expanded>&amp;#x21C4;</text-expanded>
+</entity>
+<entity name="isin" type="gen">
+<text-expanded>&amp;#x220A;</text-expanded>
+</entity>
+<entity name="Imacr" type="gen">
+<text-expanded>&amp;#x012A;</text-expanded>
+</entity>
+<entity name="nequiv" type="gen">
+<text-expanded>&amp;#x2262;</text-expanded>
+</entity>
+<entity name="pi" type="gen">
+<text-expanded>&amp;#x03C0;</text-expanded>
+</entity>
+<entity name="Ccedil" type="gen">
+<text-expanded>&amp;#x00C7;</text-expanded>
+</entity>
+<entity name="kpaint" type="gen">
+<text-expanded>
+<application>KPaint</application>
+</text-expanded>
+</entity>
+<entity name="pr" type="gen">
+<text-expanded>&amp;#x227A;</text-expanded>
+</entity>
+<entity name="there4" type="gen">
+<text-expanded>&amp;#x2234;</text-expanded>
+</entity>
+<entity name="Ncaron" type="gen">
+<text-expanded>&amp;#x0147;</text-expanded>
+</entity>
+<entity name="kformula" type="gen">
+<text-expanded>
+<application>KFormula</application>
+</text-expanded>
+</entity>
+<entity name="spades" type="gen">
+<text-expanded>&amp;#x2660;</text-expanded>
+</entity>
+<entity name="drarr" type="gen">
+<text-expanded>&amp;#x2198;</text-expanded>
+</entity>
+<entity name="alpha" type="gen">
+<text-expanded>&amp;#x03B1;</text-expanded>
+</entity>
+<entity name="iacute" type="gen">
+<text-expanded>&amp;#x00ED;</text-expanded>
+</entity>
+<entity name="lfloor" type="gen">
+<text-expanded>&amp;#x230A;</text-expanded>
+</entity>
+<entity name="infin" type="gen">
+<text-expanded>&amp;#x221E;</text-expanded>
+</entity>
+<entity name="nrtri" type="gen">
+<text-expanded>&amp;#x22EB;</text-expanded>
+</entity>
+<entity name="Iacgr" type="gen">
+<text-expanded>&amp;#x038A;</text-expanded>
+</entity>
+<entity name="ugr" type="gen">
+<text-expanded>&amp;#x03C5;</text-expanded>
+</entity>
+<entity name="lcy" type="gen">
+<text-expanded>&amp;#x043B;</text-expanded>
+</entity>
+<entity name="Mcy" type="gen">
+<text-expanded>&amp;#x041C;</text-expanded>
+</entity>
+<entity name="puncsp" type="gen">
+<text-expanded>&amp;#x2008;</text-expanded>
+</entity>
+<entity name="lArr" type="gen">
+<text-expanded>&amp;#x21D0;</text-expanded>
+</entity>
+<entity name="kscore" type="gen">
+<text-expanded>
+<application>KScore</application>
+</text-expanded>
+</entity>
+<entity name="artsdsp" type="gen">
+<text-expanded>
+<application>artsdsp</application>
+</text-expanded>
+</entity>
+<entity name="mumap" type="gen">
+<text-expanded>&amp;#x22B8;</text-expanded>
+</entity>
+<entity name="nlarr" type="gen">
+<text-expanded>&amp;#x219A;</text-expanded>
+</entity>
+<entity name="uring" type="gen">
+<text-expanded>&amp;#x016F;</text-expanded>
+</entity>
+<entity name="tcaron" type="gen">
+<text-expanded>&amp;#x0165;</text-expanded>
+</entity>
+<entity name="language" type="gen">
+<text-expanded>en</text-expanded>
+</entity>
+<entity name="hamilt" type="gen">
+<text-expanded>&amp;#x210B;</text-expanded>
+</entity>
+<entity name="PSgr" type="gen">
+<text-expanded>&amp;#x03A8;</text-expanded>
+</entity>
+<entity name="AElig" type="gen">
+<text-expanded>&amp;#x00C6;</text-expanded>
+</entity>
+<entity name="omacr" type="gen">
+<text-expanded>&amp;#x014D;</text-expanded>
+</entity>
+<entity name="kicker" type="gen">
+<text-expanded>
+<application>Kicker</application>
+</text-expanded>
+</entity>
+<entity name="THORN" type="gen">
+<text-expanded>&amp;#x00DE;</text-expanded>
+</entity>
+<entity name="plus" type="gen">
+<text-expanded>&amp;#x002B;</text-expanded>
+</entity>
+<entity name="szlig" type="gen">
+<text-expanded>&amp;#x00DF;</text-expanded>
+</entity>
+<entity name="X-Windows" type="gen">
+<text-expanded>
+<trademark class="registered">X Window
+ System</trademark>
+</text-expanded>
+</entity>
+<entity name="Ecirc" type="gen">
+<text-expanded>&amp;#x00CA;</text-expanded>
+</entity>
+<entity name="Tcedil" type="gen">
+<text-expanded>&amp;#x0162;</text-expanded>
+</entity>
+<entity name="ThreeCom" type="gen">
+<text-expanded>
+<trademark class="registered">3Com</trademark>
+</text-expanded>
+</entity>
+<entity name="Barwed" type="gen">
+<text-expanded>&amp;#x2306;</text-expanded>
+</entity>
+<entity name="leg" type="gen">
+<text-expanded>&amp;#x22DA;</text-expanded>
+</entity>
+<entity name="ensp" type="gen">
+<text-expanded>&amp;#x2002;</text-expanded>
+</entity>
+<entity name="rx" type="gen">
+<text-expanded>&amp;#x211E;</text-expanded>
+</entity>
+<entity name="becaus" type="gen">
+<text-expanded>&amp;#x2235;</text-expanded>
+</entity>
+<entity name="cap" type="gen">
+<text-expanded>&amp;#x2229;</text-expanded>
+</entity>
+<entity name="kdessh" type="gen">
+<text-expanded>
+<application>kdessh</application>
+</text-expanded>
+</entity>
+<entity name="Eogon" type="gen">
+<text-expanded>&amp;#x0118;</text-expanded>
+</entity>
+<entity name="kasteroids" type="gen">
+<text-expanded>
+<application>KAsteroids</application>
+</text-expanded>
+</entity>
+<entity name="oacgr" type="gen">
+<text-expanded>&amp;#x03CC;</text-expanded>
+</entity>
+<entity name="amor" type="gen">
+<text-expanded>
+<application>AMOR</application>
+</text-expanded>
+</entity>
+<entity name="les" type="gen">
+<text-expanded>&amp;#x2264;</text-expanded>
+</entity>
+<entity name="agr" type="gen">
+<text-expanded>&amp;#x03B1;</text-expanded>
+</entity>
+<entity name="zacute" type="gen">
+<text-expanded>&amp;#x017A;</text-expanded>
+</entity>
+<entity name="sol" type="gen">
+<text-expanded>&amp;#x002F;</text-expanded>
+</entity>
+<entity name="phmmat" type="gen">
+<text-expanded>&amp;#x2133;</text-expanded>
+</entity>
+<entity name="Bgr" type="gen">
+<text-expanded>&amp;#x0392;</text-expanded>
+</entity>
+<entity name="sc" type="gen">
+<text-expanded>&amp;#x227B;</text-expanded>
+</entity>
+<entity name="kde-ftp" type="gen">
+<text-expanded>
+<ulink url="ftp://ftp.kde.org/pub/kde/">ftp://ftp.kde.org/pub/kde/</ulink>
+</text-expanded>
+</entity>
+<entity name="real" type="gen">
+<text-expanded>&amp;#x211C;</text-expanded>
+</entity>
+<entity name="boxuL" type="gen">
+<text-expanded>&amp;#x255D;</text-expanded>
+</entity>
+<entity name="scap" type="gen">
+<text-expanded>&amp;#x227F;</text-expanded>
+</entity>
+<entity name="blank" type="gen">
+<text-expanded>&amp;#x2423;</text-expanded>
+</entity>
+<entity name="nrArr" type="gen">
+<text-expanded>&amp;#x21CF;</text-expanded>
+</entity>
+<entity name="dharl" type="gen">
+<text-expanded>&amp;#x21C3;</text-expanded>
+</entity>
+<entity name="quanta" type="gen">
+<text-expanded>
+<application>Quanta</application>
+</text-expanded>
+</entity>
+<entity name="boxuR" type="gen">
+<text-expanded>&amp;#x2559;</text-expanded>
+</entity>
+<entity name="squf" type="gen">
+<text-expanded>&amp;#x25AA;</text-expanded>
+</entity>
+<entity name="dharr" type="gen">
+<text-expanded>&amp;#x21C2;</text-expanded>
+</entity>
+<entity name="times" type="gen">
+<text-expanded>&amp;#x00D7;</text-expanded>
+</entity>
+<entity name="comma" type="gen">
+<text-expanded>&amp;#x002C;</text-expanded>
+</entity>
+<entity name="fflig" type="gen">
+<text-expanded>&amp;#xFB00;</text-expanded>
+</entity>
+<entity name="Ctrl" type="gen">
+<text-expanded>
+<keycap>Ctrl</keycap>
+</text-expanded>
+</entity>
+<entity name="timesb" type="gen">
+<text-expanded>&amp;#x22A0;</text-expanded>
+</entity>
+<entity name="updating.documentation" type="gen"/>
+<entity name="b.Sigma" type="gen">
+<text-expanded>&amp;#x03A3;</text-expanded>
+</entity>
+<entity name="eacute" type="gen">
+<text-expanded>&amp;#x00E9;</text-expanded>
+</entity>
+<entity name="TrueType" type="gen">
+<text-expanded>
+<trademark class="registered">TrueType</trademark>
+</text-expanded>
+</entity>
+<entity name="khcy" type="gen">
+<text-expanded>&amp;#x0445;</text-expanded>
+</entity>
+<entity name="kuser" type="gen">
+<text-expanded>
+<application>Kuser</application>
+</text-expanded>
+</entity>
+<entity name="xlArr" type="gen">
+<text-expanded>&amp;#x21D0;</text-expanded>
+</entity>
+<entity name="boxvH" type="gen">
+<text-expanded>&amp;#x256A;</text-expanded>
+</entity>
+<entity name="fnof" type="gen">
+<text-expanded>&amp;#x0192;</text-expanded>
+</entity>
+<entity name="boxul" type="gen">
+<text-expanded>&amp;#x2518;</text-expanded>
+</entity>
+<entity name="boxvL" type="gen">
+<text-expanded>&amp;#x2561;</text-expanded>
+</entity>
+<entity name="kjots" type="gen">
+<text-expanded>
+<application>KJots</application>
+</text-expanded>
+</entity>
+<entity name="divide" type="gen">
+<text-expanded>&amp;#x00F7;</text-expanded>
+</entity>
+<entity name="utrif" type="gen">
+<text-expanded>&amp;#x25B4;</text-expanded>
+</entity>
+<entity name="diams" type="gen">
+<text-expanded>&amp;#x2666;</text-expanded>
+</entity>
+<entity name="thetas" type="gen">
+<text-expanded>&amp;#x03B8;</text-expanded>
+</entity>
+<entity name="boxur" type="gen">
+<text-expanded>&amp;#x2514;</text-expanded>
+</entity>
+<entity name="rang" type="gen">
+<text-expanded>&amp;#x3009;</text-expanded>
+</entity>
+<entity name="thetav" type="gen">
+<text-expanded>&amp;#x03D1;</text-expanded>
+</entity>
+<entity name="boxvR" type="gen">
+<text-expanded>&amp;#x255E;</text-expanded>
+</entity>
+<entity name="FDLInvariantSections" type="gen">
+<text-expanded>no Invariant Sections</text-expanded>
+</entity>
+<entity name="efDot" type="gen">
+<text-expanded>&amp;#x2252;</text-expanded>
+</entity>
+<entity name="Hewlett-Packard" type="gen">
+<text-expanded>
+<trademark class="registered">Hewlett-Packard</trademark>
+</text-expanded>
+</entity>
+<entity name="commat" type="gen">
+<text-expanded>&amp;#x0040;</text-expanded>
+</entity>
+<entity name="softcy" type="gen">
+<text-expanded>&amp;#x044C;</text-expanded>
+</entity>
+<entity name="nap" type="gen">
+<text-expanded>&amp;#x2249;</text-expanded>
+</entity>
+<entity name="b.Pi" type="gen">
+<text-expanded>&amp;#x03A0;</text-expanded>
+</entity>
+<entity name="LMB" type="gen">
+<text-expanded>
+<mousebutton>left</mousebutton> mouse button</text-expanded>
+</entity>
+<entity name="incare" type="gen">
+<text-expanded>&amp;#x2105;</text-expanded>
+</entity>
+<entity name="nwarr" type="gen">
+<text-expanded>&amp;#x2196;</text-expanded>
+</entity>
+<entity name="imacr" type="gen">
+<text-expanded>&amp;#x012B;</text-expanded>
+</entity>
+<entity name="Rarr" type="gen">
+<text-expanded>&amp;#x21A0;</text-expanded>
+</entity>
+<entity name="half" type="gen">
+<text-expanded>&amp;#x00BD;</text-expanded>
+</entity>
+<entity name="lgr" type="gen">
+<text-expanded>&amp;#x03BB;</text-expanded>
+</entity>
+<entity name="Mgr" type="gen">
+<text-expanded>&amp;#x039C;</text-expanded>
+</entity>
+<entity name="period" type="gen">
+<text-expanded>&amp;#x002E;</text-expanded>
+</entity>
+<entity name="boxvh" type="gen">
+<text-expanded>&amp;#x253C;</text-expanded>
+</entity>
+<entity name="Dcy" type="gen">
+<text-expanded>&amp;#x0414;</text-expanded>
+</entity>
+<entity name="boxvl" type="gen">
+<text-expanded>&amp;#x2524;</text-expanded>
+</entity>
+<entity name="rpar" type="gen">
+<text-expanded>&amp;#x0029;</text-expanded>
+</entity>
+<entity name="squ" type="gen">
+<text-expanded>&amp;#x25A1;</text-expanded>
+</entity>
+<entity name="circ" type="gen">
+<text-expanded>&amp;#x005E;</text-expanded>
+</entity>
+<entity name="kscd" type="gen">
+<text-expanded>
+<application>Kscd</application>
+</text-expanded>
+</entity>
+<entity name="boxvr" type="gen">
+<text-expanded>&amp;#x251C;</text-expanded>
+</entity>
+<entity name="cire" type="gen">
+<text-expanded>&amp;#x2257;</text-expanded>
+</entity>
+<entity name="rect" type="gen">
+<text-expanded>&amp;#x25AD;</text-expanded>
+</entity>
+<element name="postcode">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="postcode">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="citerefentry">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="refentrytitle"/>
+<element-name name="manvolnum" occurrence="?"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="citerefentry">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="volumenum">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="volumenum">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="interface">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+<element-name name="accel"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="interface">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="sect4info">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="keywordset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="sect4info">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="informalexample">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="informalexample">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="width" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="firstname">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="firstname">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="releaseinfo">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="releaseinfo">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="bookinfo">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="*">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+<or-group>
+<sequence-group>
+
+<element-name name="date"/>
+
+<element-name name="releaseinfo"/>
+</sequence-group>
+<sequence-group>
+
+<element-name name="releaseinfo"/>
+
+<element-name name="date"/>
+</sequence-group>
+</or-group>
+<or-group occurrence="*">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+<or-group>
+<sequence-group>
+
+<element-name name="abstract"/>
+
+<element-name name="keywordset"/>
+</sequence-group>
+<sequence-group>
+
+<element-name name="keywordset"/>
+
+<element-name name="abstract"/>
+</sequence-group>
+</or-group>
+<or-group occurrence="*">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+<element-name name="keywordset"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="bookinfo">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="contents" type="#IMPLIED" value="IDREFS" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="guisubmenu">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+<element-name name="accel"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="guisubmenu">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="acronym">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="acronym"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="anchor"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="acronym">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="othername">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="othername">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="database">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="database">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="class" type="#IMPLIED" enumeration="yes" value="name table field key1 key2 record" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="imagedata">
+<content-model-expanded>
+
+<empty/>
+</content-model-expanded>
+</element>
+<attlist name="imagedata">
+<attribute name="srccredit" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="width" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="scalefit" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="format" type="#IMPLIED" enumeration="yes" value="BMP CGM-CHAR CGM-BINARY CGM-CLEAR DITROFF DVI EPS EQN FAX GIF GIF87a GIF89a JPG JPEG IGES PCX PIC PNG PS SGML TBL TEX TIFF WMF WPG linespecific" default=""/>
+<attribute name="depth" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="entityref" type="#IMPLIED" value="ENTITY" default=""/>
+<attribute name="scale" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="fileref" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="align" type="#IMPLIED" enumeration="yes" value="left right center" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="literallayout">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="lineannotation"/>
+<element-name name="co"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="literallayout">
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="width" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="format" type="" enumeration="notation" value="linespecific" default="linespecific"/>
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="linenumbering" type="#IMPLIED" enumeration="yes" value="numbered unnumbered" default=""/>
+<attribute name="class" type="" enumeration="yes" value="monospaced normal" default="normal"/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="otheraddr">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="otheraddr">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="glossdiv">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group>
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="*">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+<element-name name="glossentry" occurrence="+"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="glossdiv">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="status" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="lineannotation">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="lineannotation">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="jobtitle">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="jobtitle">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="index">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="indexinfo" occurrence="?"/>
+<sequence-group occurrence="?">
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="*">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+<or-group>
+<element-name name="indexdiv" occurrence="*"/>
+<element-name name="indexentry" occurrence="*"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="index">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="citation">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="citation">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="inlineequation">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group>
+<element-name name="alt" occurrence="?"/>
+<or-group>
+
+<element-name name="graphic" occurrence="+"/>
+
+<element-name name="inlinemediaobject" occurrence="+"/>
+</or-group>
+</sequence-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="inlineequation">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="hardware">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="hardware">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="informalfigure">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="informalfigure">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="float" type="" value="CDATA" default="0"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="pgwide" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="legalnotice">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="title" occurrence="?"/>
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="blockquote"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="legalnotice">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="sectioninfo">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="keywordset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="sectioninfo">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="glossary">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="glossaryinfo" occurrence="?"/>
+<sequence-group occurrence="?">
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="*">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+<or-group>
+<element-name name="glossdiv" occurrence="+"/>
+<element-name name="glossentry" occurrence="+"/>
+</or-group>
+<element-name name="bibliography" occurrence="?"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="glossary">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="status" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="property">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="property">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="state">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="state">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="synopfragmentref">
+<content-model-expanded>
+
+<sequence-group>
+<pcdata/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="synopfragmentref">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="linkend" type="#REQUIRED" value="IDREF" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="area">
+<content-model-expanded>
+
+<empty/>
+</content-model-expanded>
+</element>
+<attlist name="area">
+<attribute name="otherunits" type="#IMPLIED" value="NMTOKEN" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="units" type="#IMPLIED" enumeration="yes" value="calspair linecolumn linerange linecolumnpair other" default=""/>
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="id" type="#REQUIRED" value="ID" default=""/>
+<attribute name="linkends" type="#IMPLIED" value="IDREFS" default=""/>
+<attribute name="coords" type="#REQUIRED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="reference">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="referenceinfo" occurrence="?"/>
+<sequence-group>
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<element-name name="partintro" occurrence="?"/>
+<sequence-group occurrence="+">
+<element-name name="refentry"/>
+</sequence-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="reference">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="status" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="msgset">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group occurrence="?">
+<element-name name="title"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group>
+<element-name name="msgentry" occurrence="+"/>
+<element-name name="simplemsgentry" occurrence="+"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="msgset">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="highlights">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="highlights">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="spanspec">
+<content-model-expanded>
+
+<empty/>
+</content-model-expanded>
+</element>
+<attlist name="spanspec">
+<attribute name="nameend" type="#REQUIRED" value="CDATA" default=""/>
+<attribute name="char" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="colsep" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="charoff" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="spanname" type="#REQUIRED" value="CDATA" default=""/>
+<attribute name="namest" type="#REQUIRED" value="CDATA" default=""/>
+<attribute name="rowsep" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="align" type="#IMPLIED" enumeration="yes" value="left right center justify char" default=""/>
+</attlist>
+<element name="sect1info">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="keywordset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="sect1info">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="address">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="street"/>
+<element-name name="pob"/>
+<element-name name="postcode"/>
+<element-name name="city"/>
+<element-name name="state"/>
+<element-name name="country"/>
+<element-name name="phone"/>
+<element-name name="fax"/>
+<element-name name="email"/>
+<element-name name="otheraddr"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="address">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="format" type="" enumeration="notation" value="linespecific" default="linespecific"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="linenumbering" type="#IMPLIED" enumeration="yes" value="numbered unnumbered" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="bibliographyinfo">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="keywordset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="bibliographyinfo">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="table">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group>
+<sequence-group>
+
+<element-name name="title"/>
+
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<sequence-group occurrence="*">
+
+<element-name name="indexterm"/>
+</sequence-group>
+<or-group>
+
+<element-name name="graphic" occurrence="+"/>
+
+<element-name name="mediaobject" occurrence="+"/>
+
+<element-name name="tgroup" occurrence="+"/>
+</or-group>
+</sequence-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="table">
+<attribute name="tocentry" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="shortentry" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="colsep" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="tabstyle" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="frame" type="#IMPLIED" enumeration="yes" value="top bottom topbot all sides none" default=""/>
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="rowsep" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="orient" type="#IMPLIED" enumeration="yes" value="port land" default=""/>
+<attribute name="pgwide" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="titleabbrev">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="titleabbrev">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="msgsub">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="title" occurrence="?"/>
+<element-name name="msgtext"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="msgsub">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="screen">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="co"/>
+<element-name name="lineannotation"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="screen">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="format" type="" enumeration="notation" value="linespecific" default="linespecific"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="linenumbering" type="#IMPLIED" enumeration="yes" value="numbered unnumbered" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="width" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="contrib">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="contrib">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="structname">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="structname">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="guimenu">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+<element-name name="accel"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="guimenu">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="orgname">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="orgname">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="refname">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="refname">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="itemizedlist">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group occurrence="?">
+<element-name name="title"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<element-name name="listitem" occurrence="+"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="itemizedlist">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="mark" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="spacing" type="#IMPLIED" enumeration="yes" value="normal compact" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="foreignphrase">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="foreignphrase">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="see">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="see">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="constant">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="constant">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="class" type="#IMPLIED" enumeration="yes" value="limit" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="guibutton">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+<element-name name="accel"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="guibutton">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="sidebarinfo">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="keywordset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="sidebarinfo">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="refpurpose">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="refpurpose">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="seg">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="seg">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="equation">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group occurrence="?">
+<element-name name="title"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group>
+<element-name name="informalequation"/>
+<sequence-group>
+
+<element-name name="alt" occurrence="?"/>
+
+<or-group>
+<element-name name="graphic" occurrence="+"/>
+<element-name name="mediaobject" occurrence="+"/>
+
+</or-group>
+</sequence-group>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="equation">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="city">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="city">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="tertiaryie">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="tertiaryie">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="linkends" type="#IMPLIED" value="IDREFS" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="alt">
+<content-model-expanded>
+
+<sequence-group>
+<pcdata/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="alt">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="isbn">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="isbn">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="fieldsynopsis">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="modifier" occurrence="*"/>
+<element-name name="type" occurrence="?"/>
+<element-name name="varname"/>
+<element-name name="initializer" occurrence="?"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="fieldsynopsis">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="glosslist">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="glossentry" occurrence="+"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="glosslist">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="link">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="link">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="linkend" type="#REQUIRED" value="IDREF" default=""/>
+<attribute name="endterm" type="#IMPLIED" value="IDREF" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="type" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="setindex">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="setindexinfo" occurrence="?"/>
+<sequence-group occurrence="?">
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="*">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+<or-group>
+<element-name name="indexdiv" occurrence="*"/>
+<element-name name="indexentry" occurrence="*"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="setindex">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="set">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group occurrence="?">
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<element-name name="setinfo" occurrence="?"/>
+<element-name name="toc" occurrence="?"/>
+<sequence-group occurrence="+">
+<element-name name="book"/>
+</sequence-group>
+<element-name name="setindex" occurrence="?"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="set">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="status" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="fpi" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="imageobject">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="objectinfo" occurrence="?"/>
+<element-name name="imagedata"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="imageobject">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="paramdef">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="parameter"/>
+<element-name name="funcparams"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="paramdef">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="entrytbl">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="colspec" occurrence="*"/>
+<element-name name="spanspec" occurrence="*"/>
+<element-name name="thead" occurrence="?"/>
+<element-name name="tbody"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="entrytbl">
+<attribute name="cols" type="#REQUIRED" value="CDATA" default=""/>
+<attribute name="nameend" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="char" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="colsep" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="charoff" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="spanname" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="namest" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="colname" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="rowsep" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="tgroupstyle" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="align" type="#IMPLIED" enumeration="yes" value="left right center justify char" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="varargs">
+<content-model-expanded>
+
+<empty/>
+</content-model-expanded>
+</element>
+<attlist name="varargs">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="calloutlist">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group occurrence="?">
+<element-name name="title"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<element-name name="callout" occurrence="+"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="calloutlist">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="warning">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="title" occurrence="?"/>
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="warning">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="medialabel">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="medialabel">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="class" type="#IMPLIED" enumeration="yes" value="cartridge cdrom disk tape" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="lineage">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="lineage">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="example">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group>
+<element-name name="title"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="example">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="width" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="member">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="member">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="glossaryinfo">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="keywordset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="glossaryinfo">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="blockquote">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="title" occurrence="?"/>
+<element-name name="attribution" occurrence="?"/>
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="blockquote">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="appendixinfo">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="keywordset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="appendixinfo">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="productnumber">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="productnumber">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="mediaobjectco">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="objectinfo" occurrence="?"/>
+<element-name name="imageobjectco"/>
+<or-group occurrence="*">
+<element-name name="imageobjectco"/>
+<element-name name="textobject"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="mediaobjectco">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="article">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group occurrence="?">
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<element-name name="articleinfo" occurrence="?"/>
+<element-name name="tocchap" occurrence="?"/>
+<element-name name="lot" occurrence="*"/>
+<or-group>
+<sequence-group>
+
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+
+<or-group>
+<element-name name="sect1" occurrence="*"/>
+<sequence-group occurrence="*">
+<element-name name="refentry"/>
+</sequence-group>
+<element-name name="simplesect" occurrence="*"/>
+<element-name name="section" occurrence="*"/>
+
+</or-group>
+</sequence-group>
+<or-group>
+
+<element-name name="sect1" occurrence="+"/>
+
+<sequence-group occurrence="+">
+<element-name name="refentry"/>
+
+</sequence-group>
+
+<element-name name="simplesect" occurrence="+"/>
+
+<element-name name="section" occurrence="+"/>
+</or-group>
+</or-group>
+<or-group occurrence="*">
+<or-group>
+
+<element-name name="toc"/>
+
+<element-name name="lot"/>
+
+<element-name name="index"/>
+
+<element-name name="glossary"/>
+
+<element-name name="bibliography"/>
+</or-group>
+<sequence-group>
+
+<element-name name="appendix"/>
+</sequence-group>
+<element-name name="ackno"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="article">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="status" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="parentbook" type="#IMPLIED" value="IDREF" default=""/>
+<attribute name="class" type="#IMPLIED" enumeration="yes" value="journalarticle productsheet whitepaper techreport specification faq" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="pob">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="pob">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="refsynopsisdivinfo">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="keywordset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="refsynopsisdivinfo">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="msgentry">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="msg" occurrence="+"/>
+<element-name name="msginfo" occurrence="?"/>
+<element-name name="msgexplan" occurrence="*"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="msgentry">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="footnoteref">
+<content-model-expanded>
+
+<empty/>
+</content-model-expanded>
+</element>
+<attlist name="footnoteref">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="linkend" type="#REQUIRED" value="IDREF" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="articleinfo">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="keywordset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="articleinfo">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="action">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="action">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="replaceable">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="optional"/>
+<element-name name="anchor"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="replaceable">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="class" type="#IMPLIED" enumeration="yes" value="command function option parameter" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="symbol">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="symbol">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="class" type="#IMPLIED" enumeration="yes" value="limit" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="attribution">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="attribution">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="audiodata">
+<content-model-expanded>
+
+<empty/>
+</content-model-expanded>
+</element>
+<attlist name="audiodata">
+<attribute name="srccredit" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="format" type="#IMPLIED" enumeration="yes" value="BMP CGM-CHAR CGM-BINARY CGM-CLEAR DITROFF DVI EPS EQN FAX GIF GIF87a GIF89a JPG JPEG IGES PCX PIC PNG PS SGML TBL TEX TIFF WMF WPG linespecific" default=""/>
+<attribute name="entityref" type="#IMPLIED" value="ENTITY" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="fileref" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="procedure">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group occurrence="?">
+<element-name name="title"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="*">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+<element-name name="step" occurrence="+"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="procedure">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="chapterinfo">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="keywordset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="chapterinfo">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="msgtext">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="msgtext">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="varname">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="varname">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="abstract">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="title" occurrence="?"/>
+<or-group occurrence="+">
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="abstract">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="citetitle">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="citetitle">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="pubwork" type="#IMPLIED" enumeration="yes" value="article book chapter part refentry section journal series set manuscript" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="guiicon">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+<element-name name="accel"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="guiicon">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="surname">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="surname">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="refsect1info">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="keywordset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="refsect1info">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="initializer">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="initializer">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="shortcut">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="keycap"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="mousebutton"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="shortcut">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="otheraction" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="action" type="#IMPLIED" enumeration="yes" value="click double-click press seq simul other" default=""/>
+</attlist>
+<element name="superscript">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="replaceable"/>
+<element-name name="symbol"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="anchor"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="superscript">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="guilabel">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+<element-name name="accel"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="guilabel">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="issuenum">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="issuenum">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="issn">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="issn">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="areaset">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="area" occurrence="+"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="areaset">
+<attribute name="otherunits" type="#IMPLIED" value="NMTOKEN" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="units" type="#IMPLIED" enumeration="yes" value="calspair linecolumn linerange linecolumnpair other" default=""/>
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="id" type="#REQUIRED" value="ID" default=""/>
+<attribute name="coords" type="#REQUIRED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="trademark">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="emphasis"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="trademark">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="class" type="" enumeration="yes" value="service trade registered copyright" default="trade"/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="country">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="country">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="filename">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="filename">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="path" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="class" type="#IMPLIED" enumeration="yes" value="headerfile devicefile libraryfile directory symlink" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="informaltable">
+<content-model-expanded>
+
+<or-group>
+<element-name name="graphic" occurrence="+"/>
+<element-name name="mediaobject" occurrence="+"/>
+<element-name name="tgroup" occurrence="+"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="informaltable">
+<attribute name="tocentry" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="shortentry" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="colsep" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="tabstyle" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="frame" type="#IMPLIED" enumeration="yes" value="top bottom topbot all sides none" default=""/>
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="pgwide" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="orient" type="#IMPLIED" enumeration="yes" value="port land" default=""/>
+<attribute name="rowsep" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="modespec">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="modespec">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="application" type="#IMPLIED" enumeration="notation" value="BMP CGM-CHAR CGM-BINARY CGM-CLEAR DITROFF DVI EPS EQN FAX GIF GIF87a GIF89a JPG JPEG IGES PCX PIC PNG PS SGML TBL TEX TIFF WMF WPG linespecific" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="msgexplan">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="title" occurrence="?"/>
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="msgexplan">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="listitem">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="listitem">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="override" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="collab">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="collabname"/>
+<element-name name="affiliation" occurrence="*"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="collab">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="figure">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group>
+<element-name name="title"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="+">
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="figure">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="float" type="" value="CDATA" default="0"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="pgwide" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="classname">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="classname">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="oointerface">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="modifier" occurrence="*"/>
+<element-name name="interfacename"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="oointerface">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="varlistentry">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="term" occurrence="+"/>
+<element-name name="listitem"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="varlistentry">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="funcdef">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="function"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="funcdef">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="videoobject">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="objectinfo" occurrence="?"/>
+<element-name name="videodata"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="videoobject">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="shortaffil">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="shortaffil">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="refnamediv">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="refdescriptor" occurrence="?"/>
+<element-name name="refname" occurrence="+"/>
+<element-name name="refpurpose"/>
+<element-name name="refclass" occurrence="*"/>
+<or-group occurrence="*">
+<element-name name="remark"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="refnamediv">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="sect3info">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="keywordset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="sect3info">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="seealsoie">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="seealsoie">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="linkends" type="#IMPLIED" value="IDREFS" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="pubsnumber">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="pubsnumber">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="glossterm">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="glossterm">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="baseform" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="linkend" type="#IMPLIED" value="IDREF" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="seeie">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="seeie">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="linkend" type="#IMPLIED" value="IDREF" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="markup">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="markup">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="biblioentry">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="articleinfo"/>
+<or-group>
+
+<element-name name="abbrev"/>
+
+<element-name name="abstract"/>
+
+<element-name name="address"/>
+
+<element-name name="artpagenums"/>
+
+<element-name name="author"/>
+
+<element-name name="authorgroup"/>
+
+<element-name name="authorinitials"/>
+
+<element-name name="bibliomisc"/>
+
+<element-name name="biblioset"/>
+
+<element-name name="collab"/>
+
+<element-name name="confgroup"/>
+
+<element-name name="contractnum"/>
+
+<element-name name="contractsponsor"/>
+
+<element-name name="copyright"/>
+
+<element-name name="corpauthor"/>
+
+<element-name name="corpname"/>
+
+<element-name name="date"/>
+
+<element-name name="edition"/>
+
+<element-name name="editor"/>
+
+<element-name name="invpartnumber"/>
+
+<element-name name="isbn"/>
+
+<element-name name="issn"/>
+
+<element-name name="issuenum"/>
+
+<element-name name="orgname"/>
+
+<element-name name="othercredit"/>
+
+<element-name name="pagenums"/>
+
+<element-name name="printhistory"/>
+
+<element-name name="productname"/>
+
+<element-name name="productnumber"/>
+
+<element-name name="pubdate"/>
+
+<element-name name="publisher"/>
+
+<element-name name="publishername"/>
+
+<element-name name="pubsnumber"/>
+
+<element-name name="releaseinfo"/>
+
+<element-name name="revhistory"/>
+
+<element-name name="seriesvolnums"/>
+
+<element-name name="subtitle"/>
+
+<element-name name="title"/>
+
+<element-name name="titleabbrev"/>
+
+<element-name name="volumenum"/>
+
+<element-name name="citetitle"/>
+
+<element-name name="honorific"/>
+
+<element-name name="firstname"/>
+
+<element-name name="surname"/>
+
+<element-name name="lineage"/>
+
+<element-name name="othername"/>
+
+<element-name name="affiliation"/>
+
+<element-name name="authorblurb"/>
+
+<element-name name="contrib"/>
+
+<element-name name="indexterm"/>
+</or-group>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="biblioentry">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="qandaset">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group occurrence="?">
+<element-name name="title"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="*">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="procedure"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="indexterm"/>
+</or-group>
+<or-group>
+<element-name name="qandadiv" occurrence="+"/>
+<element-name name="qandaentry" occurrence="+"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="qandaset">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="defaultlabel" type="#IMPLIED" enumeration="yes" value="qanda number none" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="mediaobject">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="objectinfo" occurrence="?"/>
+<or-group>
+<element-name name="videoobject"/>
+<element-name name="audioobject"/>
+<element-name name="imageobject"/>
+</or-group>
+<or-group occurrence="*">
+<element-name name="videoobject"/>
+<element-name name="audioobject"/>
+<element-name name="imageobject"/>
+<element-name name="textobject"/>
+</or-group>
+<element-name name="caption" occurrence="?"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="mediaobject">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="corpauthor">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="corpauthor">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="step">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="title" occurrence="?"/>
+<or-group>
+<sequence-group>
+
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+
+<sequence-group occurrence="?">
+<element-name name="substeps"/>
+<or-group occurrence="*">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+
+</sequence-group>
+</sequence-group>
+<sequence-group>
+
+<element-name name="substeps"/>
+
+<or-group occurrence="*">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</sequence-group>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="step">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="performance" type="" enumeration="yes" value="optional required" default="required"/>
+</attlist>
+<element name="seealso">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="seealso">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="qandaentry">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="revhistory" occurrence="?"/>
+<element-name name="question"/>
+<element-name name="answer" occurrence="*"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="qandaentry">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="othercredit">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="othercredit">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#REQUIRED" enumeration="yes" value="translator developer reviewer graphist musician tester" default=""/>
+</attlist>
+<element name="keyword">
+<content-model-expanded>
+
+<sequence-group>
+<pcdata/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="keyword">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="tertiary">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="tertiary">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="sortas" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="itermset">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="indexterm" occurrence="+"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="itermset">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="guimenuitem">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+<element-name name="accel"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="guimenuitem">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="fax">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="fax">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="ooclass">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="modifier" occurrence="*"/>
+<element-name name="classname"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="ooclass">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="para">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="para">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="bibliomixed">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+<element-name name="bibliomset"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="bibliomixed">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="variablelist">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group occurrence="?">
+<element-name name="title"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<element-name name="varlistentry" occurrence="+"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="variablelist">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="termlength" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="manvolnum">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="acronym"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="anchor"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="manvolnum">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="screenco">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="areaspec"/>
+<element-name name="screen"/>
+<element-name name="calloutlist" occurrence="*"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="screenco">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="firstterm">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="acronym"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="anchor"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="firstterm">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="linkend" type="#IMPLIED" value="IDREF" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="segtitle">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="segtitle">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="refsynopsisdiv">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="refsynopsisdivinfo" occurrence="?"/>
+<sequence-group occurrence="?">
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group>
+<sequence-group>
+
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+
+<element-name name="refsect2" occurrence="*"/>
+</sequence-group>
+<sequence-group>
+
+<element-name name="refsect2" occurrence="+"/>
+</sequence-group>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="refsynopsisdiv">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="setindexinfo">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="keywordset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="setindexinfo">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="part">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="partinfo" occurrence="?"/>
+<sequence-group>
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<element-name name="partintro" occurrence="?"/>
+<or-group occurrence="+">
+<element-name name="appendix"/>
+<element-name name="chapter"/>
+<element-name name="toc"/>
+<element-name name="lot"/>
+<element-name name="index"/>
+<element-name name="glossary"/>
+<element-name name="bibliography"/>
+<element-name name="article"/>
+<element-name name="preface"/>
+<element-name name="refentry"/>
+<element-name name="reference"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="part">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="status" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="ulink">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="ulink">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="url" type="#REQUIRED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="type" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="biblioset">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="biblioset">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="relation" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="type">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="type">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="mousebutton">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="mousebutton">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="preface">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="prefaceinfo" occurrence="?"/>
+<sequence-group>
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="*">
+<element-name name="toc"/>
+<element-name name="lot"/>
+<element-name name="index"/>
+<element-name name="glossary"/>
+<element-name name="bibliography"/>
+</or-group>
+<element-name name="tocchap" occurrence="?"/>
+<or-group>
+<sequence-group>
+
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+
+<or-group>
+<element-name name="sect1" occurrence="*"/>
+<sequence-group occurrence="*">
+<element-name name="refentry"/>
+</sequence-group>
+<element-name name="simplesect" occurrence="*"/>
+<element-name name="section" occurrence="*"/>
+
+</or-group>
+</sequence-group>
+<or-group>
+
+<element-name name="sect1" occurrence="+"/>
+
+<sequence-group occurrence="+">
+<element-name name="refentry"/>
+
+</sequence-group>
+
+<element-name name="simplesect" occurrence="+"/>
+
+<element-name name="section" occurrence="+"/>
+</or-group>
+</or-group>
+<or-group occurrence="*">
+<element-name name="toc"/>
+<element-name name="lot"/>
+<element-name name="index"/>
+<element-name name="glossary"/>
+<element-name name="bibliography"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="preface">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="status" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="glossseealso">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="glossseealso">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="otherterm" type="#IMPLIED" value="IDREF" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="errorcode">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="errorcode">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="secondary">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="secondary">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="sortas" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="refentrytitle">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="refentrytitle">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="formalpara">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="title"/>
+<sequence-group occurrence="*">
+<element-name name="indexterm"/>
+</sequence-group>
+<element-name name="para"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="formalpara">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="indexinfo">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="keywordset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="indexinfo">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="author">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="author">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="entry">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="entry">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="spanname" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="nameend" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="namest" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="rotate" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="rowsep" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="colname" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="valign" type="#IMPLIED" enumeration="yes" value="top middle bottom" default=""/>
+<attribute name="char" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="align" type="#IMPLIED" enumeration="yes" value="left right center justify char" default=""/>
+<attribute name="colsep" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="charoff" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="morerows" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="funcparams">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="funcparams">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="authorgroup">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="author"/>
+<element-name name="editor"/>
+<element-name name="collab"/>
+<element-name name="corpauthor"/>
+<element-name name="othercredit"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="authorgroup">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="note">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="title" occurrence="?"/>
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="note">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="simplemsgentry">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="msgtext"/>
+<element-name name="msgexplan"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="simplemsgentry">
+<attribute name="level" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="origin" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="audience" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="group">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="arg"/>
+<element-name name="group"/>
+<element-name name="option"/>
+<element-name name="synopfragmentref"/>
+<element-name name="replaceable"/>
+<element-name name="sbr"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="group">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="rep" type="" enumeration="yes" value="norepeat repeat" default="norepeat"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="choice" type="" enumeration="yes" value="opt req plain" default="opt"/>
+</attlist>
+<element name="informalequation">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group>
+<element-name name="alt" occurrence="?"/>
+<or-group>
+
+<element-name name="graphic" occurrence="+"/>
+
+<element-name name="mediaobject" occurrence="+"/>
+</or-group>
+</sequence-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="informalequation">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="authorinitials">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="authorinitials">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="setinfo">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="keywordset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="setinfo">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="contents" type="#IMPLIED" value="IDREFS" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="pagenums">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="pagenums">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="funcsynopsisinfo">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="lineannotation"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="funcsynopsisinfo">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="format" type="" enumeration="notation" value="linespecific" default="linespecific"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="linenumbering" type="#IMPLIED" enumeration="yes" value="numbered unnumbered" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="tbody">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="row" occurrence="+"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="tbody">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="valign" type="#IMPLIED" enumeration="yes" value="top middle bottom" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="areaspec">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="area"/>
+<element-name name="areaset"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="areaspec">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="units" type="#IMPLIED" enumeration="yes" value="calspair linecolumn linerange linecolumnpair other" default=""/>
+<attribute name="otherunits" type="#IMPLIED" value="NMTOKEN" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="application">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="application">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="class" type="#IMPLIED" enumeration="yes" value="hardware software" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="keysym">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="keysym">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="segmentedlist">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group occurrence="?">
+<element-name name="title"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<element-name name="segtitle"/>
+<element-name name="segtitle" occurrence="+"/>
+<element-name name="seglistitem" occurrence="+"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="segmentedlist">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="copyright">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="year" occurrence="+"/>
+<element-name name="holder" occurrence="*"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="copyright">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="returnvalue">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="returnvalue">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="wordasword">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="acronym"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="anchor"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="wordasword">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="anchor">
+<content-model-expanded>
+
+<empty/>
+</content-model-expanded>
+</element>
+<attlist name="anchor">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="id" type="#REQUIRED" value="ID" default=""/>
+<attribute name="pagenum" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="year">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="year">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="arg">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="arg"/>
+<element-name name="group"/>
+<element-name name="option"/>
+<element-name name="synopfragmentref"/>
+<element-name name="replaceable"/>
+<element-name name="sbr"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="arg">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="rep" type="" enumeration="yes" value="norepeat repeat" default="norepeat"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="choice" type="" enumeration="yes" value="opt req plain" default="opt"/>
+</attlist>
+<element name="refsect3info">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="keywordset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="refsect3info">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="refentry">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group occurrence="*">
+<element-name name="indexterm"/>
+</sequence-group>
+<element-name name="refentryinfo" occurrence="?"/>
+<element-name name="refmeta" occurrence="?"/>
+<or-group occurrence="*">
+<element-name name="remark"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+</or-group>
+<element-name name="refnamediv"/>
+<element-name name="refsynopsisdiv" occurrence="?"/>
+<element-name name="refsect1" occurrence="+"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="refentry">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="status" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="important">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="title" occurrence="?"/>
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="important">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="modifier">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="modifier">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="honorific">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="honorific">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="accel">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="accel">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="section">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="sectioninfo" occurrence="?"/>
+<sequence-group>
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="*">
+<element-name name="toc"/>
+<element-name name="lot"/>
+<element-name name="index"/>
+<element-name name="glossary"/>
+<element-name name="bibliography"/>
+</or-group>
+<or-group>
+<sequence-group>
+
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+
+<or-group>
+<sequence-group occurrence="*">
+<element-name name="refentry"/>
+</sequence-group>
+<element-name name="section" occurrence="*"/>
+
+</or-group>
+</sequence-group>
+<sequence-group occurrence="+">
+
+<element-name name="refentry"/>
+</sequence-group>
+<element-name name="section" occurrence="+"/>
+</or-group>
+<or-group occurrence="*">
+<element-name name="toc"/>
+<element-name name="lot"/>
+<element-name name="index"/>
+<element-name name="glossary"/>
+<element-name name="bibliography"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="section">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="status" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="partintro">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group occurrence="?">
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group>
+<sequence-group>
+
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+
+<or-group>
+<element-name name="sect1" occurrence="*"/>
+<sequence-group occurrence="*">
+<element-name name="refentry"/>
+</sequence-group>
+<element-name name="simplesect" occurrence="*"/>
+<element-name name="section" occurrence="*"/>
+
+</or-group>
+</sequence-group>
+<or-group>
+
+<element-name name="sect1" occurrence="+"/>
+
+<sequence-group occurrence="+">
+<element-name name="refentry"/>
+
+</sequence-group>
+
+<element-name name="simplesect" occurrence="+"/>
+
+<element-name name="section" occurrence="+"/>
+</or-group>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="partintro">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="errorname">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="errorname">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="book">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group occurrence="?">
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<element-name name="bookinfo"/>
+<or-group occurrence="*">
+<element-name name="dedication"/>
+<element-name name="toc"/>
+<element-name name="lot"/>
+<element-name name="glossary"/>
+<element-name name="bibliography"/>
+<element-name name="preface"/>
+<element-name name="chapter"/>
+<element-name name="reference"/>
+<element-name name="part"/>
+<element-name name="article"/>
+<element-name name="appendix"/>
+<element-name name="index"/>
+<element-name name="setindex"/>
+<element-name name="colophon"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="book">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="status" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="fpi" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="label">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="acronym"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="anchor"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="label">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="msginfo">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="*">
+<element-name name="msglevel"/>
+<element-name name="msgorig"/>
+<element-name name="msgaud"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="msginfo">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="phrase">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="phrase">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="colophon">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group occurrence="?">
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="blockquote"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="colophon">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="status" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="editor">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="editor">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="screeninfo">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="screeninfo">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="funcprototype">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="funcdef"/>
+<or-group>
+<element-name name="void"/>
+<element-name name="varargs"/>
+<element-name name="paramdef" occurrence="+"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="funcprototype">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="systemitem">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+<element-name name="acronym"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="systemitem">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="class" type="#IMPLIED" enumeration="yes" value="constant groupname library macro osname resource systemname username" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="remark">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="remark">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="tgroup">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="colspec" occurrence="*"/>
+<element-name name="spanspec" occurrence="*"/>
+<element-name name="thead" occurrence="?"/>
+<element-name name="tfoot" occurrence="?"/>
+<element-name name="tbody"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="tgroup">
+<attribute name="cols" type="#REQUIRED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="char" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="colsep" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="charoff" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="rowsep" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="tgroupstyle" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="align" type="#IMPLIED" enumeration="yes" value="left right center justify char" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="prefaceinfo">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="keywordset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="prefaceinfo">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="funcsynopsis">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="funcsynopsisinfo"/>
+<element-name name="funcprototype"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="funcsynopsis">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="collabname">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="collabname">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="sect1">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="sect1info" occurrence="?"/>
+<sequence-group>
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="*">
+<element-name name="toc"/>
+<element-name name="lot"/>
+<element-name name="index"/>
+<element-name name="glossary"/>
+<element-name name="bibliography"/>
+</or-group>
+<or-group>
+<sequence-group>
+
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+
+<or-group>
+<sequence-group occurrence="*">
+<element-name name="refentry"/>
+</sequence-group>
+<element-name name="sect2" occurrence="*"/>
+<element-name name="simplesect" occurrence="*"/>
+
+</or-group>
+</sequence-group>
+<sequence-group occurrence="+">
+
+<element-name name="refentry"/>
+</sequence-group>
+<element-name name="sect2" occurrence="+"/>
+<element-name name="simplesect" occurrence="+"/>
+</or-group>
+<or-group occurrence="*">
+<element-name name="toc"/>
+<element-name name="lot"/>
+<element-name name="index"/>
+<element-name name="glossary"/>
+<element-name name="bibliography"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="sect1">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="status" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="renderas" type="#IMPLIED" enumeration="yes" value="sect2 sect3 sect4 sect5" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="sect2">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="sect2info" occurrence="?"/>
+<sequence-group>
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="*">
+<element-name name="toc"/>
+<element-name name="lot"/>
+<element-name name="index"/>
+<element-name name="glossary"/>
+<element-name name="bibliography"/>
+</or-group>
+<or-group>
+<sequence-group>
+
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+
+<or-group>
+<sequence-group occurrence="*">
+<element-name name="refentry"/>
+</sequence-group>
+<element-name name="sect3" occurrence="*"/>
+<element-name name="simplesect" occurrence="*"/>
+
+</or-group>
+</sequence-group>
+<sequence-group occurrence="+">
+
+<element-name name="refentry"/>
+</sequence-group>
+<element-name name="sect3" occurrence="+"/>
+<element-name name="simplesect" occurrence="+"/>
+</or-group>
+<or-group occurrence="*">
+<element-name name="toc"/>
+<element-name name="lot"/>
+<element-name name="index"/>
+<element-name name="glossary"/>
+<element-name name="bibliography"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="sect2">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="status" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="renderas" type="#IMPLIED" enumeration="yes" value="sect1 sect3 sect4 sect5" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="sect3">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="sect3info" occurrence="?"/>
+<sequence-group>
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="*">
+<element-name name="toc"/>
+<element-name name="lot"/>
+<element-name name="index"/>
+<element-name name="glossary"/>
+<element-name name="bibliography"/>
+</or-group>
+<or-group>
+<sequence-group>
+
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+
+<or-group>
+<sequence-group occurrence="*">
+<element-name name="refentry"/>
+</sequence-group>
+<element-name name="sect4" occurrence="*"/>
+<element-name name="simplesect" occurrence="*"/>
+
+</or-group>
+</sequence-group>
+<sequence-group occurrence="+">
+
+<element-name name="refentry"/>
+</sequence-group>
+<element-name name="sect4" occurrence="+"/>
+<element-name name="simplesect" occurrence="+"/>
+</or-group>
+<or-group occurrence="*">
+<element-name name="toc"/>
+<element-name name="lot"/>
+<element-name name="index"/>
+<element-name name="glossary"/>
+<element-name name="bibliography"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="sect3">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="status" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="renderas" type="#IMPLIED" enumeration="yes" value="sect1 sect2 sect4 sect5" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="sect4">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="sect4info" occurrence="?"/>
+<sequence-group>
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="*">
+<element-name name="toc"/>
+<element-name name="lot"/>
+<element-name name="index"/>
+<element-name name="glossary"/>
+<element-name name="bibliography"/>
+</or-group>
+<or-group>
+<sequence-group>
+
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+
+<or-group>
+<sequence-group occurrence="*">
+<element-name name="refentry"/>
+</sequence-group>
+<element-name name="sect5" occurrence="*"/>
+<element-name name="simplesect" occurrence="*"/>
+
+</or-group>
+</sequence-group>
+<sequence-group occurrence="+">
+
+<element-name name="refentry"/>
+</sequence-group>
+<element-name name="sect5" occurrence="+"/>
+<element-name name="simplesect" occurrence="+"/>
+</or-group>
+<or-group occurrence="*">
+<element-name name="toc"/>
+<element-name name="lot"/>
+<element-name name="index"/>
+<element-name name="glossary"/>
+<element-name name="bibliography"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="sect4">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="status" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="renderas" type="#IMPLIED" enumeration="yes" value="sect1 sect2 sect3 sect5" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="sect5">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="sect5info" occurrence="?"/>
+<sequence-group>
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="*">
+<element-name name="toc"/>
+<element-name name="lot"/>
+<element-name name="index"/>
+<element-name name="glossary"/>
+<element-name name="bibliography"/>
+</or-group>
+<or-group>
+<sequence-group>
+
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+
+<or-group>
+<sequence-group occurrence="*">
+<element-name name="refentry"/>
+</sequence-group>
+<element-name name="simplesect" occurrence="*"/>
+
+</or-group>
+</sequence-group>
+<sequence-group occurrence="+">
+
+<element-name name="refentry"/>
+</sequence-group>
+<element-name name="simplesect" occurrence="+"/>
+</or-group>
+<or-group occurrence="*">
+<element-name name="toc"/>
+<element-name name="lot"/>
+<element-name name="index"/>
+<element-name name="glossary"/>
+<element-name name="bibliography"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="sect5">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="status" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="renderas" type="#IMPLIED" enumeration="yes" value="sect1 sect2 sect3 sect4" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="tip">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="title" occurrence="?"/>
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="tip">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="thead">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="colspec" occurrence="*"/>
+<element-name name="row" occurrence="+"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="thead">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="valign" type="#IMPLIED" enumeration="yes" value="top middle bottom" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="classsynopsisinfo">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="lineannotation"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="classsynopsisinfo">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="format" type="" enumeration="notation" value="linespecific" default="linespecific"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="linenumbering" type="#IMPLIED" enumeration="yes" value="numbered unnumbered" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="olink">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="olink">
+<attribute name="localinfo" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="linkmode" type="" value="IDREF" default="kdems-default"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="targetdocent" type="#IMPLIED" value="ENTITY" default=""/>
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="type" type="" enumeration="yes" value="href other" default="href"/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="sect5info">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="keywordset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="sect5info">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="msgaud">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="msgaud">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="cmdsynopsis">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="command"/>
+<element-name name="arg"/>
+<element-name name="group"/>
+<element-name name="sbr"/>
+</or-group>
+<element-name name="synopfragment" occurrence="*"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="cmdsynopsis">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="cmdlength" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="sepchar" type="" value="CDATA" default=" "/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="methodname">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="methodname">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="corpname">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="corpname">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="title">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="title">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="pagenum" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="invpartnumber">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="invpartnumber">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="productname">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="productname">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="class" type="" enumeration="yes" value="service trade registered copyright" default="trade"/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="glosssee">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="glosssee">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="otherterm" type="#IMPLIED" value="IDREF" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="row">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="entry"/>
+<element-name name="entrytbl"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="row">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="rowsep" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="valign" type="#IMPLIED" enumeration="yes" value="top middle bottom" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="programlistingco">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="areaspec"/>
+<element-name name="programlisting"/>
+<element-name name="calloutlist" occurrence="*"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="programlistingco">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="structfield">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="structfield">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="refsect1">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="refsect1info" occurrence="?"/>
+<sequence-group>
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group>
+<sequence-group>
+
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+
+<element-name name="refsect2" occurrence="*"/>
+</sequence-group>
+<element-name name="refsect2" occurrence="+"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="refsect1">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="status" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="refsect2">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="refsect2info" occurrence="?"/>
+<sequence-group>
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group>
+<sequence-group>
+
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+
+<element-name name="refsect3" occurrence="*"/>
+</sequence-group>
+<element-name name="refsect3" occurrence="+"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="refsect2">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="status" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="refsect3">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="refsect3info" occurrence="?"/>
+<sequence-group>
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="refsect3">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="status" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="methodsynopsis">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="modifier" occurrence="*"/>
+<or-group occurrence="?">
+<element-name name="type"/>
+<element-name name="void"/>
+</or-group>
+<element-name name="methodname"/>
+<or-group>
+<element-name name="methodparam" occurrence="+"/>
+<element-name name="void"/>
+</or-group>
+<element-name name="exceptionname" occurrence="*"/>
+<element-name name="modifier" occurrence="*"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="methodsynopsis">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="ackno">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="ackno">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="errortype">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="errortype">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="menuchoice">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="shortcut" occurrence="?"/>
+<or-group occurrence="+">
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="interface"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="menuchoice">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="seglistitem">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="seg"/>
+<element-name name="seg" occurrence="+"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="seglistitem">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="primary">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="primary">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="sortas" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="subject">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="subjectterm" occurrence="+"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="subject">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="weight" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="indexentry">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="primaryie"/>
+<or-group occurrence="*">
+<element-name name="seeie"/>
+<element-name name="seealsoie"/>
+</or-group>
+<sequence-group occurrence="*">
+<element-name name="secondaryie"/>
+<or-group occurrence="*">
+
+<element-name name="seeie"/>
+
+<element-name name="seealsoie"/>
+
+<element-name name="tertiaryie"/>
+</or-group>
+</sequence-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="indexentry">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="envar">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="envar">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="orgdiv">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="orgdiv">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="publishername">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="publishername">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="msglevel">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="msglevel">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="partinfo">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="keywordset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="partinfo">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="optional">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="optional">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="term">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="term">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="sect2info">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="keywordset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="sect2info">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="synopsis">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="lineannotation"/>
+<element-name name="co"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="synopsis">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="format" type="" enumeration="notation" value="linespecific" default="linespecific"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="linenumbering" type="#IMPLIED" enumeration="yes" value="numbered unnumbered" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="indexterm">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="primary" occurrence="?"/>
+<or-group occurrence="?">
+<sequence-group>
+
+<element-name name="secondary"/>
+
+<or-group occurrence="?">
+<sequence-group>
+<element-name name="tertiary"/>
+<or-group occurrence="?">
+
+<element-name name="see"/>
+
+<element-name name="seealso" occurrence="+"/>
+</or-group>
+</sequence-group>
+<element-name name="see"/>
+<element-name name="seealso" occurrence="+"/>
+
+</or-group>
+</sequence-group>
+<element-name name="see"/>
+<element-name name="seealso" occurrence="+"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="indexterm">
+<attribute name="significance" type="" enumeration="yes" value="preferred normal" default="normal"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="zone" type="#IMPLIED" value="IDREFS" default=""/>
+<attribute name="startref" type="#IMPLIED" value="IDREF" default=""/>
+<attribute name="pagenum" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="class" type="#IMPLIED" enumeration="yes" value="singular startofrange endofrange" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="scope" type="#IMPLIED" enumeration="yes" value="all global local" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="keywordset">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="keyword" occurrence="+"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="keywordset">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="glossdef">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="remark"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+<element-name name="glossseealso" occurrence="*"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="glossdef">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="subject" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="parameter">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="parameter">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="class" type="#IMPLIED" enumeration="yes" value="command function option" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="callout">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="callout">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="arearefs" type="#REQUIRED" value="IDREFS" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="qandadiv">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group occurrence="?">
+<element-name name="title"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="*">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="procedure"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="indexterm"/>
+</or-group>
+<or-group>
+<element-name name="qandadiv" occurrence="+"/>
+<element-name name="qandaentry" occurrence="+"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="qandadiv">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="token">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="token">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="audioobject">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="objectinfo" occurrence="?"/>
+<element-name name="audiodata"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="audioobject">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="tfoot">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="colspec" occurrence="*"/>
+<element-name name="row" occurrence="+"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="tfoot">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="valign" type="#IMPLIED" enumeration="yes" value="top middle bottom" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="glossentry">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="glossterm"/>
+<element-name name="acronym" occurrence="?"/>
+<element-name name="abbrev" occurrence="?"/>
+<sequence-group occurrence="*">
+<element-name name="indexterm"/>
+</sequence-group>
+<element-name name="revhistory" occurrence="?"/>
+<or-group>
+<element-name name="glosssee"/>
+<element-name name="glossdef" occurrence="+"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="glossentry">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="sortas" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="refentryinfo">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="keywordset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="refentryinfo">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="pubdate">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="pubdate">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="option">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="option">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="textobject">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="objectinfo" occurrence="?"/>
+<or-group>
+<element-name name="phrase"/>
+<or-group occurrence="+">
+
+<element-name name="calloutlist"/>
+
+<element-name name="glosslist"/>
+
+<element-name name="itemizedlist"/>
+
+<element-name name="orderedlist"/>
+
+<element-name name="segmentedlist"/>
+
+<element-name name="simplelist"/>
+
+<element-name name="variablelist"/>
+
+<element-name name="caution"/>
+
+<element-name name="important"/>
+
+<element-name name="note"/>
+
+<element-name name="tip"/>
+
+<element-name name="warning"/>
+
+<element-name name="literallayout"/>
+
+<element-name name="programlisting"/>
+
+<element-name name="programlistingco"/>
+
+<element-name name="screen"/>
+
+<element-name name="screenco"/>
+
+<element-name name="screenshot"/>
+
+<element-name name="formalpara"/>
+
+<element-name name="para"/>
+
+<element-name name="simpara"/>
+
+<element-name name="blockquote"/>
+</or-group>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="textobject">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="caption">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="blockquote"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="caption">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="publisher">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="publishername"/>
+<element-name name="address" occurrence="*"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="publisher">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="primaryie">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="primaryie">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="linkends" type="#IMPLIED" value="IDREFS" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="objectinfo">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="keywordset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="objectinfo">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="simpara">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="simpara">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="co">
+<content-model-expanded>
+
+<empty/>
+</content-model-expanded>
+</element>
+<attlist name="co">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#REQUIRED" value="ID" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="linkends" type="#IMPLIED" value="IDREFS" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="simplesect">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group>
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="simplesect">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="msgmain">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="title" occurrence="?"/>
+<element-name name="msgtext"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="msgmain">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="email">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="email">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="destructorsynopsis">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="modifier" occurrence="*"/>
+<element-name name="methodname" occurrence="?"/>
+<or-group>
+<element-name name="methodparam" occurrence="+"/>
+<element-name name="void"/>
+</or-group>
+<element-name name="exceptionname" occurrence="*"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="destructorsynopsis">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="abbrev">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="acronym"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="anchor"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="abbrev">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="referenceinfo">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="keywordset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="referenceinfo">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="footnote">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="footnote">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="keycode">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="keycode">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="holder">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="holder">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="ooexception">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="modifier" occurrence="*"/>
+<element-name name="exceptionname"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="ooexception">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="emphasis">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="emphasis">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="void">
+<content-model-expanded>
+
+<empty/>
+</content-model-expanded>
+</element>
+<attlist name="void">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="exceptionname">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="exceptionname">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="indexdiv">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group occurrence="?">
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<sequence-group>
+<or-group occurrence="*">
+
+<element-name name="itemizedlist"/>
+
+<element-name name="orderedlist"/>
+
+<element-name name="variablelist"/>
+
+<element-name name="simplelist"/>
+
+<element-name name="literallayout"/>
+
+<element-name name="programlisting"/>
+
+<element-name name="programlistingco"/>
+
+<element-name name="screen"/>
+
+<element-name name="screenco"/>
+
+<element-name name="screenshot"/>
+
+<element-name name="synopsis"/>
+
+<element-name name="cmdsynopsis"/>
+
+<element-name name="funcsynopsis"/>
+
+<element-name name="classsynopsis"/>
+
+<element-name name="fieldsynopsis"/>
+
+<element-name name="constructorsynopsis"/>
+
+<element-name name="destructorsynopsis"/>
+
+<element-name name="methodsynopsis"/>
+
+<element-name name="formalpara"/>
+
+<element-name name="para"/>
+
+<element-name name="simpara"/>
+
+<element-name name="address"/>
+
+<element-name name="blockquote"/>
+
+<element-name name="graphic"/>
+
+<element-name name="graphicco"/>
+
+<element-name name="mediaobject"/>
+
+<element-name name="mediaobjectco"/>
+
+<element-name name="informalequation"/>
+
+<element-name name="informalexample"/>
+
+<element-name name="informalfigure"/>
+
+<element-name name="informaltable"/>
+
+<element-name name="anchor"/>
+
+<element-name name="remark"/>
+
+<element-name name="link"/>
+
+<element-name name="olink"/>
+
+<element-name name="ulink"/>
+
+<element-name name="beginpage"/>
+</or-group>
+<or-group>
+
+<element-name name="indexentry" occurrence="+"/>
+
+<element-name name="segmentedlist"/>
+</or-group>
+</sequence-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="indexdiv">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="bibliodiv">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group occurrence="?">
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="*">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+<or-group occurrence="+">
+<element-name name="biblioentry"/>
+<element-name name="bibliomixed"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="bibliodiv">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="status" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="colspec">
+<content-model-expanded>
+
+<empty/>
+</content-model-expanded>
+</element>
+<attlist name="colspec">
+<attribute name="colnum" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="char" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="colsep" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="colwidth" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="charoff" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="colname" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="rowsep" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="align" type="#IMPLIED" enumeration="yes" value="left right center justify char" default=""/>
+</attlist>
+<element name="keycap">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="keycap">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="msgorig">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="msgorig">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="subjectterm">
+<content-model-expanded>
+
+<sequence-group>
+<pcdata/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="subjectterm">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="interfacename">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="interfacename">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="methodparam">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="modifier" occurrence="*"/>
+<element-name name="type" occurrence="?"/>
+<or-group>
+<sequence-group>
+
+<element-name name="parameter"/>
+
+<element-name name="initializer" occurrence="?"/>
+</sequence-group>
+<element-name name="funcparams"/>
+</or-group>
+<element-name name="modifier" occurrence="*"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="methodparam">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="rep" type="" enumeration="yes" value="norepeat repeat" default="norepeat"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="choice" type="" enumeration="yes" value="opt req plain" default="req"/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="contractsponsor">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="contractsponsor">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="edition">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="edition">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="function">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="function">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="chapter">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="chapterinfo" occurrence="?"/>
+<sequence-group>
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="*">
+<element-name name="toc"/>
+<element-name name="lot"/>
+<element-name name="index"/>
+<element-name name="glossary"/>
+<element-name name="bibliography"/>
+</or-group>
+<element-name name="tocchap" occurrence="?"/>
+<or-group>
+<sequence-group>
+
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+
+<or-group>
+<element-name name="sect1" occurrence="*"/>
+<sequence-group occurrence="*">
+<element-name name="refentry"/>
+</sequence-group>
+<element-name name="simplesect" occurrence="*"/>
+<element-name name="section" occurrence="*"/>
+
+</or-group>
+</sequence-group>
+<or-group>
+
+<element-name name="sect1" occurrence="+"/>
+
+<sequence-group occurrence="+">
+<element-name name="refentry"/>
+
+</sequence-group>
+
+<element-name name="simplesect" occurrence="+"/>
+
+<element-name name="section" occurrence="+"/>
+</or-group>
+</or-group>
+<or-group occurrence="*">
+<element-name name="toc"/>
+<element-name name="lot"/>
+<element-name name="index"/>
+<element-name name="glossary"/>
+<element-name name="bibliography"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="chapter">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="status" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="refdescriptor">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="refdescriptor">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="inlinemediaobject">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="objectinfo" occurrence="?"/>
+<or-group>
+<element-name name="videoobject"/>
+<element-name name="audioobject"/>
+<element-name name="imageobject"/>
+</or-group>
+<or-group occurrence="*">
+<element-name name="videoobject"/>
+<element-name name="audioobject"/>
+<element-name name="imageobject"/>
+<element-name name="textobject"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="inlinemediaobject">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="command">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="command">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="contractnum">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="contractnum">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="refmiscinfo">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="refmiscinfo">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="class" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="substeps">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="step" occurrence="+"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="substeps">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="performance" type="" enumeration="yes" value="optional required" default="required"/>
+</attlist>
+<element name="screenshot">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="screeninfo" occurrence="?"/>
+<or-group>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="screenshot">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="msgrel">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="title" occurrence="?"/>
+<element-name name="msgtext"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="msgrel">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="question">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="label" occurrence="?"/>
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="procedure"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="question">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="refclass">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="application"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="refclass">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="videodata">
+<content-model-expanded>
+
+<empty/>
+</content-model-expanded>
+</element>
+<attlist name="videodata">
+<attribute name="srccredit" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="width" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="scalefit" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="format" type="#IMPLIED" enumeration="yes" value="BMP CGM-CHAR CGM-BINARY CGM-CLEAR DITROFF DVI EPS EQN FAX GIF GIF87a GIF89a JPG JPEG IGES PCX PIC PNG PS SGML TBL TEX TIFF WMF WPG linespecific" default=""/>
+<attribute name="depth" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="entityref" type="#IMPLIED" value="ENTITY" default=""/>
+<attribute name="scale" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="fileref" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="align" type="#IMPLIED" enumeration="yes" value="left right center" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="answer">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="label" occurrence="?"/>
+<or-group occurrence="*">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="procedure"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="indexterm"/>
+</or-group>
+<element-name name="qandaentry" occurrence="*"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="answer">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="phone">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="phone">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="printhistory">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="printhistory">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="affiliation">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="shortaffil" occurrence="?"/>
+<element-name name="jobtitle" occurrence="*"/>
+<element-name name="orgname" occurrence="?"/>
+<element-name name="orgdiv" occurrence="*"/>
+<element-name name="address" occurrence="*"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="affiliation">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="keycombo">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="keycap"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="mousebutton"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="keycombo">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="otheraction" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="action" type="#IMPLIED" enumeration="yes" value="click double-click press seq simul other" default=""/>
+</attlist>
+<element name="xref">
+<content-model-expanded>
+
+<empty/>
+</content-model-expanded>
+</element>
+<attlist name="xref">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="linkend" type="#REQUIRED" value="IDREF" default=""/>
+<attribute name="endterm" type="#IMPLIED" value="IDREF" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="subtitle">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="subtitle">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="bibliography">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="bibliographyinfo" occurrence="?"/>
+<sequence-group occurrence="?">
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="*">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+<or-group>
+<element-name name="bibliodiv" occurrence="+"/>
+<or-group occurrence="+">
+
+<element-name name="biblioentry"/>
+
+<element-name name="bibliomixed"/>
+</or-group>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="bibliography">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="status" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="refsect2info">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="graphic"/>
+<element-name name="mediaobject"/>
+<element-name name="legalnotice"/>
+<element-name name="modespec"/>
+<element-name name="subjectset"/>
+<element-name name="keywordset"/>
+<element-name name="itermset"/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="refsect2info">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="quote">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="quote">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="programlisting">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="co"/>
+<element-name name="lineannotation"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="programlisting">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="format" type="" enumeration="notation" value="linespecific" default="linespecific"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="linenumbering" type="#IMPLIED" enumeration="yes" value="numbered unnumbered" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="width" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="appendix">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="appendixinfo" occurrence="?"/>
+<sequence-group>
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="*">
+<element-name name="toc"/>
+<element-name name="lot"/>
+<element-name name="index"/>
+<element-name name="glossary"/>
+<element-name name="bibliography"/>
+</or-group>
+<element-name name="tocchap" occurrence="?"/>
+<or-group>
+<sequence-group>
+
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="msgset"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="qandaset"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="abstract"/>
+<element-name name="authorblurb"/>
+<element-name name="epigraph"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+
+<or-group>
+<element-name name="sect1" occurrence="*"/>
+<sequence-group occurrence="*">
+<element-name name="refentry"/>
+</sequence-group>
+<element-name name="simplesect" occurrence="*"/>
+<element-name name="section" occurrence="*"/>
+
+</or-group>
+</sequence-group>
+<or-group>
+
+<element-name name="sect1" occurrence="+"/>
+
+<sequence-group occurrence="+">
+<element-name name="refentry"/>
+
+</sequence-group>
+
+<element-name name="simplesect" occurrence="+"/>
+
+<element-name name="section" occurrence="+"/>
+</or-group>
+</or-group>
+<or-group occurrence="*">
+<element-name name="toc"/>
+<element-name name="lot"/>
+<element-name name="index"/>
+<element-name name="glossary"/>
+<element-name name="bibliography"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="appendix">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="status" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="label" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="synopfragment">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="arg"/>
+<element-name name="group"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="synopfragment">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#REQUIRED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="classsynopsis">
+<content-model-expanded>
+
+<sequence-group>
+<or-group occurrence="+">
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+</or-group>
+<or-group occurrence="*">
+<element-name name="classsynopsisinfo"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="classsynopsis">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="language" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="class" type="" enumeration="yes" value="class interface" default="class"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="constructorsynopsis">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="modifier" occurrence="*"/>
+<element-name name="methodname" occurrence="?"/>
+<or-group>
+<element-name name="methodparam" occurrence="+"/>
+<element-name name="void"/>
+</or-group>
+<element-name name="exceptionname" occurrence="*"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="constructorsynopsis">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="sgmltag">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="sgmltag">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="class" type="#IMPLIED" enumeration="yes" value="attribute attvalue element endtag emptytag genentity numcharref paramentity pi xmlpi starttag sgmlcomment" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="literal">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="literal">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="msg">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="title" occurrence="?"/>
+<element-name name="msgmain"/>
+<or-group occurrence="*">
+<element-name name="msgsub"/>
+<element-name name="msgrel"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="msg">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="street">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="street">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="dedication">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group occurrence="?">
+<element-name name="title"/>
+<element-name name="subtitle" occurrence="?"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="blockquote"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="dedication">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="status" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="bibliomisc">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="inlineequation"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="bibliomisc">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="secondaryie">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="footnoteref"/>
+<element-name name="xref"/>
+<element-name name="abbrev"/>
+<element-name name="acronym"/>
+<element-name name="citation"/>
+<element-name name="citerefentry"/>
+<element-name name="citetitle"/>
+<element-name name="emphasis"/>
+<element-name name="firstterm"/>
+<element-name name="foreignphrase"/>
+<element-name name="glossterm"/>
+<element-name name="footnote"/>
+<element-name name="phrase"/>
+<element-name name="quote"/>
+<element-name name="trademark"/>
+<element-name name="wordasword"/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="author"/>
+<element-name name="authorinitials"/>
+<element-name name="corpauthor"/>
+<element-name name="modespec"/>
+<element-name name="othercredit"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="revhistory"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="secondaryie">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="linkends" type="#IMPLIED" value="IDREFS" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="subjectset">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="subject" occurrence="+"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="subjectset">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="scheme" type="#IMPLIED" value="NMTOKEN" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="artpagenums">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="artpagenums">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="prompt">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="replaceable"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+<element-name name="envar"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="prompt">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="authorblurb">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="title" occurrence="?"/>
+<or-group occurrence="+">
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="authorblurb">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="date">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="date">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="simplelist">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="member" occurrence="+"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="simplelist">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="columns" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="type" type="" enumeration="yes" value="inline vert horiz" default="vert"/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="caution">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="title" occurrence="?"/>
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="procedure"/>
+<element-name name="sidebar"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="caution">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="sidebar">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="sidebarinfo" occurrence="?"/>
+<sequence-group occurrence="?">
+<element-name name="title"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<or-group occurrence="+">
+<element-name name="calloutlist"/>
+<element-name name="glosslist"/>
+<element-name name="itemizedlist"/>
+<element-name name="orderedlist"/>
+<element-name name="segmentedlist"/>
+<element-name name="simplelist"/>
+<element-name name="variablelist"/>
+<element-name name="caution"/>
+<element-name name="important"/>
+<element-name name="note"/>
+<element-name name="tip"/>
+<element-name name="warning"/>
+<element-name name="literallayout"/>
+<element-name name="programlisting"/>
+<element-name name="programlistingco"/>
+<element-name name="screen"/>
+<element-name name="screenco"/>
+<element-name name="screenshot"/>
+<element-name name="synopsis"/>
+<element-name name="cmdsynopsis"/>
+<element-name name="funcsynopsis"/>
+<element-name name="classsynopsis"/>
+<element-name name="fieldsynopsis"/>
+<element-name name="constructorsynopsis"/>
+<element-name name="destructorsynopsis"/>
+<element-name name="methodsynopsis"/>
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+<element-name name="address"/>
+<element-name name="blockquote"/>
+<element-name name="graphic"/>
+<element-name name="graphicco"/>
+<element-name name="mediaobject"/>
+<element-name name="mediaobjectco"/>
+<element-name name="informalequation"/>
+<element-name name="informalexample"/>
+<element-name name="informalfigure"/>
+<element-name name="informaltable"/>
+<element-name name="equation"/>
+<element-name name="example"/>
+<element-name name="figure"/>
+<element-name name="table"/>
+<element-name name="procedure"/>
+<element-name name="anchor"/>
+<element-name name="bridgehead"/>
+<element-name name="remark"/>
+<element-name name="highlights"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="sidebar">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="bibliomset">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="abbrev"/>
+<element-name name="abstract"/>
+<element-name name="address"/>
+<element-name name="artpagenums"/>
+<element-name name="author"/>
+<element-name name="authorgroup"/>
+<element-name name="authorinitials"/>
+<element-name name="bibliomisc"/>
+<element-name name="biblioset"/>
+<element-name name="collab"/>
+<element-name name="confgroup"/>
+<element-name name="contractnum"/>
+<element-name name="contractsponsor"/>
+<element-name name="copyright"/>
+<element-name name="corpauthor"/>
+<element-name name="corpname"/>
+<element-name name="date"/>
+<element-name name="edition"/>
+<element-name name="editor"/>
+<element-name name="invpartnumber"/>
+<element-name name="isbn"/>
+<element-name name="issn"/>
+<element-name name="issuenum"/>
+<element-name name="orgname"/>
+<element-name name="othercredit"/>
+<element-name name="pagenums"/>
+<element-name name="printhistory"/>
+<element-name name="productname"/>
+<element-name name="productnumber"/>
+<element-name name="pubdate"/>
+<element-name name="publisher"/>
+<element-name name="publishername"/>
+<element-name name="pubsnumber"/>
+<element-name name="releaseinfo"/>
+<element-name name="revhistory"/>
+<element-name name="seriesvolnums"/>
+<element-name name="subtitle"/>
+<element-name name="title"/>
+<element-name name="titleabbrev"/>
+<element-name name="volumenum"/>
+<element-name name="citetitle"/>
+<element-name name="honorific"/>
+<element-name name="firstname"/>
+<element-name name="surname"/>
+<element-name name="lineage"/>
+<element-name name="othername"/>
+<element-name name="affiliation"/>
+<element-name name="authorblurb"/>
+<element-name name="contrib"/>
+<element-name name="indexterm"/>
+<element-name name="bibliomset"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="bibliomset">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="relation" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="userinput">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="userinput">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="subscript">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="replaceable"/>
+<element-name name="symbol"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="anchor"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="subscript">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="computeroutput">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="action"/>
+<element-name name="application"/>
+<element-name name="classname"/>
+<element-name name="methodname"/>
+<element-name name="interfacename"/>
+<element-name name="exceptionname"/>
+<element-name name="ooclass"/>
+<element-name name="oointerface"/>
+<element-name name="ooexception"/>
+<element-name name="command"/>
+<element-name name="computeroutput"/>
+<element-name name="database"/>
+<element-name name="email"/>
+<element-name name="envar"/>
+<element-name name="errorcode"/>
+<element-name name="errorname"/>
+<element-name name="errortype"/>
+<element-name name="filename"/>
+<element-name name="function"/>
+<element-name name="guibutton"/>
+<element-name name="guiicon"/>
+<element-name name="guilabel"/>
+<element-name name="guimenu"/>
+<element-name name="guimenuitem"/>
+<element-name name="guisubmenu"/>
+<element-name name="hardware"/>
+<element-name name="interface"/>
+<element-name name="keycap"/>
+<element-name name="keycode"/>
+<element-name name="keycombo"/>
+<element-name name="keysym"/>
+<element-name name="literal"/>
+<element-name name="constant"/>
+<element-name name="markup"/>
+<element-name name="medialabel"/>
+<element-name name="menuchoice"/>
+<element-name name="mousebutton"/>
+<element-name name="option"/>
+<element-name name="optional"/>
+<element-name name="parameter"/>
+<element-name name="prompt"/>
+<element-name name="property"/>
+<element-name name="replaceable"/>
+<element-name name="returnvalue"/>
+<element-name name="sgmltag"/>
+<element-name name="structfield"/>
+<element-name name="structname"/>
+<element-name name="symbol"/>
+<element-name name="systemitem"/>
+<element-name name="token"/>
+<element-name name="type"/>
+<element-name name="userinput"/>
+<element-name name="varname"/>
+<element-name name="anchor"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+<element-name name="beginpage"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="computeroutput">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="moreinfo" type="" enumeration="yes" value="refentry none" default="none"/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="seriesvolnums">
+<content-model-expanded>
+
+<or-group occurrence="*">
+<pcdata/>
+<element-name name="link"/>
+<element-name name="olink"/>
+<element-name name="ulink"/>
+<element-name name="emphasis"/>
+<element-name name="trademark"/>
+<element-name name="replaceable"/>
+<element-name name="remark"/>
+<element-name name="subscript"/>
+<element-name name="superscript"/>
+<element-name name="inlinegraphic"/>
+<element-name name="inlinemediaobject"/>
+<element-name name="indexterm"/>
+
+</or-group>
+</content-model-expanded>
+</element>
+<attlist name="seriesvolnums">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="sbr">
+<content-model-expanded>
+
+<empty/>
+</content-model-expanded>
+</element>
+<attlist name="sbr">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="refmeta">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group occurrence="*">
+<element-name name="indexterm"/>
+</sequence-group>
+<element-name name="refentrytitle"/>
+<element-name name="manvolnum" occurrence="?"/>
+<element-name name="refmiscinfo" occurrence="*"/>
+<sequence-group occurrence="*">
+<element-name name="indexterm"/>
+</sequence-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="refmeta">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="epigraph">
+<content-model-expanded>
+
+<sequence-group>
+<element-name name="attribution" occurrence="?"/>
+<or-group occurrence="+">
+<element-name name="formalpara"/>
+<element-name name="para"/>
+<element-name name="simpara"/>
+</or-group>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="epigraph">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+</attlist>
+<element name="orderedlist">
+<content-model-expanded>
+
+<sequence-group>
+<sequence-group occurrence="?">
+<element-name name="title"/>
+<element-name name="titleabbrev" occurrence="?"/>
+</sequence-group>
+<element-name name="listitem" occurrence="+"/>
+
+</sequence-group>
+</content-model-expanded>
+</element>
+<attlist name="orderedlist">
+<attribute name="xreflabel" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="lang" type="#IMPLIED" enumeration="yes" value="af az bg bo br bs ca cs cy da de el en en-GB en-US eo es et eu fa fi fo fr ga gl he hi hr hu id is it ja kn ko lt lv mi mk mt nl no nb nn nso oc pl pt pt-BR pt-PT ro ru si sk sl sr st sv ta te tg th tr uk vi x-wa xh zh zh-CN zh-TW zu" default=""/>
+<attribute name="spacing" type="#IMPLIED" enumeration="yes" value="normal compact" default=""/>
+<attribute name="id" type="#IMPLIED" value="ID" default=""/>
+<attribute name="continuation" type="" enumeration="yes" value="continues restarts" default="restarts"/>
+<attribute name="numeration" type="#IMPLIED" enumeration="yes" value="arabic upperalpha loweralpha upperroman lowerroman" default=""/>
+<attribute name="role" type="#IMPLIED" value="CDATA" default=""/>
+<attribute name="inheritnum" type="" enumeration="yes" value="inherit ignore" default="ignore"/>
+</attlist>
+
+</dtd>
diff --git a/kate/xmltools/kpartgui.dtd.xml b/kate/xmltools/kpartgui.dtd.xml
new file mode 100644
index 0000000..a914e6d
--- /dev/null
+++ b/kate/xmltools/kpartgui.dtd.xml
@@ -0,0 +1,673 @@
+<!DOCTYPE dtd PUBLIC "-//Norman Walsh//DTD DTDParse V2.0//EN"
+ "dtd.dtd" [
+]>
+<dtd version='1.0'
+ unexpanded='1'
+ title="KDE GUI Definition"
+ namecase-general="1"
+ namecase-entity="0"
+ xml="0"
+ system-id="kpartgui.dtd"
+ public-id=""
+ declaration=""
+ created-by="DTDParse V2.0beta6"
+ created-on="Wed Jun 12 22:40:16 2002"
+>
+<element name="Menu"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="text" occurrence="?"/>
+ <or-group occurrence="*">
+ <element-name name="title"/>
+ <element-name name="Action"/>
+ <element-name name="ActionList"/>
+ <element-name name="Separator"/>
+ <element-name name="WeakSeparator"/>
+ <element-name name="TearOffHandle"/>
+ <element-name name="Merge"/>
+ <element-name name="MergeLocal"/>
+ <element-name name="DefineGroup"/>
+ <element-name name="Menu"/>
+ </or-group>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="text" occurrence="?"/>
+ <or-group occurrence="*">
+ <element-name name="title"/>
+ <element-name name="Action"/>
+ <element-name name="ActionList"/>
+ <element-name name="Separator"/>
+ <element-name name="WeakSeparator"/>
+ <element-name name="TearOffHandle"/>
+ <element-name name="Merge"/>
+ <element-name name="MergeLocal"/>
+ <element-name name="DefineGroup"/>
+ <element-name name="Menu"/>
+ </or-group>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="Menu">
+<attdecl>
+ append CDATA #IMPLIED
+ name CDATA #REQUIRED
+ group CDATA #IMPLIED
+ icon CDATA #IMPLIED
+ noMerge (0|1) "0"
+</attdecl>
+<attribute name="noMerge"
+ type=""
+ enumeration="yes"
+ value=""
+ default="0"/>
+<attribute name="append"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="group"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="icon"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="MenuBar"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <or-group occurrence="*">
+ <element-name name="Menu"/>
+ <element-name name="Separator"/>
+ <element-name name="Action"/>
+ <element-name name="ActionList"/>
+ <element-name name="Merge"/>
+ <element-name name="MergeLocal"/>
+ <element-name name="DefineGroup"/>
+ </or-group>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <or-group occurrence="*">
+ <element-name name="Menu"/>
+ <element-name name="Separator"/>
+ <element-name name="Action"/>
+ <element-name name="ActionList"/>
+ <element-name name="Merge"/>
+ <element-name name="MergeLocal"/>
+ <element-name name="DefineGroup"/>
+ </or-group>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="MenuBar">
+<attdecl>
+ name CDATA #IMPLIED
+ group CDATA #IMPLIED
+</attdecl>
+<attribute name="group"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="MainWindow"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <any/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <any/>
+ </sequence-group>
+</content-model>
+</element>
+
+<element name="ActionList"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="ActionList">
+<attdecl>
+ name CDATA #REQUIRED
+</attdecl>
+<attribute name="name"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="kpartplugin"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <or-group occurrence="*">
+ <element-name name="ActionProperties"/>
+ <element-name name="MenuBar"/>
+ <element-name name="ToolBar"/>
+ <element-name name="Merge"/>
+ <element-name name="MergeLocal"/>
+ <element-name name="DefineGroup"/>
+ <element-name name="MainWindow"/>
+ <element-name name="StatusBar"/>
+ <element-name name="Menu"/>
+ <element-name name="State"/>
+ </or-group>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <or-group occurrence="*">
+ <element-name name="ActionProperties"/>
+ <element-name name="MenuBar"/>
+ <element-name name="ToolBar"/>
+ <element-name name="Merge"/>
+ <element-name name="MergeLocal"/>
+ <element-name name="DefineGroup"/>
+ <element-name name="MainWindow"/>
+ <element-name name="StatusBar"/>
+ <element-name name="Menu"/>
+ <element-name name="State"/>
+ </or-group>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="kpartplugin">
+<attdecl>
+ name CDATA #REQUIRED
+ version CDATA #REQUIRED
+ library CDATA #IMPLIED
+</attdecl>
+<attribute name="library"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="version"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="Merge"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="Merge">
+<attdecl>
+ name CDATA #IMPLIED
+</attdecl>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="disable"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="Action" occurrence="+"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="Action" occurrence="+"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<element name="State"
+ content-type="element">
+<content-model-expanded>
+ <or-group>
+ <element-name name="enable"/>
+ <element-name name="disable"/>
+ <sequence-group>
+ <element-name name="enable"/>
+ <element-name name="disable"/>
+ </sequence-group>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group>
+ <element-name name="enable"/>
+ <element-name name="disable"/>
+ <sequence-group>
+ <element-name name="enable"/>
+ <element-name name="disable"/>
+ </sequence-group>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="State">
+<attdecl>
+ name CDATA #REQUIRED
+</attdecl>
+<attribute name="name"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="ToolBar"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="text" occurrence="?"/>
+ <or-group occurrence="*">
+ <element-name name="Action"/>
+ <element-name name="Separator"/>
+ <element-name name="WeakSeparator"/>
+ <element-name name="ActionList"/>
+ <element-name name="Merge"/>
+ <element-name name="MergeLocal"/>
+ <element-name name="DefineGroup"/>
+ </or-group>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="text" occurrence="?"/>
+ <or-group occurrence="*">
+ <element-name name="Action"/>
+ <element-name name="Separator"/>
+ <element-name name="WeakSeparator"/>
+ <element-name name="ActionList"/>
+ <element-name name="Merge"/>
+ <element-name name="MergeLocal"/>
+ <element-name name="DefineGroup"/>
+ </or-group>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="ToolBar">
+<attdecl>
+ name CDATA #REQUIRED
+ fullWidth (true|false) "true"
+ position (top|bottom|left|right) "top"
+ iconText (icononly|textonly|icontextright|icontextbottom) #IMPLIED
+ iconSize CDATA #IMPLIED
+ index CDATA #IMPLIED
+ offset CDATA #IMPLIED
+ newline (true|false) "false"
+ group CDATA #IMPLIED
+ hidden (true|false) "false"
+ noEdit (true|false) "false"
+</attdecl>
+<attribute name="group"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="index"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="hidden"
+ type=""
+ enumeration="yes"
+ value="true false"
+ default="false"/>
+<attribute name="newline"
+ type=""
+ enumeration="yes"
+ value="true false"
+ default="false"/>
+<attribute name="iconSize"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="noEdit"
+ type=""
+ enumeration="yes"
+ value="true false"
+ default="false"/>
+<attribute name="fullWidth"
+ type=""
+ enumeration="yes"
+ value="true false"
+ default="true"/>
+<attribute name="position"
+ type=""
+ enumeration="yes"
+ value="top bottom left right"
+ default="top"/>
+<attribute name="iconText"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="icononly textonly icontextright icontextbottom"
+ default=""/>
+<attribute name="offset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="Separator"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="Separator">
+<attdecl>
+ lineSeparator (true|false) "false"
+ group CDATA #IMPLIED
+</attdecl>
+<attribute name="lineSeparator"
+ type=""
+ enumeration="yes"
+ value="true false"
+ default="false"/>
+<attribute name="group"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="DefineGroup"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="DefineGroup">
+<attdecl>
+ name CDATA #REQUIRED
+</attdecl>
+<attribute name="name"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="text"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<element name="title"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="title">
+<attdecl>
+ icon CDATA #IMPLIED
+</attdecl>
+<attribute name="icon"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="StatusBar"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <any/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <any/>
+ </sequence-group>
+</content-model>
+</element>
+
+<element name="ActionProperties"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="Action" occurrence="+"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="Action" occurrence="+"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<element name="kpartgui"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <or-group occurrence="*">
+ <element-name name="ActionProperties"/>
+ <element-name name="MenuBar"/>
+ <element-name name="ToolBar"/>
+ <element-name name="Merge"/>
+ <element-name name="MergeLocal"/>
+ <element-name name="DefineGroup"/>
+ <element-name name="MainWindow"/>
+ <element-name name="StatusBar"/>
+ <element-name name="Menu"/>
+ <element-name name="State"/>
+ </or-group>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <or-group occurrence="*">
+ <element-name name="ActionProperties"/>
+ <element-name name="MenuBar"/>
+ <element-name name="ToolBar"/>
+ <element-name name="Merge"/>
+ <element-name name="MergeLocal"/>
+ <element-name name="DefineGroup"/>
+ <element-name name="MainWindow"/>
+ <element-name name="StatusBar"/>
+ <element-name name="Menu"/>
+ <element-name name="State"/>
+ </or-group>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="kpartgui">
+<attdecl>
+ name CDATA #REQUIRED
+ version CDATA #REQUIRED
+ library CDATA #IMPLIED
+</attdecl>
+<attribute name="library"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="version"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="MergeLocal"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="MergeLocal">
+<attdecl>
+ name CDATA #IMPLIED
+</attdecl>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="WeakSeparator"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<element name="TearOffHandle"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="TearOffHandle">
+<attdecl>
+ group CDATA #IMPLIED
+</attdecl>
+<attribute name="group"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="enable"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="Action" occurrence="+"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="Action" occurrence="+"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<element name="Action"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="Action">
+<attdecl>
+ name CDATA #REQUIRED
+ group CDATA #IMPLIED
+ text CDATA #IMPLIED
+ whatsThis CDATA #IMPLIED
+ toolTip CDATA #IMPLIED
+ shortText CDATA #IMPLIED
+ shortcut CDATA #IMPLIED
+ icon CDATA #IMPLIED
+</attdecl>
+<attribute name="text"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="group"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="shortText"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="icon"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="shortcut"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="toolTip"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="whatsThis"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+</dtd>
diff --git a/kate/xmltools/language.dtd.xml b/kate/xmltools/language.dtd.xml
new file mode 100644
index 0000000..23cea4a
--- /dev/null
+++ b/kate/xmltools/language.dtd.xml
@@ -0,0 +1,960 @@
+<!DOCTYPE dtd PUBLIC "-//Norman Walsh//DTD DTDParse V2.0//EN"
+ "dtd.dtd" [
+]>
+<dtd version='1.0'
+ unexpanded='1'
+ title="kate highlightning definition"
+ namecase-general="1"
+ namecase-entity="0"
+ xml="0"
+ system-id="dev/kdelibs/kate/data/language.dtd"
+ public-id=""
+ declaration=""
+ created-by="DTDParse V2.0beta6"
+ created-on="Wed Jun 12 12:05:12 2002"
+>
+<entity name="ruleattrs"
+ type="param"
+>
+<text-expanded>attribute CDATA #REQUIRED -- The name of the ItemData to be used for matching text --
+ context NMTOKEN #REQUIRED -- The name of the context to go to when this rule
+ matches --
+ beginRegion CDATA #IMPLIED -- Begin a region of type beginRegion --
+ endRegion CDATA #IMPLIED -- End a region of type endRegion --</text-expanded>
+<text>attribute CDATA #REQUIRED -- The name of the ItemData to be used for matching text --
+ context NMTOKEN #REQUIRED -- The name of the context to go to when this rule
+ matches --
+ beginRegion CDATA #IMPLIED -- Begin a region of type beginRegion --
+ endRegion CDATA #IMPLIED -- End a region of type endRegion --</text>
+</entity>
+
+<element name="Float"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="*">
+ <element-name name="AnyChar"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <element-name name="AnyChar"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="Float">
+<attdecl>
+ %ruleattrs;
+</attdecl>
+<attribute name="context"
+ type="#REQUIRED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="attribute"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="beginRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="endRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="RegExpr"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="RegExpr">
+<attdecl>
+ String CDATA #REQUIRED -- The regular expression pattern --
+ insensitive (false|true) #IMPLIED -- Wheather to match insensitive or not
+ Defaults to false --
+ minimal (false|true) #IMPLIED -- Wheather to use minimal matching for wild cards
+ in the pattern Defaults to false --
+ %ruleattrs;
+</attdecl>
+<attribute name="context"
+ type="#REQUIRED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="attribute"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="beginRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="insensitive"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="false true"
+ default=""/>
+<attribute name="endRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="minimal"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="false true"
+ default=""/>
+<attribute name="String"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="HlCHex"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="HlCHex">
+<attdecl>
+ %ruleattrs;
+</attdecl>
+<attribute name="context"
+ type="#REQUIRED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="attribute"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="beginRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="endRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="language"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="highlighting"/>
+ <element-name name="general" occurrence="?"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="highlighting"/>
+ <element-name name="general" occurrence="?"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="language">
+<attdecl>
+ name CDATA #REQUIRED -- The name of this syntax description. Used in the
+ Highlightning Mode menu --
+ section (Sources|Markup|Other|Scripts) #REQUIRED
+ -- The logical group to which this syntax description
+ belongs. Used for sub menus --
+ extensions CDATA #REQUIRED -- A file glob or pattern to decide for which documents
+ to use this syntax description --
+ mimetype CDATA #REQUIRED -- A list of mimetypes to decide for which documents
+ to use this syntax description --
+ version CDATA #IMPLIED -- Version number of this syntax description --
+ kateverison CDATA #IMPLIED -- Kate version required for using this file --
+ casesensitive (0|1) #IMPLIED -- ?? --
+</attdecl>
+<attribute name="section"
+ type="#REQUIRED"
+ enumeration="yes"
+ value="Sources Markup Other Scripts"
+ default=""/>
+<attribute name="casesensitive"
+ type="#IMPLIED"
+ enumeration="yes"
+ value=""
+ default=""/>
+<attribute name="mimetype"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="extensions"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="version"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="kateverison"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="general"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="comments" occurrence="?"/>
+ <element-name name="keywords" occurrence="?"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="comments" occurrence="?"/>
+ <element-name name="keywords" occurrence="?"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="general">
+<attdecl>
+</attdecl>
+</attlist>
+
+<element name="DetectChar"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="DetectChar">
+<attdecl>
+ char CDATA #REQUIRED -- The character to look for --
+ %ruleattrs;
+</attdecl>
+<attribute name="context"
+ type="#REQUIRED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="attribute"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="beginRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="char"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="endRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="item"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<element name="comments"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="comment"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="comment"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="comments">
+<attdecl>
+</attdecl>
+</attlist>
+
+<element name="AnyChar"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="AnyChar">
+<attdecl>
+ String CDATA #REQUIRED -- A string representing the characters to look for --
+ %ruleattrs;
+</attdecl>
+<attribute name="context"
+ type="#REQUIRED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="attribute"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="beginRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="endRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="String"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="itemDatas"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="itemData"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="itemData"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="itemDatas">
+<attdecl>
+</attdecl>
+</attlist>
+
+<element name="IncludeRules"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="IncludeRules">
+<attdecl>
+ context NMTOKEN #REQUIRED -- The name or index of the context to include --
+</attdecl>
+<attribute name="context"
+ type="#REQUIRED"
+ value="NMTOKEN"
+ default=""/>
+</attlist>
+
+<element name="itemData"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="itemData">
+<attdecl>
+ name CDATA #REQUIRED -- The name of this attribute --
+ defStyleNum CDATA #REQUIRED -- The index of the default style to use --
+ color CDATA #IMPLIED -- Color for this style, either a hex triplet, a name
+ or some other format recognized by Qt --
+ selColor CDATA #IMPLIED -- The color for this style when text is selected --
+ italic CDATA #IMPLIED -- Wheather this attribute should be rendered using
+ an italic typeface --
+ bold CDATA #IMPLIED -- Wheather this attribute should be renederd using
+ a bold typeface --
+</attdecl>
+<attribute name="italic"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="defStyleNum"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="selColor"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="bold"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="color"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="LineContinue"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="LineContinue">
+<attdecl>
+ %ruleattrs;
+</attdecl>
+<attribute name="context"
+ type="#REQUIRED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="attribute"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="beginRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="endRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="contexts"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="context"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="context"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<element name="keywords"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="keywords">
+<attdecl>
+ casesensitive CDATA #IMPLIED
+ weakDeliminator CDATA #IMPLIED
+</attdecl>
+<attribute name="casesensitive"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="weakDeliminator"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="HlCOct"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="HlCOct">
+<attdecl>
+ %ruleattrs;
+</attdecl>
+<attribute name="context"
+ type="#REQUIRED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="attribute"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="beginRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="endRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="HlCStringChar"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="HlCStringChar">
+<attdecl>
+ %ruleattrs;
+</attdecl>
+<attribute name="context"
+ type="#REQUIRED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="attribute"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="beginRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="endRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="context"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="keyword"/>
+ <element-name name="Float"/>
+ <element-name name="HlCOct"/>
+ <element-name name="HlCHex"/>
+ <element-name name="Int"/>
+ <element-name name="DetectChar"/>
+ <element-name name="Detect2Chars"/>
+ <element-name name="AnyChar"/>
+ <element-name name="StringDetect"/>
+ <element-name name="RegExpr"/>
+ <element-name name="LineContinue"/>
+ <element-name name="HlCStringChar"/>
+ <element-name name="RangeDetect"/>
+ <element-name name="HlCChar"/>
+ <element-name name="IncludeRules"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="*">
+ <element-name name="keyword"/>
+ <element-name name="Float"/>
+ <element-name name="HlCOct"/>
+ <element-name name="HlCHex"/>
+ <element-name name="Int"/>
+ <element-name name="DetectChar"/>
+ <element-name name="Detect2Chars"/>
+ <element-name name="AnyChar"/>
+ <element-name name="StringDetect"/>
+ <element-name name="RegExpr"/>
+ <element-name name="LineContinue"/>
+ <element-name name="HlCStringChar"/>
+ <element-name name="RangeDetect"/>
+ <element-name name="HlCChar"/>
+ <element-name name="IncludeRules"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="context">
+<attdecl>
+ attribute CDATA #REQUIRED
+ lineEndContext NMTOKEN #REQUIRED
+ lineBeginContext NMTOKEN #IMPLIED
+ name CDATA #IMPLIED
+ fallthrough (false|true) #IMPLIED
+ fallthroughContext NMTOKEN #IMPLIED
+</attdecl>
+<attribute name="attribute"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="lineEndContext"
+ type="#REQUIRED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="fallthroughContext"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="fallthrough"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="false true"
+ default=""/>
+<attribute name="lineBeginContext"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="keyword"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="keyword">
+<attdecl>
+ %ruleattrs;
+ String (types|keywords|attribute-definitions|literals|definitions) #REQUIRED
+ -- The name of the list to try --
+ weakDelimiter CDATA #IMPLIED
+</attdecl>
+<attribute name="context"
+ type="#REQUIRED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="attribute"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="beginRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="weakDelimiter"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="endRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="String"
+ type="#REQUIRED"
+ enumeration="yes"
+ value="types keywords attribute-definitions literals definitions"
+ default=""/>
+</attlist>
+
+<element name="list"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="item"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="item"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="list">
+<attdecl>
+ name (types|keywords|attribute-definitions|literals|definitions) #REQUIRED
+</attdecl>
+<attribute name="name"
+ type="#REQUIRED"
+ enumeration="yes"
+ value="types keywords attribute-definitions literals definitions"
+ default=""/>
+</attlist>
+
+<element name="Int"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="*">
+ <element-name name="StringDetect"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <element-name name="StringDetect"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="Int">
+<attdecl>
+ %ruleattrs;
+</attdecl>
+<attribute name="context"
+ type="#REQUIRED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="attribute"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="beginRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="endRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="RangeDetect"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="RangeDetect">
+<attdecl>
+ char CDATA #REQUIRED -- The character starting the range --
+ char1 CDATA #REQUIRED -- The character terminating the range --
+ %ruleattrs;
+</attdecl>
+<attribute name="context"
+ type="#REQUIRED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="attribute"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="beginRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="char"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="endRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="char1"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="StringDetect"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="StringDetect">
+<attdecl>
+ String CDATA #REQUIRED -- The string to look for --
+ insensitive (TRUE|FALSE) #REQUIRED -- Wheather to match case insensitive or not.
+ Defaults to false --
+ %ruleattrs;
+</attdecl>
+<attribute name="context"
+ type="#REQUIRED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="attribute"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="beginRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="insensitive"
+ type="#REQUIRED"
+ enumeration="yes"
+ value="TRUE FALSE"
+ default=""/>
+<attribute name="endRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="String"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="highlighting"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="list" occurrence="*"/>
+ <element-name name="contexts"/>
+ <element-name name="itemDatas"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="list" occurrence="*"/>
+ <element-name name="contexts"/>
+ <element-name name="itemDatas"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="highlighting">
+<attdecl>
+</attdecl>
+</attlist>
+
+<element name="Detect2Chars"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="Detect2Chars">
+<attdecl>
+ char CDATA #REQUIRED -- The first character --
+ char1 CDATA #REQUIRED -- The second character --
+ %ruleattrs;
+</attdecl>
+<attribute name="context"
+ type="#REQUIRED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="attribute"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="beginRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="char"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="endRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="char1"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="comment"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="comment">
+<attdecl>
+ name (singleLine|multiLine) #REQUIRED
+ start CDATA #REQUIRED
+ end CDATA #IMPLIED
+</attdecl>
+<attribute name="end"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="start"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#REQUIRED"
+ enumeration="yes"
+ value="singleLine multiLine"
+ default=""/>
+</attlist>
+
+<element name="HlCChar"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="HlCChar">
+<attdecl>
+ %ruleattrs;
+</attdecl>
+<attribute name="context"
+ type="#REQUIRED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="attribute"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="beginRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="endRegion"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+</dtd>
diff --git a/kate/xmltools/plugin_katexmltools.cpp b/kate/xmltools/plugin_katexmltools.cpp
new file mode 100644
index 0000000..05f7802
--- /dev/null
+++ b/kate/xmltools/plugin_katexmltools.cpp
@@ -0,0 +1,1141 @@
+/***************************************************************************
+ pluginKatexmltools.cpp
+
+ List elements, attributes, attribute values and entities allowed by DTD.
+ Needs a DTD in XML format ( as produced by dtdparse ) for most features.
+
+ copyright : ( C ) 2001-2002 by Daniel Naber
+ email : daniel.naber@t-online.de
+
+ Copyright (C) 2005 by Anders Lund <anders@alweb.dk>
+ ***************************************************************************/
+
+/***************************************************************************
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or ( at your option ) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ ***************************************************************************/
+
+/*
+README:
+The basic idea is this: certain keyEvents(), namely [<&" ], trigger a completion box.
+This is intended as a help for editing. There are some cases where the XML
+spec is not followed, e.g. one can add the same attribute twice to an element.
+Also see the user documentation. If backspace is pressed after a completion popup
+was closed, the popup will re-open. This way typos can be corrected and the popup
+will reappear, which is quite comfortable.
+
+FIXME for jowenn if he has time:
+-Ctrl-Z doesn't work if completion is visible
+-Typing with popup works, but right/left cursor keys and start/end don't, i.e.
+ they should be ignored by the completion ( ? )
+-popup not completely visible if it's long and appears at the bottom of the screen
+
+FIXME:
+-( docbook ) <author lang="">: insert space between the quotes, press "de" and return -> only "d" inserted
+-Correctly support more than one view:
+ charactersInteractivelyInserted( ..) is tied to kv->document()
+ but filterInsertString( .. ) is tied to kv
+-The "Insert Element" dialog isn't case insensitive, but it should be
+-fix upper/lower case problems ( start typing lowercase if the tag etc. is upper case )
+-See the "fixme"'s in the code
+
+TODO:
+-check for mem leaks
+-add "Go to opening/parent tag"?
+-check doctype to get top-level element
+-can undo behaviour be improved?, e.g. the plugins internal deletions of text
+ don't have to be an extra step
+-don't offer entities if inside tag but outside attribute value
+
+-Support for more than one namespace at the same time ( e.g. XSLT + XSL-FO )?
+=>This could also be handled in the XSLT DTD fragment, as described in the XSLT 1.0 spec,
+ but then at <xsl:template match="/"><html> it will only show you HTML elements!
+=>So better "Assign meta DTD" and "Add meta DTD", the latter will expand the current meta DTD
+-Option to insert empty element in <empty/> form
+-Show expanded entities with QChar::QChar( int rc ) + unicode font
+-Don't ignore entities defined in the document's prologue
+-Only offer 'valid' elements, i.e. don't take the elements as a set but check
+ if the DTD is matched ( order, number of occurences, ... )
+
+-Maybe only read the meta DTD file once, then store the resulting QMap on disk ( using QDataStream )?
+ We'll then have to compare timeOf_cacheFile <-> timeOf_metaDtd.
+-Try to use libxml
+*/
+
+#include "plugin_katexmltools.h"
+#include "plugin_katexmltools.moc"
+
+#include <assert.h>
+
+#include <qdatetime.h>
+#include <qdom.h>
+#include <qfile.h>
+#include <qlayout.h>
+#include <qlistbox.h>
+#include <qprogressdialog.h>
+#include <qpushbutton.h>
+#include <qregexp.h>
+#include <qstring.h>
+#include <qtimer.h>
+
+#include <kaction.h>
+#include <kbuttonbox.h>
+#include <klineedit.h>
+#include <kcursor.h>
+#include <kdebug.h>
+#include <kfiledialog.h>
+#include <kglobal.h>
+#include <kinstance.h>
+#include <kio/job.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kstandarddirs.h>
+#include <kgenericfactory.h>
+
+K_EXPORT_COMPONENT_FACTORY( katexmltoolsplugin, KGenericFactory<PluginKateXMLTools>( "katexmltools" ) )
+
+class PluginView : public KXMLGUIClient
+{
+ friend class PluginKateXMLTools;
+
+ public:
+ Kate::MainWindow *win;
+};
+
+PluginKateXMLTools::PluginKateXMLTools( QObject* parent, const char* name, const QStringList& )
+ : Kate::Plugin ( (Kate::Application*)parent, name )
+{
+ //kdDebug() << "PluginKateXMLTools constructor called" << endl;
+
+ m_dtdString = QString();
+ m_urlString = QString();
+ m_docToAssignTo = 0L;
+
+ m_mode = none;
+ m_correctPos = 0;
+
+ m_lastLine = 0;
+ m_lastCol = 0;
+ m_lastAllowed = QStringList();
+ m_popupOpenCol = -1;
+
+ m_dtds.setAutoDelete( true );
+
+ m_documentManager = ((Kate::Application*)parent)->documentManager();
+
+// connect( m_documentManager, SIGNAL(documentCreated()),
+// this, SLOT(slotDocumentCreated()) );
+ connect( m_documentManager, SIGNAL(documentDeleted(uint)),
+ this, SLOT(slotDocumentDeleted(uint)) );
+}
+
+PluginKateXMLTools::~PluginKateXMLTools()
+{
+ //kdDebug() << "xml tools descructor 1..." << endl;
+}
+
+void PluginKateXMLTools::addView( Kate::MainWindow *win )
+{
+ // TODO: doesn't this have to be deleted?
+ PluginView *view = new PluginView ();
+ ( void) new KAction ( i18n("&Insert Element..."), CTRL+Key_Return, this,
+ SLOT( slotInsertElement()), view->actionCollection(), "xml_tool_insert_element" );
+ ( void) new KAction ( i18n("&Close Element"), CTRL+Key_Less, this,
+ SLOT( slotCloseElement()), view->actionCollection(), "xml_tool_close_element" );
+ ( void) new KAction ( i18n("Assign Meta &DTD..." ), 0, this,
+ SLOT( getDTD()), view->actionCollection(), "xml_tool_assign" );
+
+ view->setInstance( new KInstance("kate") );
+ view->setXMLFile( "plugins/katexmltools/ui.rc" );
+ win->guiFactory()->addClient( view );
+
+ view->win = win;
+ m_views.append( view );
+}
+
+void PluginKateXMLTools::removeView( Kate::MainWindow *win )
+{
+ for ( uint z=0; z < m_views.count(); z++ )
+ {
+ if ( m_views.at(z)->win == win )
+ {
+ PluginView *view = m_views.at( z );
+ m_views.remove ( view );
+ win->guiFactory()->removeClient( view );
+ delete view;
+ }
+ }
+}
+
+void PluginKateXMLTools::slotDocumentDeleted( uint documentNumber )
+{
+ // Remove the document from m_DTDs, and also delete the PseudoDTD
+ // if it becomes unused.
+ if ( m_docDtds[ documentNumber ] )
+ {
+ kdDebug()<<"XMLTools:slotDocumentDeleted: documents: "<<m_docDtds.count()<<", DTDs: "<<m_dtds.count()<<endl;
+ PseudoDTD *dtd = m_docDtds.take( documentNumber );
+
+ QIntDictIterator<PseudoDTD> it ( m_docDtds );
+ for ( ; it.current(); ++it )
+ {
+ if ( it.current() == dtd )
+ return;
+ }
+
+ QDictIterator<PseudoDTD> it1( m_dtds );
+ for ( ; it1.current() ; ++it1 )
+ {
+ if ( it1.current() == dtd )
+ {
+ m_dtds.remove( it1.currentKey() );
+ return;
+ }
+ }
+ }
+}
+
+void PluginKateXMLTools::backspacePressed()
+{
+ kdDebug() << "xml tools backspacePressed" << endl;
+
+ if ( !application()->activeMainWindow() )
+ return;
+
+ Kate::View *kv = application()->activeMainWindow()->viewManager()->activeView();
+ if( ! kv )
+ {
+ kdDebug() << "Warning: no Kate::View" << endl;
+ return;
+ }
+ uint line, col;
+ kv->cursorPositionReal( &line, &col );
+
+ //kdDebug() << "++ redisplay popup? line:" << line << ", col: " << col << endl;
+ if( m_lastLine == line && col == m_lastCol )
+ {
+ int len = col - m_popupOpenCol;
+ if( len < 0 )
+ {
+ kdDebug() << "**Warning: len < 0" << endl;
+ return;
+ }
+ //kdDebug() << "++ redisplay popup, " << m_lastAllowed.count() << ", len:" << len <<endl;
+ connectSlots( kv );
+ kv->showCompletionBox( stringListToCompletionEntryList(m_lastAllowed), len, false );
+ }
+}
+
+void PluginKateXMLTools::emptyKeyEvent()
+{
+ keyEvent( 0, 0, QString::null );
+}
+
+void PluginKateXMLTools::keyEvent( int, int, const QString &/*s*/ )
+{
+ //kdDebug() << "xml tools keyEvent: '" << s << endl;
+
+ if ( !application()->activeMainWindow() )
+ return;
+
+ Kate::View *kv = application()->activeMainWindow()->viewManager()->activeView();
+ if( ! kv )
+ {
+ kdDebug() << "Warning: no Kate::View" << endl;
+ return;
+ }
+
+ uint docNumber = kv->document()->documentNumber();
+ if( ! m_docDtds[ docNumber ] )
+ // no meta DTD assigned yet
+ return;
+
+ // debug to test speed:
+ //QTime t; t.start();
+
+ QStringList allowed = QStringList();
+
+ // get char on the left of the cursor:
+ uint line, col;
+ kv->cursorPositionReal( &line, &col );
+ QString lineStr = kv->getDoc()->textLine( line );
+ QString leftCh = lineStr.mid( col-1, 1 );
+ QString secondLeftCh = lineStr.mid( col-2, 1 );
+
+ if( leftCh == "&" )
+ {
+ kdDebug() << "Getting entities" << endl;
+ allowed = m_docDtds[docNumber]->entities("" );
+ m_mode = entities;
+ }
+ else if( leftCh == "<" )
+ {
+ kdDebug() << "*outside tag -> get elements" << endl;
+ QString parentElement = getParentElement( *kv, true );
+ kdDebug() << "parent: " << parentElement << endl;
+ allowed = m_docDtds[docNumber]->allowedElements(parentElement );
+ m_mode = elements;
+ }
+ // TODO: optionally close parent tag if not left=="/>"
+ else if( leftCh == " " || (isQuote(leftCh) && secondLeftCh == "=") )
+ {
+ // TODO: check secondLeftChar, too?! then you don't need to trigger
+ // with space and we yet save CPU power
+ QString currentElement = insideTag( *kv );
+ QString currentAttribute;
+ if( ! currentElement.isEmpty() )
+ currentAttribute = insideAttribute( *kv );
+
+ kdDebug() << "Tag: " << currentElement << endl;
+ kdDebug() << "Attr: " << currentAttribute << endl;
+
+ if( ! currentElement.isEmpty() && ! currentAttribute.isEmpty() )
+ {
+ kdDebug() << "*inside attribute -> get attribute values" << endl;
+ allowed = m_docDtds[docNumber]->attributeValues(currentElement, currentAttribute );
+ if( allowed.count() == 1 &&
+ (allowed[0] == "CDATA" || allowed[0] == "ID" || allowed[0] == "IDREF" ||
+ allowed[0] == "IDREFS" || allowed[0] == "ENTITY" || allowed[0] == "ENTITIES" ||
+ allowed[0] == "NMTOKEN" || allowed[0] == "NMTOKENS" || allowed[0] == "NAME") )
+ {
+ // these must not be taken literally, e.g. don't insert the string "CDATA"
+ allowed.clear();
+ }
+ else
+ {
+ m_mode = attributevalues;
+ }
+ }
+ else if( ! currentElement.isEmpty() )
+ {
+ kdDebug() << "*inside tag -> get attributes" << endl;
+ allowed = m_docDtds[docNumber]->allowedAttributes(currentElement );
+ m_mode = attributes;
+ }
+ }
+
+ //kdDebug() << "time elapsed (ms): " << t.elapsed() << endl;
+ //kdDebug() << "Allowed strings: " << allowed.count() << endl;
+
+ if( allowed.count() >= 1 && allowed[0] != "__EMPTY" )
+ {
+ allowed = sortQStringList( allowed );
+ connectSlots( kv );
+ kv->showCompletionBox( stringListToCompletionEntryList( allowed ), 0, false );
+ m_popupOpenCol = col;
+ m_lastAllowed = allowed;
+ }
+ //else {
+ // m_lastAllowed.clear();
+ //}
+}
+
+QValueList<KTextEditor::CompletionEntry>
+PluginKateXMLTools::stringListToCompletionEntryList( QStringList list )
+{
+ QValueList<KTextEditor::CompletionEntry> compList;
+ KTextEditor::CompletionEntry entry;
+ for( QStringList::Iterator it = list.begin(); it != list.end(); ++it )
+ {
+ entry.text = ( *it );
+ compList << entry;
+ }
+ return compList;
+}
+
+
+/**
+ * disconnect all signals of a specified kateview from the local slots
+ *
+ */
+void PluginKateXMLTools::disconnectSlots( Kate::View *kv )
+{
+ disconnect( kv, SIGNAL(filterInsertString(KTextEditor::CompletionEntry*,QString*)), this, 0 );
+ disconnect( kv, SIGNAL(completionDone(KTextEditor::CompletionEntry)), this, 0 );
+ disconnect( kv, SIGNAL(completionAborted()), this, 0 );
+}
+
+/**
+ * connect all signals of a specified kateview to the local slots
+ *
+ */
+void PluginKateXMLTools::connectSlots( Kate::View *kv )
+{
+ connect( kv, SIGNAL(filterInsertString(KTextEditor::CompletionEntry*,QString*) ),
+ this, SLOT(filterInsertString(KTextEditor::CompletionEntry*,QString*)) );
+ connect( kv, SIGNAL(completionDone(KTextEditor::CompletionEntry) ),
+ this, SLOT(completionDone(KTextEditor::CompletionEntry)) );
+ connect( kv, SIGNAL(completionAborted()), this, SLOT(completionAborted()) );
+}
+
+/**
+ * Load the meta DTD. In case of success set the 'ready'
+ * flag to true, to show that we're is ready to give hints about the DTD.
+ */
+void PluginKateXMLTools::getDTD()
+{
+ if ( !application()->activeMainWindow() )
+ return;
+
+ Kate::View *kv = application()->activeMainWindow()->viewManager()->activeView();
+ if( ! kv )
+ {
+ kdDebug() << "Warning: no Kate::View" << endl;
+ return;
+ }
+
+ // ### replace this with something more sane
+ // Start where the supplied XML-DTDs are fed by default unless
+ // user changed directory last time:
+
+ QString defaultDir = KGlobal::dirs()->findResourceDir("data", "katexmltools/" ) + "katexmltools/";
+ if( m_urlString.isNull() ) {
+ m_urlString = defaultDir;
+ }
+ KURL url;
+
+ // Guess the meta DTD by looking at the doctype's public identifier.
+ // XML allows comments etc. before the doctype, so look further than
+ // just the first line.
+ // Example syntax:
+ // <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
+ uint checkMaxLines = 200;
+ QString documentStart = kv->getDoc()->text(0, 0, checkMaxLines+1, 0 );
+ QRegExp re( "<!DOCTYPE\\s+(.*)\\s+PUBLIC\\s+[\"'](.*)[\"']", false );
+ re.setMinimal( true );
+ int matchPos = re.search( documentStart );
+ QString filename;
+ QString doctype;
+ QString topElement;
+
+ if( matchPos != -1 ) {
+ topElement = re.cap( 1 );
+ doctype = re.cap( 2 );
+ kdDebug() << "Top element: " << topElement << endl;
+ kdDebug() << "Doctype match: " << doctype << endl;
+ // XHTML:
+ if( doctype == "-//W3C//DTD XHTML 1.0 Transitional//EN" )
+ filename = "xhtml1-transitional.dtd.xml";
+ else if( doctype == "-//W3C//DTD XHTML 1.0 Strict//EN" )
+ filename = "xhtml1-strict.dtd.xml";
+ else if( doctype == "-//W3C//DTD XHTML 1.0 Frameset//EN" )
+ filename = "xhtml1-frameset.dtd.xml";
+ // HTML 4.0:
+ else if ( doctype == "-//W3C//DTD HTML 4.01 Transitional//EN" )
+ filename = "html4-loose.dtd.xml";
+ else if ( doctype == "-//W3C//DTD HTML 4.01//EN" )
+ filename = "html4-strict.dtd.xml";
+ // KDE Docbook:
+ else if ( doctype == "-//KDE//DTD DocBook XML V4.1.2-Based Variant V1.1//EN" )
+ filename = "kde-docbook.dtd.xml";
+ }
+ else if( documentStart.find("<xsl:stylesheet" ) != -1 &&
+ documentStart.find( "xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"") != -1 )
+ {
+ /* XSLT doesn't have a doctype/DTD. We look for an xsl:stylesheet tag instead.
+ Example:
+ <xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns="http://www.w3.org/TR/xhtml1/strict">
+ */
+ filename = "xslt-1.0.dtd.xml";
+ doctype = "XSLT 1.0";
+ }
+ else
+ kdDebug() << "No doctype found" << endl;
+
+ if( filename.isEmpty() )
+ {
+ // no meta dtd found for this file
+ url = KFileDialog::getOpenURL(m_urlString, "*.xml",
+ 0, i18n( "Assign Meta DTD in XML Format") );
+ }
+ else
+ {
+ url.setFileName( defaultDir + filename );
+ KMessageBox::information(0, i18n("The current file has been identified "
+ "as a document of type \"%1\". The meta DTD for this document type "
+ "will now be loaded.").arg( doctype ),
+ i18n( "Loading XML Meta DTD" ),
+ QString::fromLatin1( "DTDAssigned") );
+ }
+
+ if( url.isEmpty() )
+ return;
+
+ m_urlString = url.url(); // remember directory for next time
+
+ if ( m_dtds[ m_urlString ] )
+ assignDTD( m_dtds[ m_urlString ], kv->document() );
+ else
+ {
+ m_dtdString = "";
+ m_docToAssignTo = kv->document();
+
+ QApplication::setOverrideCursor( KCursor::waitCursor() );
+ KIO::Job *job = KIO::get( url );
+ connect( job, SIGNAL(result(KIO::Job *)), this, SLOT(slotFinished(KIO::Job *)) );
+ connect( job, SIGNAL(data(KIO::Job *, const QByteArray &)),
+ this, SLOT(slotData(KIO::Job *, const QByteArray &)) );
+ }
+ kdDebug()<<"XMLTools::getDTD: Documents: "<<m_docDtds.count()<<", DTDs: "<<m_dtds.count()<<endl;
+}
+
+void PluginKateXMLTools::slotFinished( KIO::Job *job )
+{
+ if( job->error() )
+ {
+ //kdDebug() << "XML Plugin error: DTD in XML format (" << filename << " ) could not be loaded" << endl;
+ job->showErrorDialog( 0 );
+ }
+ else if ( static_cast<KIO::TransferJob *>(job)->isErrorPage() )
+ {
+ // catch failed loading loading via http:
+ KMessageBox::error(0, i18n("The file '%1' could not be opened. "
+ "The server returned an error.").arg( m_urlString ),
+ i18n( "XML Plugin Error") );
+ }
+ else
+ {
+ PseudoDTD *dtd = new PseudoDTD();
+ dtd->analyzeDTD( m_urlString, m_dtdString );
+
+ m_dtds.insert( m_urlString, dtd );
+ assignDTD( dtd, m_docToAssignTo );
+
+ // clean up a bit
+ m_docToAssignTo = 0;
+ m_dtdString = "";
+ }
+ QApplication::restoreOverrideCursor();
+}
+
+void PluginKateXMLTools::slotData( KIO::Job *, const QByteArray &data )
+{
+ m_dtdString += QString( data );
+}
+
+void PluginKateXMLTools::assignDTD( PseudoDTD *dtd, KTextEditor::Document *doc )
+{
+ m_docDtds.replace( doc->documentNumber(), dtd );
+ connect( doc, SIGNAL(charactersInteractivelyInserted(int,int,const QString&) ),
+ this, SLOT(keyEvent(int,int,const QString&)) );
+
+ disconnect( doc, SIGNAL(backspacePressed()), this, 0 );
+ connect( doc, SIGNAL(backspacePressed() ),
+ this, SLOT(backspacePressed()) );
+}
+
+/**
+ * Offer a line edit with completion for possible elements at cursor position and insert the
+ * tag one chosen/entered by the user, plus its closing tag. If there's a text selection,
+ * add the markup around it.
+ */
+void PluginKateXMLTools::slotInsertElement()
+{
+ if ( !application()->activeMainWindow() )
+ return;
+
+ Kate::View *kv = application()->activeMainWindow()->viewManager()->activeView();
+ if( ! kv )
+ {
+ kdDebug() << "Warning: no Kate::View" << endl;
+ return;
+ }
+
+ PseudoDTD *dtd = m_docDtds[kv->document()->documentNumber()];
+ QString parentElement = getParentElement( *kv, false );
+ QStringList allowed;
+
+ if( dtd )
+ allowed = dtd->allowedElements(parentElement );
+
+ InsertElement *dialog = new InsertElement(
+ ( QWidget *)application()->activeMainWindow()->viewManager()->activeView(), "insertXml" );
+ QString text = dialog->showDialog( allowed );
+ delete dialog;
+
+ if( !text.isEmpty() )
+ {
+ QStringList list = QStringList::split( ' ', text );
+ QString pre;
+ QString post;
+ // anders: use <tagname/> if the tag is required to be empty.
+ // In that case maybe we should not remove the selection? or overwrite it?
+ int adjust = 0; // how much to move cursor.
+ // if we know that we have attributes, it goes
+ // just after the tag name, otherwise between tags.
+ if ( dtd && dtd->allowedAttributes(list[0]).count() )
+ adjust++; // the ">"
+
+ if ( dtd && dtd->allowedElements(list[0]).contains("__EMPTY") )
+ {
+ pre = "<" + text + "/>";
+ if ( adjust )
+ adjust++; // for the "/"
+ }
+ else
+ {
+ pre = "<" + text + ">";
+ post ="</" + list[0] + ">";
+ }
+
+ QString marked;
+ if ( ! post.isEmpty() )
+ marked = kv->getDoc()->selection();
+
+ if( marked.length() > 0 )
+ kv->getDoc()->removeSelectedText();
+
+ kv->insertText( pre + marked + post );
+ }
+}
+
+/**
+ * Insert a closing tag for the nearest not-closed parent element.
+ */
+void PluginKateXMLTools::slotCloseElement()
+{
+ if ( !application()->activeMainWindow() )
+ return;
+
+ Kate::View *kv = application()->activeMainWindow()->viewManager()->activeView();
+ if( ! kv )
+ {
+ kdDebug() << "Warning: no Kate::View" << endl;
+ return;
+ }
+ QString parentElement = getParentElement( *kv, false );
+
+ //kdDebug() << "parentElement: '" << parentElement << "'" << endl;
+ QString closeTag = "</" + parentElement + ">";
+ if( ! parentElement.isEmpty() )
+ kv->insertText( closeTag );
+}
+
+// modify the completion string before it gets inserted
+void PluginKateXMLTools::filterInsertString( KTextEditor::CompletionEntry *ce, QString *text )
+{
+ kdDebug() << "filterInsertString str: " << *text << endl;
+ kdDebug() << "filterInsertString text: " << ce->text << endl;
+
+ if ( !application()->activeMainWindow() )
+ return;
+
+ Kate::View *kv = application()->activeMainWindow()->viewManager()->activeView();
+ if( ! kv )
+ {
+ kdDebug() << "Warning (filterInsertString() ): no Kate::View" << endl;
+ return;
+ }
+
+ uint line, col;
+ kv->cursorPositionReal( &line, &col );
+ QString lineStr = kv->getDoc()->textLine(line );
+ QString leftCh = lineStr.mid( col-1, 1 );
+ QString rightCh = lineStr.mid( col, 1 );
+
+ m_correctPos = 0; // where to move the cursor after completion ( >0 = move right )
+ if( m_mode == entities )
+ {
+ // This is a bit ugly, but entities are case-sensitive
+ // and we want the correct completion even if the user started typing
+ // e.g. in lower case but the entity is in upper case
+ kv->getDoc()->removeText( line, col - (ce->text.length() - text->length()), line, col );
+ *text = ce->text + ";";
+ }
+
+ else if( m_mode == attributes )
+ {
+ *text = *text + "=\"\"";
+ m_correctPos = -1;
+ if( !rightCh.isEmpty() && rightCh != ">" && rightCh != "/" && rightCh != " " )
+ { // TODO: other whitespaces
+ // add space in front of the next attribute
+ *text = *text + " ";
+ m_correctPos--;
+ }
+ }
+
+ else if( m_mode == attributevalues )
+ {
+ // TODO: support more than one line
+ uint startAttValue = 0;
+ uint endAttValue = 0;
+
+ // find left quote:
+ for( startAttValue = col; startAttValue > 0; startAttValue-- )
+ {
+ QString ch = lineStr.mid( startAttValue-1, 1 );
+ if( isQuote(ch) )
+ break;
+ }
+
+ // find right quote:
+ for( endAttValue = col; endAttValue <= lineStr.length(); endAttValue++ )
+ {
+ QString ch = lineStr.mid( endAttValue-1, 1 );
+ if( isQuote(ch) )
+ break;
+ }
+
+ // maybe the user has already typed something to trigger completion,
+ // don't overwrite that:
+ startAttValue += ce->text.length() - text->length();
+ // delete the current contents of the attribute:
+ if( startAttValue < endAttValue )
+ {
+ kv->getDoc()->removeText( line, startAttValue, line, endAttValue-1 );
+ // FIXME: this makes the scrollbar jump
+ // but without it, inserting sometimes goes crazy :-(
+ kv->setCursorPositionReal( line, startAttValue );
+ }
+ }
+
+ else if( m_mode == elements )
+ {
+ // anders: if the tag is marked EMPTY, insert in form <tagname/>
+ QString str;
+ int docNumber = kv->document()->documentNumber();
+ bool isEmptyTag =m_docDtds[docNumber]->allowedElements(ce->text).contains( "__EMPTY" );
+ if ( isEmptyTag )
+ str = "/>";
+ else
+ str = "></" + ce->text + ">";
+ *text = *text + str;
+
+ // Place the cursor where it is most likely wanted:
+ // allways inside the tag if the tag is empty AND the DTD indicates that there are attribs)
+ // outside for open tags, UNLESS there are mandatory attributes
+ if ( m_docDtds[docNumber]->requiredAttributes(ce->text).count()
+ || ( isEmptyTag && m_docDtds[docNumber]->allowedAttributes( ce->text).count() ) )
+ m_correctPos = - str.length();
+ else if ( ! isEmptyTag )
+ m_correctPos = -str.length() + 1;
+ }
+}
+
+static void correctPos( Kate::View *kv, int count )
+{
+ if( count > 0 )
+ {
+ for( int i = 0; i < count; i++ )
+ kv->cursorRight();
+ }
+ else if( count < 0 )
+ {
+ for( int i = 0; i < -count; i++ )
+ kv->cursorLeft();
+ }
+}
+
+void PluginKateXMLTools::completionAborted()
+{
+ if ( !application()->activeMainWindow() )
+ return;
+
+ Kate::View *kv = application()->activeMainWindow()->viewManager()->activeView();
+ if( ! kv )
+ {
+ kdDebug() << "Warning (completionAborted() ): no Kate::View" << endl;
+ return;
+ }
+ disconnectSlots( kv );
+ kv->cursorPositionReal( &m_lastLine, &m_lastCol );
+ m_lastCol--;
+
+ correctPos( kv,m_correctPos );
+ m_correctPos = 0;
+
+ kdDebug() << "completionAborted() at line:" << m_lastLine << ", col:" << m_lastCol << endl;
+}
+
+void PluginKateXMLTools::completionDone( KTextEditor::CompletionEntry )
+{
+ kdDebug() << "completionDone()" << endl;
+
+ if ( !application()->activeMainWindow() )
+ return;
+
+ Kate::View *kv = application()->activeMainWindow()->viewManager()->activeView();
+ if( ! kv )
+ {
+ kdDebug() << "Warning (completionDone() ): no Kate::View" << endl;
+ return;
+ }
+ disconnectSlots( kv );
+
+ correctPos( kv,m_correctPos );
+ m_correctPos = 0;
+
+ if( m_mode == attributes )
+ {
+ // immediately show attribute values:
+ QTimer::singleShot( 10, this, SLOT(emptyKeyEvent()) );
+ }
+
+}
+
+// ========================================================================
+// Pseudo-XML stuff:
+
+/**
+ * Check if cursor is inside a tag, that is
+ * if "<" occurs before ">" occurs ( on the left side of the cursor ).
+ * Return the tag name, return "" if we cursor is outside a tag.
+ */
+QString PluginKateXMLTools::insideTag( Kate::View &kv )
+{
+ uint line = 0, col = 0;
+ kv.cursorPositionReal( &line, &col );
+ int y = line; // another variable because uint <-> int
+
+ do {
+ QString lineStr = kv.getDoc()->textLine(y );
+ for( uint x = col; x > 0; x-- )
+ {
+ QString ch = lineStr.mid( x-1, 1 );
+ if( ch == ">" ) // cursor is outside tag
+ return "";
+
+ if( ch == "<" )
+ {
+ QString tag;
+ // look for white space on the right to get the tag name
+ for( uint z = x; z <= lineStr.length() ; z++ )
+ {
+ ch = lineStr.mid( z-1, 1 );
+ if( ch.at(0).isSpace() || ch == "/" || ch == ">" )
+ return tag.right( tag.length()-1 );
+
+ if( z == lineStr.length() )
+ {
+ tag += ch;
+ return tag.right( tag.length()-1 );
+ }
+
+ tag += ch;
+ }
+ }
+ }
+ y--;
+ col = kv.getDoc()->textLine(y).length();
+ } while( y >= 0 );
+
+ return "";
+}
+
+/**
+ * Check if cursor is inside an attribute value, that is
+ * if '="' is on the left, and if it's nearer than "<" or ">".
+ *
+ * @Return the attribute name or "" if we're outside an attribute
+ * value.
+ *
+ * Note: only call when insideTag() == true.
+ * TODO: allow whitespace around "="
+ */
+QString PluginKateXMLTools::insideAttribute( Kate::View &kv )
+{
+ uint line = 0, col = 0;
+ kv.cursorPositionReal( &line, &col );
+ int y = line; // another variable because uint <-> int
+ uint x = 0;
+ QString lineStr = "";
+ QString ch = "";
+
+ do {
+ lineStr = kv.getDoc()->textLine(y );
+ for( x = col; x > 0; x-- )
+ {
+ ch = lineStr.mid( x-1, 1 );
+ QString chLeft = lineStr.mid( x-2, 1 );
+ // TODO: allow whitespace
+ if( isQuote(ch) && chLeft == "=" )
+ break;
+ else if( isQuote(ch) && chLeft != "=" )
+ return "";
+ else if( ch == "<" || ch == ">" )
+ return "";
+ }
+ y--;
+ col = kv.getDoc()->textLine(y).length();
+ } while( !isQuote(ch) );
+
+ // look for next white space on the left to get the tag name
+ QString attr = "";
+ for( int z = x; z >= 0; z-- )
+ {
+ ch = lineStr.mid( z-1, 1 );
+
+ if( ch.at(0).isSpace() )
+ break;
+
+ if( z == 0 )
+ { // start of line == whitespace
+ attr += ch;
+ break;
+ }
+
+ attr = ch + attr;
+ }
+
+ return attr.left( attr.length()-2 );
+}
+
+/**
+ * Find the parent element for the current cursor position. That is,
+ * go left and find the first opening element that's not closed yet,
+ * ignoring empty elements.
+ * Examples: If cursor is at "X", the correct parent element is "p":
+ * <p> <a x="xyz"> foo <i> test </i> bar </a> X
+ * <p> <a x="xyz"> foo bar </a> X
+ * <p> foo <img/> bar X
+ * <p> foo bar X
+ */
+QString PluginKateXMLTools::getParentElement( Kate::View &kv, bool ignoreSingleChar )
+{
+ enum {
+ parsingText,
+ parsingElement,
+ parsingElementBoundary,
+ parsingNonElement,
+ parsingAttributeDquote,
+ parsingAttributeSquote,
+ parsingIgnore
+ } parseState;
+ parseState = ignoreSingleChar ? parsingIgnore : parsingText;
+
+ int nestingLevel = 0;
+
+ uint line, col;
+ kv.cursorPositionReal( &line, &col );
+ QString str = kv.getDoc()->textLine(line );
+
+ while( true )
+ {
+ // move left a character
+ if( !col-- )
+ {
+ do
+ {
+ if( !line-- ) return QString::null; // reached start of document
+ str = kv.getDoc()->textLine(line );
+ col = str.length();
+ } while( !col );
+ --col;
+ }
+
+ ushort ch = str.at( col).unicode();
+
+ switch( parseState )
+ {
+ case parsingIgnore:
+ parseState = parsingText;
+ break;
+
+ case parsingText:
+ switch( ch )
+ {
+ case '<':
+ // hmm... we were actually inside an element
+ return QString::null;
+
+ case '>':
+ // we just hit an element boundary
+ parseState = parsingElementBoundary;
+ break;
+ }
+ break;
+
+ case parsingElement:
+ switch( ch )
+ {
+ case '"': // attribute ( double quoted )
+ parseState = parsingAttributeDquote;
+ break;
+
+ case '\'': // attribute ( single quoted )
+ parseState = parsingAttributeSquote;
+ break;
+
+ case '/': // close tag
+ parseState = parsingNonElement;
+ ++nestingLevel;
+ break;
+
+ case '<':
+ // we just hit the start of the element...
+ if( nestingLevel-- ) break;
+
+ QString tag = str.mid( col + 1 );
+ for( uint pos = 0, len = tag.length(); pos < len; ++pos ) {
+ ch = tag.at( pos).unicode();
+ if( ch == ' ' || ch == '\t' || ch == '>' ) {
+ tag.truncate( pos );
+ break;
+ }
+ }
+ return tag;
+ }
+ break;
+
+ case parsingElementBoundary:
+ switch( ch )
+ {
+ case '?': // processing instruction
+ case '-': // comment
+ case '/': // empty element
+ parseState = parsingNonElement;
+ break;
+
+ case '"':
+ parseState = parsingAttributeDquote;
+ break;
+
+ case '\'':
+ parseState = parsingAttributeSquote;
+ break;
+
+ case '<': // empty tag ( bad XML )
+ parseState = parsingText;
+ break;
+
+ default:
+ parseState = parsingElement;
+ }
+ break;
+
+ case parsingAttributeDquote:
+ if( ch == '"' ) parseState = parsingElement;
+ break;
+
+ case parsingAttributeSquote:
+ if( ch == '\'' ) parseState = parsingElement;
+ break;
+
+ case parsingNonElement:
+ if( ch == '<' ) parseState = parsingText;
+ break;
+ }
+ }
+}
+
+/**
+ * Return true if the tag is neither a closing tag
+ * nor an empty tag, nor a comment, nor processing instruction.
+ */
+bool PluginKateXMLTools::isOpeningTag( QString tag )
+{
+ return ( !isClosingTag(tag) && !isEmptyTag(tag ) &&
+ !tag.startsWith( "<?") && !tag.startsWith("<!") );
+}
+
+/**
+ * Return true if the tag is a closing tag. Return false
+ * if the tag is an opening tag or an empty tag ( ! )
+ */
+bool PluginKateXMLTools::isClosingTag( QString tag )
+{
+ return ( tag.startsWith("</") );
+}
+
+bool PluginKateXMLTools::isEmptyTag( QString tag )
+{
+ return ( tag.right(2) == "/>" );
+}
+
+/**
+ * Return true if ch is a single or double quote. Expects ch to be of length 1.
+ */
+bool PluginKateXMLTools::isQuote( QString ch )
+{
+ return ( ch == "\"" || ch == "'" );
+}
+
+
+// ========================================================================
+// Tools:
+
+/** Sort a QStringList case-insensitively. Static. TODO: make it more simple. */
+QStringList PluginKateXMLTools::sortQStringList( QStringList list ) {
+ // Sort list case-insensitive. This looks complicated but using a QMap
+ // is even suggested by the Qt documentation.
+ QMap<QString,QString> mapList;
+ for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it )
+ {
+ QString str = *it;
+ if( mapList.contains(str.lower()) )
+ {
+ // do not override a previous value, e.g. "Auml" and "auml" are two different
+ // entities, but they should be sorted next to each other.
+ // TODO: currently it's undefined if e.g. "A" or "a" comes first, it depends on
+ // the meta DTD ( really? it seems to work okay?!? )
+ mapList[str.lower()+"_"] = str;
+ }
+ else
+ mapList[str.lower()] = str;
+ }
+
+ list.clear();
+ QMap<QString,QString>::Iterator it;
+
+ // Qt doc: "the items are alphabetically sorted [by key] when iterating over the map":
+ for( it = mapList.begin(); it != mapList.end(); ++it )
+ list.append( it.data() );
+
+ return list;
+}
+
+//BEGIN InsertElement dialog
+InsertElement::InsertElement( QWidget *parent, const char *name )
+ :KDialogBase( parent, name, true, i18n("Insert XML Element" ),
+ KDialogBase::Ok|KDialogBase::Cancel)
+{
+}
+
+InsertElement::~InsertElement()
+{
+}
+
+void InsertElement::slotHistoryTextChanged( const QString& text )
+{
+ enableButtonOK( !text.isEmpty() );
+}
+
+QString InsertElement::showDialog( QStringList &completions )
+{
+ QWidget *page = new QWidget( this );
+ setMainWidget( page );
+ QVBoxLayout *topLayout = new QVBoxLayout( page, 0, spacingHint() );
+
+ KHistoryCombo *combo = new KHistoryCombo( page, "value" );
+ combo->setHistoryItems( completions, true );
+ connect( combo->lineEdit(), SIGNAL(textChanged ( const QString & )),
+ this, SLOT(slotHistoryTextChanged(const QString &)) );
+ QString text = i18n( "Enter XML tag name and attributes (\"<\", \">\" and closing tag will be supplied):" );
+ QLabel *label = new QLabel( text, page, "insert" );
+
+ topLayout->addWidget( label );
+ topLayout->addWidget( combo );
+
+ combo->setFocus();
+ slotHistoryTextChanged( combo->lineEdit()->text() );
+ if( exec() )
+ return combo->currentText();
+
+ return QString::null;
+}
+//END InsertElement dialog
+// kate: space-indent on; indent-width 2; replace-tabs on; mixed-indent off;
diff --git a/kate/xmltools/plugin_katexmltools.h b/kate/xmltools/plugin_katexmltools.h
new file mode 100644
index 0000000..9be61c7
--- /dev/null
+++ b/kate/xmltools/plugin_katexmltools.h
@@ -0,0 +1,150 @@
+ /***************************************************************************
+ pluginKatexmltools.cpp
+ copyright : (C) 2001-2002 by Daniel Naber
+ email : daniel.naber@t-online.de
+ ***************************************************************************/
+
+/***************************************************************************
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or ( at your option ) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ ***************************************************************************/
+
+#ifndef _PLUGIN_KANT_XMLTOOLS_H
+#define _PLUGIN_KANT_XMLTOOLS_H
+
+#include "pseudo_dtd.h"
+
+#include <qdict.h>
+#include <qstring.h>
+#include <qlistbox.h>
+#include <qprogressdialog.h>
+#include <qintdict.h>
+
+#include <kate/plugin.h>
+#include <kate/application.h>
+#include <kate/view.h>
+#include <kate/document.h>
+#include <kate/documentmanager.h>
+#include <kate/mainwindow.h>
+#include <kate/viewmanager.h>
+
+#include <ktexteditor/codecompletioninterface.h>
+
+#include <kcombobox.h>
+#include <kdialog.h>
+#include <kdialogbase.h>
+
+class PluginKateXMLTools : public Kate::Plugin, Kate::PluginViewInterface
+{
+
+ Q_OBJECT
+
+ public:
+
+ PluginKateXMLTools( QObject* parent = 0, const char* name = 0, const QStringList& = QStringList() );
+ virtual ~PluginKateXMLTools();
+ void addView ( Kate::MainWindow *win );
+ void removeView( Kate::MainWindow *win );
+
+
+ public slots:
+
+ void getDTD();
+
+ void slotInsertElement();
+ void slotCloseElement();
+ void filterInsertString( KTextEditor::CompletionEntry *ce, QString *str );
+ void completionDone( KTextEditor::CompletionEntry completionEntry );
+ void completionAborted();
+
+ void slotFinished( KIO::Job *job );
+ void slotData( KIO::Job *, const QByteArray &data );
+
+ void backspacePressed();
+ void emptyKeyEvent();
+ void keyEvent( int, int, const QString & );
+
+ /// Connected to the document manager, to manage the dtd collection.
+ void slotDocumentDeleted( uint n );
+
+ protected:
+
+ static QStringList sortQStringList( QStringList list );
+ //bool eventFilter( QObject *object, QEvent *event );
+
+ QString insideTag( Kate::View &kv );
+ QString insideAttribute( Kate::View &kv );
+
+ bool isOpeningTag( QString tag );
+ bool isClosingTag( QString tag );
+ bool isEmptyTag( QString tag );
+ bool isQuote( QString ch );
+
+ QString getParentElement( Kate::View &view, bool ignoreSingleBracket );
+
+ enum Mode {none, entities, attributevalues, attributes, elements};
+ enum PopupMode {noPopup, tagname, attributename, attributevalue, entityname};
+
+ QValueList<KTextEditor::CompletionEntry> stringListToCompletionEntryList( QStringList list );
+
+ /// Assign the PseudoDTD @p dtd to the Kate::Document @p doc
+ void assignDTD( PseudoDTD *dtd, KTextEditor::Document *doc );
+
+ /// temporary placeholder for the metaDTD file
+ QString m_dtdString;
+ /// temporary placeholder for the document to assign a DTD to while the file is loaded
+ KTextEditor::Document *m_docToAssignTo;
+ /// URL of the last loaded meta DTD
+ QString m_urlString;
+
+ uint m_lastLine, m_lastCol;
+ QStringList m_lastAllowed;
+ int m_popupOpenCol;
+
+ Mode m_mode;
+ int m_correctPos;
+
+ // code completion stuff:
+ KTextEditor::CodeCompletionInterface* m_codeInterface;
+
+ /// maps KTE::Document::docNumber -> DTD
+ QIntDict<PseudoDTD> m_docDtds;
+
+ /// maps DTD filename -> DTD
+ QDict<PseudoDTD> m_dtds;
+
+ QPtrList<class PluginView> m_views;
+
+ void connectSlots( Kate::View *kv );
+ void disconnectSlots( Kate::View *kv );
+
+ Kate::DocumentManager *m_documentManager;
+};
+
+class InsertElement : public KDialogBase
+{
+
+ Q_OBJECT
+
+ public:
+ InsertElement( QWidget *parent, const char *name );
+ ~InsertElement();
+ QString showDialog( QStringList &completions );
+ private slots:
+ void slotHistoryTextChanged( const QString& );
+
+};
+
+#endif // _PLUGIN_KANT_XMLTOOLS_H
+// kate: space-indent on; indent-width 2; replace-tabs on; mixed-indent off;
diff --git a/kate/xmltools/pseudo_dtd.cpp b/kate/xmltools/pseudo_dtd.cpp
new file mode 100644
index 0000000..b5c9cd1
--- /dev/null
+++ b/kate/xmltools/pseudo_dtd.cpp
@@ -0,0 +1,466 @@
+/***************************************************************************
+ pseudoDtd.cpp
+ copyright : (C) 2001-2002 by Daniel Naber
+ email : daniel.naber@t-online.de
+ ***************************************************************************/
+
+/***************************************************************************
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or ( at your option ) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ ***************************************************************************/
+
+#include "pseudo_dtd.h"
+
+#include <assert.h>
+
+#include <qdom.h>
+#include <qregexp.h>
+
+#include <klocale.h>
+#include <kmessagebox.h>
+
+PseudoDTD::PseudoDTD()
+{
+ // "SGML support" only means case-insensivity, because HTML is case-insensitive up to version 4:
+ m_sgmlSupport = true; // TODO: make this an run-time option ( maybe automatically set )
+}
+
+PseudoDTD::~PseudoDTD()
+{
+}
+
+void PseudoDTD::analyzeDTD( QString &metaDtdUrl, QString &metaDtd )
+{
+ QDomDocument doc( "dtdIn_xml" );
+ if ( ! doc.setContent( metaDtd) )
+ {
+ KMessageBox::error(0, i18n("The file '%1' could not be parsed. "
+ "Please check that the file is well-formed XML.").arg( metaDtdUrl ),
+ i18n( "XML Plugin Error") );
+ return;
+ }
+
+ if ( doc.doctype().name() != "dtd" )
+ {
+ KMessageBox::error(0, i18n("The file '%1' is not in the expected format. "
+ "Please check that the file is of this type:\n"
+ "-//Norman Walsh//DTD DTDParse V2.0//EN\n"
+ "You can produce such files with dtdparse. "
+ "See the Kate Plugin documentation for more information.").arg( metaDtdUrl ),
+ i18n("XML Plugin Error") );
+ return;
+ }
+
+ uint listLength = 0;
+ listLength += doc.elementsByTagName( "entity" ).count();
+ listLength += doc.elementsByTagName( "element" ).count();
+ // count this twice, as it will be iterated twice ( TODO: optimize that? ):
+ listLength += doc.elementsByTagName( "attlist" ).count() * 2;
+
+ QProgressDialog progress( i18n("Analyzing meta DTD..."), i18n("Cancel"), listLength,
+ 0, "progress", TRUE );
+ progress.setMinimumDuration( 400 );
+ progress.setProgress(0);
+
+ // Get information from meta DTD and put it in Qt data structures for fast access:
+ if( ! parseEntities( &doc, &progress ) )
+ return;
+
+ if( ! parseElements( &doc, &progress ) )
+ return;
+
+ if( ! parseAttributes( &doc, &progress ) )
+ return;
+
+ if( ! parseAttributeValues( &doc, &progress ) )
+ return;
+
+ progress.setProgress( listLength ); // just to make sure the dialog disappears
+
+}
+
+// ========================================================================
+// DOM stuff:
+
+/**
+ * Iterate through the XML to get a mapping which sub-elements are allowed for
+ * all elements.
+ */
+bool PseudoDTD::parseElements( QDomDocument *doc, QProgressDialog *progress )
+{
+
+ m_elementsList.clear();
+ // We only display a list, i.e. we pretend that the content model is just
+ // a set, so we use a map. This is necessay e.g. for xhtml 1.0's head element,
+ // which would otherwise display some elements twice.
+ QMap<QString,bool> subelementList; // the bool is not used
+
+ QDomNodeList list = doc->elementsByTagName( "element" );
+ uint listLength = list.count(); // speedup (really! )
+
+ for( uint i = 0; i < listLength; i++ )
+ {
+ if( progress->wasCancelled() )
+ return false;
+
+ progress->setProgress( progress->progress()+1 );
+ // FIXME!:
+ //qApp->processEvents();
+
+ subelementList.clear();
+ QDomNode node = list.item( i );
+ QDomElement elem = node.toElement();
+
+ if( !elem.isNull() )
+ {
+ // Enter the expanded content model, which may also include stuff not allowed.
+ // We do not care if it's a <sequence-group> or whatever.
+ QDomNodeList contentModelList = elem.elementsByTagName( "content-model-expanded" );
+ QDomNode contentModelNode = contentModelList.item(0);
+ QDomElement contentModelElem = contentModelNode.toElement();
+ if( ! contentModelElem.isNull() )
+ {
+ // check for <pcdata/>:
+ QDomNodeList pcdataList = contentModelElem.elementsByTagName( "pcdata" );
+
+ // check for other sub elements:
+ QDomNodeList subList = contentModelElem.elementsByTagName( "element-name" );
+ uint subListLength = subList.count();
+ for( uint l = 0; l < subListLength; l++ )
+ {
+ QDomNode subNode = subList.item(l);
+ QDomElement subElem = subNode.toElement();
+ if( !subElem.isNull() )
+ subelementList[subElem.attribute( "name" )] = true;
+ }
+
+ // anders: check if this is an EMPTY element, and put "__EMPTY" in the
+ // sub list, so that we can insert tags in empty form if required.
+ QDomNodeList emptyList = elem.elementsByTagName( "empty" );
+ if ( emptyList.count() )
+ subelementList["__EMPTY"] = true;
+ }
+
+ // Now remove the elements not allowed (e.g. <a> is explicitely not allowed in <a>
+ // in the HTML 4.01 Strict DTD):
+ QDomNodeList exclusionsList = elem.elementsByTagName( "exclusions" );
+ if( exclusionsList.length() > 0 )
+ { // sometimes there are no exclusions ( e.g. in XML DTDs there are never exclusions )
+ QDomNode exclusionsNode = exclusionsList.item(0);
+ QDomElement exclusionsElem = exclusionsNode.toElement();
+ if( ! exclusionsElem.isNull() )
+ {
+ QDomNodeList subList = exclusionsElem.elementsByTagName( "element-name" );
+ uint subListLength = subList.count();
+ for( uint l = 0; l < subListLength; l++ )
+ {
+ QDomNode subNode = subList.item(l);
+ QDomElement subElem = subNode.toElement();
+ if( !subElem.isNull() )
+ {
+ QMap<QString,bool>::Iterator it = subelementList.find( subElem.attribute( "name" ) );
+ if( it != subelementList.end() )
+ subelementList.remove(it);
+ }
+ }
+ }
+ }
+
+ // turn the map into a list:
+ QStringList subelementListTmp;
+ QMap<QString,bool>::Iterator it;
+ for( it = subelementList.begin(); it != subelementList.end(); ++it )
+ subelementListTmp.append( it.key() );
+
+ m_elementsList.insert( elem.attribute( "name" ), subelementListTmp );
+
+ }
+
+ } // end iteration over all <element> nodes
+ return true;
+}
+
+/**
+ * Check which elements are allowed inside a parent element. This returns
+ * a list of allowed elements, but it doesn't care about order or if only a certain
+ * number of occurences is allowed.
+ */
+QStringList PseudoDTD::allowedElements( QString parentElement )
+{
+ if( m_sgmlSupport )
+ {
+ // find the matching element, ignoring case:
+ QMap<QString,QStringList>::Iterator it;
+ for( it = m_elementsList.begin(); it != m_elementsList.end(); ++it )
+ {
+ if( it.key().lower() == parentElement.lower() )
+ return it.data();
+ }
+ }
+ else if( m_elementsList.contains(parentElement) )
+ return m_elementsList[parentElement];
+
+ return QStringList();
+}
+
+/**
+ * Iterate through the XML to get a mapping which attributes are allowed inside
+ * all elements.
+ */
+bool PseudoDTD::parseAttributes( QDomDocument *doc, QProgressDialog *progress )
+{
+ m_attributesList.clear();
+// QStringList allowedAttributes;
+ QDomNodeList list = doc->elementsByTagName( "attlist" );
+ uint listLength = list.count();
+
+ for( uint i = 0; i < listLength; i++ )
+ {
+ if( progress->wasCancelled() )
+ return false;
+
+ progress->setProgress( progress->progress()+1 );
+ // FIXME!!
+ //qApp->processEvents();
+
+ ElementAttributes attrs;
+ QDomNode node = list.item(i);
+ QDomElement elem = node.toElement();
+ if( !elem.isNull() )
+ {
+ QDomNodeList attributeList = elem.elementsByTagName( "attribute" );
+ uint attributeListLength = attributeList.count();
+ for( uint l = 0; l < attributeListLength; l++ )
+ {
+ QDomNode attributeNode = attributeList.item(l);
+ QDomElement attributeElem = attributeNode.toElement();
+
+ if( ! attributeElem.isNull() )
+ {
+ if ( attributeElem.attribute("type") == "#REQUIRED" )
+ attrs.requiredAttributes.append( attributeElem.attribute("name") );
+ else
+ attrs.optionalAttributes.append( attributeElem.attribute("name") );
+ }
+ }
+ m_attributesList.insert( elem.attribute("name"), attrs );
+ }
+ }
+
+ return true;
+}
+
+/** Check which attributes are allowed for an element.
+ */
+QStringList PseudoDTD::allowedAttributes( QString element )
+{
+ if( m_sgmlSupport )
+ {
+ // find the matching element, ignoring case:
+ QMap<QString,ElementAttributes>::Iterator it;
+ for( it = m_attributesList.begin(); it != m_attributesList.end(); ++it ) {
+ if( it.key().lower() == element.lower() ) {
+ return it.data().optionalAttributes + it.data().requiredAttributes;
+ }
+ }
+ }
+ else if( m_attributesList.contains(element) )
+ return m_attributesList[element].optionalAttributes + m_attributesList[element].requiredAttributes;
+
+ return QStringList();
+}
+
+QStringList PseudoDTD::requiredAttributes( const QString &element ) const
+{
+ if ( m_sgmlSupport )
+ {
+ QMap<QString,ElementAttributes>::ConstIterator it;
+ for( it = m_attributesList.begin(); it != m_attributesList.end(); ++it )
+ {
+ if( it.key().lower() == element.lower() )
+ return it.data().requiredAttributes;
+ }
+ }
+ else if( m_attributesList.contains(element) )
+ return m_attributesList[element].requiredAttributes;
+
+ return QStringList();
+}
+
+/**
+ * Iterate through the XML to get a mapping which attribute values are allowed
+ * for all attributes inside all elements.
+ */
+bool PseudoDTD::parseAttributeValues( QDomDocument *doc, QProgressDialog *progress )
+{
+ m_attributevaluesList.clear(); // 1 element : n possible attributes
+ QMap<QString,QStringList> attributevaluesTmp; // 1 attribute : n possible values
+ QDomNodeList list = doc->elementsByTagName( "attlist" );
+ uint listLength = list.count();
+
+ for( uint i = 0; i < listLength; i++ )
+ {
+ if( progress->wasCancelled() )
+ return false;
+
+ progress->setProgress( progress->progress()+1 );
+ // FIXME!
+ //qApp->processEvents();
+
+ attributevaluesTmp.clear();
+ QDomNode node = list.item(i);
+ QDomElement elem = node.toElement();
+ if( !elem.isNull() )
+ {
+ // Enter the list of <attribute>:
+ QDomNodeList attributeList = elem.elementsByTagName( "attribute" );
+ uint attributeListLength = attributeList.count();
+ for( uint l = 0; l < attributeListLength; l++ )
+ {
+ QDomNode attributeNode = attributeList.item(l);
+ QDomElement attributeElem = attributeNode.toElement();
+ if( ! attributeElem.isNull() )
+ {
+ QString value = attributeElem.attribute( "value" );
+ attributevaluesTmp.insert( attributeElem.attribute("name"), QStringList::split(QRegExp(" "), value) );
+ }
+ }
+ m_attributevaluesList.insert( elem.attribute("name"), attributevaluesTmp );
+ }
+ }
+ return true;
+}
+
+/**
+ * Check which attributes values are allowed for an attribute in an element
+ * (the element is necessary because e.g. "href" inside <a> could be different
+ * to an "href" inside <link>):
+ */
+QStringList PseudoDTD::attributeValues( QString element, QString attribute )
+{
+ // Direct access would be faster than iteration of course but not always correct,
+ // because we need to be case-insensitive.
+ if( m_sgmlSupport ) {
+ // first find the matching element, ignoring case:
+ QMap< QString,QMap<QString,QStringList> >::Iterator it;
+ for( it = m_attributevaluesList.begin(); it != m_attributevaluesList.end(); ++it )
+ {
+ if( it.key().lower() == element.lower() )
+ {
+ QMap<QString,QStringList> attrVals = it.data();
+ QMap<QString,QStringList>::Iterator itV;
+ // then find the matching attribute for that element, ignoring case:
+ for( itV = attrVals.begin(); itV != attrVals.end(); ++itV )
+ {
+ if( itV.key().lower() == attribute.lower() )
+ return( itV.data() );
+ }
+ }
+ }
+ }
+ else if( m_attributevaluesList.contains(element) )
+ {
+ QMap<QString,QStringList> attrVals = m_attributevaluesList[element];
+ if( attrVals.contains(attribute) )
+ return attrVals[attribute];
+ }
+
+ // no predefined values available:
+ return QStringList();
+}
+
+/**
+ * Iterate through the XML to get a mapping of all entity names and their expanded
+ * version, e.g. nbsp => &#160;. Parameter entities are ignored.
+ */
+bool PseudoDTD::parseEntities( QDomDocument *doc, QProgressDialog *progress )
+{
+ m_entityList.clear();
+ QDomNodeList list = doc->elementsByTagName( "entity" );
+ uint listLength = list.count();
+
+ for( uint i = 0; i < listLength; i++ )
+ {
+ if( progress->wasCancelled() )
+ return false;
+
+ progress->setProgress( progress->progress()+1 );
+ //FIXME!!
+ //qApp->processEvents();
+ QDomNode node = list.item(i);
+ QDomElement elem = node.toElement();
+ if( !elem.isNull()
+ && elem.attribute( "type" ) != "param" )
+ { // TODO: what's cdata <-> gen ?
+ QDomNodeList expandedList = elem.elementsByTagName( "text-expanded" );
+ QDomNode expandedNode = expandedList.item(0);
+ QDomElement expandedElem = expandedNode.toElement();
+ if( ! expandedElem.isNull() )
+ {
+ QString exp = expandedElem.text();
+ // TODO: support more than one &#...; in the expanded text
+ /* TODO include do this when the unicode font problem is solved:
+ if( exp.contains(QRegExp("^&#x[a-zA-Z0-9]+;$")) ) {
+ // hexadecimal numbers, e.g. "&#x236;"
+ uint end = exp.find( ";" );
+ exp = exp.mid( 3, end-3 );
+ exp = QChar();
+ } else if( exp.contains(QRegExp("^&#[0-9]+;$")) ) {
+ // decimal numbers, e.g. "&#236;"
+ uint end = exp.find( ";" );
+ exp = exp.mid( 2, end-2 );
+ exp = QChar( exp.toInt() );
+ }
+ */
+ m_entityList.insert( elem.attribute("name"), exp );
+ }
+ else
+ {
+ m_entityList.insert( elem.attribute("name"), QString() );
+ }
+ }
+ }
+ return true;
+}
+
+/**
+ * Get a list of all ( non-parameter ) entities that start with a certain string.
+ */
+QStringList PseudoDTD::entities( QString start )
+{
+ QStringList entities;
+ QMap<QString,QString>::Iterator it;
+ for( it = m_entityList.begin(); it != m_entityList.end(); ++it ) {
+ if( (*it).startsWith(start) )
+ {
+ QString str = it.key();
+ /* TODO: show entities as unicode character
+ if( !it.data().isEmpty() ) {
+ //str += " -- " + it.data();
+ QRegExp re( "&#(\\d+);" );
+ if( re.search(it.data()) != -1 ) {
+ uint ch = re.cap( 1).toUInt();
+ str += " -- " + QChar( ch).decomposition();
+ }
+ //kdDebug() << "#" << it.data() << endl;
+ }
+ */
+ entities.append( str );
+ // TODO: later use a table view
+ }
+ }
+ return entities;
+}
+
+// kate: space-indent on; indent-width 2; replace-tabs on; mixed-indent off;
diff --git a/kate/xmltools/pseudo_dtd.h b/kate/xmltools/pseudo_dtd.h
new file mode 100644
index 0000000..f5cf37e
--- /dev/null
+++ b/kate/xmltools/pseudo_dtd.h
@@ -0,0 +1,76 @@
+ /***************************************************************************
+ pseudoDtd.cpp
+ copyright : (C) 2001-2002 by Daniel Naber
+ email : daniel.naber@t-online.de
+ ***************************************************************************/
+
+/***************************************************************************
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or ( at your option ) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ ***************************************************************************/
+
+#ifndef _PLUGIN_KANT_XMLTOOLS_DTD_H
+#define _PLUGIN_KANT_XMLTOOLS_DTD_H
+
+#include <qdom.h>
+#include <qprogressdialog.h>
+
+/**
+ * This class contains the attributes for one element.
+ * To get ALL attributes, concatenate the two lists.
+ */
+class ElementAttributes
+{
+ public:
+ QStringList optionalAttributes;
+ QStringList requiredAttributes;
+};
+
+class PseudoDTD
+{
+
+ public:
+ PseudoDTD();
+ ~PseudoDTD();
+
+ void analyzeDTD( QString &metaDtdUrl, QString &metaDtd );
+
+ QStringList allowedElements( QString parentElement );
+ QStringList allowedAttributes( QString parentElement );
+ QStringList attributeValues( QString element, QString attribute );
+ QStringList entities( QString start );
+ QStringList requiredAttributes( const QString &parentElement ) const;
+
+ protected:
+
+ bool parseElements( QDomDocument *doc, QProgressDialog *progress );
+ bool parseAttributes( QDomDocument *doc, QProgressDialog *progress );
+ bool parseAttributeValues( QDomDocument *doc, QProgressDialog *progress );
+ bool parseEntities( QDomDocument *doc, QProgressDialog *progress );
+
+ bool m_sgmlSupport;
+
+ // Entities, e.g. <"nbsp", "160">
+ QMap<QString,QString> m_entityList;
+ // Elements, e.g. <"a", ( "b", "i", "em", "strong" )>
+ QMap<QString,QStringList> m_elementsList;
+ // Attributes e.g. <"a", ( "href", "lang", "title" )>
+ QMap<QString,ElementAttributes> m_attributesList;
+ // Attribute values e.g. <"td", <"align", ( "left", "right", "justify" )>>
+ QMap< QString,QMap<QString,QStringList> > m_attributevaluesList;
+
+};
+
+#endif // _PLUGIN_KANT_XMLTOOLS_DTD_H
+// kate: space-indent on; indent-width 2; replace-tabs on; mixed-indent off;
diff --git a/kate/xmltools/simplify_dtd.xsl b/kate/xmltools/simplify_dtd.xsl
new file mode 100644
index 0000000..53d3a13
--- /dev/null
+++ b/kate/xmltools/simplify_dtd.xsl
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+
+<!--
+Remove all parameter entities and other useless stuff from the kdex.dtd.xml DTD,
+to make the file smaller.
+Daniel Naber, 2001-09-23, last update 2001-09-29
+-->
+
+<xsl:output method="xml"
+ indent="yes"
+ doctype-public="-//Norman Walsh//DTD DTDParse V2.0//EN"
+ doctype-system="dtd.dtd"/>
+
+ <xsl:template match="dtd">
+ <dtd>
+ <xsl:attribute name="version"><xsl:value-of select="@version"/></xsl:attribute>
+ <xsl:attribute name="unexpanded"><xsl:value-of select="@unexpanded"/></xsl:attribute>
+ <xsl:attribute name="title"><xsl:value-of select="@title"/></xsl:attribute>
+ <xsl:attribute name="namecase-general"><xsl:value-of select="@namecase-general"/></xsl:attribute>
+ <xsl:attribute name="namecase-entity"><xsl:value-of select="@namecase-entity"/></xsl:attribute>
+ <xsl:attribute name="xml"><xsl:value-of select="@xml"/></xsl:attribute>
+ <xsl:attribute name="system-id"><xsl:value-of select="@system-id"/></xsl:attribute>
+ <xsl:attribute name="public-id"><xsl:value-of select="@public-id"/></xsl:attribute>
+ <xsl:attribute name="declaration"><xsl:value-of select="@declaration"/></xsl:attribute>
+ <xsl:attribute name="created-by">XSLT Simplifier</xsl:attribute>
+ <xsl:attribute name="created-on"><xsl:value-of select="@created-on"/> (original version)</xsl:attribute>
+ <xsl:apply-templates />
+ </dtd>
+ </xsl:template>
+
+ <!-- remove some "entity" elements and other stuff not needed: -->
+
+ <xsl:template match="element">
+ <element>
+ <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
+ <xsl:copy-of select="content-model-expanded"/>
+ </element>
+ </xsl:template>
+
+ <xsl:template match="entity">
+ <xsl:if test="not(@type='param')">
+ <entity>
+ <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
+ <xsl:attribute name="type"><xsl:value-of select="@type"/></xsl:attribute>
+ <xsl:apply-templates select="text-expanded"/>
+ </entity>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="text-expanded">
+ <xsl:copy-of select="."/>
+ </xsl:template>
+
+ <xsl:template match="attlist">
+ <attlist>
+ <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
+ <xsl:copy-of select="attribute"/>
+ </attlist>
+ </xsl:template>
+
+ <xsl:template match="notation" />
+
+</xsl:stylesheet>
diff --git a/kate/xmltools/testcases.xml b/kate/xmltools/testcases.xml
new file mode 100644
index 0000000..aa1e7dd
--- /dev/null
+++ b/kate/xmltools/testcases.xml
@@ -0,0 +1,73 @@
+This is a pseudo XML file to test the functions of the XML Plugin.
+v0.8, 2002-04-21
+
+1. Choose "Assign Meta DTD..." and load the file meta-dtd/html4-loose.dtd.xml
+
+2. Place cursor at the "X" and choose "Close Element" from the
+"XML Plugin" menu. "</P>" resp. "</p>" should be inserted:
+ <P> <a href=""> foo <i> test </i> bar </a> X
+ <P> <a x="xyz"> foo bar </a> X
+ <P> foo <img foo="&bar;"/> bar X
+ <P> foo <img/> bar X
+ <P> foo bar X
+ <p foo="bar">
+ next line, X
+ <p><!-- foo --> X (again, the "p" should be closed)
+ <p><? foo ?> X (again, the "p" should be closed)
+
+3. Place cursor after (outside) the tag and select "Insert Element...". The listed
+sub-elements should be offered as completion once you start typing. Select one
+and it should be inserted, including its closing tag. The cursor should be
+placed behind the tag name in the opening tag. The same thing should work
+if you just type "<" outside the tag:
+ <a> abbr, acronym, ....(i.e. no "a", as it cannot be nested!)
+ <A> abbr, acronym, ....
+ <P foo="bar"> a, abbr, acronym, ...
+ <textarea>, (no possible sub-elements)
+
+4. Place cursor inside the element, but after the element name and outside the
+attribute values. Press space. A list of attributes should be displayed. Select one and
+it should be inserted, including the = and two quotation marks. The cursor should be
+placed inside the quotation marks:
+ <a> accesskey, charset, ...
+ <a href="foo"> accesskey, charset, ...
+ <img href="foo" /> align, alt, border, ...
+ <html> dir, lang, version
+
+5. Place cursor inside the attribute values and press space. A List of
+attribute values should be displayed. Select one and it should be inserted at
+the current cursor position, replacing the old value:
+ <td align=""> center, char, justify, left, right
+ <td valign=""> baseline, bottom, middle, top
+ <td valign="foobar"> -- "foobar" should be replaced
+ <area shape=""> circle, default, poly, rect
+ <area foobar=""> (no predefined values)
+
+6. Type "&". A list with named entities should appear. Select one and
+it should be inserted, including the trailing semicolon.
+
+7. Test that SGML (that is HTML, really) is treated as case-insensitive:
+ <TD AligN="center">
+ <Td AligN="justify">
+ <td AligN="leftcenter">
+ <TD align="">
+
+8. Single quotes work just like double quotes, whitespace inside element tags is okay:
+ <td align='right'>
+ <td align=''>
+ <td
+ align="">
+
+9. Current limitations: trigger completion at "X":
+ <a href="foo"> blah <em>X -- <a> inside <a> is not allowed, but this limitation is not
+ part of the DTD, so the plugin will incorrectly claim that <a> is allowed at "X".
+ <head><title> foobar</title> X -- <title> is only allowed once, but the plugin
+ only looks for the parent element (<head> in this case) and ignores the existing <title>.
+ <a href="foo" X > -- an attribute may only appear once, but "href" is listed by the plugin
+ although it's used already.
+ <td align = "X"> -- whitespace around '=' is not recognized although it's legal.
+
+10. Use "Assing Meta DTD..." to switch to kde-dockbook.dtd.xml. Try the above steps
+on the following tags:
+ <author lang="">
+ <surname>
diff --git a/kate/xmltools/ui.rc b/kate/xmltools/ui.rc
new file mode 100644
index 0000000..a6f393c
--- /dev/null
+++ b/kate/xmltools/ui.rc
@@ -0,0 +1,10 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="katexmltools" library="libkatexmltoolsplugin" version="8">
+<MenuBar>
+ <Menu name="xml"><Text>&amp;XML</Text>
+ <Action name="xml_tool_insert_element" />
+ <Action name="xml_tool_close_element" />
+ <Action name="xml_tool_assign" />
+ </Menu>
+</MenuBar>
+</kpartplugin>
diff --git a/kate/xmltools/xhtml1-frameset.dtd.xml b/kate/xmltools/xhtml1-frameset.dtd.xml
new file mode 100644
index 0000000..6530334
--- /dev/null
+++ b/kate/xmltools/xhtml1-frameset.dtd.xml
@@ -0,0 +1,14043 @@
+<!DOCTYPE dtd PUBLIC "-//Norman Walsh//DTD DTDParse V2.0//EN"
+ "dtd.dtd" [
+<!ENTITY nbsp "&#160;">
+<!ENTITY iexcl "&#161;">
+<!ENTITY cent "&#162;">
+<!ENTITY pound "&#163;">
+<!ENTITY curren "&#164;">
+<!ENTITY yen "&#165;">
+<!ENTITY brvbar "&#166;">
+<!ENTITY sect "&#167;">
+<!ENTITY uml "&#168;">
+<!ENTITY copy "&#169;">
+<!ENTITY ordf "&#170;">
+<!ENTITY laquo "&#171;">
+<!ENTITY not "&#172;">
+<!ENTITY shy "&#173;">
+<!ENTITY reg "&#174;">
+<!ENTITY macr "&#175;">
+<!ENTITY deg "&#176;">
+<!ENTITY plusmn "&#177;">
+<!ENTITY sup2 "&#178;">
+<!ENTITY sup3 "&#179;">
+<!ENTITY acute "&#180;">
+<!ENTITY micro "&#181;">
+<!ENTITY para "&#182;">
+<!ENTITY middot "&#183;">
+<!ENTITY cedil "&#184;">
+<!ENTITY sup1 "&#185;">
+<!ENTITY ordm "&#186;">
+<!ENTITY raquo "&#187;">
+<!ENTITY frac14 "&#188;">
+<!ENTITY frac12 "&#189;">
+<!ENTITY frac34 "&#190;">
+<!ENTITY iquest "&#191;">
+<!ENTITY Agrave "&#192;">
+<!ENTITY Aacute "&#193;">
+<!ENTITY Acirc "&#194;">
+<!ENTITY Atilde "&#195;">
+<!ENTITY Auml "&#196;">
+<!ENTITY Aring "&#197;">
+<!ENTITY AElig "&#198;">
+<!ENTITY Ccedil "&#199;">
+<!ENTITY Egrave "&#200;">
+<!ENTITY Eacute "&#201;">
+<!ENTITY Ecirc "&#202;">
+<!ENTITY Euml "&#203;">
+<!ENTITY Igrave "&#204;">
+<!ENTITY Iacute "&#205;">
+<!ENTITY Icirc "&#206;">
+<!ENTITY Iuml "&#207;">
+<!ENTITY ETH "&#208;">
+<!ENTITY Ntilde "&#209;">
+<!ENTITY Ograve "&#210;">
+<!ENTITY Oacute "&#211;">
+<!ENTITY Ocirc "&#212;">
+<!ENTITY Otilde "&#213;">
+<!ENTITY Ouml "&#214;">
+<!ENTITY times "&#215;">
+<!ENTITY Oslash "&#216;">
+<!ENTITY Ugrave "&#217;">
+<!ENTITY Uacute "&#218;">
+<!ENTITY Ucirc "&#219;">
+<!ENTITY Uuml "&#220;">
+<!ENTITY Yacute "&#221;">
+<!ENTITY THORN "&#222;">
+<!ENTITY szlig "&#223;">
+<!ENTITY agrave "&#224;">
+<!ENTITY aacute "&#225;">
+<!ENTITY acirc "&#226;">
+<!ENTITY atilde "&#227;">
+<!ENTITY auml "&#228;">
+<!ENTITY aring "&#229;">
+<!ENTITY aelig "&#230;">
+<!ENTITY ccedil "&#231;">
+<!ENTITY egrave "&#232;">
+<!ENTITY eacute "&#233;">
+<!ENTITY ecirc "&#234;">
+<!ENTITY euml "&#235;">
+<!ENTITY igrave "&#236;">
+<!ENTITY iacute "&#237;">
+<!ENTITY icirc "&#238;">
+<!ENTITY iuml "&#239;">
+<!ENTITY eth "&#240;">
+<!ENTITY ntilde "&#241;">
+<!ENTITY ograve "&#242;">
+<!ENTITY oacute "&#243;">
+<!ENTITY ocirc "&#244;">
+<!ENTITY otilde "&#245;">
+<!ENTITY ouml "&#246;">
+<!ENTITY divide "&#247;">
+<!ENTITY oslash "&#248;">
+<!ENTITY ugrave "&#249;">
+<!ENTITY uacute "&#250;">
+<!ENTITY ucirc "&#251;">
+<!ENTITY uuml "&#252;">
+<!ENTITY yacute "&#253;">
+<!ENTITY thorn "&#254;">
+<!ENTITY yuml "&#255;">
+<!ENTITY fnof "&#402;">
+<!ENTITY Alpha "&#913;">
+<!ENTITY Beta "&#914;">
+<!ENTITY Gamma "&#915;">
+<!ENTITY Delta "&#916;">
+<!ENTITY Epsilon "&#917;">
+<!ENTITY Zeta "&#918;">
+<!ENTITY Eta "&#919;">
+<!ENTITY Theta "&#920;">
+<!ENTITY Iota "&#921;">
+<!ENTITY Kappa "&#922;">
+<!ENTITY Lambda "&#923;">
+<!ENTITY Mu "&#924;">
+<!ENTITY Nu "&#925;">
+<!ENTITY Xi "&#926;">
+<!ENTITY Omicron "&#927;">
+<!ENTITY Pi "&#928;">
+<!ENTITY Rho "&#929;">
+<!ENTITY Sigma "&#931;">
+<!ENTITY Tau "&#932;">
+<!ENTITY Upsilon "&#933;">
+<!ENTITY Phi "&#934;">
+<!ENTITY Chi "&#935;">
+<!ENTITY Psi "&#936;">
+<!ENTITY Omega "&#937;">
+<!ENTITY alpha "&#945;">
+<!ENTITY beta "&#946;">
+<!ENTITY gamma "&#947;">
+<!ENTITY delta "&#948;">
+<!ENTITY epsilon "&#949;">
+<!ENTITY zeta "&#950;">
+<!ENTITY eta "&#951;">
+<!ENTITY theta "&#952;">
+<!ENTITY iota "&#953;">
+<!ENTITY kappa "&#954;">
+<!ENTITY lambda "&#955;">
+<!ENTITY mu "&#956;">
+<!ENTITY nu "&#957;">
+<!ENTITY xi "&#958;">
+<!ENTITY omicron "&#959;">
+<!ENTITY pi "&#960;">
+<!ENTITY rho "&#961;">
+<!ENTITY sigmaf "&#962;">
+<!ENTITY sigma "&#963;">
+<!ENTITY tau "&#964;">
+<!ENTITY upsilon "&#965;">
+<!ENTITY phi "&#966;">
+<!ENTITY chi "&#967;">
+<!ENTITY psi "&#968;">
+<!ENTITY omega "&#969;">
+<!ENTITY thetasym "&#977;">
+<!ENTITY upsih "&#978;">
+<!ENTITY piv "&#982;">
+<!ENTITY bull "&#8226;">
+<!ENTITY hellip "&#8230;">
+<!ENTITY prime "&#8242;">
+<!ENTITY Prime "&#8243;">
+<!ENTITY oline "&#8254;">
+<!ENTITY frasl "&#8260;">
+<!ENTITY weierp "&#8472;">
+<!ENTITY image "&#8465;">
+<!ENTITY real "&#8476;">
+<!ENTITY trade "&#8482;">
+<!ENTITY alefsym "&#8501;">
+<!ENTITY larr "&#8592;">
+<!ENTITY uarr "&#8593;">
+<!ENTITY rarr "&#8594;">
+<!ENTITY darr "&#8595;">
+<!ENTITY harr "&#8596;">
+<!ENTITY crarr "&#8629;">
+<!ENTITY lArr "&#8656;">
+<!ENTITY uArr "&#8657;">
+<!ENTITY rArr "&#8658;">
+<!ENTITY dArr "&#8659;">
+<!ENTITY hArr "&#8660;">
+<!ENTITY forall "&#8704;">
+<!ENTITY part "&#8706;">
+<!ENTITY exist "&#8707;">
+<!ENTITY empty "&#8709;">
+<!ENTITY nabla "&#8711;">
+<!ENTITY isin "&#8712;">
+<!ENTITY notin "&#8713;">
+<!ENTITY ni "&#8715;">
+<!ENTITY prod "&#8719;">
+<!ENTITY sum "&#8721;">
+<!ENTITY minus "&#8722;">
+<!ENTITY lowast "&#8727;">
+<!ENTITY radic "&#8730;">
+<!ENTITY prop "&#8733;">
+<!ENTITY infin "&#8734;">
+<!ENTITY ang "&#8736;">
+<!ENTITY and "&#8743;">
+<!ENTITY or "&#8744;">
+<!ENTITY cap "&#8745;">
+<!ENTITY cup "&#8746;">
+<!ENTITY int "&#8747;">
+<!ENTITY there4 "&#8756;">
+<!ENTITY sim "&#8764;">
+<!ENTITY cong "&#8773;">
+<!ENTITY asymp "&#8776;">
+<!ENTITY ne "&#8800;">
+<!ENTITY equiv "&#8801;">
+<!ENTITY le "&#8804;">
+<!ENTITY ge "&#8805;">
+<!ENTITY sub "&#8834;">
+<!ENTITY sup "&#8835;">
+<!ENTITY nsub "&#8836;">
+<!ENTITY sube "&#8838;">
+<!ENTITY supe "&#8839;">
+<!ENTITY oplus "&#8853;">
+<!ENTITY otimes "&#8855;">
+<!ENTITY perp "&#8869;">
+<!ENTITY sdot "&#8901;">
+<!ENTITY lceil "&#8968;">
+<!ENTITY rceil "&#8969;">
+<!ENTITY lfloor "&#8970;">
+<!ENTITY rfloor "&#8971;">
+<!ENTITY lang "&#9001;">
+<!ENTITY rang "&#9002;">
+<!ENTITY loz "&#9674;">
+<!ENTITY spades "&#9824;">
+<!ENTITY clubs "&#9827;">
+<!ENTITY hearts "&#9829;">
+<!ENTITY diams "&#9830;">
+<!ENTITY quot "&#34;">
+<!ENTITY amp "&#38;#38;">
+<!ENTITY lt "&#38;#60;">
+<!ENTITY gt "&#62;">
+<!ENTITY apos "&#39;">
+<!ENTITY OElig "&#338;">
+<!ENTITY oelig "&#339;">
+<!ENTITY Scaron "&#352;">
+<!ENTITY scaron "&#353;">
+<!ENTITY Yuml "&#376;">
+<!ENTITY circ "&#710;">
+<!ENTITY tilde "&#732;">
+<!ENTITY ensp "&#8194;">
+<!ENTITY emsp "&#8195;">
+<!ENTITY thinsp "&#8201;">
+<!ENTITY zwnj "&#8204;">
+<!ENTITY zwj "&#8205;">
+<!ENTITY lrm "&#8206;">
+<!ENTITY rlm "&#8207;">
+<!ENTITY ndash "&#8211;">
+<!ENTITY mdash "&#8212;">
+<!ENTITY lsquo "&#8216;">
+<!ENTITY rsquo "&#8217;">
+<!ENTITY sbquo "&#8218;">
+<!ENTITY ldquo "&#8220;">
+<!ENTITY rdquo "&#8221;">
+<!ENTITY bdquo "&#8222;">
+<!ENTITY dagger "&#8224;">
+<!ENTITY Dagger "&#8225;">
+<!ENTITY permil "&#8240;">
+<!ENTITY lsaquo "&#8249;">
+<!ENTITY rsaquo "&#8250;">
+<!ENTITY euro "&#8364;">
+]>
+<dtd version='1.0'
+ unexpanded='1'
+ title="?untitled?"
+ namecase-general="1"
+ namecase-entity="0"
+ xml="0"
+ system-id="xhtml1-frameset.dtd"
+ public-id=""
+ declaration=""
+ created-by="DTDParse V2.0beta6"
+ created-on="Sun Oct 7 15:07:22 2001"
+>
+<entity name="LanguageCode"
+ type="param"
+>
+<text-expanded>NMTOKEN</text-expanded>
+<text>NMTOKEN</text>
+</entity>
+
+<entity name="ULStyle"
+ type="param"
+>
+<text-expanded>(disc|square|circle)</text-expanded>
+<text>(disc|square|circle)</text>
+</entity>
+
+<entity name="pre.content"
+ type="param"
+>
+<text-expanded>(#PCDATA | a | br | span | bdo | tt | i | b | u
+ | s | strike | em | strong | dfn | code | q |
+ samp | kbd | var | cite | abbr | acronym |
+ input | select | textarea | label | button | ins | del | script | noscript)*</text-expanded>
+<text>(#PCDATA | a | %special.basic; | %fontstyle.basic; | %phrase.basic; |
+ %inline.forms; | %misc;)*</text>
+</entity>
+
+<entity name="Script"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="fontstyle.extra"
+ type="param"
+>
+<text-expanded>big | small | font | basefont</text-expanded>
+<text>big | small | font | basefont</text>
+</entity>
+
+<entity name="Color"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="fontstyle.basic"
+ type="param"
+>
+<text-expanded>tt | i | b | u
+ | s | strike </text-expanded>
+<text>tt | i | b | u
+ | s | strike </text>
+</entity>
+
+<entity name="TFrame"
+ type="param"
+>
+<text-expanded>(void|above|below|hsides|lhs|rhs|vsides|box|border)</text-expanded>
+<text>(void|above|below|hsides|lhs|rhs|vsides|box|border)</text>
+</entity>
+
+<entity name="Character"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="URI"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="coreattrs"
+ type="param"
+>
+<text-expanded>id ID #IMPLIED
+ class CDATA #IMPLIED
+ style CDATA #IMPLIED
+ title CDATA #IMPLIED</text-expanded>
+<text>id ID #IMPLIED
+ class CDATA #IMPLIED
+ style %StyleSheet; #IMPLIED
+ title %Text; #IMPLIED</text>
+</entity>
+
+<entity name="HTMLlat1"
+ type="param"
+ public="-//W3C//ENTITIES Latin 1 for XHTML//EN"
+ system="xhtml-lat1.ent"
+/>
+
+<entity name="Inline"
+ type="param"
+>
+<text-expanded>(#PCDATA | a | br | span | bdo | object | applet | img | map | iframe | tt | i | b | u
+ | s | strike | big | small | font | basefont | em | strong | dfn | code | q |
+ samp | kbd | var | cite | abbr | acronym | sub | sup | input | select | textarea | label | button | ins | del | script | noscript)*</text-expanded>
+<text>(#PCDATA | %inline; | %misc;)*</text>
+</entity>
+
+<entity name="OLStyle"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="Flow"
+ type="param"
+>
+<text-expanded>(#PCDATA | p | h1|h2|h3|h4|h5|h6 | div | ul | ol | dl | menu | dir | pre | hr | blockquote | address | center | isindex | fieldset | table | form | a | br | span | bdo | object | applet | img | map | iframe | tt | i | b | u
+ | s | strike | big | small | font | basefont | em | strong | dfn | code | q |
+ samp | kbd | var | cite | abbr | acronym | sub | sup | input | select | textarea | label | button | ins | del | script | noscript)*</text-expanded>
+<text>(#PCDATA | %block; | form | %inline; | %misc;)*</text>
+</entity>
+
+<entity name="TextAlign"
+ type="param"
+>
+<text-expanded>align (left|center|right|justify) #IMPLIED</text-expanded>
+<text>align (left|center|right|justify) #IMPLIED</text>
+</entity>
+
+<entity name="ContentTypes"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="head.misc"
+ type="param"
+>
+<text-expanded>(script|style|meta|link|object|isindex)*</text-expanded>
+<text>(script|style|meta|link|object|isindex)*</text>
+</entity>
+
+<entity name="block"
+ type="param"
+>
+<text-expanded>p | h1|h2|h3|h4|h5|h6 | div | ul | ol | dl | menu | dir | pre | hr | blockquote | address | center | isindex | fieldset | table</text-expanded>
+<text>p | %heading; | div | %lists; | %blocktext; | isindex | fieldset | table</text>
+</entity>
+
+<entity name="HTMLspecial"
+ type="param"
+ public="-//W3C//ENTITIES Special for XHTML//EN"
+ system="xhtml-special.ent"
+/>
+
+<entity name="special"
+ type="param"
+>
+<text-expanded>br | span | bdo | object | applet | img | map | iframe</text-expanded>
+<text>%special.basic; | %special.extra;</text>
+</entity>
+
+<entity name="CAlign"
+ type="param"
+>
+<text-expanded>(top|bottom|left|right)</text-expanded>
+<text>(top|bottom|left|right)</text>
+</entity>
+
+<entity name="form.content"
+ type="param"
+>
+<text-expanded>(#PCDATA | p | h1|h2|h3|h4|h5|h6 | div | ul | ol | dl | menu | dir | pre | hr | blockquote | address | center | isindex | fieldset | table | a | br | span | bdo | object | applet | img | map | iframe | tt | i | b | u
+ | s | strike | big | small | font | basefont | em | strong | dfn | code | q |
+ samp | kbd | var | cite | abbr | acronym | sub | sup | input | select | textarea | label | button | ins | del | script | noscript)*</text-expanded>
+<text>(#PCDATA | %block; | %inline; | %misc;)*</text>
+</entity>
+
+<entity name="phrase"
+ type="param"
+>
+<text-expanded>em | strong | dfn | code | q |
+ samp | kbd | var | cite | abbr | acronym | sub | sup</text-expanded>
+<text>%phrase.basic; | %phrase.extra;</text>
+</entity>
+
+<entity name="ContentType"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="StyleSheet"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="cellhalign"
+ type="param"
+>
+<text-expanded>align (left|center|right|justify|char) #IMPLIED
+ char CDATA #IMPLIED
+ charoff CDATA #IMPLIED</text-expanded>
+<text>align (left|center|right|justify|char) #IMPLIED
+ char %Character; #IMPLIED
+ charoff %Length; #IMPLIED</text>
+</entity>
+
+<entity name="Datetime"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="i18n"
+ type="param"
+>
+<text-expanded>lang NMTOKEN #IMPLIED
+ xml:lang NMTOKEN #IMPLIED
+ dir (ltr|rtl) #IMPLIED</text-expanded>
+<text>lang %LanguageCode; #IMPLIED
+ xml:lang %LanguageCode; #IMPLIED
+ dir (ltr|rtl) #IMPLIED</text>
+</entity>
+
+<entity name="phrase.extra"
+ type="param"
+>
+<text-expanded>sub | sup</text-expanded>
+<text>sub | sup</text>
+</entity>
+
+<entity name="phrase.basic"
+ type="param"
+>
+<text-expanded>em | strong | dfn | code | q |
+ samp | kbd | var | cite | abbr | acronym</text-expanded>
+<text>em | strong | dfn | code | q |
+ samp | kbd | var | cite | abbr | acronym</text>
+</entity>
+
+<entity name="misc"
+ type="param"
+>
+<text-expanded>ins | del | script | noscript</text-expanded>
+<text>ins | del | script | noscript</text>
+</entity>
+
+<entity name="LAlign"
+ type="param"
+>
+<text-expanded>(top|bottom|left|right)</text-expanded>
+<text>(top|bottom|left|right)</text>
+</entity>
+
+<entity name="UriList"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="MultiLength"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="button.content"
+ type="param"
+>
+<text-expanded>(#PCDATA | p | h1|h2|h3|h4|h5|h6 | div | ul | ol | dl | menu | dir | pre | hr | blockquote | address | center |
+ table | br | span | bdo | object | applet | img | map |
+ tt | i | b | u
+ | s | strike | big | small | font | basefont | em | strong | dfn | code | q |
+ samp | kbd | var | cite | abbr | acronym | sub | sup | ins | del | script | noscript)*</text-expanded>
+<text>(#PCDATA | p | %heading; | div | %lists; | %blocktext; |
+ table | br | span | bdo | object | applet | img | map |
+ %fontstyle; | %phrase; | %misc;)*</text>
+</entity>
+
+<entity name="cellvalign"
+ type="param"
+>
+<text-expanded>valign (top|middle|bottom|baseline) #IMPLIED</text-expanded>
+<text>valign (top|middle|bottom|baseline) #IMPLIED</text>
+</entity>
+
+<entity name="Text"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="HTMLsymbol"
+ type="param"
+ public="-//W3C//ENTITIES Symbols for XHTML//EN"
+ system="xhtml-symbol.ent"
+/>
+
+<entity name="focus"
+ type="param"
+>
+<text-expanded>accesskey CDATA #IMPLIED
+ tabindex CDATA #IMPLIED
+ onfocus CDATA #IMPLIED
+ onblur CDATA #IMPLIED</text-expanded>
+<text>accesskey %Character; #IMPLIED
+ tabindex %Number; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED</text>
+</entity>
+
+<entity name="Shape"
+ type="param"
+>
+<text-expanded>(rect|circle|poly|default)</text-expanded>
+<text>(rect|circle|poly|default)</text>
+</entity>
+
+<entity name="events"
+ type="param"
+>
+<text-expanded>onclick CDATA #IMPLIED
+ ondblclick CDATA #IMPLIED
+ onmousedown CDATA #IMPLIED
+ onmouseup CDATA #IMPLIED
+ onmouseover CDATA #IMPLIED
+ onmousemove CDATA #IMPLIED
+ onmouseout CDATA #IMPLIED
+ onkeypress CDATA #IMPLIED
+ onkeydown CDATA #IMPLIED
+ onkeyup CDATA #IMPLIED</text-expanded>
+<text>onclick %Script; #IMPLIED
+ ondblclick %Script; #IMPLIED
+ onmousedown %Script; #IMPLIED
+ onmouseup %Script; #IMPLIED
+ onmouseover %Script; #IMPLIED
+ onmousemove %Script; #IMPLIED
+ onmouseout %Script; #IMPLIED
+ onkeypress %Script; #IMPLIED
+ onkeydown %Script; #IMPLIED
+ onkeyup %Script; #IMPLIED</text>
+</entity>
+
+<entity name="inline.forms"
+ type="param"
+>
+<text-expanded>input | select | textarea | label | button</text-expanded>
+<text>input | select | textarea | label | button</text>
+</entity>
+
+<entity name="a.content"
+ type="param"
+>
+<text-expanded>(#PCDATA | br | span | bdo | object | applet | img | map | iframe | tt | i | b | u
+ | s | strike | big | small | font | basefont | em | strong | dfn | code | q |
+ samp | kbd | var | cite | abbr | acronym | sub | sup | input | select | textarea | label | button | ins | del | script | noscript)*</text-expanded>
+<text>(#PCDATA | %special; | %fontstyle; | %phrase; | %inline.forms; | %misc;)*</text>
+</entity>
+
+<entity name="TRules"
+ type="param"
+>
+<text-expanded>(none | groups | rows | cols | all)</text-expanded>
+<text>(none | groups | rows | cols | all)</text>
+</entity>
+
+<entity name="inline"
+ type="param"
+>
+<text-expanded>a | br | span | bdo | object | applet | img | map | iframe | tt | i | b | u
+ | s | strike | big | small | font | basefont | em | strong | dfn | code | q |
+ samp | kbd | var | cite | abbr | acronym | sub | sup | input | select | textarea | label | button</text-expanded>
+<text>a | %special; | %fontstyle; | %phrase; | %inline.forms;</text>
+</entity>
+
+<entity name="Charsets"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="FrameTarget"
+ type="param"
+>
+<text-expanded>NMTOKEN</text-expanded>
+<text>NMTOKEN</text>
+</entity>
+
+<entity name="lists"
+ type="param"
+>
+<text-expanded>ul | ol | dl | menu | dir</text-expanded>
+<text>ul | ol | dl | menu | dir</text>
+</entity>
+
+<entity name="blocktext"
+ type="param"
+>
+<text-expanded>pre | hr | blockquote | address | center</text-expanded>
+<text>pre | hr | blockquote | address | center</text>
+</entity>
+
+<entity name="Number"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="LinkTypes"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="Scope"
+ type="param"
+>
+<text-expanded>(row|col|rowgroup|colgroup)</text-expanded>
+<text>(row|col|rowgroup|colgroup)</text>
+</entity>
+
+<entity name="special.extra"
+ type="param"
+>
+<text-expanded>object | applet | img | map | iframe</text-expanded>
+<text>object | applet | img | map | iframe</text>
+</entity>
+
+<entity name="InputType"
+ type="param"
+>
+<text-expanded>(text | password | checkbox |
+ radio | submit | reset |
+ file | hidden | image | button)</text-expanded>
+<text>(text | password | checkbox |
+ radio | submit | reset |
+ file | hidden | image | button)</text>
+</entity>
+
+<entity name="special.basic"
+ type="param"
+>
+<text-expanded>br | span | bdo</text-expanded>
+<text>br | span | bdo</text>
+</entity>
+
+<entity name="ImgAlign"
+ type="param"
+>
+<text-expanded>(top|middle|bottom|left|right)</text-expanded>
+<text>(top|middle|bottom|left|right)</text>
+</entity>
+
+<entity name="MultiLengths"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="Length"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="TAlign"
+ type="param"
+>
+<text-expanded>(left|center|right)</text-expanded>
+<text>(left|center|right)</text>
+</entity>
+
+<entity name="MediaDesc"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="LIStyle"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="attrs"
+ type="param"
+>
+<text-expanded>id ID #IMPLIED
+ class CDATA #IMPLIED
+ style CDATA #IMPLIED
+ title CDATA #IMPLIED lang NMTOKEN #IMPLIED
+ xml:lang NMTOKEN #IMPLIED
+ dir (ltr|rtl) #IMPLIED onclick CDATA #IMPLIED
+ ondblclick CDATA #IMPLIED
+ onmousedown CDATA #IMPLIED
+ onmouseup CDATA #IMPLIED
+ onmouseover CDATA #IMPLIED
+ onmousemove CDATA #IMPLIED
+ onmouseout CDATA #IMPLIED
+ onkeypress CDATA #IMPLIED
+ onkeydown CDATA #IMPLIED
+ onkeyup CDATA #IMPLIED</text-expanded>
+<text>%coreattrs; %i18n; %events;</text>
+</entity>
+
+<entity name="Pixels"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="Coords"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="fontstyle"
+ type="param"
+>
+<text-expanded>tt | i | b | u
+ | s | strike | big | small | font | basefont</text-expanded>
+<text>%fontstyle.basic; | %fontstyle.extra;</text>
+</entity>
+
+<entity name="Charset"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="heading"
+ type="param"
+>
+<text-expanded>h1|h2|h3|h4|h5|h6</text-expanded>
+<text>h1|h2|h3|h4|h5|h6</text>
+</entity>
+
+<entity name="ntilde"
+ type="gen"
+>
+<text-expanded>&amp;#241;</text-expanded>
+<text>&amp;#241;</text>
+</entity>
+
+<entity name="prime"
+ type="gen"
+>
+<text-expanded>&amp;#8242;</text-expanded>
+<text>&amp;#8242;</text>
+</entity>
+
+<entity name="quot"
+ type="gen"
+>
+<text-expanded>&amp;#34;</text-expanded>
+<text>&amp;#34;</text>
+</entity>
+
+<entity name="rceil"
+ type="gen"
+>
+<text-expanded>&amp;#8969;</text-expanded>
+<text>&amp;#8969;</text>
+</entity>
+
+<entity name="prod"
+ type="gen"
+>
+<text-expanded>&amp;#8719;</text-expanded>
+<text>&amp;#8719;</text>
+</entity>
+
+<entity name="Euml"
+ type="gen"
+>
+<text-expanded>&amp;#203;</text-expanded>
+<text>&amp;#203;</text>
+</entity>
+
+<entity name="loz"
+ type="gen"
+>
+<text-expanded>&amp;#9674;</text-expanded>
+<text>&amp;#9674;</text>
+</entity>
+
+<entity name="Yacute"
+ type="gen"
+>
+<text-expanded>&amp;#221;</text-expanded>
+<text>&amp;#221;</text>
+</entity>
+
+<entity name="rdquo"
+ type="gen"
+>
+<text-expanded>&amp;#8221;</text-expanded>
+<text>&amp;#8221;</text>
+</entity>
+
+<entity name="ne"
+ type="gen"
+>
+<text-expanded>&amp;#8800;</text-expanded>
+<text>&amp;#8800;</text>
+</entity>
+
+<entity name="igrave"
+ type="gen"
+>
+<text-expanded>&amp;#236;</text-expanded>
+<text>&amp;#236;</text>
+</entity>
+
+<entity name="psi"
+ type="gen"
+>
+<text-expanded>&amp;#968;</text-expanded>
+<text>&amp;#968;</text>
+</entity>
+
+<entity name="Oacute"
+ type="gen"
+>
+<text-expanded>&amp;#211;</text-expanded>
+<text>&amp;#211;</text>
+</entity>
+
+<entity name="lsaquo"
+ type="gen"
+>
+<text-expanded>&amp;#8249;</text-expanded>
+<text>&amp;#8249;</text>
+</entity>
+
+<entity name="ni"
+ type="gen"
+>
+<text-expanded>&amp;#8715;</text-expanded>
+<text>&amp;#8715;</text>
+</entity>
+
+<entity name="frasl"
+ type="gen"
+>
+<text-expanded>&amp;#8260;</text-expanded>
+<text>&amp;#8260;</text>
+</entity>
+
+<entity name="Epsilon"
+ type="gen"
+>
+<text-expanded>&amp;#917;</text-expanded>
+<text>&amp;#917;</text>
+</entity>
+
+<entity name="rArr"
+ type="gen"
+>
+<text-expanded>&amp;#8658;</text-expanded>
+<text>&amp;#8658;</text>
+</entity>
+
+<entity name="Eacute"
+ type="gen"
+>
+<text-expanded>&amp;#201;</text-expanded>
+<text>&amp;#201;</text>
+</entity>
+
+<entity name="acute"
+ type="gen"
+>
+<text-expanded>&amp;#180;</text-expanded>
+<text>&amp;#180;</text>
+</entity>
+
+<entity name="Pi"
+ type="gen"
+>
+<text-expanded>&amp;#928;</text-expanded>
+<text>&amp;#928;</text>
+</entity>
+
+<entity name="radic"
+ type="gen"
+>
+<text-expanded>&amp;#8730;</text-expanded>
+<text>&amp;#8730;</text>
+</entity>
+
+<entity name="Ugrave"
+ type="gen"
+>
+<text-expanded>&amp;#217;</text-expanded>
+<text>&amp;#217;</text>
+</entity>
+
+<entity name="prop"
+ type="gen"
+>
+<text-expanded>&amp;#8733;</text-expanded>
+<text>&amp;#8733;</text>
+</entity>
+
+<entity name="ccedil"
+ type="gen"
+>
+<text-expanded>&amp;#231;</text-expanded>
+<text>&amp;#231;</text>
+</entity>
+
+<entity name="Iuml"
+ type="gen"
+>
+<text-expanded>&amp;#207;</text-expanded>
+<text>&amp;#207;</text>
+</entity>
+
+<entity name="Agrave"
+ type="gen"
+>
+<text-expanded>&amp;#192;</text-expanded>
+<text>&amp;#192;</text>
+</entity>
+
+<entity name="bull"
+ type="gen"
+>
+<text-expanded>&amp;#8226;</text-expanded>
+<text>&amp;#8226;</text>
+</entity>
+
+<entity name="nu"
+ type="gen"
+>
+<text-expanded>&amp;#957;</text-expanded>
+<text>&amp;#957;</text>
+</entity>
+
+<entity name="ge"
+ type="gen"
+>
+<text-expanded>&amp;#8805;</text-expanded>
+<text>&amp;#8805;</text>
+</entity>
+
+<entity name="gamma"
+ type="gen"
+>
+<text-expanded>&amp;#947;</text-expanded>
+<text>&amp;#947;</text>
+</entity>
+
+<entity name="Kappa"
+ type="gen"
+>
+<text-expanded>&amp;#922;</text-expanded>
+<text>&amp;#922;</text>
+</entity>
+
+<entity name="aring"
+ type="gen"
+>
+<text-expanded>&amp;#229;</text-expanded>
+<text>&amp;#229;</text>
+</entity>
+
+<entity name="cedil"
+ type="gen"
+>
+<text-expanded>&amp;#184;</text-expanded>
+<text>&amp;#184;</text>
+</entity>
+
+<entity name="laquo"
+ type="gen"
+>
+<text-expanded>&amp;#171;</text-expanded>
+<text>&amp;#171;</text>
+</entity>
+
+<entity name="Xi"
+ type="gen"
+>
+<text-expanded>&amp;#926;</text-expanded>
+<text>&amp;#926;</text>
+</entity>
+
+<entity name="copy"
+ type="gen"
+>
+<text-expanded>&amp;#169;</text-expanded>
+<text>&amp;#169;</text>
+</entity>
+
+<entity name="crarr"
+ type="gen"
+>
+<text-expanded>&amp;#8629;</text-expanded>
+<text>&amp;#8629;</text>
+</entity>
+
+<entity name="sigma"
+ type="gen"
+>
+<text-expanded>&amp;#963;</text-expanded>
+<text>&amp;#963;</text>
+</entity>
+
+<entity name="acirc"
+ type="gen"
+>
+<text-expanded>&amp;#226;</text-expanded>
+<text>&amp;#226;</text>
+</entity>
+
+<entity name="clubs"
+ type="gen"
+>
+<text-expanded>&amp;#9827;</text-expanded>
+<text>&amp;#9827;</text>
+</entity>
+
+<entity name="Otilde"
+ type="gen"
+>
+<text-expanded>&amp;#213;</text-expanded>
+<text>&amp;#213;</text>
+</entity>
+
+<entity name="ETH"
+ type="gen"
+>
+<text-expanded>&amp;#208;</text-expanded>
+<text>&amp;#208;</text>
+</entity>
+
+<entity name="iota"
+ type="gen"
+>
+<text-expanded>&amp;#953;</text-expanded>
+<text>&amp;#953;</text>
+</entity>
+
+<entity name="gt"
+ type="gen"
+>
+<text-expanded>&amp;#62;</text-expanded>
+<text>&amp;#62;</text>
+</entity>
+
+<entity name="tilde"
+ type="gen"
+>
+<text-expanded>&amp;#732;</text-expanded>
+<text>&amp;#732;</text>
+</entity>
+
+<entity name="Chi"
+ type="gen"
+>
+<text-expanded>&amp;#935;</text-expanded>
+<text>&amp;#935;</text>
+</entity>
+
+<entity name="Theta"
+ type="gen"
+>
+<text-expanded>&amp;#920;</text-expanded>
+<text>&amp;#920;</text>
+</entity>
+
+<entity name="upsih"
+ type="gen"
+>
+<text-expanded>&amp;#978;</text-expanded>
+<text>&amp;#978;</text>
+</entity>
+
+<entity name="ouml"
+ type="gen"
+>
+<text-expanded>&amp;#246;</text-expanded>
+<text>&amp;#246;</text>
+</entity>
+
+<entity name="uacute"
+ type="gen"
+>
+<text-expanded>&amp;#250;</text-expanded>
+<text>&amp;#250;</text>
+</entity>
+
+<entity name="uml"
+ type="gen"
+>
+<text-expanded>&amp;#168;</text-expanded>
+<text>&amp;#168;</text>
+</entity>
+
+<entity name="mdash"
+ type="gen"
+>
+<text-expanded>&amp;#8212;</text-expanded>
+<text>&amp;#8212;</text>
+</entity>
+
+<entity name="forall"
+ type="gen"
+>
+<text-expanded>&amp;#8704;</text-expanded>
+<text>&amp;#8704;</text>
+</entity>
+
+<entity name="Phi"
+ type="gen"
+>
+<text-expanded>&amp;#934;</text-expanded>
+<text>&amp;#934;</text>
+</entity>
+
+<entity name="euro"
+ type="gen"
+>
+<text-expanded>&amp;#8364;</text-expanded>
+<text>&amp;#8364;</text>
+</entity>
+
+<entity name="aacute"
+ type="gen"
+>
+<text-expanded>&amp;#225;</text-expanded>
+<text>&amp;#225;</text>
+</entity>
+
+<entity name="or"
+ type="gen"
+>
+<text-expanded>&amp;#8744;</text-expanded>
+<text>&amp;#8744;</text>
+</entity>
+
+<entity name="ecirc"
+ type="gen"
+>
+<text-expanded>&amp;#234;</text-expanded>
+<text>&amp;#234;</text>
+</entity>
+
+<entity name="iquest"
+ type="gen"
+>
+<text-expanded>&amp;#191;</text-expanded>
+<text>&amp;#191;</text>
+</entity>
+
+<entity name="tau"
+ type="gen"
+>
+<text-expanded>&amp;#964;</text-expanded>
+<text>&amp;#964;</text>
+</entity>
+
+<entity name="emsp"
+ type="gen"
+>
+<text-expanded>&amp;#8195;</text-expanded>
+<text>&amp;#8195;</text>
+</entity>
+
+<entity name="weierp"
+ type="gen"
+>
+<text-expanded>&amp;#8472;</text-expanded>
+<text>&amp;#8472;</text>
+</entity>
+
+<entity name="Ntilde"
+ type="gen"
+>
+<text-expanded>&amp;#209;</text-expanded>
+<text>&amp;#209;</text>
+</entity>
+
+<entity name="lang"
+ type="gen"
+>
+<text-expanded>&amp;#9001;</text-expanded>
+<text>&amp;#9001;</text>
+</entity>
+
+<entity name="lambda"
+ type="gen"
+>
+<text-expanded>&amp;#955;</text-expanded>
+<text>&amp;#955;</text>
+</entity>
+
+<entity name="Delta"
+ type="gen"
+>
+<text-expanded>&amp;#916;</text-expanded>
+<text>&amp;#916;</text>
+</entity>
+
+<entity name="Uuml"
+ type="gen"
+>
+<text-expanded>&amp;#220;</text-expanded>
+<text>&amp;#220;</text>
+</entity>
+
+<entity name="oline"
+ type="gen"
+>
+<text-expanded>&amp;#8254;</text-expanded>
+<text>&amp;#8254;</text>
+</entity>
+
+<entity name="Igrave"
+ type="gen"
+>
+<text-expanded>&amp;#204;</text-expanded>
+<text>&amp;#204;</text>
+</entity>
+
+<entity name="Ocirc"
+ type="gen"
+>
+<text-expanded>&amp;#212;</text-expanded>
+<text>&amp;#212;</text>
+</entity>
+
+<entity name="OElig"
+ type="gen"
+>
+<text-expanded>&amp;#338;</text-expanded>
+<text>&amp;#338;</text>
+</entity>
+
+<entity name="isin"
+ type="gen"
+>
+<text-expanded>&amp;#8712;</text-expanded>
+<text>&amp;#8712;</text>
+</entity>
+
+<entity name="icirc"
+ type="gen"
+>
+<text-expanded>&amp;#238;</text-expanded>
+<text>&amp;#238;</text>
+</entity>
+
+<entity name="cup"
+ type="gen"
+>
+<text-expanded>&amp;#8746;</text-expanded>
+<text>&amp;#8746;</text>
+</entity>
+
+<entity name="zeta"
+ type="gen"
+>
+<text-expanded>&amp;#950;</text-expanded>
+<text>&amp;#950;</text>
+</entity>
+
+<entity name="pi"
+ type="gen"
+>
+<text-expanded>&amp;#960;</text-expanded>
+<text>&amp;#960;</text>
+</entity>
+
+<entity name="Ccedil"
+ type="gen"
+>
+<text-expanded>&amp;#199;</text-expanded>
+<text>&amp;#199;</text>
+</entity>
+
+<entity name="atilde"
+ type="gen"
+>
+<text-expanded>&amp;#227;</text-expanded>
+<text>&amp;#227;</text>
+</entity>
+
+<entity name="dArr"
+ type="gen"
+>
+<text-expanded>&amp;#8659;</text-expanded>
+<text>&amp;#8659;</text>
+</entity>
+
+<entity name="Yuml"
+ type="gen"
+>
+<text-expanded>&amp;#376;</text-expanded>
+<text>&amp;#376;</text>
+</entity>
+
+<entity name="uArr"
+ type="gen"
+>
+<text-expanded>&amp;#8657;</text-expanded>
+<text>&amp;#8657;</text>
+</entity>
+
+<entity name="there4"
+ type="gen"
+>
+<text-expanded>&amp;#8756;</text-expanded>
+<text>&amp;#8756;</text>
+</entity>
+
+<entity name="minus"
+ type="gen"
+>
+<text-expanded>&amp;#8722;</text-expanded>
+<text>&amp;#8722;</text>
+</entity>
+
+<entity name="upsilon"
+ type="gen"
+>
+<text-expanded>&amp;#965;</text-expanded>
+<text>&amp;#965;</text>
+</entity>
+
+<entity name="lrm"
+ type="gen"
+>
+<text-expanded>&amp;#8206;</text-expanded>
+<text>&amp;#8206;</text>
+</entity>
+
+<entity name="rho"
+ type="gen"
+>
+<text-expanded>&amp;#961;</text-expanded>
+<text>&amp;#961;</text>
+</entity>
+
+<entity name="lowast"
+ type="gen"
+>
+<text-expanded>&amp;#8727;</text-expanded>
+<text>&amp;#8727;</text>
+</entity>
+
+<entity name="xi"
+ type="gen"
+>
+<text-expanded>&amp;#958;</text-expanded>
+<text>&amp;#958;</text>
+</entity>
+
+<entity name="Prime"
+ type="gen"
+>
+<text-expanded>&amp;#8243;</text-expanded>
+<text>&amp;#8243;</text>
+</entity>
+
+<entity name="spades"
+ type="gen"
+>
+<text-expanded>&amp;#9824;</text-expanded>
+<text>&amp;#9824;</text>
+</entity>
+
+<entity name="lceil"
+ type="gen"
+>
+<text-expanded>&amp;#8968;</text-expanded>
+<text>&amp;#8968;</text>
+</entity>
+
+<entity name="hArr"
+ type="gen"
+>
+<text-expanded>&amp;#8660;</text-expanded>
+<text>&amp;#8660;</text>
+</entity>
+
+<entity name="alpha"
+ type="gen"
+>
+<text-expanded>&amp;#945;</text-expanded>
+<text>&amp;#945;</text>
+</entity>
+
+<entity name="iacute"
+ type="gen"
+>
+<text-expanded>&amp;#237;</text-expanded>
+<text>&amp;#237;</text>
+</entity>
+
+<entity name="lfloor"
+ type="gen"
+>
+<text-expanded>&amp;#8970;</text-expanded>
+<text>&amp;#8970;</text>
+</entity>
+
+<entity name="infin"
+ type="gen"
+>
+<text-expanded>&amp;#8734;</text-expanded>
+<text>&amp;#8734;</text>
+</entity>
+
+<entity name="image"
+ type="gen"
+>
+<text-expanded>&amp;#8465;</text-expanded>
+<text>&amp;#8465;</text>
+</entity>
+
+<entity name="sup1"
+ type="gen"
+>
+<text-expanded>&amp;#185;</text-expanded>
+<text>&amp;#185;</text>
+</entity>
+
+<entity name="ldquo"
+ type="gen"
+>
+<text-expanded>&amp;#8220;</text-expanded>
+<text>&amp;#8220;</text>
+</entity>
+
+<entity name="sup2"
+ type="gen"
+>
+<text-expanded>&amp;#178;</text-expanded>
+<text>&amp;#178;</text>
+</entity>
+
+<entity name="sup3"
+ type="gen"
+>
+<text-expanded>&amp;#179;</text-expanded>
+<text>&amp;#179;</text>
+</entity>
+
+<entity name="Beta"
+ type="gen"
+>
+<text-expanded>&amp;#914;</text-expanded>
+<text>&amp;#914;</text>
+</entity>
+
+<entity name="brvbar"
+ type="gen"
+>
+<text-expanded>&amp;#166;</text-expanded>
+<text>&amp;#166;</text>
+</entity>
+
+<entity name="oelig"
+ type="gen"
+>
+<text-expanded>&amp;#339;</text-expanded>
+<text>&amp;#339;</text>
+</entity>
+
+<entity name="ograve"
+ type="gen"
+>
+<text-expanded>&amp;#242;</text-expanded>
+<text>&amp;#242;</text>
+</entity>
+
+<entity name="rarr"
+ type="gen"
+>
+<text-expanded>&amp;#8594;</text-expanded>
+<text>&amp;#8594;</text>
+</entity>
+
+<entity name="Uacute"
+ type="gen"
+>
+<text-expanded>&amp;#218;</text-expanded>
+<text>&amp;#218;</text>
+</entity>
+
+<entity name="rsaquo"
+ type="gen"
+>
+<text-expanded>&amp;#8250;</text-expanded>
+<text>&amp;#8250;</text>
+</entity>
+
+<entity name="sub"
+ type="gen"
+>
+<text-expanded>&amp;#8834;</text-expanded>
+<text>&amp;#8834;</text>
+</entity>
+
+<entity name="zwj"
+ type="gen"
+>
+<text-expanded>&amp;#8205;</text-expanded>
+<text>&amp;#8205;</text>
+</entity>
+
+<entity name="perp"
+ type="gen"
+>
+<text-expanded>&amp;#8869;</text-expanded>
+<text>&amp;#8869;</text>
+</entity>
+
+<entity name="egrave"
+ type="gen"
+>
+<text-expanded>&amp;#232;</text-expanded>
+<text>&amp;#232;</text>
+</entity>
+
+<entity name="thorn"
+ type="gen"
+>
+<text-expanded>&amp;#254;</text-expanded>
+<text>&amp;#254;</text>
+</entity>
+
+<entity name="equiv"
+ type="gen"
+>
+<text-expanded>&amp;#8801;</text-expanded>
+<text>&amp;#8801;</text>
+</entity>
+
+<entity name="lArr"
+ type="gen"
+>
+<text-expanded>&amp;#8656;</text-expanded>
+<text>&amp;#8656;</text>
+</entity>
+
+<entity name="Aacute"
+ type="gen"
+>
+<text-expanded>&amp;#193;</text-expanded>
+<text>&amp;#193;</text>
+</entity>
+
+<entity name="amp"
+ type="gen"
+>
+<text-expanded>&amp;#38;#38;</text-expanded>
+<text>&amp;#38;#38;</text>
+</entity>
+
+<entity name="auml"
+ type="gen"
+>
+<text-expanded>&amp;#228;</text-expanded>
+<text>&amp;#228;</text>
+</entity>
+
+<entity name="ndash"
+ type="gen"
+>
+<text-expanded>&amp;#8211;</text-expanded>
+<text>&amp;#8211;</text>
+</entity>
+
+<entity name="Gamma"
+ type="gen"
+>
+<text-expanded>&amp;#915;</text-expanded>
+<text>&amp;#915;</text>
+</entity>
+
+<entity name="otimes"
+ type="gen"
+>
+<text-expanded>&amp;#8855;</text-expanded>
+<text>&amp;#8855;</text>
+</entity>
+
+<entity name="sum"
+ type="gen"
+>
+<text-expanded>&amp;#8721;</text-expanded>
+<text>&amp;#8721;</text>
+</entity>
+
+<entity name="Aring"
+ type="gen"
+>
+<text-expanded>&amp;#197;</text-expanded>
+<text>&amp;#197;</text>
+</entity>
+
+<entity name="pound"
+ type="gen"
+>
+<text-expanded>&amp;#163;</text-expanded>
+<text>&amp;#163;</text>
+</entity>
+
+<entity name="oplus"
+ type="gen"
+>
+<text-expanded>&amp;#8853;</text-expanded>
+<text>&amp;#8853;</text>
+</entity>
+
+<entity name="sup"
+ type="gen"
+>
+<text-expanded>&amp;#8835;</text-expanded>
+<text>&amp;#8835;</text>
+</entity>
+
+<entity name="Upsilon"
+ type="gen"
+>
+<text-expanded>&amp;#933;</text-expanded>
+<text>&amp;#933;</text>
+</entity>
+
+<entity name="exist"
+ type="gen"
+>
+<text-expanded>&amp;#8707;</text-expanded>
+<text>&amp;#8707;</text>
+</entity>
+
+<entity name="Eta"
+ type="gen"
+>
+<text-expanded>&amp;#919;</text-expanded>
+<text>&amp;#919;</text>
+</entity>
+
+<entity name="zwnj"
+ type="gen"
+>
+<text-expanded>&amp;#8204;</text-expanded>
+<text>&amp;#8204;</text>
+</entity>
+
+<entity name="Acirc"
+ type="gen"
+>
+<text-expanded>&amp;#194;</text-expanded>
+<text>&amp;#194;</text>
+</entity>
+
+<entity name="Lambda"
+ type="gen"
+>
+<text-expanded>&amp;#923;</text-expanded>
+<text>&amp;#923;</text>
+</entity>
+
+<entity name="Sigma"
+ type="gen"
+>
+<text-expanded>&amp;#931;</text-expanded>
+<text>&amp;#931;</text>
+</entity>
+
+<entity name="rsquo"
+ type="gen"
+>
+<text-expanded>&amp;#8217;</text-expanded>
+<text>&amp;#8217;</text>
+</entity>
+
+<entity name="AElig"
+ type="gen"
+>
+<text-expanded>&amp;#198;</text-expanded>
+<text>&amp;#198;</text>
+</entity>
+
+<entity name="deg"
+ type="gen"
+>
+<text-expanded>&amp;#176;</text-expanded>
+<text>&amp;#176;</text>
+</entity>
+
+<entity name="euml"
+ type="gen"
+>
+<text-expanded>&amp;#235;</text-expanded>
+<text>&amp;#235;</text>
+</entity>
+
+<entity name="ucirc"
+ type="gen"
+>
+<text-expanded>&amp;#251;</text-expanded>
+<text>&amp;#251;</text>
+</entity>
+
+<entity name="chi"
+ type="gen"
+>
+<text-expanded>&amp;#967;</text-expanded>
+<text>&amp;#967;</text>
+</entity>
+
+<entity name="and"
+ type="gen"
+>
+<text-expanded>&amp;#8743;</text-expanded>
+<text>&amp;#8743;</text>
+</entity>
+
+<entity name="omega"
+ type="gen"
+>
+<text-expanded>&amp;#969;</text-expanded>
+<text>&amp;#969;</text>
+</entity>
+
+<entity name="ang"
+ type="gen"
+>
+<text-expanded>&amp;#8736;</text-expanded>
+<text>&amp;#8736;</text>
+</entity>
+
+<entity name="THORN"
+ type="gen"
+>
+<text-expanded>&amp;#222;</text-expanded>
+<text>&amp;#222;</text>
+</entity>
+
+<entity name="Atilde"
+ type="gen"
+>
+<text-expanded>&amp;#195;</text-expanded>
+<text>&amp;#195;</text>
+</entity>
+
+<entity name="hellip"
+ type="gen"
+>
+<text-expanded>&amp;#8230;</text-expanded>
+<text>&amp;#8230;</text>
+</entity>
+
+<entity name="phi"
+ type="gen"
+>
+<text-expanded>&amp;#966;</text-expanded>
+<text>&amp;#966;</text>
+</entity>
+
+<entity name="szlig"
+ type="gen"
+>
+<text-expanded>&amp;#223;</text-expanded>
+<text>&amp;#223;</text>
+</entity>
+
+<entity name="Ecirc"
+ type="gen"
+>
+<text-expanded>&amp;#202;</text-expanded>
+<text>&amp;#202;</text>
+</entity>
+
+<entity name="iuml"
+ type="gen"
+>
+<text-expanded>&amp;#239;</text-expanded>
+<text>&amp;#239;</text>
+</entity>
+
+<entity name="nabla"
+ type="gen"
+>
+<text-expanded>&amp;#8711;</text-expanded>
+<text>&amp;#8711;</text>
+</entity>
+
+<entity name="scaron"
+ type="gen"
+>
+<text-expanded>&amp;#353;</text-expanded>
+<text>&amp;#353;</text>
+</entity>
+
+<entity name="macr"
+ type="gen"
+>
+<text-expanded>&amp;#175;</text-expanded>
+<text>&amp;#175;</text>
+</entity>
+
+<entity name="dagger"
+ type="gen"
+>
+<text-expanded>&amp;#8224;</text-expanded>
+<text>&amp;#8224;</text>
+</entity>
+
+<entity name="supe"
+ type="gen"
+>
+<text-expanded>&amp;#8839;</text-expanded>
+<text>&amp;#8839;</text>
+</entity>
+
+<entity name="ensp"
+ type="gen"
+>
+<text-expanded>&amp;#8194;</text-expanded>
+<text>&amp;#8194;</text>
+</entity>
+
+<entity name="cap"
+ type="gen"
+>
+<text-expanded>&amp;#8745;</text-expanded>
+<text>&amp;#8745;</text>
+</entity>
+
+<entity name="Iacute"
+ type="gen"
+>
+<text-expanded>&amp;#205;</text-expanded>
+<text>&amp;#205;</text>
+</entity>
+
+<entity name="aelig"
+ type="gen"
+>
+<text-expanded>&amp;#230;</text-expanded>
+<text>&amp;#230;</text>
+</entity>
+
+<entity name="Iota"
+ type="gen"
+>
+<text-expanded>&amp;#921;</text-expanded>
+<text>&amp;#921;</text>
+</entity>
+
+<entity name="Psi"
+ type="gen"
+>
+<text-expanded>&amp;#936;</text-expanded>
+<text>&amp;#936;</text>
+</entity>
+
+<entity name="nsub"
+ type="gen"
+>
+<text-expanded>&amp;#8836;</text-expanded>
+<text>&amp;#8836;</text>
+</entity>
+
+<entity name="Icirc"
+ type="gen"
+>
+<text-expanded>&amp;#206;</text-expanded>
+<text>&amp;#206;</text>
+</entity>
+
+<entity name="iexcl"
+ type="gen"
+>
+<text-expanded>&amp;#161;</text-expanded>
+<text>&amp;#161;</text>
+</entity>
+
+<entity name="Ograve"
+ type="gen"
+>
+<text-expanded>&amp;#210;</text-expanded>
+<text>&amp;#210;</text>
+</entity>
+
+<entity name="yen"
+ type="gen"
+>
+<text-expanded>&amp;#165;</text-expanded>
+<text>&amp;#165;</text>
+</entity>
+
+<entity name="Ouml"
+ type="gen"
+>
+<text-expanded>&amp;#214;</text-expanded>
+<text>&amp;#214;</text>
+</entity>
+
+<entity name="frac12"
+ type="gen"
+>
+<text-expanded>&amp;#189;</text-expanded>
+<text>&amp;#189;</text>
+</entity>
+
+<entity name="oslash"
+ type="gen"
+>
+<text-expanded>&amp;#248;</text-expanded>
+<text>&amp;#248;</text>
+</entity>
+
+<entity name="alefsym"
+ type="gen"
+>
+<text-expanded>&amp;#8501;</text-expanded>
+<text>&amp;#8501;</text>
+</entity>
+
+<entity name="Egrave"
+ type="gen"
+>
+<text-expanded>&amp;#200;</text-expanded>
+<text>&amp;#200;</text>
+</entity>
+
+<entity name="frac14"
+ type="gen"
+>
+<text-expanded>&amp;#188;</text-expanded>
+<text>&amp;#188;</text>
+</entity>
+
+<entity name="micro"
+ type="gen"
+>
+<text-expanded>&amp;#181;</text-expanded>
+<text>&amp;#181;</text>
+</entity>
+
+<entity name="real"
+ type="gen"
+>
+<text-expanded>&amp;#8476;</text-expanded>
+<text>&amp;#8476;</text>
+</entity>
+
+<entity name="int"
+ type="gen"
+>
+<text-expanded>&amp;#8747;</text-expanded>
+<text>&amp;#8747;</text>
+</entity>
+
+<entity name="Mu"
+ type="gen"
+>
+<text-expanded>&amp;#924;</text-expanded>
+<text>&amp;#924;</text>
+</entity>
+
+<entity name="bdquo"
+ type="gen"
+>
+<text-expanded>&amp;#8222;</text-expanded>
+<text>&amp;#8222;</text>
+</entity>
+
+<entity name="darr"
+ type="gen"
+>
+<text-expanded>&amp;#8595;</text-expanded>
+<text>&amp;#8595;</text>
+</entity>
+
+<entity name="permil"
+ type="gen"
+>
+<text-expanded>&amp;#8240;</text-expanded>
+<text>&amp;#8240;</text>
+</entity>
+
+<entity name="uarr"
+ type="gen"
+>
+<text-expanded>&amp;#8593;</text-expanded>
+<text>&amp;#8593;</text>
+</entity>
+
+<entity name="raquo"
+ type="gen"
+>
+<text-expanded>&amp;#187;</text-expanded>
+<text>&amp;#187;</text>
+</entity>
+
+<entity name="kappa"
+ type="gen"
+>
+<text-expanded>&amp;#954;</text-expanded>
+<text>&amp;#954;</text>
+</entity>
+
+<entity name="middot"
+ type="gen"
+>
+<text-expanded>&amp;#183;</text-expanded>
+<text>&amp;#183;</text>
+</entity>
+
+<entity name="times"
+ type="gen"
+>
+<text-expanded>&amp;#215;</text-expanded>
+<text>&amp;#215;</text>
+</entity>
+
+<entity name="sube"
+ type="gen"
+>
+<text-expanded>&amp;#8838;</text-expanded>
+<text>&amp;#8838;</text>
+</entity>
+
+<entity name="piv"
+ type="gen"
+>
+<text-expanded>&amp;#982;</text-expanded>
+<text>&amp;#982;</text>
+</entity>
+
+<entity name="sect"
+ type="gen"
+>
+<text-expanded>&amp;#167;</text-expanded>
+<text>&amp;#167;</text>
+</entity>
+
+<entity name="le"
+ type="gen"
+>
+<text-expanded>&amp;#8804;</text-expanded>
+<text>&amp;#8804;</text>
+</entity>
+
+<entity name="sbquo"
+ type="gen"
+>
+<text-expanded>&amp;#8218;</text-expanded>
+<text>&amp;#8218;</text>
+</entity>
+
+<entity name="plusmn"
+ type="gen"
+>
+<text-expanded>&amp;#177;</text-expanded>
+<text>&amp;#177;</text>
+</entity>
+
+<entity name="curren"
+ type="gen"
+>
+<text-expanded>&amp;#164;</text-expanded>
+<text>&amp;#164;</text>
+</entity>
+
+<entity name="Alpha"
+ type="gen"
+>
+<text-expanded>&amp;#913;</text-expanded>
+<text>&amp;#913;</text>
+</entity>
+
+<entity name="harr"
+ type="gen"
+>
+<text-expanded>&amp;#8596;</text-expanded>
+<text>&amp;#8596;</text>
+</entity>
+
+<entity name="not"
+ type="gen"
+>
+<text-expanded>&amp;#172;</text-expanded>
+<text>&amp;#172;</text>
+</entity>
+
+<entity name="uuml"
+ type="gen"
+>
+<text-expanded>&amp;#252;</text-expanded>
+<text>&amp;#252;</text>
+</entity>
+
+<entity name="yacute"
+ type="gen"
+>
+<text-expanded>&amp;#253;</text-expanded>
+<text>&amp;#253;</text>
+</entity>
+
+<entity name="cong"
+ type="gen"
+>
+<text-expanded>&amp;#8773;</text-expanded>
+<text>&amp;#8773;</text>
+</entity>
+
+<entity name="omicron"
+ type="gen"
+>
+<text-expanded>&amp;#959;</text-expanded>
+<text>&amp;#959;</text>
+</entity>
+
+<entity name="rfloor"
+ type="gen"
+>
+<text-expanded>&amp;#8971;</text-expanded>
+<text>&amp;#8971;</text>
+</entity>
+
+<entity name="oacute"
+ type="gen"
+>
+<text-expanded>&amp;#243;</text-expanded>
+<text>&amp;#243;</text>
+</entity>
+
+<entity name="trade"
+ type="gen"
+>
+<text-expanded>&amp;#8482;</text-expanded>
+<text>&amp;#8482;</text>
+</entity>
+
+<entity name="shy"
+ type="gen"
+>
+<text-expanded>&amp;#173;</text-expanded>
+<text>&amp;#173;</text>
+</entity>
+
+<entity name="Zeta"
+ type="gen"
+>
+<text-expanded>&amp;#918;</text-expanded>
+<text>&amp;#918;</text>
+</entity>
+
+<entity name="theta"
+ type="gen"
+>
+<text-expanded>&amp;#952;</text-expanded>
+<text>&amp;#952;</text>
+</entity>
+
+<entity name="ordf"
+ type="gen"
+>
+<text-expanded>&amp;#170;</text-expanded>
+<text>&amp;#170;</text>
+</entity>
+
+<entity name="eacute"
+ type="gen"
+>
+<text-expanded>&amp;#233;</text-expanded>
+<text>&amp;#233;</text>
+</entity>
+
+<entity name="thetasym"
+ type="gen"
+>
+<text-expanded>&amp;#977;</text-expanded>
+<text>&amp;#977;</text>
+</entity>
+
+<entity name="ugrave"
+ type="gen"
+>
+<text-expanded>&amp;#249;</text-expanded>
+<text>&amp;#249;</text>
+</entity>
+
+<entity name="apos"
+ type="gen"
+>
+<text-expanded>&amp;#39;</text-expanded>
+<text>&amp;#39;</text>
+</entity>
+
+<entity name="lt"
+ type="gen"
+>
+<text-expanded>&amp;#38;#60;</text-expanded>
+<text>&amp;#38;#60;</text>
+</entity>
+
+<entity name="fnof"
+ type="gen"
+>
+<text-expanded>&amp;#402;</text-expanded>
+<text>&amp;#402;</text>
+</entity>
+
+<entity name="ordm"
+ type="gen"
+>
+<text-expanded>&amp;#186;</text-expanded>
+<text>&amp;#186;</text>
+</entity>
+
+<entity name="para"
+ type="gen"
+>
+<text-expanded>&amp;#182;</text-expanded>
+<text>&amp;#182;</text>
+</entity>
+
+<entity name="larr"
+ type="gen"
+>
+<text-expanded>&amp;#8592;</text-expanded>
+<text>&amp;#8592;</text>
+</entity>
+
+<entity name="yuml"
+ type="gen"
+>
+<text-expanded>&amp;#255;</text-expanded>
+<text>&amp;#255;</text>
+</entity>
+
+<entity name="Nu"
+ type="gen"
+>
+<text-expanded>&amp;#925;</text-expanded>
+<text>&amp;#925;</text>
+</entity>
+
+<entity name="diams"
+ type="gen"
+>
+<text-expanded>&amp;#9830;</text-expanded>
+<text>&amp;#9830;</text>
+</entity>
+
+<entity name="agrave"
+ type="gen"
+>
+<text-expanded>&amp;#224;</text-expanded>
+<text>&amp;#224;</text>
+</entity>
+
+<entity name="divide"
+ type="gen"
+>
+<text-expanded>&amp;#247;</text-expanded>
+<text>&amp;#247;</text>
+</entity>
+
+<entity name="Scaron"
+ type="gen"
+>
+<text-expanded>&amp;#352;</text-expanded>
+<text>&amp;#352;</text>
+</entity>
+
+<entity name="rang"
+ type="gen"
+>
+<text-expanded>&amp;#9002;</text-expanded>
+<text>&amp;#9002;</text>
+</entity>
+
+<entity name="Dagger"
+ type="gen"
+>
+<text-expanded>&amp;#8225;</text-expanded>
+<text>&amp;#8225;</text>
+</entity>
+
+<entity name="Tau"
+ type="gen"
+>
+<text-expanded>&amp;#932;</text-expanded>
+<text>&amp;#932;</text>
+</entity>
+
+<entity name="nbsp"
+ type="gen"
+>
+<text-expanded>&amp;#160;</text-expanded>
+<text>&amp;#160;</text>
+</entity>
+
+<entity name="eta"
+ type="gen"
+>
+<text-expanded>&amp;#951;</text-expanded>
+<text>&amp;#951;</text>
+</entity>
+
+<entity name="sim"
+ type="gen"
+>
+<text-expanded>&amp;#8764;</text-expanded>
+<text>&amp;#8764;</text>
+</entity>
+
+<entity name="lsquo"
+ type="gen"
+>
+<text-expanded>&amp;#8216;</text-expanded>
+<text>&amp;#8216;</text>
+</entity>
+
+<entity name="rlm"
+ type="gen"
+>
+<text-expanded>&amp;#8207;</text-expanded>
+<text>&amp;#8207;</text>
+</entity>
+
+<entity name="delta"
+ type="gen"
+>
+<text-expanded>&amp;#948;</text-expanded>
+<text>&amp;#948;</text>
+</entity>
+
+<entity name="Ucirc"
+ type="gen"
+>
+<text-expanded>&amp;#219;</text-expanded>
+<text>&amp;#219;</text>
+</entity>
+
+<entity name="otilde"
+ type="gen"
+>
+<text-expanded>&amp;#245;</text-expanded>
+<text>&amp;#245;</text>
+</entity>
+
+<entity name="part"
+ type="gen"
+>
+<text-expanded>&amp;#8706;</text-expanded>
+<text>&amp;#8706;</text>
+</entity>
+
+<entity name="Omicron"
+ type="gen"
+>
+<text-expanded>&amp;#927;</text-expanded>
+<text>&amp;#927;</text>
+</entity>
+
+<entity name="eth"
+ type="gen"
+>
+<text-expanded>&amp;#240;</text-expanded>
+<text>&amp;#240;</text>
+</entity>
+
+<entity name="ocirc"
+ type="gen"
+>
+<text-expanded>&amp;#244;</text-expanded>
+<text>&amp;#244;</text>
+</entity>
+
+<entity name="Omega"
+ type="gen"
+>
+<text-expanded>&amp;#937;</text-expanded>
+<text>&amp;#937;</text>
+</entity>
+
+<entity name="beta"
+ type="gen"
+>
+<text-expanded>&amp;#946;</text-expanded>
+<text>&amp;#946;</text>
+</entity>
+
+<entity name="Oslash"
+ type="gen"
+>
+<text-expanded>&amp;#216;</text-expanded>
+<text>&amp;#216;</text>
+</entity>
+
+<entity name="epsilon"
+ type="gen"
+>
+<text-expanded>&amp;#949;</text-expanded>
+<text>&amp;#949;</text>
+</entity>
+
+<entity name="notin"
+ type="gen"
+>
+<text-expanded>&amp;#8713;</text-expanded>
+<text>&amp;#8713;</text>
+</entity>
+
+<entity name="empty"
+ type="gen"
+>
+<text-expanded>&amp;#8709;</text-expanded>
+<text>&amp;#8709;</text>
+</entity>
+
+<entity name="reg"
+ type="gen"
+>
+<text-expanded>&amp;#174;</text-expanded>
+<text>&amp;#174;</text>
+</entity>
+
+<entity name="hearts"
+ type="gen"
+>
+<text-expanded>&amp;#9829;</text-expanded>
+<text>&amp;#9829;</text>
+</entity>
+
+<entity name="Auml"
+ type="gen"
+>
+<text-expanded>&amp;#196;</text-expanded>
+<text>&amp;#196;</text>
+</entity>
+
+<entity name="frac34"
+ type="gen"
+>
+<text-expanded>&amp;#190;</text-expanded>
+<text>&amp;#190;</text>
+</entity>
+
+<entity name="mu"
+ type="gen"
+>
+<text-expanded>&amp;#956;</text-expanded>
+<text>&amp;#956;</text>
+</entity>
+
+<entity name="sdot"
+ type="gen"
+>
+<text-expanded>&amp;#8901;</text-expanded>
+<text>&amp;#8901;</text>
+</entity>
+
+<entity name="asymp"
+ type="gen"
+>
+<text-expanded>&amp;#8776;</text-expanded>
+<text>&amp;#8776;</text>
+</entity>
+
+<entity name="thinsp"
+ type="gen"
+>
+<text-expanded>&amp;#8201;</text-expanded>
+<text>&amp;#8201;</text>
+</entity>
+
+<entity name="cent"
+ type="gen"
+>
+<text-expanded>&amp;#162;</text-expanded>
+<text>&amp;#162;</text>
+</entity>
+
+<entity name="circ"
+ type="gen"
+>
+<text-expanded>&amp;#710;</text-expanded>
+<text>&amp;#710;</text>
+</entity>
+
+<entity name="sigmaf"
+ type="gen"
+>
+<text-expanded>&amp;#962;</text-expanded>
+<text>&amp;#962;</text>
+</entity>
+
+<entity name="Rho"
+ type="gen"
+>
+<text-expanded>&amp;#929;</text-expanded>
+<text>&amp;#929;</text>
+</entity>
+
+<element name="var"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="var">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="button"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="table"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="button.content"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="button">
+<attdecl>
+ %attrs;
+ %focus;
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ type (button|submit|reset) "submit"
+ disabled (disabled) #IMPLIED
+ </attdecl>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type=""
+ enumeration="yes"
+ value="button submit reset"
+ default="submit"/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="value"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="head"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <or-group occurrence="*">
+ <element-name name="script"/>
+ <element-name name="style"/>
+ <element-name name="meta"/>
+ <element-name name="link"/>
+ <element-name name="object"/>
+ <element-name name="isindex"/>
+ </or-group>
+ <or-group>
+ <sequence-group>
+ <element-name name="title"/>
+ <or-group occurrence="*">
+ <element-name name="script"/>
+ <element-name name="style"/>
+ <element-name name="meta"/>
+ <element-name name="link"/>
+ <element-name name="object"/>
+ <element-name name="isindex"/>
+ </or-group>
+ <sequence-group occurrence="?">
+ <element-name name="base"/>
+ <or-group occurrence="*">
+ <element-name name="script"/>
+ <element-name name="style"/>
+ <element-name name="meta"/>
+ <element-name name="link"/>
+ <element-name name="object"/>
+ <element-name name="isindex"/>
+ </or-group>
+ </sequence-group>
+ </sequence-group>
+ <sequence-group>
+ <element-name name="base"/>
+ <or-group occurrence="*">
+ <element-name name="script"/>
+ <element-name name="style"/>
+ <element-name name="meta"/>
+ <element-name name="link"/>
+ <element-name name="object"/>
+ <element-name name="isindex"/>
+ </or-group>
+ <sequence-group>
+ <element-name name="title"/>
+ <or-group occurrence="*">
+ <element-name name="script"/>
+ <element-name name="style"/>
+ <element-name name="meta"/>
+ <element-name name="link"/>
+ <element-name name="object"/>
+ <element-name name="isindex"/>
+ </or-group>
+ </sequence-group>
+ </sequence-group>
+ </or-group>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="head.misc"/>
+ <or-group>
+ <sequence-group>
+ <element-name name="title"/>
+ <parament-name name="head.misc"/>
+ <sequence-group occurrence="?">
+ <element-name name="base"/>
+ <parament-name name="head.misc"/>
+ </sequence-group>
+ </sequence-group>
+ <sequence-group>
+ <element-name name="base"/>
+ <parament-name name="head.misc"/>
+ <sequence-group>
+ <element-name name="title"/>
+ <parament-name name="head.misc"/>
+ </sequence-group>
+ </sequence-group>
+ </or-group>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="head">
+<attdecl>
+ %i18n;
+ id ID #IMPLIED
+ profile %URI; #IMPLIED
+ </attdecl>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="profile"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="map"
+ content-type="element">
+<content-model-expanded>
+ <or-group>
+ <or-group occurrence="+">
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+ <element-name name="area" occurrence="+"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group>
+ <or-group occurrence="+">
+ <parament-name name="block"/>
+ <element-name name="form"/>
+ <parament-name name="misc"/>
+ </or-group>
+ <element-name name="area" occurrence="+"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="map">
+<attdecl>
+ %i18n;
+ %events;
+ id ID #REQUIRED
+ class CDATA #IMPLIED
+ style %StyleSheet; #IMPLIED
+ title %Text; #IMPLIED
+ name NMTOKEN #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#REQUIRED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="img"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="img">
+<attdecl>
+ %attrs;
+ src %URI; #REQUIRED
+ alt %Text; #REQUIRED
+ name NMTOKEN #IMPLIED
+ longdesc %URI; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ usemap %URI; #IMPLIED
+ ismap (ismap) #IMPLIED
+ align %ImgAlign; #IMPLIED
+ border %Pixels; #IMPLIED
+ hspace %Pixels; #IMPLIED
+ vspace %Pixels; #IMPLIED
+ </attdecl>
+<attribute name="ismap"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ismap"
+ default=""/>
+<attribute name="longdesc"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="vspace"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="src"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="hspace"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="height"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="alt"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="border"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom left right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="usemap"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="h1"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="h1">
+<attdecl>
+ %attrs;
+ %TextAlign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="samp"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="samp">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="h2"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="h2">
+<attdecl>
+ %attrs;
+ %TextAlign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="h3"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="h3">
+<attdecl>
+ %attrs;
+ %TextAlign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="object"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="param"/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="param"/>
+ <parament-name name="block"/>
+ <element-name name="form"/>
+ <parament-name name="inline"/>
+ <parament-name name="misc"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="object">
+<attdecl>
+ %attrs;
+ declare (declare) #IMPLIED
+ classid %URI; #IMPLIED
+ codebase %URI; #IMPLIED
+ data %URI; #IMPLIED
+ type %ContentType; #IMPLIED
+ codetype %ContentType; #IMPLIED
+ archive %UriList; #IMPLIED
+ standby %Text; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ usemap %URI; #IMPLIED
+ name NMTOKEN #IMPLIED
+ tabindex %Number; #IMPLIED
+ align %ImgAlign; #IMPLIED
+ border %Pixels; #IMPLIED
+ hspace %Pixels; #IMPLIED
+ vspace %Pixels; #IMPLIED
+ </attdecl>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="archive"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="codetype"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="hspace"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="border"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="standby"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom left right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="codebase"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="vspace"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="data"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="classid"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="height"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="declare"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="declare"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="usemap"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="h4"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="h4">
+<attdecl>
+ %attrs;
+ %TextAlign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="h5"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="h5">
+<attdecl>
+ %attrs;
+ %TextAlign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="fieldset"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="legend"/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="legend"/>
+ <parament-name name="block"/>
+ <element-name name="form"/>
+ <parament-name name="inline"/>
+ <parament-name name="misc"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="fieldset">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="h6"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="h6">
+<attdecl>
+ %attrs;
+ %TextAlign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="tbody"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="tr"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="tr"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="tbody">
+<attdecl>
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="del"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="del">
+<attdecl>
+ %attrs;
+ cite %URI; #IMPLIED
+ datetime %Datetime; #IMPLIED
+ </attdecl>
+<attribute name="cite"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="datetime"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="tfoot"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="tr"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="tr"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="tfoot">
+<attdecl>
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="acronym"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="acronym">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="basefont"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="basefont">
+<attdecl>
+ id ID #IMPLIED
+ size CDATA #REQUIRED
+ color %Color; #IMPLIED
+ face CDATA #IMPLIED
+ </attdecl>
+<attribute name="face"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="size"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="color"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="iframe"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="iframe">
+<attdecl>
+ %coreattrs;
+ longdesc %URI; #IMPLIED
+ name NMTOKEN #IMPLIED
+ src %URI; #IMPLIED
+ frameborder (1|0) "1"
+ marginwidth %Pixels; #IMPLIED
+ marginheight %Pixels; #IMPLIED
+ scrolling (yes|no|auto) "auto"
+ align %ImgAlign; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ </attdecl>
+<attribute name="marginheight"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="longdesc"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="scrolling"
+ type=""
+ enumeration="yes"
+ value="yes no auto"
+ default="auto"/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="frameborder"
+ type=""
+ enumeration="yes"
+ value="1"
+ default="1"/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="height"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="src"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom left right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="marginwidth"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="option"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="option">
+<attdecl>
+ %attrs;
+ selected (selected) #IMPLIED
+ disabled (disabled) #IMPLIED
+ label %Text; #IMPLIED
+ value CDATA #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="label"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="selected"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="selected"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="value"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="colgroup"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="*">
+ <element-name name="col"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <element-name name="col"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="colgroup">
+<attdecl>
+ %attrs;
+ span %Number; "1"
+ width %MultiLength; #IMPLIED
+ %cellhalign;
+ %cellvalign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="span"
+ type=""
+ value="CDATA"
+ default="1"/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="caption"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="caption">
+<attdecl>
+ %attrs;
+ align %CAlign; #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top bottom left right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="dir"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="li"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="li"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="dir">
+<attdecl>
+ %attrs;
+ compact (compact) #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="compact"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="compact"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="noframes"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="body"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="body"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="noframes">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="div"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="div">
+<attdecl>
+ %attrs;
+ %TextAlign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="menu"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="li"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="li"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="menu">
+<attdecl>
+ %attrs;
+ compact (compact) #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="compact"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="compact"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="font"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="font">
+<attdecl>
+ %coreattrs;
+ %i18n;
+ size CDATA #IMPLIED
+ color %Color; #IMPLIED
+ face CDATA #IMPLIED
+ </attdecl>
+<attribute name="face"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="size"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="color"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="form"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="form.content"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="form">
+<attdecl>
+ %attrs;
+ action %URI; #REQUIRED
+ method (get|post) "get"
+ name NMTOKEN #IMPLIED
+ enctype %ContentType; "application/x-www-form-urlencoded"
+ onsubmit %Script; #IMPLIED
+ onreset %Script; #IMPLIED
+ accept %ContentTypes; #IMPLIED
+ accept-charset %Charsets; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ </attdecl>
+<attribute name="accept-charset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onsubmit"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="method"
+ type=""
+ enumeration="yes"
+ value="get post"
+ default="get"/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="target"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="accept"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onreset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="enctype"
+ type=""
+ value="CDATA"
+ default="application/x-www-form-urlencoded"/>
+<attribute name="action"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="bdo"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="bdo">
+<attdecl>
+ %coreattrs;
+ %events;
+ lang %LanguageCode; #IMPLIED
+ xml:lang %LanguageCode; #IMPLIED
+ dir (ltr|rtl) #REQUIRED
+ </attdecl>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#REQUIRED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="strike"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="strike">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="label"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="label">
+<attdecl>
+ %attrs;
+ for IDREF #IMPLIED
+ accesskey %Character; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ </attdecl>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="for"
+ type="#IMPLIED"
+ value="IDREF"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="abbr"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="abbr">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="noscript"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="noscript">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="dfn"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="dfn">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="center"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="center">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="ol"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="li"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="li"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="ol">
+<attdecl>
+ %attrs;
+ type %OLStyle; #IMPLIED
+ compact (compact) #IMPLIED
+ start %Number; #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="compact"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="compact"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="start"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="area"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="area">
+<attdecl>
+ %attrs;
+ %focus;
+ shape %Shape; "rect"
+ coords %Coords; #IMPLIED
+ href %URI; #IMPLIED
+ nohref (nohref) #IMPLIED
+ alt %Text; #REQUIRED
+ target %FrameTarget; #IMPLIED
+ </attdecl>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="target"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="href"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="shape"
+ type=""
+ enumeration="yes"
+ value="rect circle poly default"
+ default="rect"/>
+<attribute name="alt"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="nohref"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="nohref"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="coords"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="dd"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="dd">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="ins"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="ins">
+<attdecl>
+ %attrs;
+ cite %URI; #IMPLIED
+ datetime %Datetime; #IMPLIED
+ </attdecl>
+<attribute name="cite"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="datetime"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="frame"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="frame">
+<attdecl>
+ %coreattrs;
+ longdesc %URI; #IMPLIED
+ name NMTOKEN #IMPLIED
+ src %URI; #IMPLIED
+ frameborder (1|0) "1"
+ marginwidth %Pixels; #IMPLIED
+ marginheight %Pixels; #IMPLIED
+ noresize (noresize) #IMPLIED
+ scrolling (yes|no|auto) "auto"
+ </attdecl>
+<attribute name="marginheight"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="longdesc"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="scrolling"
+ type=""
+ enumeration="yes"
+ value="yes no auto"
+ default="auto"/>
+<attribute name="frameborder"
+ type=""
+ enumeration="yes"
+ value="1"
+ default="1"/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="noresize"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="noresize"
+ default=""/>
+<attribute name="src"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="marginwidth"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="span"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="span">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="dl"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="+">
+ <element-name name="dt"/>
+ <element-name name="dd"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="+">
+ <element-name name="dt"/>
+ <element-name name="dd"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="dl">
+<attdecl>
+ %attrs;
+ compact (compact) #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="compact"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="compact"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="address"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="address">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="table"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="caption" occurrence="?"/>
+ <or-group>
+ <element-name name="col" occurrence="*"/>
+ <element-name name="colgroup" occurrence="*"/>
+ </or-group>
+ <element-name name="thead" occurrence="?"/>
+ <element-name name="tfoot" occurrence="?"/>
+ <or-group>
+ <element-name name="tbody" occurrence="+"/>
+ <element-name name="tr" occurrence="+"/>
+ </or-group>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="caption" occurrence="?"/>
+ <or-group>
+ <element-name name="col" occurrence="*"/>
+ <element-name name="colgroup" occurrence="*"/>
+ </or-group>
+ <element-name name="thead" occurrence="?"/>
+ <element-name name="tfoot" occurrence="?"/>
+ <or-group>
+ <element-name name="tbody" occurrence="+"/>
+ <element-name name="tr" occurrence="+"/>
+ </or-group>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="table">
+<attdecl>
+ %attrs;
+ summary %Text; #IMPLIED
+ width %Length; #IMPLIED
+ border %Pixels; #IMPLIED
+ frame %TFrame; #IMPLIED
+ rules %TRules; #IMPLIED
+ cellspacing %Length; #IMPLIED
+ cellpadding %Length; #IMPLIED
+ align %TAlign; #IMPLIED
+ bgcolor %Color; #IMPLIED
+ </attdecl>
+<attribute name="rules"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="none groups rows cols all"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="bgcolor"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="summary"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="cellspacing"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="frame"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="void above below hsides lhs rhs vsides box border"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="cellpadding"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="border"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="legend"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="legend">
+<attdecl>
+ %attrs;
+ accesskey %Character; #IMPLIED
+ align %LAlign; #IMPLIED
+ </attdecl>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top bottom left right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="cite"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="cite">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="base"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="base">
+<attdecl>
+ id ID #IMPLIED
+ href %URI; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ </attdecl>
+<attribute name="href"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="target"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+</attlist>
+
+<element name="dt"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="dt">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="body"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="body">
+<attdecl>
+ %attrs;
+ onload %Script; #IMPLIED
+ onunload %Script; #IMPLIED
+ background %URI; #IMPLIED
+ bgcolor %Color; #IMPLIED
+ text %Color; #IMPLIED
+ link %Color; #IMPLIED
+ vlink %Color; #IMPLIED
+ alink %Color; #IMPLIED
+ </attdecl>
+<attribute name="background"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="alink"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="bgcolor"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="vlink"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="text"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onload"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onunload"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="link"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="li"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="li">
+<attdecl>
+ %attrs;
+ type %LIStyle; #IMPLIED
+ value %Number; #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="value"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="hr"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="hr">
+<attdecl>
+ %attrs;
+ align (left|center|right) #IMPLIED
+ noshade (noshade) #IMPLIED
+ size %Pixels; #IMPLIED
+ width %Length; #IMPLIED
+ </attdecl>
+<attribute name="noshade"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="noshade"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="size"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="big"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="big">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="thead"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="tr"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="tr"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="thead">
+<attdecl>
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="small"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="small">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="applet"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="param"/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="param"/>
+ <parament-name name="block"/>
+ <element-name name="form"/>
+ <parament-name name="inline"/>
+ <parament-name name="misc"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="applet">
+<attdecl>
+ %coreattrs;
+ codebase %URI; #IMPLIED
+ archive CDATA #IMPLIED
+ code CDATA #IMPLIED
+ object CDATA #IMPLIED
+ alt %Text; #IMPLIED
+ name NMTOKEN #IMPLIED
+ width %Length; #REQUIRED
+ height %Length; #REQUIRED
+ align %ImgAlign; #IMPLIED
+ hspace %Pixels; #IMPLIED
+ vspace %Pixels; #IMPLIED
+ </attdecl>
+<attribute name="hspace"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="codebase"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="code"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="width"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="vspace"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="archive"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="object"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="height"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="alt"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom left right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+</attlist>
+
+<element name="script"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="script">
+<attdecl>
+ id ID #IMPLIED
+ charset %Charset; #IMPLIED
+ type %ContentType; #REQUIRED
+ language CDATA #IMPLIED
+ src %URI; #IMPLIED
+ defer (defer) #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ </attdecl>
+<attribute name="charset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:space"
+ type="#FIXED"
+ enumeration="yes"
+ value="preserve"
+ default="preserve"/>
+<attribute name="src"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="language"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="defer"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="defer"
+ default=""/>
+<attribute name="type"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="optgroup"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="option"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="option"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="optgroup">
+<attdecl>
+ %attrs;
+ disabled (disabled) #IMPLIED
+ label %Text; #REQUIRED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="label"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="td"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="td">
+<attdecl>
+ %attrs;
+ abbr %Text; #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ scope %Scope; #IMPLIED
+ rowspan %Number; "1"
+ colspan %Number; "1"
+ %cellhalign;
+ %cellvalign;
+ nowrap (nowrap) #IMPLIED
+ bgcolor %Color; #IMPLIED
+ width %Pixels; #IMPLIED
+ height %Pixels; #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="headers"
+ type="#IMPLIED"
+ value="IDREFS"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="abbr"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="scope"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="row col rowgroup colgroup"
+ default=""/>
+<attribute name="bgcolor"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="colspan"
+ type=""
+ value="CDATA"
+ default="1"/>
+<attribute name="rowspan"
+ type=""
+ value="CDATA"
+ default="1"/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="nowrap"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="nowrap"
+ default=""/>
+<attribute name="height"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="axis"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="title"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="title">
+<attdecl>
+ %i18n;
+ id ID #IMPLIED
+ </attdecl>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+</attlist>
+
+<element name="kbd"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="kbd">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="th"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="th">
+<attdecl>
+ %attrs;
+ abbr %Text; #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ scope %Scope; #IMPLIED
+ rowspan %Number; "1"
+ colspan %Number; "1"
+ %cellhalign;
+ %cellvalign;
+ nowrap (nowrap) #IMPLIED
+ bgcolor %Color; #IMPLIED
+ width %Pixels; #IMPLIED
+ height %Pixels; #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="headers"
+ type="#IMPLIED"
+ value="IDREFS"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="abbr"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="scope"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="row col rowgroup colgroup"
+ default=""/>
+<attribute name="bgcolor"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="colspan"
+ type=""
+ value="CDATA"
+ default="1"/>
+<attribute name="rowspan"
+ type=""
+ value="CDATA"
+ default="1"/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="nowrap"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="nowrap"
+ default=""/>
+<attribute name="height"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="axis"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="textarea"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="textarea">
+<attdecl>
+ %attrs;
+ %focus;
+ name CDATA #IMPLIED
+ rows %Number; #REQUIRED
+ cols %Number; #REQUIRED
+ disabled (disabled) #IMPLIED
+ readonly (readonly) #IMPLIED
+ onselect %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ </attdecl>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="rows"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onchange"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="cols"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onselect"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="readonly"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="readonly"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="meta"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="meta">
+<attdecl>
+ %i18n;
+ id ID #IMPLIED
+ http-equiv CDATA #IMPLIED
+ name CDATA #IMPLIED
+ content CDATA #REQUIRED
+ scheme CDATA #IMPLIED
+ </attdecl>
+<attribute name="scheme"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="http-equiv"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="content"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+</attlist>
+
+<element name="frameset"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="frameset"/>
+ <element-name name="frame"/>
+ <element-name name="noframes"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="*">
+ <element-name name="frameset"/>
+ <element-name name="frame"/>
+ <element-name name="noframes"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="frameset">
+<attdecl>
+ %coreattrs;
+ rows %MultiLengths; #IMPLIED
+ cols %MultiLengths; #IMPLIED
+ onload %Script; #IMPLIED
+ onunload %Script; #IMPLIED
+ </attdecl>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="cols"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onunload"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="rows"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onload"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="em"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="em">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="link"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="link">
+<attdecl>
+ %attrs;
+ charset %Charset; #IMPLIED
+ href %URI; #IMPLIED
+ hreflang %LanguageCode; #IMPLIED
+ type %ContentType; #IMPLIED
+ rel %LinkTypes; #IMPLIED
+ rev %LinkTypes; #IMPLIED
+ media %MediaDesc; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ </attdecl>
+<attribute name="rev"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="media"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="hreflang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="target"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="href"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="rel"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="tr"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="+">
+ <element-name name="th"/>
+ <element-name name="td"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="+">
+ <element-name name="th"/>
+ <element-name name="td"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="tr">
+<attdecl>
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ bgcolor %Color; #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="bgcolor"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="strong"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="strong">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="pre"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="pre.content"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="pre">
+<attdecl>
+ %attrs;
+ width %Number; #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:space"
+ type="#FIXED"
+ enumeration="yes"
+ value="preserve"
+ default="preserve"/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="tt"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="tt">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="input"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="input">
+<attdecl>
+ %attrs;
+ %focus;
+ type %InputType; "text"
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ checked (checked) #IMPLIED
+ disabled (disabled) #IMPLIED
+ readonly (readonly) #IMPLIED
+ size CDATA #IMPLIED
+ maxlength %Number; #IMPLIED
+ src %URI; #IMPLIED
+ alt CDATA #IMPLIED
+ usemap %URI; #IMPLIED
+ onselect %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ accept %ContentTypes; #IMPLIED
+ align %ImgAlign; #IMPLIED
+ </attdecl>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="src"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="size"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="checked"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="checked"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="value"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="accept"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="alt"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom left right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="maxlength"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type=""
+ enumeration="yes"
+ value="text password checkbox radio submit reset file hidden image button"
+ default="text"/>
+<attribute name="onchange"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onselect"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="readonly"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="readonly"
+ default=""/>
+<attribute name="usemap"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="a"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="a.content"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="a">
+<attdecl>
+ %attrs;
+ %focus;
+ charset %Charset; #IMPLIED
+ type %ContentType; #IMPLIED
+ name NMTOKEN #IMPLIED
+ href %URI; #IMPLIED
+ hreflang %LanguageCode; #IMPLIED
+ rel %LinkTypes; #IMPLIED
+ rev %LinkTypes; #IMPLIED
+ shape %Shape; "rect"
+ coords %Coords; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ </attdecl>
+<attribute name="rev"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="hreflang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="target"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="href"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="rel"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="shape"
+ type=""
+ enumeration="yes"
+ value="rect circle poly default"
+ default="rect"/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="coords"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="b"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="b">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="style"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="style">
+<attdecl>
+ %i18n;
+ id ID #IMPLIED
+ type %ContentType; #REQUIRED
+ media %MediaDesc; #IMPLIED
+ title %Text; #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ </attdecl>
+<attribute name="xml:space"
+ type="#FIXED"
+ enumeration="yes"
+ value="preserve"
+ default="preserve"/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="media"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="type"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="param"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="param">
+<attdecl>
+ id ID #IMPLIED
+ name CDATA #REQUIRED
+ value CDATA #IMPLIED
+ valuetype (data|ref|object) "data"
+ type %ContentType; #IMPLIED
+ </attdecl>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="value"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="valuetype"
+ type=""
+ enumeration="yes"
+ value="data ref object"
+ default="data"/>
+<attribute name="name"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="i"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="i">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="html"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="head"/>
+ <element-name name="frameset"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="head"/>
+ <element-name name="frameset"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="html">
+<attdecl>
+ %i18n;
+ id ID #IMPLIED
+ xmlns %URI; #FIXED 'http://www.w3.org/1999/xhtml'
+ </attdecl>
+<attribute name="xmlns"
+ type="#FIXED"
+ value="CDATA"
+ default="http://www.w3.org/1999/xhtml"/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+</attlist>
+
+<element name="sub"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="sub">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="code"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="code">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="blockquote"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="blockquote">
+<attdecl>
+ %attrs;
+ cite %URI; #IMPLIED
+ </attdecl>
+<attribute name="cite"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="p"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="p">
+<attdecl>
+ %attrs;
+ %TextAlign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="q"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="q">
+<attdecl>
+ %attrs;
+ cite %URI; #IMPLIED
+ </attdecl>
+<attribute name="cite"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="s"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="s">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="select"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="+">
+ <element-name name="optgroup"/>
+ <element-name name="option"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="+">
+ <element-name name="optgroup"/>
+ <element-name name="option"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="select">
+<attdecl>
+ %attrs;
+ name CDATA #IMPLIED
+ size %Number; #IMPLIED
+ multiple (multiple) #IMPLIED
+ disabled (disabled) #IMPLIED
+ tabindex %Number; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ </attdecl>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="size"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onchange"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="multiple"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="multiple"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="u"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="u">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="isindex"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="isindex">
+<attdecl>
+ %coreattrs;
+ %i18n;
+ prompt %Text; #IMPLIED
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="prompt"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+</attlist>
+
+<element name="col"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="col">
+<attdecl>
+ %attrs;
+ span %Number; "1"
+ width %MultiLength; #IMPLIED
+ %cellhalign;
+ %cellvalign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="span"
+ type=""
+ value="CDATA"
+ default="1"/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="br"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="br">
+<attdecl>
+ %coreattrs;
+ clear (left|all|right|none) "none"
+ </attdecl>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="clear"
+ type=""
+ enumeration="yes"
+ value="left all right none"
+ default="none"/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+</attlist>
+
+<element name="ul"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="li"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="li"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="ul">
+<attdecl>
+ %attrs;
+ type %ULStyle; #IMPLIED
+ compact (compact) #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="compact"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="compact"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disc square circle"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="sup"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="sup">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+</dtd>
diff --git a/kate/xmltools/xhtml1-strict.dtd.xml b/kate/xmltools/xhtml1-strict.dtd.xml
new file mode 100644
index 0000000..907cd86
--- /dev/null
+++ b/kate/xmltools/xhtml1-strict.dtd.xml
@@ -0,0 +1,11629 @@
+<!DOCTYPE dtd PUBLIC "-//Norman Walsh//DTD DTDParse V2.0//EN"
+ "dtd.dtd" [
+<!ENTITY nbsp "&#160;">
+<!ENTITY iexcl "&#161;">
+<!ENTITY cent "&#162;">
+<!ENTITY pound "&#163;">
+<!ENTITY curren "&#164;">
+<!ENTITY yen "&#165;">
+<!ENTITY brvbar "&#166;">
+<!ENTITY sect "&#167;">
+<!ENTITY uml "&#168;">
+<!ENTITY copy "&#169;">
+<!ENTITY ordf "&#170;">
+<!ENTITY laquo "&#171;">
+<!ENTITY not "&#172;">
+<!ENTITY shy "&#173;">
+<!ENTITY reg "&#174;">
+<!ENTITY macr "&#175;">
+<!ENTITY deg "&#176;">
+<!ENTITY plusmn "&#177;">
+<!ENTITY sup2 "&#178;">
+<!ENTITY sup3 "&#179;">
+<!ENTITY acute "&#180;">
+<!ENTITY micro "&#181;">
+<!ENTITY para "&#182;">
+<!ENTITY middot "&#183;">
+<!ENTITY cedil "&#184;">
+<!ENTITY sup1 "&#185;">
+<!ENTITY ordm "&#186;">
+<!ENTITY raquo "&#187;">
+<!ENTITY frac14 "&#188;">
+<!ENTITY frac12 "&#189;">
+<!ENTITY frac34 "&#190;">
+<!ENTITY iquest "&#191;">
+<!ENTITY Agrave "&#192;">
+<!ENTITY Aacute "&#193;">
+<!ENTITY Acirc "&#194;">
+<!ENTITY Atilde "&#195;">
+<!ENTITY Auml "&#196;">
+<!ENTITY Aring "&#197;">
+<!ENTITY AElig "&#198;">
+<!ENTITY Ccedil "&#199;">
+<!ENTITY Egrave "&#200;">
+<!ENTITY Eacute "&#201;">
+<!ENTITY Ecirc "&#202;">
+<!ENTITY Euml "&#203;">
+<!ENTITY Igrave "&#204;">
+<!ENTITY Iacute "&#205;">
+<!ENTITY Icirc "&#206;">
+<!ENTITY Iuml "&#207;">
+<!ENTITY ETH "&#208;">
+<!ENTITY Ntilde "&#209;">
+<!ENTITY Ograve "&#210;">
+<!ENTITY Oacute "&#211;">
+<!ENTITY Ocirc "&#212;">
+<!ENTITY Otilde "&#213;">
+<!ENTITY Ouml "&#214;">
+<!ENTITY times "&#215;">
+<!ENTITY Oslash "&#216;">
+<!ENTITY Ugrave "&#217;">
+<!ENTITY Uacute "&#218;">
+<!ENTITY Ucirc "&#219;">
+<!ENTITY Uuml "&#220;">
+<!ENTITY Yacute "&#221;">
+<!ENTITY THORN "&#222;">
+<!ENTITY szlig "&#223;">
+<!ENTITY agrave "&#224;">
+<!ENTITY aacute "&#225;">
+<!ENTITY acirc "&#226;">
+<!ENTITY atilde "&#227;">
+<!ENTITY auml "&#228;">
+<!ENTITY aring "&#229;">
+<!ENTITY aelig "&#230;">
+<!ENTITY ccedil "&#231;">
+<!ENTITY egrave "&#232;">
+<!ENTITY eacute "&#233;">
+<!ENTITY ecirc "&#234;">
+<!ENTITY euml "&#235;">
+<!ENTITY igrave "&#236;">
+<!ENTITY iacute "&#237;">
+<!ENTITY icirc "&#238;">
+<!ENTITY iuml "&#239;">
+<!ENTITY eth "&#240;">
+<!ENTITY ntilde "&#241;">
+<!ENTITY ograve "&#242;">
+<!ENTITY oacute "&#243;">
+<!ENTITY ocirc "&#244;">
+<!ENTITY otilde "&#245;">
+<!ENTITY ouml "&#246;">
+<!ENTITY divide "&#247;">
+<!ENTITY oslash "&#248;">
+<!ENTITY ugrave "&#249;">
+<!ENTITY uacute "&#250;">
+<!ENTITY ucirc "&#251;">
+<!ENTITY uuml "&#252;">
+<!ENTITY yacute "&#253;">
+<!ENTITY thorn "&#254;">
+<!ENTITY yuml "&#255;">
+<!ENTITY fnof "&#402;">
+<!ENTITY Alpha "&#913;">
+<!ENTITY Beta "&#914;">
+<!ENTITY Gamma "&#915;">
+<!ENTITY Delta "&#916;">
+<!ENTITY Epsilon "&#917;">
+<!ENTITY Zeta "&#918;">
+<!ENTITY Eta "&#919;">
+<!ENTITY Theta "&#920;">
+<!ENTITY Iota "&#921;">
+<!ENTITY Kappa "&#922;">
+<!ENTITY Lambda "&#923;">
+<!ENTITY Mu "&#924;">
+<!ENTITY Nu "&#925;">
+<!ENTITY Xi "&#926;">
+<!ENTITY Omicron "&#927;">
+<!ENTITY Pi "&#928;">
+<!ENTITY Rho "&#929;">
+<!ENTITY Sigma "&#931;">
+<!ENTITY Tau "&#932;">
+<!ENTITY Upsilon "&#933;">
+<!ENTITY Phi "&#934;">
+<!ENTITY Chi "&#935;">
+<!ENTITY Psi "&#936;">
+<!ENTITY Omega "&#937;">
+<!ENTITY alpha "&#945;">
+<!ENTITY beta "&#946;">
+<!ENTITY gamma "&#947;">
+<!ENTITY delta "&#948;">
+<!ENTITY epsilon "&#949;">
+<!ENTITY zeta "&#950;">
+<!ENTITY eta "&#951;">
+<!ENTITY theta "&#952;">
+<!ENTITY iota "&#953;">
+<!ENTITY kappa "&#954;">
+<!ENTITY lambda "&#955;">
+<!ENTITY mu "&#956;">
+<!ENTITY nu "&#957;">
+<!ENTITY xi "&#958;">
+<!ENTITY omicron "&#959;">
+<!ENTITY pi "&#960;">
+<!ENTITY rho "&#961;">
+<!ENTITY sigmaf "&#962;">
+<!ENTITY sigma "&#963;">
+<!ENTITY tau "&#964;">
+<!ENTITY upsilon "&#965;">
+<!ENTITY phi "&#966;">
+<!ENTITY chi "&#967;">
+<!ENTITY psi "&#968;">
+<!ENTITY omega "&#969;">
+<!ENTITY thetasym "&#977;">
+<!ENTITY upsih "&#978;">
+<!ENTITY piv "&#982;">
+<!ENTITY bull "&#8226;">
+<!ENTITY hellip "&#8230;">
+<!ENTITY prime "&#8242;">
+<!ENTITY Prime "&#8243;">
+<!ENTITY oline "&#8254;">
+<!ENTITY frasl "&#8260;">
+<!ENTITY weierp "&#8472;">
+<!ENTITY image "&#8465;">
+<!ENTITY real "&#8476;">
+<!ENTITY trade "&#8482;">
+<!ENTITY alefsym "&#8501;">
+<!ENTITY larr "&#8592;">
+<!ENTITY uarr "&#8593;">
+<!ENTITY rarr "&#8594;">
+<!ENTITY darr "&#8595;">
+<!ENTITY harr "&#8596;">
+<!ENTITY crarr "&#8629;">
+<!ENTITY lArr "&#8656;">
+<!ENTITY uArr "&#8657;">
+<!ENTITY rArr "&#8658;">
+<!ENTITY dArr "&#8659;">
+<!ENTITY hArr "&#8660;">
+<!ENTITY forall "&#8704;">
+<!ENTITY part "&#8706;">
+<!ENTITY exist "&#8707;">
+<!ENTITY empty "&#8709;">
+<!ENTITY nabla "&#8711;">
+<!ENTITY isin "&#8712;">
+<!ENTITY notin "&#8713;">
+<!ENTITY ni "&#8715;">
+<!ENTITY prod "&#8719;">
+<!ENTITY sum "&#8721;">
+<!ENTITY minus "&#8722;">
+<!ENTITY lowast "&#8727;">
+<!ENTITY radic "&#8730;">
+<!ENTITY prop "&#8733;">
+<!ENTITY infin "&#8734;">
+<!ENTITY ang "&#8736;">
+<!ENTITY and "&#8743;">
+<!ENTITY or "&#8744;">
+<!ENTITY cap "&#8745;">
+<!ENTITY cup "&#8746;">
+<!ENTITY int "&#8747;">
+<!ENTITY there4 "&#8756;">
+<!ENTITY sim "&#8764;">
+<!ENTITY cong "&#8773;">
+<!ENTITY asymp "&#8776;">
+<!ENTITY ne "&#8800;">
+<!ENTITY equiv "&#8801;">
+<!ENTITY le "&#8804;">
+<!ENTITY ge "&#8805;">
+<!ENTITY sub "&#8834;">
+<!ENTITY sup "&#8835;">
+<!ENTITY nsub "&#8836;">
+<!ENTITY sube "&#8838;">
+<!ENTITY supe "&#8839;">
+<!ENTITY oplus "&#8853;">
+<!ENTITY otimes "&#8855;">
+<!ENTITY perp "&#8869;">
+<!ENTITY sdot "&#8901;">
+<!ENTITY lceil "&#8968;">
+<!ENTITY rceil "&#8969;">
+<!ENTITY lfloor "&#8970;">
+<!ENTITY rfloor "&#8971;">
+<!ENTITY lang "&#9001;">
+<!ENTITY rang "&#9002;">
+<!ENTITY loz "&#9674;">
+<!ENTITY spades "&#9824;">
+<!ENTITY clubs "&#9827;">
+<!ENTITY hearts "&#9829;">
+<!ENTITY diams "&#9830;">
+<!ENTITY quot "&#34;">
+<!ENTITY amp "&#38;#38;">
+<!ENTITY lt "&#38;#60;">
+<!ENTITY gt "&#62;">
+<!ENTITY apos "&#39;">
+<!ENTITY OElig "&#338;">
+<!ENTITY oelig "&#339;">
+<!ENTITY Scaron "&#352;">
+<!ENTITY scaron "&#353;">
+<!ENTITY Yuml "&#376;">
+<!ENTITY circ "&#710;">
+<!ENTITY tilde "&#732;">
+<!ENTITY ensp "&#8194;">
+<!ENTITY emsp "&#8195;">
+<!ENTITY thinsp "&#8201;">
+<!ENTITY zwnj "&#8204;">
+<!ENTITY zwj "&#8205;">
+<!ENTITY lrm "&#8206;">
+<!ENTITY rlm "&#8207;">
+<!ENTITY ndash "&#8211;">
+<!ENTITY mdash "&#8212;">
+<!ENTITY lsquo "&#8216;">
+<!ENTITY rsquo "&#8217;">
+<!ENTITY sbquo "&#8218;">
+<!ENTITY ldquo "&#8220;">
+<!ENTITY rdquo "&#8221;">
+<!ENTITY bdquo "&#8222;">
+<!ENTITY dagger "&#8224;">
+<!ENTITY Dagger "&#8225;">
+<!ENTITY permil "&#8240;">
+<!ENTITY lsaquo "&#8249;">
+<!ENTITY rsaquo "&#8250;">
+<!ENTITY euro "&#8364;">
+]>
+<dtd version='1.0'
+ unexpanded='1'
+ title="?untitled?"
+ namecase-general="1"
+ namecase-entity="0"
+ xml="0"
+ system-id="xhtml1-strict.dtd"
+ public-id=""
+ declaration=""
+ created-by="DTDParse V2.0beta6"
+ created-on="Sun Oct 7 14:51:20 2001"
+>
+<entity name="LanguageCode"
+ type="param"
+>
+<text-expanded>NMTOKEN</text-expanded>
+<text>NMTOKEN</text>
+</entity>
+
+<entity name="misc"
+ type="param"
+>
+<text-expanded>ins | del | script | noscript</text-expanded>
+<text>ins | del | script | noscript</text>
+</entity>
+
+<entity name="Block"
+ type="param"
+>
+<text-expanded>(p | h1|h2|h3|h4|h5|h6 | div | ul | ol | dl | pre | hr | blockquote | address | fieldset | table | form | ins | del | script | noscript)*</text-expanded>
+<text>(%block; | form | %misc;)*</text>
+</entity>
+
+<entity name="UriList"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="pre.content"
+ type="param"
+>
+<text-expanded>(#PCDATA | a | br | span | bdo | map | tt | i | b |
+ em | strong | dfn | code | q | sub | sup |
+ samp | kbd | var | cite | abbr | acronym | input | select | textarea | label | button)*</text-expanded>
+<text>(#PCDATA | a | br | span | bdo | map | tt | i | b |
+ %phrase; | %inline.forms;)*</text>
+</entity>
+
+<entity name="Script"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="MultiLength"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="button.content"
+ type="param"
+>
+<text-expanded>(#PCDATA | p | h1|h2|h3|h4|h5|h6 | div | ul | ol | dl | pre | hr | blockquote | address |
+ table | br | span | bdo | object | img | map | tt | i | b | big | small | em | strong | dfn | code | q | sub | sup |
+ samp | kbd | var | cite | abbr | acronym | ins | del | script | noscript)*</text-expanded>
+<text>(#PCDATA | p | %heading; | div | %lists; | %blocktext; |
+ table | %special; | %fontstyle; | %phrase; | %misc;)*</text>
+</entity>
+
+<entity name="cellvalign"
+ type="param"
+>
+<text-expanded>valign (top|middle|bottom|baseline) #IMPLIED</text-expanded>
+<text>valign (top|middle|bottom|baseline) #IMPLIED</text>
+</entity>
+
+<entity name="Text"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="TFrame"
+ type="param"
+>
+<text-expanded>(void|above|below|hsides|lhs|rhs|vsides|box|border)</text-expanded>
+<text>(void|above|below|hsides|lhs|rhs|vsides|box|border)</text>
+</entity>
+
+<entity name="focus"
+ type="param"
+>
+<text-expanded>accesskey CDATA #IMPLIED
+ tabindex CDATA #IMPLIED
+ onfocus CDATA #IMPLIED
+ onblur CDATA #IMPLIED</text-expanded>
+<text>accesskey %Character; #IMPLIED
+ tabindex %Number; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED</text>
+</entity>
+
+<entity name="HTMLsymbol"
+ type="param"
+ public="-//W3C//ENTITIES Symbols for XHTML//EN"
+ system="xhtml-symbol.ent"
+/>
+
+<entity name="Character"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="URI"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="coreattrs"
+ type="param"
+>
+<text-expanded>id ID #IMPLIED
+ class CDATA #IMPLIED
+ style CDATA #IMPLIED
+ title CDATA #IMPLIED</text-expanded>
+<text>id ID #IMPLIED
+ class CDATA #IMPLIED
+ style %StyleSheet; #IMPLIED
+ title %Text; #IMPLIED</text>
+</entity>
+
+<entity name="Shape"
+ type="param"
+>
+<text-expanded>(rect|circle|poly|default)</text-expanded>
+<text>(rect|circle|poly|default)</text>
+</entity>
+
+<entity name="HTMLlat1"
+ type="param"
+ public="-//W3C//ENTITIES Latin 1 for XHTML//EN"
+ system="xhtml-lat1.ent"
+/>
+
+<entity name="TRules"
+ type="param"
+>
+<text-expanded>(none | groups | rows | cols | all)</text-expanded>
+<text>(none | groups | rows | cols | all)</text>
+</entity>
+
+<entity name="a.content"
+ type="param"
+>
+<text-expanded>(#PCDATA | br | span | bdo | object | img | map | tt | i | b | big | small | em | strong | dfn | code | q | sub | sup |
+ samp | kbd | var | cite | abbr | acronym | input | select | textarea | label | button | ins | del | script | noscript)*</text-expanded>
+<text>(#PCDATA | %special; | %fontstyle; | %phrase; | %inline.forms; | %misc;)*</text>
+</entity>
+
+<entity name="inline.forms"
+ type="param"
+>
+<text-expanded>input | select | textarea | label | button</text-expanded>
+<text>input | select | textarea | label | button</text>
+</entity>
+
+<entity name="events"
+ type="param"
+>
+<text-expanded>onclick CDATA #IMPLIED
+ ondblclick CDATA #IMPLIED
+ onmousedown CDATA #IMPLIED
+ onmouseup CDATA #IMPLIED
+ onmouseover CDATA #IMPLIED
+ onmousemove CDATA #IMPLIED
+ onmouseout CDATA #IMPLIED
+ onkeypress CDATA #IMPLIED
+ onkeydown CDATA #IMPLIED
+ onkeyup CDATA #IMPLIED</text-expanded>
+<text>onclick %Script; #IMPLIED
+ ondblclick %Script; #IMPLIED
+ onmousedown %Script; #IMPLIED
+ onmouseup %Script; #IMPLIED
+ onmouseover %Script; #IMPLIED
+ onmousemove %Script; #IMPLIED
+ onmouseout %Script; #IMPLIED
+ onkeypress %Script; #IMPLIED
+ onkeydown %Script; #IMPLIED
+ onkeyup %Script; #IMPLIED</text>
+</entity>
+
+<entity name="Inline"
+ type="param"
+>
+<text-expanded>(#PCDATA | a | br | span | bdo | object | img | map | tt | i | b | big | small | em | strong | dfn | code | q | sub | sup |
+ samp | kbd | var | cite | abbr | acronym | input | select | textarea | label | button | ins | del | script | noscript)*</text-expanded>
+<text>(#PCDATA | %inline; | %misc;)*</text>
+</entity>
+
+<entity name="inline"
+ type="param"
+>
+<text-expanded>a | br | span | bdo | object | img | map | tt | i | b | big | small | em | strong | dfn | code | q | sub | sup |
+ samp | kbd | var | cite | abbr | acronym | input | select | textarea | label | button</text-expanded>
+<text>a | %special; | %fontstyle; | %phrase; | %inline.forms;</text>
+</entity>
+
+<entity name="Flow"
+ type="param"
+>
+<text-expanded>(#PCDATA | p | h1|h2|h3|h4|h5|h6 | div | ul | ol | dl | pre | hr | blockquote | address | fieldset | table | form | a | br | span | bdo | object | img | map | tt | i | b | big | small | em | strong | dfn | code | q | sub | sup |
+ samp | kbd | var | cite | abbr | acronym | input | select | textarea | label | button | ins | del | script | noscript)*</text-expanded>
+<text>(#PCDATA | %block; | form | %inline; | %misc;)*</text>
+</entity>
+
+<entity name="Charsets"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="blocktext"
+ type="param"
+>
+<text-expanded>pre | hr | blockquote | address</text-expanded>
+<text>pre | hr | blockquote | address</text>
+</entity>
+
+<entity name="lists"
+ type="param"
+>
+<text-expanded>ul | ol | dl</text-expanded>
+<text>ul | ol | dl</text>
+</entity>
+
+<entity name="Number"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="ContentTypes"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="head.misc"
+ type="param"
+>
+<text-expanded>(script|style|meta|link|object)*</text-expanded>
+<text>(script|style|meta|link|object)*</text>
+</entity>
+
+<entity name="block"
+ type="param"
+>
+<text-expanded>p | h1|h2|h3|h4|h5|h6 | div | ul | ol | dl | pre | hr | blockquote | address | fieldset | table</text-expanded>
+<text>p | %heading; | div | %lists; | %blocktext; | fieldset | table</text>
+</entity>
+
+<entity name="HTMLspecial"
+ type="param"
+ public="-//W3C//ENTITIES Special for XHTML//EN"
+ system="xhtml-special.ent"
+/>
+
+<entity name="LinkTypes"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="special"
+ type="param"
+>
+<text-expanded>br | span | bdo | object | img | map</text-expanded>
+<text>br | span | bdo | object | img | map</text>
+</entity>
+
+<entity name="Scope"
+ type="param"
+>
+<text-expanded>(row|col|rowgroup|colgroup)</text-expanded>
+<text>(row|col|rowgroup|colgroup)</text>
+</entity>
+
+<entity name="InputType"
+ type="param"
+>
+<text-expanded>(text | password | checkbox |
+ radio | submit | reset |
+ file | hidden | image | button)</text-expanded>
+<text>(text | password | checkbox |
+ radio | submit | reset |
+ file | hidden | image | button)</text>
+</entity>
+
+<entity name="form.content"
+ type="param"
+>
+<text-expanded>(p | h1|h2|h3|h4|h5|h6 | div | ul | ol | dl | pre | hr | blockquote | address | fieldset | table | ins | del | script | noscript)*</text-expanded>
+<text>(%block; | %misc;)*</text>
+</entity>
+
+<entity name="Length"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="phrase"
+ type="param"
+>
+<text-expanded>em | strong | dfn | code | q | sub | sup |
+ samp | kbd | var | cite | abbr | acronym</text-expanded>
+<text>em | strong | dfn | code | q | sub | sup |
+ samp | kbd | var | cite | abbr | acronym</text>
+</entity>
+
+<entity name="ContentType"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="MediaDesc"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="StyleSheet"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="attrs"
+ type="param"
+>
+<text-expanded>id ID #IMPLIED
+ class CDATA #IMPLIED
+ style CDATA #IMPLIED
+ title CDATA #IMPLIED lang NMTOKEN #IMPLIED
+ xml:lang NMTOKEN #IMPLIED
+ dir (ltr|rtl) #IMPLIED onclick CDATA #IMPLIED
+ ondblclick CDATA #IMPLIED
+ onmousedown CDATA #IMPLIED
+ onmouseup CDATA #IMPLIED
+ onmouseover CDATA #IMPLIED
+ onmousemove CDATA #IMPLIED
+ onmouseout CDATA #IMPLIED
+ onkeypress CDATA #IMPLIED
+ onkeydown CDATA #IMPLIED
+ onkeyup CDATA #IMPLIED</text-expanded>
+<text>%coreattrs; %i18n; %events;</text>
+</entity>
+
+<entity name="Pixels"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="cellhalign"
+ type="param"
+>
+<text-expanded>align (left|center|right|justify|char) #IMPLIED
+ char CDATA #IMPLIED
+ charoff CDATA #IMPLIED</text-expanded>
+<text>align (left|center|right|justify|char) #IMPLIED
+ char %Character; #IMPLIED
+ charoff %Length; #IMPLIED</text>
+</entity>
+
+<entity name="Datetime"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="Coords"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="fontstyle"
+ type="param"
+>
+<text-expanded>tt | i | b | big | small</text-expanded>
+<text>tt | i | b | big | small</text>
+</entity>
+
+<entity name="heading"
+ type="param"
+>
+<text-expanded>h1|h2|h3|h4|h5|h6</text-expanded>
+<text>h1|h2|h3|h4|h5|h6</text>
+</entity>
+
+<entity name="Charset"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="i18n"
+ type="param"
+>
+<text-expanded>lang NMTOKEN #IMPLIED
+ xml:lang NMTOKEN #IMPLIED
+ dir (ltr|rtl) #IMPLIED</text-expanded>
+<text>lang %LanguageCode; #IMPLIED
+ xml:lang %LanguageCode; #IMPLIED
+ dir (ltr|rtl) #IMPLIED</text>
+</entity>
+
+<entity name="ntilde"
+ type="gen"
+>
+<text-expanded>&amp;#241;</text-expanded>
+<text>&amp;#241;</text>
+</entity>
+
+<entity name="prime"
+ type="gen"
+>
+<text-expanded>&amp;#8242;</text-expanded>
+<text>&amp;#8242;</text>
+</entity>
+
+<entity name="quot"
+ type="gen"
+>
+<text-expanded>&amp;#34;</text-expanded>
+<text>&amp;#34;</text>
+</entity>
+
+<entity name="rceil"
+ type="gen"
+>
+<text-expanded>&amp;#8969;</text-expanded>
+<text>&amp;#8969;</text>
+</entity>
+
+<entity name="prod"
+ type="gen"
+>
+<text-expanded>&amp;#8719;</text-expanded>
+<text>&amp;#8719;</text>
+</entity>
+
+<entity name="Euml"
+ type="gen"
+>
+<text-expanded>&amp;#203;</text-expanded>
+<text>&amp;#203;</text>
+</entity>
+
+<entity name="loz"
+ type="gen"
+>
+<text-expanded>&amp;#9674;</text-expanded>
+<text>&amp;#9674;</text>
+</entity>
+
+<entity name="Yacute"
+ type="gen"
+>
+<text-expanded>&amp;#221;</text-expanded>
+<text>&amp;#221;</text>
+</entity>
+
+<entity name="rdquo"
+ type="gen"
+>
+<text-expanded>&amp;#8221;</text-expanded>
+<text>&amp;#8221;</text>
+</entity>
+
+<entity name="ne"
+ type="gen"
+>
+<text-expanded>&amp;#8800;</text-expanded>
+<text>&amp;#8800;</text>
+</entity>
+
+<entity name="igrave"
+ type="gen"
+>
+<text-expanded>&amp;#236;</text-expanded>
+<text>&amp;#236;</text>
+</entity>
+
+<entity name="psi"
+ type="gen"
+>
+<text-expanded>&amp;#968;</text-expanded>
+<text>&amp;#968;</text>
+</entity>
+
+<entity name="Oacute"
+ type="gen"
+>
+<text-expanded>&amp;#211;</text-expanded>
+<text>&amp;#211;</text>
+</entity>
+
+<entity name="lsaquo"
+ type="gen"
+>
+<text-expanded>&amp;#8249;</text-expanded>
+<text>&amp;#8249;</text>
+</entity>
+
+<entity name="ni"
+ type="gen"
+>
+<text-expanded>&amp;#8715;</text-expanded>
+<text>&amp;#8715;</text>
+</entity>
+
+<entity name="frasl"
+ type="gen"
+>
+<text-expanded>&amp;#8260;</text-expanded>
+<text>&amp;#8260;</text>
+</entity>
+
+<entity name="Epsilon"
+ type="gen"
+>
+<text-expanded>&amp;#917;</text-expanded>
+<text>&amp;#917;</text>
+</entity>
+
+<entity name="rArr"
+ type="gen"
+>
+<text-expanded>&amp;#8658;</text-expanded>
+<text>&amp;#8658;</text>
+</entity>
+
+<entity name="Eacute"
+ type="gen"
+>
+<text-expanded>&amp;#201;</text-expanded>
+<text>&amp;#201;</text>
+</entity>
+
+<entity name="acute"
+ type="gen"
+>
+<text-expanded>&amp;#180;</text-expanded>
+<text>&amp;#180;</text>
+</entity>
+
+<entity name="Pi"
+ type="gen"
+>
+<text-expanded>&amp;#928;</text-expanded>
+<text>&amp;#928;</text>
+</entity>
+
+<entity name="radic"
+ type="gen"
+>
+<text-expanded>&amp;#8730;</text-expanded>
+<text>&amp;#8730;</text>
+</entity>
+
+<entity name="Ugrave"
+ type="gen"
+>
+<text-expanded>&amp;#217;</text-expanded>
+<text>&amp;#217;</text>
+</entity>
+
+<entity name="prop"
+ type="gen"
+>
+<text-expanded>&amp;#8733;</text-expanded>
+<text>&amp;#8733;</text>
+</entity>
+
+<entity name="ccedil"
+ type="gen"
+>
+<text-expanded>&amp;#231;</text-expanded>
+<text>&amp;#231;</text>
+</entity>
+
+<entity name="Iuml"
+ type="gen"
+>
+<text-expanded>&amp;#207;</text-expanded>
+<text>&amp;#207;</text>
+</entity>
+
+<entity name="Agrave"
+ type="gen"
+>
+<text-expanded>&amp;#192;</text-expanded>
+<text>&amp;#192;</text>
+</entity>
+
+<entity name="bull"
+ type="gen"
+>
+<text-expanded>&amp;#8226;</text-expanded>
+<text>&amp;#8226;</text>
+</entity>
+
+<entity name="nu"
+ type="gen"
+>
+<text-expanded>&amp;#957;</text-expanded>
+<text>&amp;#957;</text>
+</entity>
+
+<entity name="ge"
+ type="gen"
+>
+<text-expanded>&amp;#8805;</text-expanded>
+<text>&amp;#8805;</text>
+</entity>
+
+<entity name="gamma"
+ type="gen"
+>
+<text-expanded>&amp;#947;</text-expanded>
+<text>&amp;#947;</text>
+</entity>
+
+<entity name="Kappa"
+ type="gen"
+>
+<text-expanded>&amp;#922;</text-expanded>
+<text>&amp;#922;</text>
+</entity>
+
+<entity name="aring"
+ type="gen"
+>
+<text-expanded>&amp;#229;</text-expanded>
+<text>&amp;#229;</text>
+</entity>
+
+<entity name="cedil"
+ type="gen"
+>
+<text-expanded>&amp;#184;</text-expanded>
+<text>&amp;#184;</text>
+</entity>
+
+<entity name="laquo"
+ type="gen"
+>
+<text-expanded>&amp;#171;</text-expanded>
+<text>&amp;#171;</text>
+</entity>
+
+<entity name="Xi"
+ type="gen"
+>
+<text-expanded>&amp;#926;</text-expanded>
+<text>&amp;#926;</text>
+</entity>
+
+<entity name="copy"
+ type="gen"
+>
+<text-expanded>&amp;#169;</text-expanded>
+<text>&amp;#169;</text>
+</entity>
+
+<entity name="crarr"
+ type="gen"
+>
+<text-expanded>&amp;#8629;</text-expanded>
+<text>&amp;#8629;</text>
+</entity>
+
+<entity name="sigma"
+ type="gen"
+>
+<text-expanded>&amp;#963;</text-expanded>
+<text>&amp;#963;</text>
+</entity>
+
+<entity name="acirc"
+ type="gen"
+>
+<text-expanded>&amp;#226;</text-expanded>
+<text>&amp;#226;</text>
+</entity>
+
+<entity name="clubs"
+ type="gen"
+>
+<text-expanded>&amp;#9827;</text-expanded>
+<text>&amp;#9827;</text>
+</entity>
+
+<entity name="Otilde"
+ type="gen"
+>
+<text-expanded>&amp;#213;</text-expanded>
+<text>&amp;#213;</text>
+</entity>
+
+<entity name="ETH"
+ type="gen"
+>
+<text-expanded>&amp;#208;</text-expanded>
+<text>&amp;#208;</text>
+</entity>
+
+<entity name="iota"
+ type="gen"
+>
+<text-expanded>&amp;#953;</text-expanded>
+<text>&amp;#953;</text>
+</entity>
+
+<entity name="gt"
+ type="gen"
+>
+<text-expanded>&amp;#62;</text-expanded>
+<text>&amp;#62;</text>
+</entity>
+
+<entity name="tilde"
+ type="gen"
+>
+<text-expanded>&amp;#732;</text-expanded>
+<text>&amp;#732;</text>
+</entity>
+
+<entity name="Chi"
+ type="gen"
+>
+<text-expanded>&amp;#935;</text-expanded>
+<text>&amp;#935;</text>
+</entity>
+
+<entity name="Theta"
+ type="gen"
+>
+<text-expanded>&amp;#920;</text-expanded>
+<text>&amp;#920;</text>
+</entity>
+
+<entity name="upsih"
+ type="gen"
+>
+<text-expanded>&amp;#978;</text-expanded>
+<text>&amp;#978;</text>
+</entity>
+
+<entity name="ouml"
+ type="gen"
+>
+<text-expanded>&amp;#246;</text-expanded>
+<text>&amp;#246;</text>
+</entity>
+
+<entity name="uacute"
+ type="gen"
+>
+<text-expanded>&amp;#250;</text-expanded>
+<text>&amp;#250;</text>
+</entity>
+
+<entity name="uml"
+ type="gen"
+>
+<text-expanded>&amp;#168;</text-expanded>
+<text>&amp;#168;</text>
+</entity>
+
+<entity name="mdash"
+ type="gen"
+>
+<text-expanded>&amp;#8212;</text-expanded>
+<text>&amp;#8212;</text>
+</entity>
+
+<entity name="forall"
+ type="gen"
+>
+<text-expanded>&amp;#8704;</text-expanded>
+<text>&amp;#8704;</text>
+</entity>
+
+<entity name="Phi"
+ type="gen"
+>
+<text-expanded>&amp;#934;</text-expanded>
+<text>&amp;#934;</text>
+</entity>
+
+<entity name="euro"
+ type="gen"
+>
+<text-expanded>&amp;#8364;</text-expanded>
+<text>&amp;#8364;</text>
+</entity>
+
+<entity name="aacute"
+ type="gen"
+>
+<text-expanded>&amp;#225;</text-expanded>
+<text>&amp;#225;</text>
+</entity>
+
+<entity name="or"
+ type="gen"
+>
+<text-expanded>&amp;#8744;</text-expanded>
+<text>&amp;#8744;</text>
+</entity>
+
+<entity name="ecirc"
+ type="gen"
+>
+<text-expanded>&amp;#234;</text-expanded>
+<text>&amp;#234;</text>
+</entity>
+
+<entity name="iquest"
+ type="gen"
+>
+<text-expanded>&amp;#191;</text-expanded>
+<text>&amp;#191;</text>
+</entity>
+
+<entity name="tau"
+ type="gen"
+>
+<text-expanded>&amp;#964;</text-expanded>
+<text>&amp;#964;</text>
+</entity>
+
+<entity name="emsp"
+ type="gen"
+>
+<text-expanded>&amp;#8195;</text-expanded>
+<text>&amp;#8195;</text>
+</entity>
+
+<entity name="weierp"
+ type="gen"
+>
+<text-expanded>&amp;#8472;</text-expanded>
+<text>&amp;#8472;</text>
+</entity>
+
+<entity name="Ntilde"
+ type="gen"
+>
+<text-expanded>&amp;#209;</text-expanded>
+<text>&amp;#209;</text>
+</entity>
+
+<entity name="lang"
+ type="gen"
+>
+<text-expanded>&amp;#9001;</text-expanded>
+<text>&amp;#9001;</text>
+</entity>
+
+<entity name="lambda"
+ type="gen"
+>
+<text-expanded>&amp;#955;</text-expanded>
+<text>&amp;#955;</text>
+</entity>
+
+<entity name="Delta"
+ type="gen"
+>
+<text-expanded>&amp;#916;</text-expanded>
+<text>&amp;#916;</text>
+</entity>
+
+<entity name="Uuml"
+ type="gen"
+>
+<text-expanded>&amp;#220;</text-expanded>
+<text>&amp;#220;</text>
+</entity>
+
+<entity name="oline"
+ type="gen"
+>
+<text-expanded>&amp;#8254;</text-expanded>
+<text>&amp;#8254;</text>
+</entity>
+
+<entity name="Igrave"
+ type="gen"
+>
+<text-expanded>&amp;#204;</text-expanded>
+<text>&amp;#204;</text>
+</entity>
+
+<entity name="Ocirc"
+ type="gen"
+>
+<text-expanded>&amp;#212;</text-expanded>
+<text>&amp;#212;</text>
+</entity>
+
+<entity name="OElig"
+ type="gen"
+>
+<text-expanded>&amp;#338;</text-expanded>
+<text>&amp;#338;</text>
+</entity>
+
+<entity name="isin"
+ type="gen"
+>
+<text-expanded>&amp;#8712;</text-expanded>
+<text>&amp;#8712;</text>
+</entity>
+
+<entity name="icirc"
+ type="gen"
+>
+<text-expanded>&amp;#238;</text-expanded>
+<text>&amp;#238;</text>
+</entity>
+
+<entity name="cup"
+ type="gen"
+>
+<text-expanded>&amp;#8746;</text-expanded>
+<text>&amp;#8746;</text>
+</entity>
+
+<entity name="zeta"
+ type="gen"
+>
+<text-expanded>&amp;#950;</text-expanded>
+<text>&amp;#950;</text>
+</entity>
+
+<entity name="pi"
+ type="gen"
+>
+<text-expanded>&amp;#960;</text-expanded>
+<text>&amp;#960;</text>
+</entity>
+
+<entity name="Ccedil"
+ type="gen"
+>
+<text-expanded>&amp;#199;</text-expanded>
+<text>&amp;#199;</text>
+</entity>
+
+<entity name="atilde"
+ type="gen"
+>
+<text-expanded>&amp;#227;</text-expanded>
+<text>&amp;#227;</text>
+</entity>
+
+<entity name="dArr"
+ type="gen"
+>
+<text-expanded>&amp;#8659;</text-expanded>
+<text>&amp;#8659;</text>
+</entity>
+
+<entity name="Yuml"
+ type="gen"
+>
+<text-expanded>&amp;#376;</text-expanded>
+<text>&amp;#376;</text>
+</entity>
+
+<entity name="uArr"
+ type="gen"
+>
+<text-expanded>&amp;#8657;</text-expanded>
+<text>&amp;#8657;</text>
+</entity>
+
+<entity name="there4"
+ type="gen"
+>
+<text-expanded>&amp;#8756;</text-expanded>
+<text>&amp;#8756;</text>
+</entity>
+
+<entity name="minus"
+ type="gen"
+>
+<text-expanded>&amp;#8722;</text-expanded>
+<text>&amp;#8722;</text>
+</entity>
+
+<entity name="upsilon"
+ type="gen"
+>
+<text-expanded>&amp;#965;</text-expanded>
+<text>&amp;#965;</text>
+</entity>
+
+<entity name="lrm"
+ type="gen"
+>
+<text-expanded>&amp;#8206;</text-expanded>
+<text>&amp;#8206;</text>
+</entity>
+
+<entity name="rho"
+ type="gen"
+>
+<text-expanded>&amp;#961;</text-expanded>
+<text>&amp;#961;</text>
+</entity>
+
+<entity name="lowast"
+ type="gen"
+>
+<text-expanded>&amp;#8727;</text-expanded>
+<text>&amp;#8727;</text>
+</entity>
+
+<entity name="xi"
+ type="gen"
+>
+<text-expanded>&amp;#958;</text-expanded>
+<text>&amp;#958;</text>
+</entity>
+
+<entity name="Prime"
+ type="gen"
+>
+<text-expanded>&amp;#8243;</text-expanded>
+<text>&amp;#8243;</text>
+</entity>
+
+<entity name="spades"
+ type="gen"
+>
+<text-expanded>&amp;#9824;</text-expanded>
+<text>&amp;#9824;</text>
+</entity>
+
+<entity name="lceil"
+ type="gen"
+>
+<text-expanded>&amp;#8968;</text-expanded>
+<text>&amp;#8968;</text>
+</entity>
+
+<entity name="hArr"
+ type="gen"
+>
+<text-expanded>&amp;#8660;</text-expanded>
+<text>&amp;#8660;</text>
+</entity>
+
+<entity name="alpha"
+ type="gen"
+>
+<text-expanded>&amp;#945;</text-expanded>
+<text>&amp;#945;</text>
+</entity>
+
+<entity name="iacute"
+ type="gen"
+>
+<text-expanded>&amp;#237;</text-expanded>
+<text>&amp;#237;</text>
+</entity>
+
+<entity name="lfloor"
+ type="gen"
+>
+<text-expanded>&amp;#8970;</text-expanded>
+<text>&amp;#8970;</text>
+</entity>
+
+<entity name="infin"
+ type="gen"
+>
+<text-expanded>&amp;#8734;</text-expanded>
+<text>&amp;#8734;</text>
+</entity>
+
+<entity name="image"
+ type="gen"
+>
+<text-expanded>&amp;#8465;</text-expanded>
+<text>&amp;#8465;</text>
+</entity>
+
+<entity name="sup1"
+ type="gen"
+>
+<text-expanded>&amp;#185;</text-expanded>
+<text>&amp;#185;</text>
+</entity>
+
+<entity name="ldquo"
+ type="gen"
+>
+<text-expanded>&amp;#8220;</text-expanded>
+<text>&amp;#8220;</text>
+</entity>
+
+<entity name="sup2"
+ type="gen"
+>
+<text-expanded>&amp;#178;</text-expanded>
+<text>&amp;#178;</text>
+</entity>
+
+<entity name="sup3"
+ type="gen"
+>
+<text-expanded>&amp;#179;</text-expanded>
+<text>&amp;#179;</text>
+</entity>
+
+<entity name="Beta"
+ type="gen"
+>
+<text-expanded>&amp;#914;</text-expanded>
+<text>&amp;#914;</text>
+</entity>
+
+<entity name="brvbar"
+ type="gen"
+>
+<text-expanded>&amp;#166;</text-expanded>
+<text>&amp;#166;</text>
+</entity>
+
+<entity name="oelig"
+ type="gen"
+>
+<text-expanded>&amp;#339;</text-expanded>
+<text>&amp;#339;</text>
+</entity>
+
+<entity name="ograve"
+ type="gen"
+>
+<text-expanded>&amp;#242;</text-expanded>
+<text>&amp;#242;</text>
+</entity>
+
+<entity name="rarr"
+ type="gen"
+>
+<text-expanded>&amp;#8594;</text-expanded>
+<text>&amp;#8594;</text>
+</entity>
+
+<entity name="Uacute"
+ type="gen"
+>
+<text-expanded>&amp;#218;</text-expanded>
+<text>&amp;#218;</text>
+</entity>
+
+<entity name="rsaquo"
+ type="gen"
+>
+<text-expanded>&amp;#8250;</text-expanded>
+<text>&amp;#8250;</text>
+</entity>
+
+<entity name="sub"
+ type="gen"
+>
+<text-expanded>&amp;#8834;</text-expanded>
+<text>&amp;#8834;</text>
+</entity>
+
+<entity name="zwj"
+ type="gen"
+>
+<text-expanded>&amp;#8205;</text-expanded>
+<text>&amp;#8205;</text>
+</entity>
+
+<entity name="perp"
+ type="gen"
+>
+<text-expanded>&amp;#8869;</text-expanded>
+<text>&amp;#8869;</text>
+</entity>
+
+<entity name="egrave"
+ type="gen"
+>
+<text-expanded>&amp;#232;</text-expanded>
+<text>&amp;#232;</text>
+</entity>
+
+<entity name="thorn"
+ type="gen"
+>
+<text-expanded>&amp;#254;</text-expanded>
+<text>&amp;#254;</text>
+</entity>
+
+<entity name="equiv"
+ type="gen"
+>
+<text-expanded>&amp;#8801;</text-expanded>
+<text>&amp;#8801;</text>
+</entity>
+
+<entity name="lArr"
+ type="gen"
+>
+<text-expanded>&amp;#8656;</text-expanded>
+<text>&amp;#8656;</text>
+</entity>
+
+<entity name="Aacute"
+ type="gen"
+>
+<text-expanded>&amp;#193;</text-expanded>
+<text>&amp;#193;</text>
+</entity>
+
+<entity name="amp"
+ type="gen"
+>
+<text-expanded>&amp;#38;#38;</text-expanded>
+<text>&amp;#38;#38;</text>
+</entity>
+
+<entity name="auml"
+ type="gen"
+>
+<text-expanded>&amp;#228;</text-expanded>
+<text>&amp;#228;</text>
+</entity>
+
+<entity name="ndash"
+ type="gen"
+>
+<text-expanded>&amp;#8211;</text-expanded>
+<text>&amp;#8211;</text>
+</entity>
+
+<entity name="Gamma"
+ type="gen"
+>
+<text-expanded>&amp;#915;</text-expanded>
+<text>&amp;#915;</text>
+</entity>
+
+<entity name="otimes"
+ type="gen"
+>
+<text-expanded>&amp;#8855;</text-expanded>
+<text>&amp;#8855;</text>
+</entity>
+
+<entity name="sum"
+ type="gen"
+>
+<text-expanded>&amp;#8721;</text-expanded>
+<text>&amp;#8721;</text>
+</entity>
+
+<entity name="Aring"
+ type="gen"
+>
+<text-expanded>&amp;#197;</text-expanded>
+<text>&amp;#197;</text>
+</entity>
+
+<entity name="pound"
+ type="gen"
+>
+<text-expanded>&amp;#163;</text-expanded>
+<text>&amp;#163;</text>
+</entity>
+
+<entity name="oplus"
+ type="gen"
+>
+<text-expanded>&amp;#8853;</text-expanded>
+<text>&amp;#8853;</text>
+</entity>
+
+<entity name="sup"
+ type="gen"
+>
+<text-expanded>&amp;#8835;</text-expanded>
+<text>&amp;#8835;</text>
+</entity>
+
+<entity name="Upsilon"
+ type="gen"
+>
+<text-expanded>&amp;#933;</text-expanded>
+<text>&amp;#933;</text>
+</entity>
+
+<entity name="exist"
+ type="gen"
+>
+<text-expanded>&amp;#8707;</text-expanded>
+<text>&amp;#8707;</text>
+</entity>
+
+<entity name="Eta"
+ type="gen"
+>
+<text-expanded>&amp;#919;</text-expanded>
+<text>&amp;#919;</text>
+</entity>
+
+<entity name="zwnj"
+ type="gen"
+>
+<text-expanded>&amp;#8204;</text-expanded>
+<text>&amp;#8204;</text>
+</entity>
+
+<entity name="Acirc"
+ type="gen"
+>
+<text-expanded>&amp;#194;</text-expanded>
+<text>&amp;#194;</text>
+</entity>
+
+<entity name="Lambda"
+ type="gen"
+>
+<text-expanded>&amp;#923;</text-expanded>
+<text>&amp;#923;</text>
+</entity>
+
+<entity name="Sigma"
+ type="gen"
+>
+<text-expanded>&amp;#931;</text-expanded>
+<text>&amp;#931;</text>
+</entity>
+
+<entity name="rsquo"
+ type="gen"
+>
+<text-expanded>&amp;#8217;</text-expanded>
+<text>&amp;#8217;</text>
+</entity>
+
+<entity name="AElig"
+ type="gen"
+>
+<text-expanded>&amp;#198;</text-expanded>
+<text>&amp;#198;</text>
+</entity>
+
+<entity name="deg"
+ type="gen"
+>
+<text-expanded>&amp;#176;</text-expanded>
+<text>&amp;#176;</text>
+</entity>
+
+<entity name="euml"
+ type="gen"
+>
+<text-expanded>&amp;#235;</text-expanded>
+<text>&amp;#235;</text>
+</entity>
+
+<entity name="ucirc"
+ type="gen"
+>
+<text-expanded>&amp;#251;</text-expanded>
+<text>&amp;#251;</text>
+</entity>
+
+<entity name="chi"
+ type="gen"
+>
+<text-expanded>&amp;#967;</text-expanded>
+<text>&amp;#967;</text>
+</entity>
+
+<entity name="and"
+ type="gen"
+>
+<text-expanded>&amp;#8743;</text-expanded>
+<text>&amp;#8743;</text>
+</entity>
+
+<entity name="omega"
+ type="gen"
+>
+<text-expanded>&amp;#969;</text-expanded>
+<text>&amp;#969;</text>
+</entity>
+
+<entity name="ang"
+ type="gen"
+>
+<text-expanded>&amp;#8736;</text-expanded>
+<text>&amp;#8736;</text>
+</entity>
+
+<entity name="THORN"
+ type="gen"
+>
+<text-expanded>&amp;#222;</text-expanded>
+<text>&amp;#222;</text>
+</entity>
+
+<entity name="Atilde"
+ type="gen"
+>
+<text-expanded>&amp;#195;</text-expanded>
+<text>&amp;#195;</text>
+</entity>
+
+<entity name="hellip"
+ type="gen"
+>
+<text-expanded>&amp;#8230;</text-expanded>
+<text>&amp;#8230;</text>
+</entity>
+
+<entity name="phi"
+ type="gen"
+>
+<text-expanded>&amp;#966;</text-expanded>
+<text>&amp;#966;</text>
+</entity>
+
+<entity name="szlig"
+ type="gen"
+>
+<text-expanded>&amp;#223;</text-expanded>
+<text>&amp;#223;</text>
+</entity>
+
+<entity name="Ecirc"
+ type="gen"
+>
+<text-expanded>&amp;#202;</text-expanded>
+<text>&amp;#202;</text>
+</entity>
+
+<entity name="iuml"
+ type="gen"
+>
+<text-expanded>&amp;#239;</text-expanded>
+<text>&amp;#239;</text>
+</entity>
+
+<entity name="nabla"
+ type="gen"
+>
+<text-expanded>&amp;#8711;</text-expanded>
+<text>&amp;#8711;</text>
+</entity>
+
+<entity name="scaron"
+ type="gen"
+>
+<text-expanded>&amp;#353;</text-expanded>
+<text>&amp;#353;</text>
+</entity>
+
+<entity name="macr"
+ type="gen"
+>
+<text-expanded>&amp;#175;</text-expanded>
+<text>&amp;#175;</text>
+</entity>
+
+<entity name="dagger"
+ type="gen"
+>
+<text-expanded>&amp;#8224;</text-expanded>
+<text>&amp;#8224;</text>
+</entity>
+
+<entity name="supe"
+ type="gen"
+>
+<text-expanded>&amp;#8839;</text-expanded>
+<text>&amp;#8839;</text>
+</entity>
+
+<entity name="ensp"
+ type="gen"
+>
+<text-expanded>&amp;#8194;</text-expanded>
+<text>&amp;#8194;</text>
+</entity>
+
+<entity name="cap"
+ type="gen"
+>
+<text-expanded>&amp;#8745;</text-expanded>
+<text>&amp;#8745;</text>
+</entity>
+
+<entity name="Iacute"
+ type="gen"
+>
+<text-expanded>&amp;#205;</text-expanded>
+<text>&amp;#205;</text>
+</entity>
+
+<entity name="aelig"
+ type="gen"
+>
+<text-expanded>&amp;#230;</text-expanded>
+<text>&amp;#230;</text>
+</entity>
+
+<entity name="Iota"
+ type="gen"
+>
+<text-expanded>&amp;#921;</text-expanded>
+<text>&amp;#921;</text>
+</entity>
+
+<entity name="Psi"
+ type="gen"
+>
+<text-expanded>&amp;#936;</text-expanded>
+<text>&amp;#936;</text>
+</entity>
+
+<entity name="nsub"
+ type="gen"
+>
+<text-expanded>&amp;#8836;</text-expanded>
+<text>&amp;#8836;</text>
+</entity>
+
+<entity name="Icirc"
+ type="gen"
+>
+<text-expanded>&amp;#206;</text-expanded>
+<text>&amp;#206;</text>
+</entity>
+
+<entity name="iexcl"
+ type="gen"
+>
+<text-expanded>&amp;#161;</text-expanded>
+<text>&amp;#161;</text>
+</entity>
+
+<entity name="Ograve"
+ type="gen"
+>
+<text-expanded>&amp;#210;</text-expanded>
+<text>&amp;#210;</text>
+</entity>
+
+<entity name="yen"
+ type="gen"
+>
+<text-expanded>&amp;#165;</text-expanded>
+<text>&amp;#165;</text>
+</entity>
+
+<entity name="Ouml"
+ type="gen"
+>
+<text-expanded>&amp;#214;</text-expanded>
+<text>&amp;#214;</text>
+</entity>
+
+<entity name="frac12"
+ type="gen"
+>
+<text-expanded>&amp;#189;</text-expanded>
+<text>&amp;#189;</text>
+</entity>
+
+<entity name="oslash"
+ type="gen"
+>
+<text-expanded>&amp;#248;</text-expanded>
+<text>&amp;#248;</text>
+</entity>
+
+<entity name="alefsym"
+ type="gen"
+>
+<text-expanded>&amp;#8501;</text-expanded>
+<text>&amp;#8501;</text>
+</entity>
+
+<entity name="Egrave"
+ type="gen"
+>
+<text-expanded>&amp;#200;</text-expanded>
+<text>&amp;#200;</text>
+</entity>
+
+<entity name="frac14"
+ type="gen"
+>
+<text-expanded>&amp;#188;</text-expanded>
+<text>&amp;#188;</text>
+</entity>
+
+<entity name="micro"
+ type="gen"
+>
+<text-expanded>&amp;#181;</text-expanded>
+<text>&amp;#181;</text>
+</entity>
+
+<entity name="real"
+ type="gen"
+>
+<text-expanded>&amp;#8476;</text-expanded>
+<text>&amp;#8476;</text>
+</entity>
+
+<entity name="int"
+ type="gen"
+>
+<text-expanded>&amp;#8747;</text-expanded>
+<text>&amp;#8747;</text>
+</entity>
+
+<entity name="Mu"
+ type="gen"
+>
+<text-expanded>&amp;#924;</text-expanded>
+<text>&amp;#924;</text>
+</entity>
+
+<entity name="bdquo"
+ type="gen"
+>
+<text-expanded>&amp;#8222;</text-expanded>
+<text>&amp;#8222;</text>
+</entity>
+
+<entity name="darr"
+ type="gen"
+>
+<text-expanded>&amp;#8595;</text-expanded>
+<text>&amp;#8595;</text>
+</entity>
+
+<entity name="permil"
+ type="gen"
+>
+<text-expanded>&amp;#8240;</text-expanded>
+<text>&amp;#8240;</text>
+</entity>
+
+<entity name="uarr"
+ type="gen"
+>
+<text-expanded>&amp;#8593;</text-expanded>
+<text>&amp;#8593;</text>
+</entity>
+
+<entity name="raquo"
+ type="gen"
+>
+<text-expanded>&amp;#187;</text-expanded>
+<text>&amp;#187;</text>
+</entity>
+
+<entity name="kappa"
+ type="gen"
+>
+<text-expanded>&amp;#954;</text-expanded>
+<text>&amp;#954;</text>
+</entity>
+
+<entity name="middot"
+ type="gen"
+>
+<text-expanded>&amp;#183;</text-expanded>
+<text>&amp;#183;</text>
+</entity>
+
+<entity name="times"
+ type="gen"
+>
+<text-expanded>&amp;#215;</text-expanded>
+<text>&amp;#215;</text>
+</entity>
+
+<entity name="sube"
+ type="gen"
+>
+<text-expanded>&amp;#8838;</text-expanded>
+<text>&amp;#8838;</text>
+</entity>
+
+<entity name="piv"
+ type="gen"
+>
+<text-expanded>&amp;#982;</text-expanded>
+<text>&amp;#982;</text>
+</entity>
+
+<entity name="sect"
+ type="gen"
+>
+<text-expanded>&amp;#167;</text-expanded>
+<text>&amp;#167;</text>
+</entity>
+
+<entity name="le"
+ type="gen"
+>
+<text-expanded>&amp;#8804;</text-expanded>
+<text>&amp;#8804;</text>
+</entity>
+
+<entity name="sbquo"
+ type="gen"
+>
+<text-expanded>&amp;#8218;</text-expanded>
+<text>&amp;#8218;</text>
+</entity>
+
+<entity name="plusmn"
+ type="gen"
+>
+<text-expanded>&amp;#177;</text-expanded>
+<text>&amp;#177;</text>
+</entity>
+
+<entity name="curren"
+ type="gen"
+>
+<text-expanded>&amp;#164;</text-expanded>
+<text>&amp;#164;</text>
+</entity>
+
+<entity name="Alpha"
+ type="gen"
+>
+<text-expanded>&amp;#913;</text-expanded>
+<text>&amp;#913;</text>
+</entity>
+
+<entity name="harr"
+ type="gen"
+>
+<text-expanded>&amp;#8596;</text-expanded>
+<text>&amp;#8596;</text>
+</entity>
+
+<entity name="not"
+ type="gen"
+>
+<text-expanded>&amp;#172;</text-expanded>
+<text>&amp;#172;</text>
+</entity>
+
+<entity name="uuml"
+ type="gen"
+>
+<text-expanded>&amp;#252;</text-expanded>
+<text>&amp;#252;</text>
+</entity>
+
+<entity name="yacute"
+ type="gen"
+>
+<text-expanded>&amp;#253;</text-expanded>
+<text>&amp;#253;</text>
+</entity>
+
+<entity name="cong"
+ type="gen"
+>
+<text-expanded>&amp;#8773;</text-expanded>
+<text>&amp;#8773;</text>
+</entity>
+
+<entity name="omicron"
+ type="gen"
+>
+<text-expanded>&amp;#959;</text-expanded>
+<text>&amp;#959;</text>
+</entity>
+
+<entity name="rfloor"
+ type="gen"
+>
+<text-expanded>&amp;#8971;</text-expanded>
+<text>&amp;#8971;</text>
+</entity>
+
+<entity name="oacute"
+ type="gen"
+>
+<text-expanded>&amp;#243;</text-expanded>
+<text>&amp;#243;</text>
+</entity>
+
+<entity name="trade"
+ type="gen"
+>
+<text-expanded>&amp;#8482;</text-expanded>
+<text>&amp;#8482;</text>
+</entity>
+
+<entity name="shy"
+ type="gen"
+>
+<text-expanded>&amp;#173;</text-expanded>
+<text>&amp;#173;</text>
+</entity>
+
+<entity name="Zeta"
+ type="gen"
+>
+<text-expanded>&amp;#918;</text-expanded>
+<text>&amp;#918;</text>
+</entity>
+
+<entity name="theta"
+ type="gen"
+>
+<text-expanded>&amp;#952;</text-expanded>
+<text>&amp;#952;</text>
+</entity>
+
+<entity name="ordf"
+ type="gen"
+>
+<text-expanded>&amp;#170;</text-expanded>
+<text>&amp;#170;</text>
+</entity>
+
+<entity name="eacute"
+ type="gen"
+>
+<text-expanded>&amp;#233;</text-expanded>
+<text>&amp;#233;</text>
+</entity>
+
+<entity name="thetasym"
+ type="gen"
+>
+<text-expanded>&amp;#977;</text-expanded>
+<text>&amp;#977;</text>
+</entity>
+
+<entity name="ugrave"
+ type="gen"
+>
+<text-expanded>&amp;#249;</text-expanded>
+<text>&amp;#249;</text>
+</entity>
+
+<entity name="apos"
+ type="gen"
+>
+<text-expanded>&amp;#39;</text-expanded>
+<text>&amp;#39;</text>
+</entity>
+
+<entity name="lt"
+ type="gen"
+>
+<text-expanded>&amp;#38;#60;</text-expanded>
+<text>&amp;#38;#60;</text>
+</entity>
+
+<entity name="fnof"
+ type="gen"
+>
+<text-expanded>&amp;#402;</text-expanded>
+<text>&amp;#402;</text>
+</entity>
+
+<entity name="ordm"
+ type="gen"
+>
+<text-expanded>&amp;#186;</text-expanded>
+<text>&amp;#186;</text>
+</entity>
+
+<entity name="para"
+ type="gen"
+>
+<text-expanded>&amp;#182;</text-expanded>
+<text>&amp;#182;</text>
+</entity>
+
+<entity name="larr"
+ type="gen"
+>
+<text-expanded>&amp;#8592;</text-expanded>
+<text>&amp;#8592;</text>
+</entity>
+
+<entity name="yuml"
+ type="gen"
+>
+<text-expanded>&amp;#255;</text-expanded>
+<text>&amp;#255;</text>
+</entity>
+
+<entity name="Nu"
+ type="gen"
+>
+<text-expanded>&amp;#925;</text-expanded>
+<text>&amp;#925;</text>
+</entity>
+
+<entity name="diams"
+ type="gen"
+>
+<text-expanded>&amp;#9830;</text-expanded>
+<text>&amp;#9830;</text>
+</entity>
+
+<entity name="agrave"
+ type="gen"
+>
+<text-expanded>&amp;#224;</text-expanded>
+<text>&amp;#224;</text>
+</entity>
+
+<entity name="divide"
+ type="gen"
+>
+<text-expanded>&amp;#247;</text-expanded>
+<text>&amp;#247;</text>
+</entity>
+
+<entity name="Scaron"
+ type="gen"
+>
+<text-expanded>&amp;#352;</text-expanded>
+<text>&amp;#352;</text>
+</entity>
+
+<entity name="rang"
+ type="gen"
+>
+<text-expanded>&amp;#9002;</text-expanded>
+<text>&amp;#9002;</text>
+</entity>
+
+<entity name="Dagger"
+ type="gen"
+>
+<text-expanded>&amp;#8225;</text-expanded>
+<text>&amp;#8225;</text>
+</entity>
+
+<entity name="Tau"
+ type="gen"
+>
+<text-expanded>&amp;#932;</text-expanded>
+<text>&amp;#932;</text>
+</entity>
+
+<entity name="nbsp"
+ type="gen"
+>
+<text-expanded>&amp;#160;</text-expanded>
+<text>&amp;#160;</text>
+</entity>
+
+<entity name="eta"
+ type="gen"
+>
+<text-expanded>&amp;#951;</text-expanded>
+<text>&amp;#951;</text>
+</entity>
+
+<entity name="sim"
+ type="gen"
+>
+<text-expanded>&amp;#8764;</text-expanded>
+<text>&amp;#8764;</text>
+</entity>
+
+<entity name="lsquo"
+ type="gen"
+>
+<text-expanded>&amp;#8216;</text-expanded>
+<text>&amp;#8216;</text>
+</entity>
+
+<entity name="rlm"
+ type="gen"
+>
+<text-expanded>&amp;#8207;</text-expanded>
+<text>&amp;#8207;</text>
+</entity>
+
+<entity name="delta"
+ type="gen"
+>
+<text-expanded>&amp;#948;</text-expanded>
+<text>&amp;#948;</text>
+</entity>
+
+<entity name="Ucirc"
+ type="gen"
+>
+<text-expanded>&amp;#219;</text-expanded>
+<text>&amp;#219;</text>
+</entity>
+
+<entity name="otilde"
+ type="gen"
+>
+<text-expanded>&amp;#245;</text-expanded>
+<text>&amp;#245;</text>
+</entity>
+
+<entity name="part"
+ type="gen"
+>
+<text-expanded>&amp;#8706;</text-expanded>
+<text>&amp;#8706;</text>
+</entity>
+
+<entity name="Omicron"
+ type="gen"
+>
+<text-expanded>&amp;#927;</text-expanded>
+<text>&amp;#927;</text>
+</entity>
+
+<entity name="eth"
+ type="gen"
+>
+<text-expanded>&amp;#240;</text-expanded>
+<text>&amp;#240;</text>
+</entity>
+
+<entity name="ocirc"
+ type="gen"
+>
+<text-expanded>&amp;#244;</text-expanded>
+<text>&amp;#244;</text>
+</entity>
+
+<entity name="Omega"
+ type="gen"
+>
+<text-expanded>&amp;#937;</text-expanded>
+<text>&amp;#937;</text>
+</entity>
+
+<entity name="beta"
+ type="gen"
+>
+<text-expanded>&amp;#946;</text-expanded>
+<text>&amp;#946;</text>
+</entity>
+
+<entity name="Oslash"
+ type="gen"
+>
+<text-expanded>&amp;#216;</text-expanded>
+<text>&amp;#216;</text>
+</entity>
+
+<entity name="epsilon"
+ type="gen"
+>
+<text-expanded>&amp;#949;</text-expanded>
+<text>&amp;#949;</text>
+</entity>
+
+<entity name="notin"
+ type="gen"
+>
+<text-expanded>&amp;#8713;</text-expanded>
+<text>&amp;#8713;</text>
+</entity>
+
+<entity name="empty"
+ type="gen"
+>
+<text-expanded>&amp;#8709;</text-expanded>
+<text>&amp;#8709;</text>
+</entity>
+
+<entity name="reg"
+ type="gen"
+>
+<text-expanded>&amp;#174;</text-expanded>
+<text>&amp;#174;</text>
+</entity>
+
+<entity name="hearts"
+ type="gen"
+>
+<text-expanded>&amp;#9829;</text-expanded>
+<text>&amp;#9829;</text>
+</entity>
+
+<entity name="Auml"
+ type="gen"
+>
+<text-expanded>&amp;#196;</text-expanded>
+<text>&amp;#196;</text>
+</entity>
+
+<entity name="frac34"
+ type="gen"
+>
+<text-expanded>&amp;#190;</text-expanded>
+<text>&amp;#190;</text>
+</entity>
+
+<entity name="mu"
+ type="gen"
+>
+<text-expanded>&amp;#956;</text-expanded>
+<text>&amp;#956;</text>
+</entity>
+
+<entity name="sdot"
+ type="gen"
+>
+<text-expanded>&amp;#8901;</text-expanded>
+<text>&amp;#8901;</text>
+</entity>
+
+<entity name="asymp"
+ type="gen"
+>
+<text-expanded>&amp;#8776;</text-expanded>
+<text>&amp;#8776;</text>
+</entity>
+
+<entity name="thinsp"
+ type="gen"
+>
+<text-expanded>&amp;#8201;</text-expanded>
+<text>&amp;#8201;</text>
+</entity>
+
+<entity name="cent"
+ type="gen"
+>
+<text-expanded>&amp;#162;</text-expanded>
+<text>&amp;#162;</text>
+</entity>
+
+<entity name="circ"
+ type="gen"
+>
+<text-expanded>&amp;#710;</text-expanded>
+<text>&amp;#710;</text>
+</entity>
+
+<entity name="sigmaf"
+ type="gen"
+>
+<text-expanded>&amp;#962;</text-expanded>
+<text>&amp;#962;</text>
+</entity>
+
+<entity name="Rho"
+ type="gen"
+>
+<text-expanded>&amp;#929;</text-expanded>
+<text>&amp;#929;</text>
+</entity>
+
+<element name="var"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="var">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="button"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="table"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="button.content"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="button">
+<attdecl>
+ %attrs;
+ %focus;
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ type (button|submit|reset) "submit"
+ disabled (disabled) #IMPLIED
+ </attdecl>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type=""
+ enumeration="yes"
+ value="button submit reset"
+ default="submit"/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="value"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="head"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <or-group occurrence="*">
+ <element-name name="script"/>
+ <element-name name="style"/>
+ <element-name name="meta"/>
+ <element-name name="link"/>
+ <element-name name="object"/>
+ </or-group>
+ <or-group>
+ <sequence-group>
+ <element-name name="title"/>
+ <or-group occurrence="*">
+ <element-name name="script"/>
+ <element-name name="style"/>
+ <element-name name="meta"/>
+ <element-name name="link"/>
+ <element-name name="object"/>
+ </or-group>
+ <sequence-group occurrence="?">
+ <element-name name="base"/>
+ <or-group occurrence="*">
+ <element-name name="script"/>
+ <element-name name="style"/>
+ <element-name name="meta"/>
+ <element-name name="link"/>
+ <element-name name="object"/>
+ </or-group>
+ </sequence-group>
+ </sequence-group>
+ <sequence-group>
+ <element-name name="base"/>
+ <or-group occurrence="*">
+ <element-name name="script"/>
+ <element-name name="style"/>
+ <element-name name="meta"/>
+ <element-name name="link"/>
+ <element-name name="object"/>
+ </or-group>
+ <sequence-group>
+ <element-name name="title"/>
+ <or-group occurrence="*">
+ <element-name name="script"/>
+ <element-name name="style"/>
+ <element-name name="meta"/>
+ <element-name name="link"/>
+ <element-name name="object"/>
+ </or-group>
+ </sequence-group>
+ </sequence-group>
+ </or-group>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="head.misc"/>
+ <or-group>
+ <sequence-group>
+ <element-name name="title"/>
+ <parament-name name="head.misc"/>
+ <sequence-group occurrence="?">
+ <element-name name="base"/>
+ <parament-name name="head.misc"/>
+ </sequence-group>
+ </sequence-group>
+ <sequence-group>
+ <element-name name="base"/>
+ <parament-name name="head.misc"/>
+ <sequence-group>
+ <element-name name="title"/>
+ <parament-name name="head.misc"/>
+ </sequence-group>
+ </sequence-group>
+ </or-group>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="head">
+<attdecl>
+ %i18n;
+ id ID #IMPLIED
+ profile %URI; #IMPLIED
+ </attdecl>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="profile"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="map"
+ content-type="element">
+<content-model-expanded>
+ <or-group>
+ <or-group occurrence="+">
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+ <element-name name="area" occurrence="+"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group>
+ <or-group occurrence="+">
+ <parament-name name="block"/>
+ <element-name name="form"/>
+ <parament-name name="misc"/>
+ </or-group>
+ <element-name name="area" occurrence="+"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="map">
+<attdecl>
+ %i18n;
+ %events;
+ id ID #REQUIRED
+ class CDATA #IMPLIED
+ style %StyleSheet; #IMPLIED
+ title %Text; #IMPLIED
+ name NMTOKEN #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#REQUIRED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="img"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="img">
+<attdecl>
+ %attrs;
+ src %URI; #REQUIRED
+ alt %Text; #REQUIRED
+ longdesc %URI; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ usemap %URI; #IMPLIED
+ ismap (ismap) #IMPLIED
+ </attdecl>
+<attribute name="ismap"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ismap"
+ default=""/>
+<attribute name="longdesc"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="src"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="height"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="alt"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="usemap"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="h1"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="h1">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="samp"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="samp">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="h2"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="h2">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="h3"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="h3">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="object"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="param"/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="param"/>
+ <parament-name name="block"/>
+ <element-name name="form"/>
+ <parament-name name="inline"/>
+ <parament-name name="misc"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="object">
+<attdecl>
+ %attrs;
+ declare (declare) #IMPLIED
+ classid %URI; #IMPLIED
+ codebase %URI; #IMPLIED
+ data %URI; #IMPLIED
+ type %ContentType; #IMPLIED
+ codetype %ContentType; #IMPLIED
+ archive %UriList; #IMPLIED
+ standby %Text; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ usemap %URI; #IMPLIED
+ name NMTOKEN #IMPLIED
+ tabindex %Number; #IMPLIED
+ </attdecl>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="codebase"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="archive"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="data"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="codetype"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="classid"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="height"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="standby"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="declare"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="declare"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="usemap"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="h4"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="h4">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="h5"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="h5">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="fieldset"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="legend"/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="legend"/>
+ <parament-name name="block"/>
+ <element-name name="form"/>
+ <parament-name name="inline"/>
+ <parament-name name="misc"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="fieldset">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="h6"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="h6">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="tbody"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="tr"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="tr"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="tbody">
+<attdecl>
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="del"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="del">
+<attdecl>
+ %attrs;
+ cite %URI; #IMPLIED
+ datetime %Datetime; #IMPLIED
+ </attdecl>
+<attribute name="cite"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="datetime"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="tfoot"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="tr"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="tr"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="tfoot">
+<attdecl>
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="acronym"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="acronym">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="option"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="option">
+<attdecl>
+ %attrs;
+ selected (selected) #IMPLIED
+ disabled (disabled) #IMPLIED
+ label %Text; #IMPLIED
+ value CDATA #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="label"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="selected"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="selected"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="value"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="colgroup"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="*">
+ <element-name name="col"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <element-name name="col"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="colgroup">
+<attdecl>
+ %attrs;
+ span %Number; "1"
+ width %MultiLength; #IMPLIED
+ %cellhalign;
+ %cellvalign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="span"
+ type=""
+ value="CDATA"
+ default="1"/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="caption"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="caption">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="div"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="div">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="form"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="form.content"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="form">
+<attdecl>
+ %attrs;
+ action %URI; #REQUIRED
+ method (get|post) "get"
+ enctype %ContentType; "application/x-www-form-urlencoded"
+ onsubmit %Script; #IMPLIED
+ onreset %Script; #IMPLIED
+ accept %ContentTypes; #IMPLIED
+ accept-charset %Charsets; #IMPLIED
+ </attdecl>
+<attribute name="accept-charset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onsubmit"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="method"
+ type=""
+ enumeration="yes"
+ value="get post"
+ default="get"/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="accept"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onreset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="enctype"
+ type=""
+ value="CDATA"
+ default="application/x-www-form-urlencoded"/>
+<attribute name="action"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="bdo"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="bdo">
+<attdecl>
+ %coreattrs;
+ %events;
+ lang %LanguageCode; #IMPLIED
+ xml:lang %LanguageCode; #IMPLIED
+ dir (ltr|rtl) #REQUIRED
+ </attdecl>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#REQUIRED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="label"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="label">
+<attdecl>
+ %attrs;
+ for IDREF #IMPLIED
+ accesskey %Character; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ </attdecl>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="for"
+ type="#IMPLIED"
+ value="IDREF"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="abbr"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="abbr">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="noscript"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Block"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="noscript">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="dfn"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="dfn">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="ol"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="li"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="li"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="ol">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="area"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="area">
+<attdecl>
+ %attrs;
+ %focus;
+ shape %Shape; "rect"
+ coords %Coords; #IMPLIED
+ href %URI; #IMPLIED
+ nohref (nohref) #IMPLIED
+ alt %Text; #REQUIRED
+ </attdecl>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="href"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="shape"
+ type=""
+ enumeration="yes"
+ value="rect circle poly default"
+ default="rect"/>
+<attribute name="alt"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="nohref"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="nohref"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="coords"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="dd"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="dd">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="ins"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="ins">
+<attdecl>
+ %attrs;
+ cite %URI; #IMPLIED
+ datetime %Datetime; #IMPLIED
+ </attdecl>
+<attribute name="cite"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="datetime"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="span"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="span">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="dl"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="+">
+ <element-name name="dt"/>
+ <element-name name="dd"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="+">
+ <element-name name="dt"/>
+ <element-name name="dd"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="dl">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="address"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="address">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="table"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="caption" occurrence="?"/>
+ <or-group>
+ <element-name name="col" occurrence="*"/>
+ <element-name name="colgroup" occurrence="*"/>
+ </or-group>
+ <element-name name="thead" occurrence="?"/>
+ <element-name name="tfoot" occurrence="?"/>
+ <or-group>
+ <element-name name="tbody" occurrence="+"/>
+ <element-name name="tr" occurrence="+"/>
+ </or-group>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="caption" occurrence="?"/>
+ <or-group>
+ <element-name name="col" occurrence="*"/>
+ <element-name name="colgroup" occurrence="*"/>
+ </or-group>
+ <element-name name="thead" occurrence="?"/>
+ <element-name name="tfoot" occurrence="?"/>
+ <or-group>
+ <element-name name="tbody" occurrence="+"/>
+ <element-name name="tr" occurrence="+"/>
+ </or-group>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="table">
+<attdecl>
+ %attrs;
+ summary %Text; #IMPLIED
+ width %Length; #IMPLIED
+ border %Pixels; #IMPLIED
+ frame %TFrame; #IMPLIED
+ rules %TRules; #IMPLIED
+ cellspacing %Length; #IMPLIED
+ cellpadding %Length; #IMPLIED
+ </attdecl>
+<attribute name="rules"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="none groups rows cols all"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="summary"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="cellspacing"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="frame"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="void above below hsides lhs rhs vsides box border"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="cellpadding"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="border"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="legend"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="legend">
+<attdecl>
+ %attrs;
+ accesskey %Character; #IMPLIED
+ </attdecl>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="cite"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="cite">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="base"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="base">
+<attdecl>
+ href %URI; #IMPLIED
+ id ID #IMPLIED
+ </attdecl>
+<attribute name="href"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+</attlist>
+
+<element name="dt"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="dt">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="body"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Block"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="body">
+<attdecl>
+ %attrs;
+ onload %Script; #IMPLIED
+ onunload %Script; #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onload"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onunload"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="li"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="li">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="hr"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="hr">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="big"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="big">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="thead"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="tr"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="tr"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="thead">
+<attdecl>
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="small"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="small">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="script"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="script">
+<attdecl>
+ id ID #IMPLIED
+ charset %Charset; #IMPLIED
+ type %ContentType; #REQUIRED
+ src %URI; #IMPLIED
+ defer (defer) #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ </attdecl>
+<attribute name="charset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:space"
+ type="#FIXED"
+ enumeration="yes"
+ value="preserve"
+ default="preserve"/>
+<attribute name="src"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="defer"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="defer"
+ default=""/>
+<attribute name="type"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="optgroup"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="option"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="option"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="optgroup">
+<attdecl>
+ %attrs;
+ disabled (disabled) #IMPLIED
+ label %Text; #REQUIRED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="label"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="td"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="td">
+<attdecl>
+ %attrs;
+ abbr %Text; #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ scope %Scope; #IMPLIED
+ rowspan %Number; "1"
+ colspan %Number; "1"
+ %cellhalign;
+ %cellvalign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="headers"
+ type="#IMPLIED"
+ value="IDREFS"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="abbr"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="scope"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="row col rowgroup colgroup"
+ default=""/>
+<attribute name="colspan"
+ type=""
+ value="CDATA"
+ default="1"/>
+<attribute name="rowspan"
+ type=""
+ value="CDATA"
+ default="1"/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="axis"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="title"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="title">
+<attdecl>
+ %i18n;
+ id ID #IMPLIED
+ </attdecl>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+</attlist>
+
+<element name="kbd"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="kbd">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="th"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="th">
+<attdecl>
+ %attrs;
+ abbr %Text; #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ scope %Scope; #IMPLIED
+ rowspan %Number; "1"
+ colspan %Number; "1"
+ %cellhalign;
+ %cellvalign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="headers"
+ type="#IMPLIED"
+ value="IDREFS"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="abbr"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="scope"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="row col rowgroup colgroup"
+ default=""/>
+<attribute name="colspan"
+ type=""
+ value="CDATA"
+ default="1"/>
+<attribute name="rowspan"
+ type=""
+ value="CDATA"
+ default="1"/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="axis"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="textarea"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="textarea">
+<attdecl>
+ %attrs;
+ %focus;
+ name CDATA #IMPLIED
+ rows %Number; #REQUIRED
+ cols %Number; #REQUIRED
+ disabled (disabled) #IMPLIED
+ readonly (readonly) #IMPLIED
+ onselect %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ </attdecl>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="rows"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onchange"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="cols"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onselect"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="readonly"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="readonly"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="meta"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="meta">
+<attdecl>
+ %i18n;
+ id ID #IMPLIED
+ http-equiv CDATA #IMPLIED
+ name CDATA #IMPLIED
+ content CDATA #REQUIRED
+ scheme CDATA #IMPLIED
+ </attdecl>
+<attribute name="scheme"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="http-equiv"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="content"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+</attlist>
+
+<element name="em"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="em">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="link"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="link">
+<attdecl>
+ %attrs;
+ charset %Charset; #IMPLIED
+ href %URI; #IMPLIED
+ hreflang %LanguageCode; #IMPLIED
+ type %ContentType; #IMPLIED
+ rel %LinkTypes; #IMPLIED
+ rev %LinkTypes; #IMPLIED
+ media %MediaDesc; #IMPLIED
+ </attdecl>
+<attribute name="rev"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="media"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="hreflang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="href"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="rel"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="tr"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="+">
+ <element-name name="th"/>
+ <element-name name="td"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="+">
+ <element-name name="th"/>
+ <element-name name="td"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="tr">
+<attdecl>
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="strong"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="strong">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="pre"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="pre.content"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="pre">
+<attdecl>
+ %attrs;
+ xml:space (preserve) #FIXED 'preserve'
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:space"
+ type="#FIXED"
+ enumeration="yes"
+ value="preserve"
+ default="preserve"/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="tt"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="tt">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="a"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="a.content"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="a">
+<attdecl>
+ %attrs;
+ %focus;
+ charset %Charset; #IMPLIED
+ type %ContentType; #IMPLIED
+ name NMTOKEN #IMPLIED
+ href %URI; #IMPLIED
+ hreflang %LanguageCode; #IMPLIED
+ rel %LinkTypes; #IMPLIED
+ rev %LinkTypes; #IMPLIED
+ shape %Shape; "rect"
+ coords %Coords; #IMPLIED
+ </attdecl>
+<attribute name="rev"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="hreflang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="href"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="rel"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="shape"
+ type=""
+ enumeration="yes"
+ value="rect circle poly default"
+ default="rect"/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="coords"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="input"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="input">
+<attdecl>
+ %attrs;
+ %focus;
+ type %InputType; "text"
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ checked (checked) #IMPLIED
+ disabled (disabled) #IMPLIED
+ readonly (readonly) #IMPLIED
+ size CDATA #IMPLIED
+ maxlength %Number; #IMPLIED
+ src %URI; #IMPLIED
+ alt CDATA #IMPLIED
+ usemap %URI; #IMPLIED
+ onselect %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ accept %ContentTypes; #IMPLIED
+ </attdecl>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="src"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="size"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="checked"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="checked"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="value"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="accept"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="alt"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="maxlength"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type=""
+ enumeration="yes"
+ value="text password checkbox radio submit reset file hidden image button"
+ default="text"/>
+<attribute name="onchange"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onselect"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="readonly"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="readonly"
+ default=""/>
+<attribute name="usemap"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="b"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="b">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="style"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="style">
+<attdecl>
+ %i18n;
+ id ID #IMPLIED
+ type %ContentType; #REQUIRED
+ media %MediaDesc; #IMPLIED
+ title %Text; #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ </attdecl>
+<attribute name="xml:space"
+ type="#FIXED"
+ enumeration="yes"
+ value="preserve"
+ default="preserve"/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="media"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="type"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="param"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="param">
+<attdecl>
+ id ID #IMPLIED
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ valuetype (data|ref|object) "data"
+ type %ContentType; #IMPLIED
+ </attdecl>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="value"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="valuetype"
+ type=""
+ enumeration="yes"
+ value="data ref object"
+ default="data"/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="i"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="i">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="html"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="head"/>
+ <element-name name="body"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="head"/>
+ <element-name name="body"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="html">
+<attdecl>
+ %i18n;
+ id ID #IMPLIED
+ xmlns %URI; #FIXED 'http://www.w3.org/1999/xhtml'
+ </attdecl>
+<attribute name="xmlns"
+ type="#FIXED"
+ value="CDATA"
+ default="http://www.w3.org/1999/xhtml"/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+</attlist>
+
+<element name="sub"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="sub">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="code"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="code">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="blockquote"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Block"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="blockquote">
+<attdecl>
+ %attrs;
+ cite %URI; #IMPLIED
+ </attdecl>
+<attribute name="cite"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="p"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="p">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="q"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="q">
+<attdecl>
+ %attrs;
+ cite %URI; #IMPLIED
+ </attdecl>
+<attribute name="cite"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="select"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="+">
+ <element-name name="optgroup"/>
+ <element-name name="option"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="+">
+ <element-name name="optgroup"/>
+ <element-name name="option"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="select">
+<attdecl>
+ %attrs;
+ name CDATA #IMPLIED
+ size %Number; #IMPLIED
+ multiple (multiple) #IMPLIED
+ disabled (disabled) #IMPLIED
+ tabindex %Number; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ </attdecl>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="size"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onchange"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="multiple"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="multiple"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="col"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="col">
+<attdecl>
+ %attrs;
+ span %Number; "1"
+ width %MultiLength; #IMPLIED
+ %cellhalign;
+ %cellvalign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="span"
+ type=""
+ value="CDATA"
+ default="1"/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="br"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="br">
+<attdecl>
+ %coreattrs;
+ </attdecl>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+</attlist>
+
+<element name="ul"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="li"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="li"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="ul">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="sup"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="sup">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+</dtd>
diff --git a/kate/xmltools/xhtml1-transitional.dtd.xml b/kate/xmltools/xhtml1-transitional.dtd.xml
new file mode 100644
index 0000000..9506803
--- /dev/null
+++ b/kate/xmltools/xhtml1-transitional.dtd.xml
@@ -0,0 +1,13983 @@
+<!DOCTYPE dtd PUBLIC "-//Norman Walsh//DTD DTDParse V2.0//EN"
+ "dtd.dtd" [
+<!ENTITY nbsp "&#160;">
+<!ENTITY iexcl "&#161;">
+<!ENTITY cent "&#162;">
+<!ENTITY pound "&#163;">
+<!ENTITY curren "&#164;">
+<!ENTITY yen "&#165;">
+<!ENTITY brvbar "&#166;">
+<!ENTITY sect "&#167;">
+<!ENTITY uml "&#168;">
+<!ENTITY copy "&#169;">
+<!ENTITY ordf "&#170;">
+<!ENTITY laquo "&#171;">
+<!ENTITY not "&#172;">
+<!ENTITY shy "&#173;">
+<!ENTITY reg "&#174;">
+<!ENTITY macr "&#175;">
+<!ENTITY deg "&#176;">
+<!ENTITY plusmn "&#177;">
+<!ENTITY sup2 "&#178;">
+<!ENTITY sup3 "&#179;">
+<!ENTITY acute "&#180;">
+<!ENTITY micro "&#181;">
+<!ENTITY para "&#182;">
+<!ENTITY middot "&#183;">
+<!ENTITY cedil "&#184;">
+<!ENTITY sup1 "&#185;">
+<!ENTITY ordm "&#186;">
+<!ENTITY raquo "&#187;">
+<!ENTITY frac14 "&#188;">
+<!ENTITY frac12 "&#189;">
+<!ENTITY frac34 "&#190;">
+<!ENTITY iquest "&#191;">
+<!ENTITY Agrave "&#192;">
+<!ENTITY Aacute "&#193;">
+<!ENTITY Acirc "&#194;">
+<!ENTITY Atilde "&#195;">
+<!ENTITY Auml "&#196;">
+<!ENTITY Aring "&#197;">
+<!ENTITY AElig "&#198;">
+<!ENTITY Ccedil "&#199;">
+<!ENTITY Egrave "&#200;">
+<!ENTITY Eacute "&#201;">
+<!ENTITY Ecirc "&#202;">
+<!ENTITY Euml "&#203;">
+<!ENTITY Igrave "&#204;">
+<!ENTITY Iacute "&#205;">
+<!ENTITY Icirc "&#206;">
+<!ENTITY Iuml "&#207;">
+<!ENTITY ETH "&#208;">
+<!ENTITY Ntilde "&#209;">
+<!ENTITY Ograve "&#210;">
+<!ENTITY Oacute "&#211;">
+<!ENTITY Ocirc "&#212;">
+<!ENTITY Otilde "&#213;">
+<!ENTITY Ouml "&#214;">
+<!ENTITY times "&#215;">
+<!ENTITY Oslash "&#216;">
+<!ENTITY Ugrave "&#217;">
+<!ENTITY Uacute "&#218;">
+<!ENTITY Ucirc "&#219;">
+<!ENTITY Uuml "&#220;">
+<!ENTITY Yacute "&#221;">
+<!ENTITY THORN "&#222;">
+<!ENTITY szlig "&#223;">
+<!ENTITY agrave "&#224;">
+<!ENTITY aacute "&#225;">
+<!ENTITY acirc "&#226;">
+<!ENTITY atilde "&#227;">
+<!ENTITY auml "&#228;">
+<!ENTITY aring "&#229;">
+<!ENTITY aelig "&#230;">
+<!ENTITY ccedil "&#231;">
+<!ENTITY egrave "&#232;">
+<!ENTITY eacute "&#233;">
+<!ENTITY ecirc "&#234;">
+<!ENTITY euml "&#235;">
+<!ENTITY igrave "&#236;">
+<!ENTITY iacute "&#237;">
+<!ENTITY icirc "&#238;">
+<!ENTITY iuml "&#239;">
+<!ENTITY eth "&#240;">
+<!ENTITY ntilde "&#241;">
+<!ENTITY ograve "&#242;">
+<!ENTITY oacute "&#243;">
+<!ENTITY ocirc "&#244;">
+<!ENTITY otilde "&#245;">
+<!ENTITY ouml "&#246;">
+<!ENTITY divide "&#247;">
+<!ENTITY oslash "&#248;">
+<!ENTITY ugrave "&#249;">
+<!ENTITY uacute "&#250;">
+<!ENTITY ucirc "&#251;">
+<!ENTITY uuml "&#252;">
+<!ENTITY yacute "&#253;">
+<!ENTITY thorn "&#254;">
+<!ENTITY yuml "&#255;">
+<!ENTITY fnof "&#402;">
+<!ENTITY Alpha "&#913;">
+<!ENTITY Beta "&#914;">
+<!ENTITY Gamma "&#915;">
+<!ENTITY Delta "&#916;">
+<!ENTITY Epsilon "&#917;">
+<!ENTITY Zeta "&#918;">
+<!ENTITY Eta "&#919;">
+<!ENTITY Theta "&#920;">
+<!ENTITY Iota "&#921;">
+<!ENTITY Kappa "&#922;">
+<!ENTITY Lambda "&#923;">
+<!ENTITY Mu "&#924;">
+<!ENTITY Nu "&#925;">
+<!ENTITY Xi "&#926;">
+<!ENTITY Omicron "&#927;">
+<!ENTITY Pi "&#928;">
+<!ENTITY Rho "&#929;">
+<!ENTITY Sigma "&#931;">
+<!ENTITY Tau "&#932;">
+<!ENTITY Upsilon "&#933;">
+<!ENTITY Phi "&#934;">
+<!ENTITY Chi "&#935;">
+<!ENTITY Psi "&#936;">
+<!ENTITY Omega "&#937;">
+<!ENTITY alpha "&#945;">
+<!ENTITY beta "&#946;">
+<!ENTITY gamma "&#947;">
+<!ENTITY delta "&#948;">
+<!ENTITY epsilon "&#949;">
+<!ENTITY zeta "&#950;">
+<!ENTITY eta "&#951;">
+<!ENTITY theta "&#952;">
+<!ENTITY iota "&#953;">
+<!ENTITY kappa "&#954;">
+<!ENTITY lambda "&#955;">
+<!ENTITY mu "&#956;">
+<!ENTITY nu "&#957;">
+<!ENTITY xi "&#958;">
+<!ENTITY omicron "&#959;">
+<!ENTITY pi "&#960;">
+<!ENTITY rho "&#961;">
+<!ENTITY sigmaf "&#962;">
+<!ENTITY sigma "&#963;">
+<!ENTITY tau "&#964;">
+<!ENTITY upsilon "&#965;">
+<!ENTITY phi "&#966;">
+<!ENTITY chi "&#967;">
+<!ENTITY psi "&#968;">
+<!ENTITY omega "&#969;">
+<!ENTITY thetasym "&#977;">
+<!ENTITY upsih "&#978;">
+<!ENTITY piv "&#982;">
+<!ENTITY bull "&#8226;">
+<!ENTITY hellip "&#8230;">
+<!ENTITY prime "&#8242;">
+<!ENTITY Prime "&#8243;">
+<!ENTITY oline "&#8254;">
+<!ENTITY frasl "&#8260;">
+<!ENTITY weierp "&#8472;">
+<!ENTITY image "&#8465;">
+<!ENTITY real "&#8476;">
+<!ENTITY trade "&#8482;">
+<!ENTITY alefsym "&#8501;">
+<!ENTITY larr "&#8592;">
+<!ENTITY uarr "&#8593;">
+<!ENTITY rarr "&#8594;">
+<!ENTITY darr "&#8595;">
+<!ENTITY harr "&#8596;">
+<!ENTITY crarr "&#8629;">
+<!ENTITY lArr "&#8656;">
+<!ENTITY uArr "&#8657;">
+<!ENTITY rArr "&#8658;">
+<!ENTITY dArr "&#8659;">
+<!ENTITY hArr "&#8660;">
+<!ENTITY forall "&#8704;">
+<!ENTITY part "&#8706;">
+<!ENTITY exist "&#8707;">
+<!ENTITY empty "&#8709;">
+<!ENTITY nabla "&#8711;">
+<!ENTITY isin "&#8712;">
+<!ENTITY notin "&#8713;">
+<!ENTITY ni "&#8715;">
+<!ENTITY prod "&#8719;">
+<!ENTITY sum "&#8721;">
+<!ENTITY minus "&#8722;">
+<!ENTITY lowast "&#8727;">
+<!ENTITY radic "&#8730;">
+<!ENTITY prop "&#8733;">
+<!ENTITY infin "&#8734;">
+<!ENTITY ang "&#8736;">
+<!ENTITY and "&#8743;">
+<!ENTITY or "&#8744;">
+<!ENTITY cap "&#8745;">
+<!ENTITY cup "&#8746;">
+<!ENTITY int "&#8747;">
+<!ENTITY there4 "&#8756;">
+<!ENTITY sim "&#8764;">
+<!ENTITY cong "&#8773;">
+<!ENTITY asymp "&#8776;">
+<!ENTITY ne "&#8800;">
+<!ENTITY equiv "&#8801;">
+<!ENTITY le "&#8804;">
+<!ENTITY ge "&#8805;">
+<!ENTITY sub "&#8834;">
+<!ENTITY sup "&#8835;">
+<!ENTITY nsub "&#8836;">
+<!ENTITY sube "&#8838;">
+<!ENTITY supe "&#8839;">
+<!ENTITY oplus "&#8853;">
+<!ENTITY otimes "&#8855;">
+<!ENTITY perp "&#8869;">
+<!ENTITY sdot "&#8901;">
+<!ENTITY lceil "&#8968;">
+<!ENTITY rceil "&#8969;">
+<!ENTITY lfloor "&#8970;">
+<!ENTITY rfloor "&#8971;">
+<!ENTITY lang "&#9001;">
+<!ENTITY rang "&#9002;">
+<!ENTITY loz "&#9674;">
+<!ENTITY spades "&#9824;">
+<!ENTITY clubs "&#9827;">
+<!ENTITY hearts "&#9829;">
+<!ENTITY diams "&#9830;">
+<!ENTITY quot "&#34;">
+<!ENTITY amp "&#38;#38;">
+<!ENTITY lt "&#38;#60;">
+<!ENTITY gt "&#62;">
+<!ENTITY apos "&#39;">
+<!ENTITY OElig "&#338;">
+<!ENTITY oelig "&#339;">
+<!ENTITY Scaron "&#352;">
+<!ENTITY scaron "&#353;">
+<!ENTITY Yuml "&#376;">
+<!ENTITY circ "&#710;">
+<!ENTITY tilde "&#732;">
+<!ENTITY ensp "&#8194;">
+<!ENTITY emsp "&#8195;">
+<!ENTITY thinsp "&#8201;">
+<!ENTITY zwnj "&#8204;">
+<!ENTITY zwj "&#8205;">
+<!ENTITY lrm "&#8206;">
+<!ENTITY rlm "&#8207;">
+<!ENTITY ndash "&#8211;">
+<!ENTITY mdash "&#8212;">
+<!ENTITY lsquo "&#8216;">
+<!ENTITY rsquo "&#8217;">
+<!ENTITY sbquo "&#8218;">
+<!ENTITY ldquo "&#8220;">
+<!ENTITY rdquo "&#8221;">
+<!ENTITY bdquo "&#8222;">
+<!ENTITY dagger "&#8224;">
+<!ENTITY Dagger "&#8225;">
+<!ENTITY permil "&#8240;">
+<!ENTITY lsaquo "&#8249;">
+<!ENTITY rsaquo "&#8250;">
+<!ENTITY euro "&#8364;">
+]>
+<dtd version='1.0'
+ unexpanded='1'
+ title="?untitled?"
+ namecase-general="1"
+ namecase-entity="0"
+ xml="0"
+ system-id="xhtml1-transitional.dtd"
+ public-id=""
+ declaration=""
+ created-by="DTDParse V2.0beta6"
+ created-on="Sun Oct 7 15:00:34 2001"
+>
+<entity name="LanguageCode"
+ type="param"
+>
+<text-expanded>NMTOKEN</text-expanded>
+<text>NMTOKEN</text>
+</entity>
+
+<entity name="ULStyle"
+ type="param"
+>
+<text-expanded>(disc|square|circle)</text-expanded>
+<text>(disc|square|circle)</text>
+</entity>
+
+<entity name="pre.content"
+ type="param"
+>
+<text-expanded>(#PCDATA | a | br | span | bdo | tt | i | b | u
+ | s | strike | em | strong | dfn | code | q |
+ samp | kbd | var | cite | abbr | acronym |
+ input | select | textarea | label | button | ins | del | script | noscript)*</text-expanded>
+<text>(#PCDATA | a | %special.basic; | %fontstyle.basic; | %phrase.basic; |
+ %inline.forms; | %misc;)*</text>
+</entity>
+
+<entity name="Script"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="fontstyle.extra"
+ type="param"
+>
+<text-expanded>big | small | font | basefont</text-expanded>
+<text>big | small | font | basefont</text>
+</entity>
+
+<entity name="Color"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="fontstyle.basic"
+ type="param"
+>
+<text-expanded>tt | i | b | u
+ | s | strike </text-expanded>
+<text>tt | i | b | u
+ | s | strike </text>
+</entity>
+
+<entity name="TFrame"
+ type="param"
+>
+<text-expanded>(void|above|below|hsides|lhs|rhs|vsides|box|border)</text-expanded>
+<text>(void|above|below|hsides|lhs|rhs|vsides|box|border)</text>
+</entity>
+
+<entity name="Character"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="URI"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="coreattrs"
+ type="param"
+>
+<text-expanded>id ID #IMPLIED
+ class CDATA #IMPLIED
+ style CDATA #IMPLIED
+ title CDATA #IMPLIED</text-expanded>
+<text>id ID #IMPLIED
+ class CDATA #IMPLIED
+ style %StyleSheet; #IMPLIED
+ title %Text; #IMPLIED</text>
+</entity>
+
+<entity name="HTMLlat1"
+ type="param"
+ public="-//W3C//ENTITIES Latin 1 for XHTML//EN"
+ system="xhtml-lat1.ent"
+/>
+
+<entity name="Inline"
+ type="param"
+>
+<text-expanded>(#PCDATA | a | br | span | bdo | object | applet | img | map | iframe | tt | i | b | u
+ | s | strike | big | small | font | basefont | em | strong | dfn | code | q |
+ samp | kbd | var | cite | abbr | acronym | sub | sup | input | select | textarea | label | button | ins | del | script | noscript)*</text-expanded>
+<text>(#PCDATA | %inline; | %misc;)*</text>
+</entity>
+
+<entity name="OLStyle"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="Flow"
+ type="param"
+>
+<text-expanded>(#PCDATA | p | h1|h2|h3|h4|h5|h6 | div | ul | ol | dl | menu | dir | pre | hr | blockquote | address | center | noframes | isindex |fieldset | table | form | a | br | span | bdo | object | applet | img | map | iframe | tt | i | b | u
+ | s | strike | big | small | font | basefont | em | strong | dfn | code | q |
+ samp | kbd | var | cite | abbr | acronym | sub | sup | input | select | textarea | label | button | ins | del | script | noscript)*</text-expanded>
+<text>(#PCDATA | %block; | form | %inline; | %misc;)*</text>
+</entity>
+
+<entity name="TextAlign"
+ type="param"
+>
+<text-expanded>align (left|center|right|justify) #IMPLIED</text-expanded>
+<text>align (left|center|right|justify) #IMPLIED</text>
+</entity>
+
+<entity name="ContentTypes"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="head.misc"
+ type="param"
+>
+<text-expanded>(script|style|meta|link|object|isindex)*</text-expanded>
+<text>(script|style|meta|link|object|isindex)*</text>
+</entity>
+
+<entity name="block"
+ type="param"
+>
+<text-expanded>p | h1|h2|h3|h4|h5|h6 | div | ul | ol | dl | menu | dir | pre | hr | blockquote | address | center | noframes | isindex |fieldset | table</text-expanded>
+<text>p | %heading; | div | %lists; | %blocktext; | isindex |fieldset | table</text>
+</entity>
+
+<entity name="HTMLspecial"
+ type="param"
+ public="-//W3C//ENTITIES Special for XHTML//EN"
+ system="xhtml-special.ent"
+/>
+
+<entity name="special"
+ type="param"
+>
+<text-expanded>br | span | bdo | object | applet | img | map | iframe</text-expanded>
+<text>%special.basic; | %special.extra;</text>
+</entity>
+
+<entity name="CAlign"
+ type="param"
+>
+<text-expanded>(top|bottom|left|right)</text-expanded>
+<text>(top|bottom|left|right)</text>
+</entity>
+
+<entity name="form.content"
+ type="param"
+>
+<text-expanded>(#PCDATA | p | h1|h2|h3|h4|h5|h6 | div | ul | ol | dl | menu | dir | pre | hr | blockquote | address | center | noframes | isindex |fieldset | table | a | br | span | bdo | object | applet | img | map | iframe | tt | i | b | u
+ | s | strike | big | small | font | basefont | em | strong | dfn | code | q |
+ samp | kbd | var | cite | abbr | acronym | sub | sup | input | select | textarea | label | button | ins | del | script | noscript)*</text-expanded>
+<text>(#PCDATA | %block; | %inline; | %misc;)*</text>
+</entity>
+
+<entity name="phrase"
+ type="param"
+>
+<text-expanded>em | strong | dfn | code | q |
+ samp | kbd | var | cite | abbr | acronym | sub | sup</text-expanded>
+<text>%phrase.basic; | %phrase.extra;</text>
+</entity>
+
+<entity name="ContentType"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="StyleSheet"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="cellhalign"
+ type="param"
+>
+<text-expanded>align (left|center|right|justify|char) #IMPLIED
+ char CDATA #IMPLIED
+ charoff CDATA #IMPLIED</text-expanded>
+<text>align (left|center|right|justify|char) #IMPLIED
+ char %Character; #IMPLIED
+ charoff %Length; #IMPLIED</text>
+</entity>
+
+<entity name="Datetime"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="i18n"
+ type="param"
+>
+<text-expanded>lang NMTOKEN #IMPLIED
+ xml:lang NMTOKEN #IMPLIED
+ dir (ltr|rtl) #IMPLIED</text-expanded>
+<text>lang %LanguageCode; #IMPLIED
+ xml:lang %LanguageCode; #IMPLIED
+ dir (ltr|rtl) #IMPLIED</text>
+</entity>
+
+<entity name="phrase.extra"
+ type="param"
+>
+<text-expanded>sub | sup</text-expanded>
+<text>sub | sup</text>
+</entity>
+
+<entity name="phrase.basic"
+ type="param"
+>
+<text-expanded>em | strong | dfn | code | q |
+ samp | kbd | var | cite | abbr | acronym</text-expanded>
+<text>em | strong | dfn | code | q |
+ samp | kbd | var | cite | abbr | acronym</text>
+</entity>
+
+<entity name="misc"
+ type="param"
+>
+<text-expanded>ins | del | script | noscript</text-expanded>
+<text>ins | del | script | noscript</text>
+</entity>
+
+<entity name="LAlign"
+ type="param"
+>
+<text-expanded>(top|bottom|left|right)</text-expanded>
+<text>(top|bottom|left|right)</text>
+</entity>
+
+<entity name="UriList"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="MultiLength"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="button.content"
+ type="param"
+>
+<text-expanded>(#PCDATA | p | h1|h2|h3|h4|h5|h6 | div | ul | ol | dl | menu | dir | pre | hr | blockquote | address | center | noframes |
+ table | br | span | bdo | object | applet | img | map |
+ tt | i | b | u
+ | s | strike | big | small | font | basefont | em | strong | dfn | code | q |
+ samp | kbd | var | cite | abbr | acronym | sub | sup | ins | del | script | noscript)*</text-expanded>
+<text>(#PCDATA | p | %heading; | div | %lists; | %blocktext; |
+ table | br | span | bdo | object | applet | img | map |
+ %fontstyle; | %phrase; | %misc;)*</text>
+</entity>
+
+<entity name="Text"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="cellvalign"
+ type="param"
+>
+<text-expanded>valign (top|middle|bottom|baseline) #IMPLIED</text-expanded>
+<text>valign (top|middle|bottom|baseline) #IMPLIED</text>
+</entity>
+
+<entity name="HTMLsymbol"
+ type="param"
+ public="-//W3C//ENTITIES Symbols for XHTML//EN"
+ system="xhtml-symbol.ent"
+/>
+
+<entity name="focus"
+ type="param"
+>
+<text-expanded>accesskey CDATA #IMPLIED
+ tabindex CDATA #IMPLIED
+ onfocus CDATA #IMPLIED
+ onblur CDATA #IMPLIED</text-expanded>
+<text>accesskey %Character; #IMPLIED
+ tabindex %Number; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED</text>
+</entity>
+
+<entity name="Shape"
+ type="param"
+>
+<text-expanded>(rect|circle|poly|default)</text-expanded>
+<text>(rect|circle|poly|default)</text>
+</entity>
+
+<entity name="events"
+ type="param"
+>
+<text-expanded>onclick CDATA #IMPLIED
+ ondblclick CDATA #IMPLIED
+ onmousedown CDATA #IMPLIED
+ onmouseup CDATA #IMPLIED
+ onmouseover CDATA #IMPLIED
+ onmousemove CDATA #IMPLIED
+ onmouseout CDATA #IMPLIED
+ onkeypress CDATA #IMPLIED
+ onkeydown CDATA #IMPLIED
+ onkeyup CDATA #IMPLIED</text-expanded>
+<text>onclick %Script; #IMPLIED
+ ondblclick %Script; #IMPLIED
+ onmousedown %Script; #IMPLIED
+ onmouseup %Script; #IMPLIED
+ onmouseover %Script; #IMPLIED
+ onmousemove %Script; #IMPLIED
+ onmouseout %Script; #IMPLIED
+ onkeypress %Script; #IMPLIED
+ onkeydown %Script; #IMPLIED
+ onkeyup %Script; #IMPLIED</text>
+</entity>
+
+<entity name="inline.forms"
+ type="param"
+>
+<text-expanded>input | select | textarea | label | button</text-expanded>
+<text>input | select | textarea | label | button</text>
+</entity>
+
+<entity name="a.content"
+ type="param"
+>
+<text-expanded>(#PCDATA | br | span | bdo | object | applet | img | map | iframe | tt | i | b | u
+ | s | strike | big | small | font | basefont | em | strong | dfn | code | q |
+ samp | kbd | var | cite | abbr | acronym | sub | sup | input | select | textarea | label | button | ins | del | script | noscript)*</text-expanded>
+<text>(#PCDATA | %special; | %fontstyle; | %phrase; | %inline.forms; | %misc;)*</text>
+</entity>
+
+<entity name="TRules"
+ type="param"
+>
+<text-expanded>(none | groups | rows | cols | all)</text-expanded>
+<text>(none | groups | rows | cols | all)</text>
+</entity>
+
+<entity name="inline"
+ type="param"
+>
+<text-expanded>a | br | span | bdo | object | applet | img | map | iframe | tt | i | b | u
+ | s | strike | big | small | font | basefont | em | strong | dfn | code | q |
+ samp | kbd | var | cite | abbr | acronym | sub | sup | input | select | textarea | label | button</text-expanded>
+<text>a | %special; | %fontstyle; | %phrase; | %inline.forms;</text>
+</entity>
+
+<entity name="Charsets"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="FrameTarget"
+ type="param"
+>
+<text-expanded>NMTOKEN</text-expanded>
+<text>NMTOKEN</text>
+</entity>
+
+<entity name="lists"
+ type="param"
+>
+<text-expanded>ul | ol | dl | menu | dir</text-expanded>
+<text>ul | ol | dl | menu | dir</text>
+</entity>
+
+<entity name="blocktext"
+ type="param"
+>
+<text-expanded>pre | hr | blockquote | address | center | noframes</text-expanded>
+<text>pre | hr | blockquote | address | center | noframes</text>
+</entity>
+
+<entity name="Number"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="LinkTypes"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="Scope"
+ type="param"
+>
+<text-expanded>(row|col|rowgroup|colgroup)</text-expanded>
+<text>(row|col|rowgroup|colgroup)</text>
+</entity>
+
+<entity name="special.extra"
+ type="param"
+>
+<text-expanded>object | applet | img | map | iframe</text-expanded>
+<text>object | applet | img | map | iframe</text>
+</entity>
+
+<entity name="InputType"
+ type="param"
+>
+<text-expanded>(text | password | checkbox |
+ radio | submit | reset |
+ file | hidden | image | button)</text-expanded>
+<text>(text | password | checkbox |
+ radio | submit | reset |
+ file | hidden | image | button)</text>
+</entity>
+
+<entity name="special.basic"
+ type="param"
+>
+<text-expanded>br | span | bdo</text-expanded>
+<text>br | span | bdo</text>
+</entity>
+
+<entity name="ImgAlign"
+ type="param"
+>
+<text-expanded>(top|middle|bottom|left|right)</text-expanded>
+<text>(top|middle|bottom|left|right)</text>
+</entity>
+
+<entity name="Length"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="TAlign"
+ type="param"
+>
+<text-expanded>(left|center|right)</text-expanded>
+<text>(left|center|right)</text>
+</entity>
+
+<entity name="MediaDesc"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="LIStyle"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="attrs"
+ type="param"
+>
+<text-expanded>id ID #IMPLIED
+ class CDATA #IMPLIED
+ style CDATA #IMPLIED
+ title CDATA #IMPLIED lang NMTOKEN #IMPLIED
+ xml:lang NMTOKEN #IMPLIED
+ dir (ltr|rtl) #IMPLIED onclick CDATA #IMPLIED
+ ondblclick CDATA #IMPLIED
+ onmousedown CDATA #IMPLIED
+ onmouseup CDATA #IMPLIED
+ onmouseover CDATA #IMPLIED
+ onmousemove CDATA #IMPLIED
+ onmouseout CDATA #IMPLIED
+ onkeypress CDATA #IMPLIED
+ onkeydown CDATA #IMPLIED
+ onkeyup CDATA #IMPLIED</text-expanded>
+<text>%coreattrs; %i18n; %events;</text>
+</entity>
+
+<entity name="Pixels"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="Coords"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="fontstyle"
+ type="param"
+>
+<text-expanded>tt | i | b | u
+ | s | strike | big | small | font | basefont</text-expanded>
+<text>%fontstyle.basic; | %fontstyle.extra;</text>
+</entity>
+
+<entity name="Charset"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="heading"
+ type="param"
+>
+<text-expanded>h1|h2|h3|h4|h5|h6</text-expanded>
+<text>h1|h2|h3|h4|h5|h6</text>
+</entity>
+
+<entity name="ntilde"
+ type="gen"
+>
+<text-expanded>&amp;#241;</text-expanded>
+<text>&amp;#241;</text>
+</entity>
+
+<entity name="prime"
+ type="gen"
+>
+<text-expanded>&amp;#8242;</text-expanded>
+<text>&amp;#8242;</text>
+</entity>
+
+<entity name="quot"
+ type="gen"
+>
+<text-expanded>&amp;#34;</text-expanded>
+<text>&amp;#34;</text>
+</entity>
+
+<entity name="rceil"
+ type="gen"
+>
+<text-expanded>&amp;#8969;</text-expanded>
+<text>&amp;#8969;</text>
+</entity>
+
+<entity name="prod"
+ type="gen"
+>
+<text-expanded>&amp;#8719;</text-expanded>
+<text>&amp;#8719;</text>
+</entity>
+
+<entity name="Euml"
+ type="gen"
+>
+<text-expanded>&amp;#203;</text-expanded>
+<text>&amp;#203;</text>
+</entity>
+
+<entity name="loz"
+ type="gen"
+>
+<text-expanded>&amp;#9674;</text-expanded>
+<text>&amp;#9674;</text>
+</entity>
+
+<entity name="Yacute"
+ type="gen"
+>
+<text-expanded>&amp;#221;</text-expanded>
+<text>&amp;#221;</text>
+</entity>
+
+<entity name="rdquo"
+ type="gen"
+>
+<text-expanded>&amp;#8221;</text-expanded>
+<text>&amp;#8221;</text>
+</entity>
+
+<entity name="ne"
+ type="gen"
+>
+<text-expanded>&amp;#8800;</text-expanded>
+<text>&amp;#8800;</text>
+</entity>
+
+<entity name="igrave"
+ type="gen"
+>
+<text-expanded>&amp;#236;</text-expanded>
+<text>&amp;#236;</text>
+</entity>
+
+<entity name="psi"
+ type="gen"
+>
+<text-expanded>&amp;#968;</text-expanded>
+<text>&amp;#968;</text>
+</entity>
+
+<entity name="Oacute"
+ type="gen"
+>
+<text-expanded>&amp;#211;</text-expanded>
+<text>&amp;#211;</text>
+</entity>
+
+<entity name="lsaquo"
+ type="gen"
+>
+<text-expanded>&amp;#8249;</text-expanded>
+<text>&amp;#8249;</text>
+</entity>
+
+<entity name="ni"
+ type="gen"
+>
+<text-expanded>&amp;#8715;</text-expanded>
+<text>&amp;#8715;</text>
+</entity>
+
+<entity name="frasl"
+ type="gen"
+>
+<text-expanded>&amp;#8260;</text-expanded>
+<text>&amp;#8260;</text>
+</entity>
+
+<entity name="Epsilon"
+ type="gen"
+>
+<text-expanded>&amp;#917;</text-expanded>
+<text>&amp;#917;</text>
+</entity>
+
+<entity name="rArr"
+ type="gen"
+>
+<text-expanded>&amp;#8658;</text-expanded>
+<text>&amp;#8658;</text>
+</entity>
+
+<entity name="Eacute"
+ type="gen"
+>
+<text-expanded>&amp;#201;</text-expanded>
+<text>&amp;#201;</text>
+</entity>
+
+<entity name="acute"
+ type="gen"
+>
+<text-expanded>&amp;#180;</text-expanded>
+<text>&amp;#180;</text>
+</entity>
+
+<entity name="Pi"
+ type="gen"
+>
+<text-expanded>&amp;#928;</text-expanded>
+<text>&amp;#928;</text>
+</entity>
+
+<entity name="radic"
+ type="gen"
+>
+<text-expanded>&amp;#8730;</text-expanded>
+<text>&amp;#8730;</text>
+</entity>
+
+<entity name="Ugrave"
+ type="gen"
+>
+<text-expanded>&amp;#217;</text-expanded>
+<text>&amp;#217;</text>
+</entity>
+
+<entity name="prop"
+ type="gen"
+>
+<text-expanded>&amp;#8733;</text-expanded>
+<text>&amp;#8733;</text>
+</entity>
+
+<entity name="ccedil"
+ type="gen"
+>
+<text-expanded>&amp;#231;</text-expanded>
+<text>&amp;#231;</text>
+</entity>
+
+<entity name="Iuml"
+ type="gen"
+>
+<text-expanded>&amp;#207;</text-expanded>
+<text>&amp;#207;</text>
+</entity>
+
+<entity name="Agrave"
+ type="gen"
+>
+<text-expanded>&amp;#192;</text-expanded>
+<text>&amp;#192;</text>
+</entity>
+
+<entity name="bull"
+ type="gen"
+>
+<text-expanded>&amp;#8226;</text-expanded>
+<text>&amp;#8226;</text>
+</entity>
+
+<entity name="nu"
+ type="gen"
+>
+<text-expanded>&amp;#957;</text-expanded>
+<text>&amp;#957;</text>
+</entity>
+
+<entity name="ge"
+ type="gen"
+>
+<text-expanded>&amp;#8805;</text-expanded>
+<text>&amp;#8805;</text>
+</entity>
+
+<entity name="gamma"
+ type="gen"
+>
+<text-expanded>&amp;#947;</text-expanded>
+<text>&amp;#947;</text>
+</entity>
+
+<entity name="Kappa"
+ type="gen"
+>
+<text-expanded>&amp;#922;</text-expanded>
+<text>&amp;#922;</text>
+</entity>
+
+<entity name="aring"
+ type="gen"
+>
+<text-expanded>&amp;#229;</text-expanded>
+<text>&amp;#229;</text>
+</entity>
+
+<entity name="cedil"
+ type="gen"
+>
+<text-expanded>&amp;#184;</text-expanded>
+<text>&amp;#184;</text>
+</entity>
+
+<entity name="laquo"
+ type="gen"
+>
+<text-expanded>&amp;#171;</text-expanded>
+<text>&amp;#171;</text>
+</entity>
+
+<entity name="Xi"
+ type="gen"
+>
+<text-expanded>&amp;#926;</text-expanded>
+<text>&amp;#926;</text>
+</entity>
+
+<entity name="copy"
+ type="gen"
+>
+<text-expanded>&amp;#169;</text-expanded>
+<text>&amp;#169;</text>
+</entity>
+
+<entity name="crarr"
+ type="gen"
+>
+<text-expanded>&amp;#8629;</text-expanded>
+<text>&amp;#8629;</text>
+</entity>
+
+<entity name="sigma"
+ type="gen"
+>
+<text-expanded>&amp;#963;</text-expanded>
+<text>&amp;#963;</text>
+</entity>
+
+<entity name="acirc"
+ type="gen"
+>
+<text-expanded>&amp;#226;</text-expanded>
+<text>&amp;#226;</text>
+</entity>
+
+<entity name="clubs"
+ type="gen"
+>
+<text-expanded>&amp;#9827;</text-expanded>
+<text>&amp;#9827;</text>
+</entity>
+
+<entity name="Otilde"
+ type="gen"
+>
+<text-expanded>&amp;#213;</text-expanded>
+<text>&amp;#213;</text>
+</entity>
+
+<entity name="ETH"
+ type="gen"
+>
+<text-expanded>&amp;#208;</text-expanded>
+<text>&amp;#208;</text>
+</entity>
+
+<entity name="iota"
+ type="gen"
+>
+<text-expanded>&amp;#953;</text-expanded>
+<text>&amp;#953;</text>
+</entity>
+
+<entity name="gt"
+ type="gen"
+>
+<text-expanded>&amp;#62;</text-expanded>
+<text>&amp;#62;</text>
+</entity>
+
+<entity name="tilde"
+ type="gen"
+>
+<text-expanded>&amp;#732;</text-expanded>
+<text>&amp;#732;</text>
+</entity>
+
+<entity name="Chi"
+ type="gen"
+>
+<text-expanded>&amp;#935;</text-expanded>
+<text>&amp;#935;</text>
+</entity>
+
+<entity name="Theta"
+ type="gen"
+>
+<text-expanded>&amp;#920;</text-expanded>
+<text>&amp;#920;</text>
+</entity>
+
+<entity name="upsih"
+ type="gen"
+>
+<text-expanded>&amp;#978;</text-expanded>
+<text>&amp;#978;</text>
+</entity>
+
+<entity name="ouml"
+ type="gen"
+>
+<text-expanded>&amp;#246;</text-expanded>
+<text>&amp;#246;</text>
+</entity>
+
+<entity name="uacute"
+ type="gen"
+>
+<text-expanded>&amp;#250;</text-expanded>
+<text>&amp;#250;</text>
+</entity>
+
+<entity name="uml"
+ type="gen"
+>
+<text-expanded>&amp;#168;</text-expanded>
+<text>&amp;#168;</text>
+</entity>
+
+<entity name="mdash"
+ type="gen"
+>
+<text-expanded>&amp;#8212;</text-expanded>
+<text>&amp;#8212;</text>
+</entity>
+
+<entity name="forall"
+ type="gen"
+>
+<text-expanded>&amp;#8704;</text-expanded>
+<text>&amp;#8704;</text>
+</entity>
+
+<entity name="Phi"
+ type="gen"
+>
+<text-expanded>&amp;#934;</text-expanded>
+<text>&amp;#934;</text>
+</entity>
+
+<entity name="euro"
+ type="gen"
+>
+<text-expanded>&amp;#8364;</text-expanded>
+<text>&amp;#8364;</text>
+</entity>
+
+<entity name="aacute"
+ type="gen"
+>
+<text-expanded>&amp;#225;</text-expanded>
+<text>&amp;#225;</text>
+</entity>
+
+<entity name="or"
+ type="gen"
+>
+<text-expanded>&amp;#8744;</text-expanded>
+<text>&amp;#8744;</text>
+</entity>
+
+<entity name="ecirc"
+ type="gen"
+>
+<text-expanded>&amp;#234;</text-expanded>
+<text>&amp;#234;</text>
+</entity>
+
+<entity name="iquest"
+ type="gen"
+>
+<text-expanded>&amp;#191;</text-expanded>
+<text>&amp;#191;</text>
+</entity>
+
+<entity name="tau"
+ type="gen"
+>
+<text-expanded>&amp;#964;</text-expanded>
+<text>&amp;#964;</text>
+</entity>
+
+<entity name="emsp"
+ type="gen"
+>
+<text-expanded>&amp;#8195;</text-expanded>
+<text>&amp;#8195;</text>
+</entity>
+
+<entity name="weierp"
+ type="gen"
+>
+<text-expanded>&amp;#8472;</text-expanded>
+<text>&amp;#8472;</text>
+</entity>
+
+<entity name="Ntilde"
+ type="gen"
+>
+<text-expanded>&amp;#209;</text-expanded>
+<text>&amp;#209;</text>
+</entity>
+
+<entity name="lang"
+ type="gen"
+>
+<text-expanded>&amp;#9001;</text-expanded>
+<text>&amp;#9001;</text>
+</entity>
+
+<entity name="lambda"
+ type="gen"
+>
+<text-expanded>&amp;#955;</text-expanded>
+<text>&amp;#955;</text>
+</entity>
+
+<entity name="Delta"
+ type="gen"
+>
+<text-expanded>&amp;#916;</text-expanded>
+<text>&amp;#916;</text>
+</entity>
+
+<entity name="Uuml"
+ type="gen"
+>
+<text-expanded>&amp;#220;</text-expanded>
+<text>&amp;#220;</text>
+</entity>
+
+<entity name="oline"
+ type="gen"
+>
+<text-expanded>&amp;#8254;</text-expanded>
+<text>&amp;#8254;</text>
+</entity>
+
+<entity name="Igrave"
+ type="gen"
+>
+<text-expanded>&amp;#204;</text-expanded>
+<text>&amp;#204;</text>
+</entity>
+
+<entity name="Ocirc"
+ type="gen"
+>
+<text-expanded>&amp;#212;</text-expanded>
+<text>&amp;#212;</text>
+</entity>
+
+<entity name="OElig"
+ type="gen"
+>
+<text-expanded>&amp;#338;</text-expanded>
+<text>&amp;#338;</text>
+</entity>
+
+<entity name="isin"
+ type="gen"
+>
+<text-expanded>&amp;#8712;</text-expanded>
+<text>&amp;#8712;</text>
+</entity>
+
+<entity name="icirc"
+ type="gen"
+>
+<text-expanded>&amp;#238;</text-expanded>
+<text>&amp;#238;</text>
+</entity>
+
+<entity name="cup"
+ type="gen"
+>
+<text-expanded>&amp;#8746;</text-expanded>
+<text>&amp;#8746;</text>
+</entity>
+
+<entity name="zeta"
+ type="gen"
+>
+<text-expanded>&amp;#950;</text-expanded>
+<text>&amp;#950;</text>
+</entity>
+
+<entity name="pi"
+ type="gen"
+>
+<text-expanded>&amp;#960;</text-expanded>
+<text>&amp;#960;</text>
+</entity>
+
+<entity name="Ccedil"
+ type="gen"
+>
+<text-expanded>&amp;#199;</text-expanded>
+<text>&amp;#199;</text>
+</entity>
+
+<entity name="atilde"
+ type="gen"
+>
+<text-expanded>&amp;#227;</text-expanded>
+<text>&amp;#227;</text>
+</entity>
+
+<entity name="dArr"
+ type="gen"
+>
+<text-expanded>&amp;#8659;</text-expanded>
+<text>&amp;#8659;</text>
+</entity>
+
+<entity name="Yuml"
+ type="gen"
+>
+<text-expanded>&amp;#376;</text-expanded>
+<text>&amp;#376;</text>
+</entity>
+
+<entity name="uArr"
+ type="gen"
+>
+<text-expanded>&amp;#8657;</text-expanded>
+<text>&amp;#8657;</text>
+</entity>
+
+<entity name="there4"
+ type="gen"
+>
+<text-expanded>&amp;#8756;</text-expanded>
+<text>&amp;#8756;</text>
+</entity>
+
+<entity name="minus"
+ type="gen"
+>
+<text-expanded>&amp;#8722;</text-expanded>
+<text>&amp;#8722;</text>
+</entity>
+
+<entity name="upsilon"
+ type="gen"
+>
+<text-expanded>&amp;#965;</text-expanded>
+<text>&amp;#965;</text>
+</entity>
+
+<entity name="lrm"
+ type="gen"
+>
+<text-expanded>&amp;#8206;</text-expanded>
+<text>&amp;#8206;</text>
+</entity>
+
+<entity name="rho"
+ type="gen"
+>
+<text-expanded>&amp;#961;</text-expanded>
+<text>&amp;#961;</text>
+</entity>
+
+<entity name="lowast"
+ type="gen"
+>
+<text-expanded>&amp;#8727;</text-expanded>
+<text>&amp;#8727;</text>
+</entity>
+
+<entity name="xi"
+ type="gen"
+>
+<text-expanded>&amp;#958;</text-expanded>
+<text>&amp;#958;</text>
+</entity>
+
+<entity name="Prime"
+ type="gen"
+>
+<text-expanded>&amp;#8243;</text-expanded>
+<text>&amp;#8243;</text>
+</entity>
+
+<entity name="spades"
+ type="gen"
+>
+<text-expanded>&amp;#9824;</text-expanded>
+<text>&amp;#9824;</text>
+</entity>
+
+<entity name="lceil"
+ type="gen"
+>
+<text-expanded>&amp;#8968;</text-expanded>
+<text>&amp;#8968;</text>
+</entity>
+
+<entity name="hArr"
+ type="gen"
+>
+<text-expanded>&amp;#8660;</text-expanded>
+<text>&amp;#8660;</text>
+</entity>
+
+<entity name="alpha"
+ type="gen"
+>
+<text-expanded>&amp;#945;</text-expanded>
+<text>&amp;#945;</text>
+</entity>
+
+<entity name="iacute"
+ type="gen"
+>
+<text-expanded>&amp;#237;</text-expanded>
+<text>&amp;#237;</text>
+</entity>
+
+<entity name="lfloor"
+ type="gen"
+>
+<text-expanded>&amp;#8970;</text-expanded>
+<text>&amp;#8970;</text>
+</entity>
+
+<entity name="infin"
+ type="gen"
+>
+<text-expanded>&amp;#8734;</text-expanded>
+<text>&amp;#8734;</text>
+</entity>
+
+<entity name="image"
+ type="gen"
+>
+<text-expanded>&amp;#8465;</text-expanded>
+<text>&amp;#8465;</text>
+</entity>
+
+<entity name="sup1"
+ type="gen"
+>
+<text-expanded>&amp;#185;</text-expanded>
+<text>&amp;#185;</text>
+</entity>
+
+<entity name="ldquo"
+ type="gen"
+>
+<text-expanded>&amp;#8220;</text-expanded>
+<text>&amp;#8220;</text>
+</entity>
+
+<entity name="sup2"
+ type="gen"
+>
+<text-expanded>&amp;#178;</text-expanded>
+<text>&amp;#178;</text>
+</entity>
+
+<entity name="sup3"
+ type="gen"
+>
+<text-expanded>&amp;#179;</text-expanded>
+<text>&amp;#179;</text>
+</entity>
+
+<entity name="Beta"
+ type="gen"
+>
+<text-expanded>&amp;#914;</text-expanded>
+<text>&amp;#914;</text>
+</entity>
+
+<entity name="brvbar"
+ type="gen"
+>
+<text-expanded>&amp;#166;</text-expanded>
+<text>&amp;#166;</text>
+</entity>
+
+<entity name="oelig"
+ type="gen"
+>
+<text-expanded>&amp;#339;</text-expanded>
+<text>&amp;#339;</text>
+</entity>
+
+<entity name="ograve"
+ type="gen"
+>
+<text-expanded>&amp;#242;</text-expanded>
+<text>&amp;#242;</text>
+</entity>
+
+<entity name="rarr"
+ type="gen"
+>
+<text-expanded>&amp;#8594;</text-expanded>
+<text>&amp;#8594;</text>
+</entity>
+
+<entity name="Uacute"
+ type="gen"
+>
+<text-expanded>&amp;#218;</text-expanded>
+<text>&amp;#218;</text>
+</entity>
+
+<entity name="rsaquo"
+ type="gen"
+>
+<text-expanded>&amp;#8250;</text-expanded>
+<text>&amp;#8250;</text>
+</entity>
+
+<entity name="sub"
+ type="gen"
+>
+<text-expanded>&amp;#8834;</text-expanded>
+<text>&amp;#8834;</text>
+</entity>
+
+<entity name="zwj"
+ type="gen"
+>
+<text-expanded>&amp;#8205;</text-expanded>
+<text>&amp;#8205;</text>
+</entity>
+
+<entity name="perp"
+ type="gen"
+>
+<text-expanded>&amp;#8869;</text-expanded>
+<text>&amp;#8869;</text>
+</entity>
+
+<entity name="egrave"
+ type="gen"
+>
+<text-expanded>&amp;#232;</text-expanded>
+<text>&amp;#232;</text>
+</entity>
+
+<entity name="thorn"
+ type="gen"
+>
+<text-expanded>&amp;#254;</text-expanded>
+<text>&amp;#254;</text>
+</entity>
+
+<entity name="equiv"
+ type="gen"
+>
+<text-expanded>&amp;#8801;</text-expanded>
+<text>&amp;#8801;</text>
+</entity>
+
+<entity name="lArr"
+ type="gen"
+>
+<text-expanded>&amp;#8656;</text-expanded>
+<text>&amp;#8656;</text>
+</entity>
+
+<entity name="Aacute"
+ type="gen"
+>
+<text-expanded>&amp;#193;</text-expanded>
+<text>&amp;#193;</text>
+</entity>
+
+<entity name="amp"
+ type="gen"
+>
+<text-expanded>&amp;#38;#38;</text-expanded>
+<text>&amp;#38;#38;</text>
+</entity>
+
+<entity name="auml"
+ type="gen"
+>
+<text-expanded>&amp;#228;</text-expanded>
+<text>&amp;#228;</text>
+</entity>
+
+<entity name="ndash"
+ type="gen"
+>
+<text-expanded>&amp;#8211;</text-expanded>
+<text>&amp;#8211;</text>
+</entity>
+
+<entity name="Gamma"
+ type="gen"
+>
+<text-expanded>&amp;#915;</text-expanded>
+<text>&amp;#915;</text>
+</entity>
+
+<entity name="otimes"
+ type="gen"
+>
+<text-expanded>&amp;#8855;</text-expanded>
+<text>&amp;#8855;</text>
+</entity>
+
+<entity name="sum"
+ type="gen"
+>
+<text-expanded>&amp;#8721;</text-expanded>
+<text>&amp;#8721;</text>
+</entity>
+
+<entity name="Aring"
+ type="gen"
+>
+<text-expanded>&amp;#197;</text-expanded>
+<text>&amp;#197;</text>
+</entity>
+
+<entity name="pound"
+ type="gen"
+>
+<text-expanded>&amp;#163;</text-expanded>
+<text>&amp;#163;</text>
+</entity>
+
+<entity name="oplus"
+ type="gen"
+>
+<text-expanded>&amp;#8853;</text-expanded>
+<text>&amp;#8853;</text>
+</entity>
+
+<entity name="sup"
+ type="gen"
+>
+<text-expanded>&amp;#8835;</text-expanded>
+<text>&amp;#8835;</text>
+</entity>
+
+<entity name="Upsilon"
+ type="gen"
+>
+<text-expanded>&amp;#933;</text-expanded>
+<text>&amp;#933;</text>
+</entity>
+
+<entity name="exist"
+ type="gen"
+>
+<text-expanded>&amp;#8707;</text-expanded>
+<text>&amp;#8707;</text>
+</entity>
+
+<entity name="Eta"
+ type="gen"
+>
+<text-expanded>&amp;#919;</text-expanded>
+<text>&amp;#919;</text>
+</entity>
+
+<entity name="zwnj"
+ type="gen"
+>
+<text-expanded>&amp;#8204;</text-expanded>
+<text>&amp;#8204;</text>
+</entity>
+
+<entity name="Acirc"
+ type="gen"
+>
+<text-expanded>&amp;#194;</text-expanded>
+<text>&amp;#194;</text>
+</entity>
+
+<entity name="Lambda"
+ type="gen"
+>
+<text-expanded>&amp;#923;</text-expanded>
+<text>&amp;#923;</text>
+</entity>
+
+<entity name="Sigma"
+ type="gen"
+>
+<text-expanded>&amp;#931;</text-expanded>
+<text>&amp;#931;</text>
+</entity>
+
+<entity name="rsquo"
+ type="gen"
+>
+<text-expanded>&amp;#8217;</text-expanded>
+<text>&amp;#8217;</text>
+</entity>
+
+<entity name="AElig"
+ type="gen"
+>
+<text-expanded>&amp;#198;</text-expanded>
+<text>&amp;#198;</text>
+</entity>
+
+<entity name="deg"
+ type="gen"
+>
+<text-expanded>&amp;#176;</text-expanded>
+<text>&amp;#176;</text>
+</entity>
+
+<entity name="euml"
+ type="gen"
+>
+<text-expanded>&amp;#235;</text-expanded>
+<text>&amp;#235;</text>
+</entity>
+
+<entity name="ucirc"
+ type="gen"
+>
+<text-expanded>&amp;#251;</text-expanded>
+<text>&amp;#251;</text>
+</entity>
+
+<entity name="chi"
+ type="gen"
+>
+<text-expanded>&amp;#967;</text-expanded>
+<text>&amp;#967;</text>
+</entity>
+
+<entity name="and"
+ type="gen"
+>
+<text-expanded>&amp;#8743;</text-expanded>
+<text>&amp;#8743;</text>
+</entity>
+
+<entity name="omega"
+ type="gen"
+>
+<text-expanded>&amp;#969;</text-expanded>
+<text>&amp;#969;</text>
+</entity>
+
+<entity name="ang"
+ type="gen"
+>
+<text-expanded>&amp;#8736;</text-expanded>
+<text>&amp;#8736;</text>
+</entity>
+
+<entity name="THORN"
+ type="gen"
+>
+<text-expanded>&amp;#222;</text-expanded>
+<text>&amp;#222;</text>
+</entity>
+
+<entity name="Atilde"
+ type="gen"
+>
+<text-expanded>&amp;#195;</text-expanded>
+<text>&amp;#195;</text>
+</entity>
+
+<entity name="hellip"
+ type="gen"
+>
+<text-expanded>&amp;#8230;</text-expanded>
+<text>&amp;#8230;</text>
+</entity>
+
+<entity name="phi"
+ type="gen"
+>
+<text-expanded>&amp;#966;</text-expanded>
+<text>&amp;#966;</text>
+</entity>
+
+<entity name="szlig"
+ type="gen"
+>
+<text-expanded>&amp;#223;</text-expanded>
+<text>&amp;#223;</text>
+</entity>
+
+<entity name="Ecirc"
+ type="gen"
+>
+<text-expanded>&amp;#202;</text-expanded>
+<text>&amp;#202;</text>
+</entity>
+
+<entity name="iuml"
+ type="gen"
+>
+<text-expanded>&amp;#239;</text-expanded>
+<text>&amp;#239;</text>
+</entity>
+
+<entity name="nabla"
+ type="gen"
+>
+<text-expanded>&amp;#8711;</text-expanded>
+<text>&amp;#8711;</text>
+</entity>
+
+<entity name="scaron"
+ type="gen"
+>
+<text-expanded>&amp;#353;</text-expanded>
+<text>&amp;#353;</text>
+</entity>
+
+<entity name="macr"
+ type="gen"
+>
+<text-expanded>&amp;#175;</text-expanded>
+<text>&amp;#175;</text>
+</entity>
+
+<entity name="dagger"
+ type="gen"
+>
+<text-expanded>&amp;#8224;</text-expanded>
+<text>&amp;#8224;</text>
+</entity>
+
+<entity name="supe"
+ type="gen"
+>
+<text-expanded>&amp;#8839;</text-expanded>
+<text>&amp;#8839;</text>
+</entity>
+
+<entity name="ensp"
+ type="gen"
+>
+<text-expanded>&amp;#8194;</text-expanded>
+<text>&amp;#8194;</text>
+</entity>
+
+<entity name="cap"
+ type="gen"
+>
+<text-expanded>&amp;#8745;</text-expanded>
+<text>&amp;#8745;</text>
+</entity>
+
+<entity name="Iacute"
+ type="gen"
+>
+<text-expanded>&amp;#205;</text-expanded>
+<text>&amp;#205;</text>
+</entity>
+
+<entity name="aelig"
+ type="gen"
+>
+<text-expanded>&amp;#230;</text-expanded>
+<text>&amp;#230;</text>
+</entity>
+
+<entity name="Iota"
+ type="gen"
+>
+<text-expanded>&amp;#921;</text-expanded>
+<text>&amp;#921;</text>
+</entity>
+
+<entity name="Psi"
+ type="gen"
+>
+<text-expanded>&amp;#936;</text-expanded>
+<text>&amp;#936;</text>
+</entity>
+
+<entity name="nsub"
+ type="gen"
+>
+<text-expanded>&amp;#8836;</text-expanded>
+<text>&amp;#8836;</text>
+</entity>
+
+<entity name="Icirc"
+ type="gen"
+>
+<text-expanded>&amp;#206;</text-expanded>
+<text>&amp;#206;</text>
+</entity>
+
+<entity name="iexcl"
+ type="gen"
+>
+<text-expanded>&amp;#161;</text-expanded>
+<text>&amp;#161;</text>
+</entity>
+
+<entity name="Ograve"
+ type="gen"
+>
+<text-expanded>&amp;#210;</text-expanded>
+<text>&amp;#210;</text>
+</entity>
+
+<entity name="yen"
+ type="gen"
+>
+<text-expanded>&amp;#165;</text-expanded>
+<text>&amp;#165;</text>
+</entity>
+
+<entity name="Ouml"
+ type="gen"
+>
+<text-expanded>&amp;#214;</text-expanded>
+<text>&amp;#214;</text>
+</entity>
+
+<entity name="frac12"
+ type="gen"
+>
+<text-expanded>&amp;#189;</text-expanded>
+<text>&amp;#189;</text>
+</entity>
+
+<entity name="oslash"
+ type="gen"
+>
+<text-expanded>&amp;#248;</text-expanded>
+<text>&amp;#248;</text>
+</entity>
+
+<entity name="alefsym"
+ type="gen"
+>
+<text-expanded>&amp;#8501;</text-expanded>
+<text>&amp;#8501;</text>
+</entity>
+
+<entity name="Egrave"
+ type="gen"
+>
+<text-expanded>&amp;#200;</text-expanded>
+<text>&amp;#200;</text>
+</entity>
+
+<entity name="frac14"
+ type="gen"
+>
+<text-expanded>&amp;#188;</text-expanded>
+<text>&amp;#188;</text>
+</entity>
+
+<entity name="micro"
+ type="gen"
+>
+<text-expanded>&amp;#181;</text-expanded>
+<text>&amp;#181;</text>
+</entity>
+
+<entity name="real"
+ type="gen"
+>
+<text-expanded>&amp;#8476;</text-expanded>
+<text>&amp;#8476;</text>
+</entity>
+
+<entity name="int"
+ type="gen"
+>
+<text-expanded>&amp;#8747;</text-expanded>
+<text>&amp;#8747;</text>
+</entity>
+
+<entity name="Mu"
+ type="gen"
+>
+<text-expanded>&amp;#924;</text-expanded>
+<text>&amp;#924;</text>
+</entity>
+
+<entity name="bdquo"
+ type="gen"
+>
+<text-expanded>&amp;#8222;</text-expanded>
+<text>&amp;#8222;</text>
+</entity>
+
+<entity name="darr"
+ type="gen"
+>
+<text-expanded>&amp;#8595;</text-expanded>
+<text>&amp;#8595;</text>
+</entity>
+
+<entity name="permil"
+ type="gen"
+>
+<text-expanded>&amp;#8240;</text-expanded>
+<text>&amp;#8240;</text>
+</entity>
+
+<entity name="uarr"
+ type="gen"
+>
+<text-expanded>&amp;#8593;</text-expanded>
+<text>&amp;#8593;</text>
+</entity>
+
+<entity name="raquo"
+ type="gen"
+>
+<text-expanded>&amp;#187;</text-expanded>
+<text>&amp;#187;</text>
+</entity>
+
+<entity name="kappa"
+ type="gen"
+>
+<text-expanded>&amp;#954;</text-expanded>
+<text>&amp;#954;</text>
+</entity>
+
+<entity name="middot"
+ type="gen"
+>
+<text-expanded>&amp;#183;</text-expanded>
+<text>&amp;#183;</text>
+</entity>
+
+<entity name="times"
+ type="gen"
+>
+<text-expanded>&amp;#215;</text-expanded>
+<text>&amp;#215;</text>
+</entity>
+
+<entity name="sube"
+ type="gen"
+>
+<text-expanded>&amp;#8838;</text-expanded>
+<text>&amp;#8838;</text>
+</entity>
+
+<entity name="piv"
+ type="gen"
+>
+<text-expanded>&amp;#982;</text-expanded>
+<text>&amp;#982;</text>
+</entity>
+
+<entity name="sect"
+ type="gen"
+>
+<text-expanded>&amp;#167;</text-expanded>
+<text>&amp;#167;</text>
+</entity>
+
+<entity name="le"
+ type="gen"
+>
+<text-expanded>&amp;#8804;</text-expanded>
+<text>&amp;#8804;</text>
+</entity>
+
+<entity name="sbquo"
+ type="gen"
+>
+<text-expanded>&amp;#8218;</text-expanded>
+<text>&amp;#8218;</text>
+</entity>
+
+<entity name="plusmn"
+ type="gen"
+>
+<text-expanded>&amp;#177;</text-expanded>
+<text>&amp;#177;</text>
+</entity>
+
+<entity name="curren"
+ type="gen"
+>
+<text-expanded>&amp;#164;</text-expanded>
+<text>&amp;#164;</text>
+</entity>
+
+<entity name="Alpha"
+ type="gen"
+>
+<text-expanded>&amp;#913;</text-expanded>
+<text>&amp;#913;</text>
+</entity>
+
+<entity name="harr"
+ type="gen"
+>
+<text-expanded>&amp;#8596;</text-expanded>
+<text>&amp;#8596;</text>
+</entity>
+
+<entity name="not"
+ type="gen"
+>
+<text-expanded>&amp;#172;</text-expanded>
+<text>&amp;#172;</text>
+</entity>
+
+<entity name="uuml"
+ type="gen"
+>
+<text-expanded>&amp;#252;</text-expanded>
+<text>&amp;#252;</text>
+</entity>
+
+<entity name="yacute"
+ type="gen"
+>
+<text-expanded>&amp;#253;</text-expanded>
+<text>&amp;#253;</text>
+</entity>
+
+<entity name="cong"
+ type="gen"
+>
+<text-expanded>&amp;#8773;</text-expanded>
+<text>&amp;#8773;</text>
+</entity>
+
+<entity name="omicron"
+ type="gen"
+>
+<text-expanded>&amp;#959;</text-expanded>
+<text>&amp;#959;</text>
+</entity>
+
+<entity name="rfloor"
+ type="gen"
+>
+<text-expanded>&amp;#8971;</text-expanded>
+<text>&amp;#8971;</text>
+</entity>
+
+<entity name="oacute"
+ type="gen"
+>
+<text-expanded>&amp;#243;</text-expanded>
+<text>&amp;#243;</text>
+</entity>
+
+<entity name="trade"
+ type="gen"
+>
+<text-expanded>&amp;#8482;</text-expanded>
+<text>&amp;#8482;</text>
+</entity>
+
+<entity name="shy"
+ type="gen"
+>
+<text-expanded>&amp;#173;</text-expanded>
+<text>&amp;#173;</text>
+</entity>
+
+<entity name="Zeta"
+ type="gen"
+>
+<text-expanded>&amp;#918;</text-expanded>
+<text>&amp;#918;</text>
+</entity>
+
+<entity name="theta"
+ type="gen"
+>
+<text-expanded>&amp;#952;</text-expanded>
+<text>&amp;#952;</text>
+</entity>
+
+<entity name="ordf"
+ type="gen"
+>
+<text-expanded>&amp;#170;</text-expanded>
+<text>&amp;#170;</text>
+</entity>
+
+<entity name="eacute"
+ type="gen"
+>
+<text-expanded>&amp;#233;</text-expanded>
+<text>&amp;#233;</text>
+</entity>
+
+<entity name="thetasym"
+ type="gen"
+>
+<text-expanded>&amp;#977;</text-expanded>
+<text>&amp;#977;</text>
+</entity>
+
+<entity name="ugrave"
+ type="gen"
+>
+<text-expanded>&amp;#249;</text-expanded>
+<text>&amp;#249;</text>
+</entity>
+
+<entity name="apos"
+ type="gen"
+>
+<text-expanded>&amp;#39;</text-expanded>
+<text>&amp;#39;</text>
+</entity>
+
+<entity name="lt"
+ type="gen"
+>
+<text-expanded>&amp;#38;#60;</text-expanded>
+<text>&amp;#38;#60;</text>
+</entity>
+
+<entity name="fnof"
+ type="gen"
+>
+<text-expanded>&amp;#402;</text-expanded>
+<text>&amp;#402;</text>
+</entity>
+
+<entity name="ordm"
+ type="gen"
+>
+<text-expanded>&amp;#186;</text-expanded>
+<text>&amp;#186;</text>
+</entity>
+
+<entity name="para"
+ type="gen"
+>
+<text-expanded>&amp;#182;</text-expanded>
+<text>&amp;#182;</text>
+</entity>
+
+<entity name="larr"
+ type="gen"
+>
+<text-expanded>&amp;#8592;</text-expanded>
+<text>&amp;#8592;</text>
+</entity>
+
+<entity name="yuml"
+ type="gen"
+>
+<text-expanded>&amp;#255;</text-expanded>
+<text>&amp;#255;</text>
+</entity>
+
+<entity name="Nu"
+ type="gen"
+>
+<text-expanded>&amp;#925;</text-expanded>
+<text>&amp;#925;</text>
+</entity>
+
+<entity name="diams"
+ type="gen"
+>
+<text-expanded>&amp;#9830;</text-expanded>
+<text>&amp;#9830;</text>
+</entity>
+
+<entity name="agrave"
+ type="gen"
+>
+<text-expanded>&amp;#224;</text-expanded>
+<text>&amp;#224;</text>
+</entity>
+
+<entity name="divide"
+ type="gen"
+>
+<text-expanded>&amp;#247;</text-expanded>
+<text>&amp;#247;</text>
+</entity>
+
+<entity name="Scaron"
+ type="gen"
+>
+<text-expanded>&amp;#352;</text-expanded>
+<text>&amp;#352;</text>
+</entity>
+
+<entity name="rang"
+ type="gen"
+>
+<text-expanded>&amp;#9002;</text-expanded>
+<text>&amp;#9002;</text>
+</entity>
+
+<entity name="Dagger"
+ type="gen"
+>
+<text-expanded>&amp;#8225;</text-expanded>
+<text>&amp;#8225;</text>
+</entity>
+
+<entity name="Tau"
+ type="gen"
+>
+<text-expanded>&amp;#932;</text-expanded>
+<text>&amp;#932;</text>
+</entity>
+
+<entity name="nbsp"
+ type="gen"
+>
+<text-expanded>&amp;#160;</text-expanded>
+<text>&amp;#160;</text>
+</entity>
+
+<entity name="eta"
+ type="gen"
+>
+<text-expanded>&amp;#951;</text-expanded>
+<text>&amp;#951;</text>
+</entity>
+
+<entity name="sim"
+ type="gen"
+>
+<text-expanded>&amp;#8764;</text-expanded>
+<text>&amp;#8764;</text>
+</entity>
+
+<entity name="lsquo"
+ type="gen"
+>
+<text-expanded>&amp;#8216;</text-expanded>
+<text>&amp;#8216;</text>
+</entity>
+
+<entity name="rlm"
+ type="gen"
+>
+<text-expanded>&amp;#8207;</text-expanded>
+<text>&amp;#8207;</text>
+</entity>
+
+<entity name="delta"
+ type="gen"
+>
+<text-expanded>&amp;#948;</text-expanded>
+<text>&amp;#948;</text>
+</entity>
+
+<entity name="Ucirc"
+ type="gen"
+>
+<text-expanded>&amp;#219;</text-expanded>
+<text>&amp;#219;</text>
+</entity>
+
+<entity name="otilde"
+ type="gen"
+>
+<text-expanded>&amp;#245;</text-expanded>
+<text>&amp;#245;</text>
+</entity>
+
+<entity name="part"
+ type="gen"
+>
+<text-expanded>&amp;#8706;</text-expanded>
+<text>&amp;#8706;</text>
+</entity>
+
+<entity name="Omicron"
+ type="gen"
+>
+<text-expanded>&amp;#927;</text-expanded>
+<text>&amp;#927;</text>
+</entity>
+
+<entity name="eth"
+ type="gen"
+>
+<text-expanded>&amp;#240;</text-expanded>
+<text>&amp;#240;</text>
+</entity>
+
+<entity name="ocirc"
+ type="gen"
+>
+<text-expanded>&amp;#244;</text-expanded>
+<text>&amp;#244;</text>
+</entity>
+
+<entity name="Omega"
+ type="gen"
+>
+<text-expanded>&amp;#937;</text-expanded>
+<text>&amp;#937;</text>
+</entity>
+
+<entity name="beta"
+ type="gen"
+>
+<text-expanded>&amp;#946;</text-expanded>
+<text>&amp;#946;</text>
+</entity>
+
+<entity name="Oslash"
+ type="gen"
+>
+<text-expanded>&amp;#216;</text-expanded>
+<text>&amp;#216;</text>
+</entity>
+
+<entity name="epsilon"
+ type="gen"
+>
+<text-expanded>&amp;#949;</text-expanded>
+<text>&amp;#949;</text>
+</entity>
+
+<entity name="notin"
+ type="gen"
+>
+<text-expanded>&amp;#8713;</text-expanded>
+<text>&amp;#8713;</text>
+</entity>
+
+<entity name="empty"
+ type="gen"
+>
+<text-expanded>&amp;#8709;</text-expanded>
+<text>&amp;#8709;</text>
+</entity>
+
+<entity name="reg"
+ type="gen"
+>
+<text-expanded>&amp;#174;</text-expanded>
+<text>&amp;#174;</text>
+</entity>
+
+<entity name="hearts"
+ type="gen"
+>
+<text-expanded>&amp;#9829;</text-expanded>
+<text>&amp;#9829;</text>
+</entity>
+
+<entity name="Auml"
+ type="gen"
+>
+<text-expanded>&amp;#196;</text-expanded>
+<text>&amp;#196;</text>
+</entity>
+
+<entity name="frac34"
+ type="gen"
+>
+<text-expanded>&amp;#190;</text-expanded>
+<text>&amp;#190;</text>
+</entity>
+
+<entity name="mu"
+ type="gen"
+>
+<text-expanded>&amp;#956;</text-expanded>
+<text>&amp;#956;</text>
+</entity>
+
+<entity name="sdot"
+ type="gen"
+>
+<text-expanded>&amp;#8901;</text-expanded>
+<text>&amp;#8901;</text>
+</entity>
+
+<entity name="asymp"
+ type="gen"
+>
+<text-expanded>&amp;#8776;</text-expanded>
+<text>&amp;#8776;</text>
+</entity>
+
+<entity name="thinsp"
+ type="gen"
+>
+<text-expanded>&amp;#8201;</text-expanded>
+<text>&amp;#8201;</text>
+</entity>
+
+<entity name="cent"
+ type="gen"
+>
+<text-expanded>&amp;#162;</text-expanded>
+<text>&amp;#162;</text>
+</entity>
+
+<entity name="circ"
+ type="gen"
+>
+<text-expanded>&amp;#710;</text-expanded>
+<text>&amp;#710;</text>
+</entity>
+
+<entity name="sigmaf"
+ type="gen"
+>
+<text-expanded>&amp;#962;</text-expanded>
+<text>&amp;#962;</text>
+</entity>
+
+<entity name="Rho"
+ type="gen"
+>
+<text-expanded>&amp;#929;</text-expanded>
+<text>&amp;#929;</text>
+</entity>
+
+<element name="var"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="var">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="button"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="noframes"/>
+ <element-name name="table"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="button.content"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="button">
+<attdecl>
+ %attrs;
+ %focus;
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ type (button|submit|reset) "submit"
+ disabled (disabled) #IMPLIED
+ </attdecl>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type=""
+ enumeration="yes"
+ value="button submit reset"
+ default="submit"/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="value"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="head"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <or-group occurrence="*">
+ <element-name name="script"/>
+ <element-name name="style"/>
+ <element-name name="meta"/>
+ <element-name name="link"/>
+ <element-name name="object"/>
+ <element-name name="isindex"/>
+ </or-group>
+ <or-group>
+ <sequence-group>
+ <element-name name="title"/>
+ <or-group occurrence="*">
+ <element-name name="script"/>
+ <element-name name="style"/>
+ <element-name name="meta"/>
+ <element-name name="link"/>
+ <element-name name="object"/>
+ <element-name name="isindex"/>
+ </or-group>
+ <sequence-group occurrence="?">
+ <element-name name="base"/>
+ <or-group occurrence="*">
+ <element-name name="script"/>
+ <element-name name="style"/>
+ <element-name name="meta"/>
+ <element-name name="link"/>
+ <element-name name="object"/>
+ <element-name name="isindex"/>
+ </or-group>
+ </sequence-group>
+ </sequence-group>
+ <sequence-group>
+ <element-name name="base"/>
+ <or-group occurrence="*">
+ <element-name name="script"/>
+ <element-name name="style"/>
+ <element-name name="meta"/>
+ <element-name name="link"/>
+ <element-name name="object"/>
+ <element-name name="isindex"/>
+ </or-group>
+ <sequence-group>
+ <element-name name="title"/>
+ <or-group occurrence="*">
+ <element-name name="script"/>
+ <element-name name="style"/>
+ <element-name name="meta"/>
+ <element-name name="link"/>
+ <element-name name="object"/>
+ <element-name name="isindex"/>
+ </or-group>
+ </sequence-group>
+ </sequence-group>
+ </or-group>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="head.misc"/>
+ <or-group>
+ <sequence-group>
+ <element-name name="title"/>
+ <parament-name name="head.misc"/>
+ <sequence-group occurrence="?">
+ <element-name name="base"/>
+ <parament-name name="head.misc"/>
+ </sequence-group>
+ </sequence-group>
+ <sequence-group>
+ <element-name name="base"/>
+ <parament-name name="head.misc"/>
+ <sequence-group>
+ <element-name name="title"/>
+ <parament-name name="head.misc"/>
+ </sequence-group>
+ </sequence-group>
+ </or-group>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="head">
+<attdecl>
+ %i18n;
+ id ID #IMPLIED
+ profile %URI; #IMPLIED
+ </attdecl>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="profile"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="map"
+ content-type="element">
+<content-model-expanded>
+ <or-group>
+ <or-group occurrence="+">
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="noframes"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+ <element-name name="area" occurrence="+"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group>
+ <or-group occurrence="+">
+ <parament-name name="block"/>
+ <element-name name="form"/>
+ <parament-name name="misc"/>
+ </or-group>
+ <element-name name="area" occurrence="+"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="map">
+<attdecl>
+ %i18n;
+ %events;
+ id ID #REQUIRED
+ class CDATA #IMPLIED
+ style %StyleSheet; #IMPLIED
+ title %Text; #IMPLIED
+ name CDATA #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#REQUIRED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="img"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="img">
+<attdecl>
+ %attrs;
+ src %URI; #REQUIRED
+ alt %Text; #REQUIRED
+ name NMTOKEN #IMPLIED
+ longdesc %URI; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ usemap %URI; #IMPLIED
+ ismap (ismap) #IMPLIED
+ align %ImgAlign; #IMPLIED
+ border %Length; #IMPLIED
+ hspace %Pixels; #IMPLIED
+ vspace %Pixels; #IMPLIED
+ </attdecl>
+<attribute name="ismap"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ismap"
+ default=""/>
+<attribute name="longdesc"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="vspace"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="src"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="hspace"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="height"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="alt"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="border"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom left right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="usemap"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="h1"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="h1">
+<attdecl>
+ %attrs;
+ %TextAlign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="samp"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="samp">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="h2"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="h2">
+<attdecl>
+ %attrs;
+ %TextAlign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="h3"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="h3">
+<attdecl>
+ %attrs;
+ %TextAlign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="object"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="param"/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="noframes"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="param"/>
+ <parament-name name="block"/>
+ <element-name name="form"/>
+ <parament-name name="inline"/>
+ <parament-name name="misc"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="object">
+<attdecl>
+ %attrs;
+ declare (declare) #IMPLIED
+ classid %URI; #IMPLIED
+ codebase %URI; #IMPLIED
+ data %URI; #IMPLIED
+ type %ContentType; #IMPLIED
+ codetype %ContentType; #IMPLIED
+ archive %UriList; #IMPLIED
+ standby %Text; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ usemap %URI; #IMPLIED
+ name NMTOKEN #IMPLIED
+ tabindex %Number; #IMPLIED
+ align %ImgAlign; #IMPLIED
+ border %Pixels; #IMPLIED
+ hspace %Pixels; #IMPLIED
+ vspace %Pixels; #IMPLIED
+ </attdecl>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="archive"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="codetype"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="hspace"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="border"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="standby"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom left right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="codebase"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="vspace"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="data"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="classid"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="height"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="declare"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="declare"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="usemap"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="h4"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="h4">
+<attdecl>
+ %attrs;
+ %TextAlign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="h5"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="h5">
+<attdecl>
+ %attrs;
+ %TextAlign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="fieldset"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="legend"/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="noframes"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="legend"/>
+ <parament-name name="block"/>
+ <element-name name="form"/>
+ <parament-name name="inline"/>
+ <parament-name name="misc"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="fieldset">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="h6"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="h6">
+<attdecl>
+ %attrs;
+ %TextAlign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="tbody"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="tr"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="tr"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="tbody">
+<attdecl>
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="del"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="noframes"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="del">
+<attdecl>
+ %attrs;
+ cite %URI; #IMPLIED
+ datetime %Datetime; #IMPLIED
+ </attdecl>
+<attribute name="cite"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="datetime"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="tfoot"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="tr"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="tr"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="tfoot">
+<attdecl>
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="acronym"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="acronym">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="basefont"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="basefont">
+<attdecl>
+ id ID #IMPLIED
+ size CDATA #REQUIRED
+ color %Color; #IMPLIED
+ face CDATA #IMPLIED
+ </attdecl>
+<attribute name="face"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="size"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="color"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="iframe"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="noframes"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="iframe">
+<attdecl>
+ %coreattrs;
+ longdesc %URI; #IMPLIED
+ name NMTOKEN #IMPLIED
+ src %URI; #IMPLIED
+ frameborder (1|0) "1"
+ marginwidth %Pixels; #IMPLIED
+ marginheight %Pixels; #IMPLIED
+ scrolling (yes|no|auto) "auto"
+ align %ImgAlign; #IMPLIED
+ height %Length; #IMPLIED
+ width %Length; #IMPLIED
+ </attdecl>
+<attribute name="marginheight"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="longdesc"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="scrolling"
+ type=""
+ enumeration="yes"
+ value="yes no auto"
+ default="auto"/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="frameborder"
+ type=""
+ enumeration="yes"
+ value="1"
+ default="1"/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="height"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="src"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom left right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="marginwidth"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="option"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="option">
+<attdecl>
+ %attrs;
+ selected (selected) #IMPLIED
+ disabled (disabled) #IMPLIED
+ label %Text; #IMPLIED
+ value CDATA #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="label"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="selected"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="selected"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="value"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="colgroup"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="*">
+ <element-name name="col"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <element-name name="col"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="colgroup">
+<attdecl>
+ %attrs;
+ span %Number; "1"
+ width %MultiLength; #IMPLIED
+ %cellhalign;
+ %cellvalign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="span"
+ type=""
+ value="CDATA"
+ default="1"/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="caption"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="caption">
+<attdecl>
+ %attrs;
+ align %CAlign; #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top bottom left right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="dir"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="li"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="li"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="dir">
+<attdecl>
+ %attrs;
+ compact (compact) #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="compact"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="compact"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="noframes"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="noframes"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="noframes">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="div"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="noframes"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="div">
+<attdecl>
+ %attrs;
+ %TextAlign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="menu"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="li"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="li"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="menu">
+<attdecl>
+ %attrs;
+ compact (compact) #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="compact"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="compact"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="font"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="font">
+<attdecl>
+ %coreattrs;
+ %i18n;
+ size CDATA #IMPLIED
+ color %Color; #IMPLIED
+ face CDATA #IMPLIED
+ </attdecl>
+<attribute name="face"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="size"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="color"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="form"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="noframes"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="form.content"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="form">
+<attdecl>
+ %attrs;
+ action %URI; #REQUIRED
+ method (get|post) "get"
+ name NMTOKEN #IMPLIED
+ enctype %ContentType; "application/x-www-form-urlencoded"
+ onsubmit %Script; #IMPLIED
+ onreset %Script; #IMPLIED
+ accept %ContentTypes; #IMPLIED
+ accept-charset %Charsets; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ </attdecl>
+<attribute name="accept-charset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onsubmit"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="method"
+ type=""
+ enumeration="yes"
+ value="get post"
+ default="get"/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="target"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="accept"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onreset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="enctype"
+ type=""
+ value="CDATA"
+ default="application/x-www-form-urlencoded"/>
+<attribute name="action"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="bdo"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="bdo">
+<attdecl>
+ %coreattrs;
+ %events;
+ lang %LanguageCode; #IMPLIED
+ xml:lang %LanguageCode; #IMPLIED
+ dir (ltr|rtl) #REQUIRED
+ </attdecl>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#REQUIRED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="strike"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="strike">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="label"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="label">
+<attdecl>
+ %attrs;
+ for IDREF #IMPLIED
+ accesskey %Character; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ </attdecl>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="for"
+ type="#IMPLIED"
+ value="IDREF"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="abbr"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="abbr">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="noscript"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="noframes"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="noscript">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="dfn"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="dfn">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="center"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="noframes"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="center">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="ol"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="li"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="li"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="ol">
+<attdecl>
+ %attrs;
+ type %OLStyle; #IMPLIED
+ compact (compact) #IMPLIED
+ start %Number; #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="compact"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="compact"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="start"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="area"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="area">
+<attdecl>
+ %attrs;
+ %focus;
+ shape %Shape; "rect"
+ coords %Coords; #IMPLIED
+ href %URI; #IMPLIED
+ nohref (nohref) #IMPLIED
+ alt %Text; #REQUIRED
+ target %FrameTarget; #IMPLIED
+ </attdecl>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="target"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="href"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="shape"
+ type=""
+ enumeration="yes"
+ value="rect circle poly default"
+ default="rect"/>
+<attribute name="alt"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="nohref"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="nohref"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="coords"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="dd"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="noframes"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="dd">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="ins"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="noframes"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="ins">
+<attdecl>
+ %attrs;
+ cite %URI; #IMPLIED
+ datetime %Datetime; #IMPLIED
+ </attdecl>
+<attribute name="cite"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="datetime"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="span"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="span">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="dl"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="+">
+ <element-name name="dt"/>
+ <element-name name="dd"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="+">
+ <element-name name="dt"/>
+ <element-name name="dd"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="dl">
+<attdecl>
+ %attrs;
+ compact (compact) #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="compact"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="compact"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="address"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="address">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="table"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="caption" occurrence="?"/>
+ <or-group>
+ <element-name name="col" occurrence="*"/>
+ <element-name name="colgroup" occurrence="*"/>
+ </or-group>
+ <element-name name="thead" occurrence="?"/>
+ <element-name name="tfoot" occurrence="?"/>
+ <or-group>
+ <element-name name="tbody" occurrence="+"/>
+ <element-name name="tr" occurrence="+"/>
+ </or-group>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="caption" occurrence="?"/>
+ <or-group>
+ <element-name name="col" occurrence="*"/>
+ <element-name name="colgroup" occurrence="*"/>
+ </or-group>
+ <element-name name="thead" occurrence="?"/>
+ <element-name name="tfoot" occurrence="?"/>
+ <or-group>
+ <element-name name="tbody" occurrence="+"/>
+ <element-name name="tr" occurrence="+"/>
+ </or-group>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="table">
+<attdecl>
+ %attrs;
+ summary %Text; #IMPLIED
+ width %Length; #IMPLIED
+ border %Pixels; #IMPLIED
+ frame %TFrame; #IMPLIED
+ rules %TRules; #IMPLIED
+ cellspacing %Length; #IMPLIED
+ cellpadding %Length; #IMPLIED
+ align %TAlign; #IMPLIED
+ bgcolor %Color; #IMPLIED
+ </attdecl>
+<attribute name="rules"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="none groups rows cols all"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="bgcolor"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="summary"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="cellspacing"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="frame"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="void above below hsides lhs rhs vsides box border"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="cellpadding"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="border"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="legend"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="legend">
+<attdecl>
+ %attrs;
+ accesskey %Character; #IMPLIED
+ align %LAlign; #IMPLIED
+ </attdecl>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top bottom left right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="cite"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="cite">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="base"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="base">
+<attdecl>
+ id ID #IMPLIED
+ href %URI; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ </attdecl>
+<attribute name="href"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="target"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+</attlist>
+
+<element name="dt"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="dt">
+<attdecl>
+ %attrs;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="body"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="noframes"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="body">
+<attdecl>
+ %attrs;
+ onload %Script; #IMPLIED
+ onunload %Script; #IMPLIED
+ background %URI; #IMPLIED
+ bgcolor %Color; #IMPLIED
+ text %Color; #IMPLIED
+ link %Color; #IMPLIED
+ vlink %Color; #IMPLIED
+ alink %Color; #IMPLIED
+ </attdecl>
+<attribute name="background"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="alink"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="bgcolor"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="vlink"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="text"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onload"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onunload"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="link"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="li"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="noframes"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="li">
+<attdecl>
+ %attrs;
+ type %LIStyle; #IMPLIED
+ value %Number; #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="value"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="hr"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="hr">
+<attdecl>
+ %attrs;
+ align (left|center|right) #IMPLIED
+ noshade (noshade) #IMPLIED
+ size %Pixels; #IMPLIED
+ width %Length; #IMPLIED
+ </attdecl>
+<attribute name="noshade"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="noshade"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="size"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="big"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="big">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="thead"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="tr"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="tr"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="thead">
+<attdecl>
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="small"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="small">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="applet"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="param"/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="noframes"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="param"/>
+ <parament-name name="block"/>
+ <element-name name="form"/>
+ <parament-name name="inline"/>
+ <parament-name name="misc"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="applet">
+<attdecl>
+ %coreattrs;
+ codebase %URI; #IMPLIED
+ archive CDATA #IMPLIED
+ code CDATA #IMPLIED
+ object CDATA #IMPLIED
+ alt %Text; #IMPLIED
+ name NMTOKEN #IMPLIED
+ width %Length; #REQUIRED
+ height %Length; #REQUIRED
+ align %ImgAlign; #IMPLIED
+ hspace %Pixels; #IMPLIED
+ vspace %Pixels; #IMPLIED
+ </attdecl>
+<attribute name="hspace"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="codebase"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="code"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="width"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="vspace"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="archive"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="object"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="height"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="alt"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom left right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+</attlist>
+
+<element name="script"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="script">
+<attdecl>
+ id ID #IMPLIED
+ charset %Charset; #IMPLIED
+ type %ContentType; #REQUIRED
+ language CDATA #IMPLIED
+ src %URI; #IMPLIED
+ defer (defer) #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ </attdecl>
+<attribute name="charset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:space"
+ type="#FIXED"
+ enumeration="yes"
+ value="preserve"
+ default="preserve"/>
+<attribute name="src"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="language"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="defer"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="defer"
+ default=""/>
+<attribute name="type"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="optgroup"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="option"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="option"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="optgroup">
+<attdecl>
+ %attrs;
+ disabled (disabled) #IMPLIED
+ label %Text; #REQUIRED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="label"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="td"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="noframes"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="td">
+<attdecl>
+ %attrs;
+ abbr %Text; #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ scope %Scope; #IMPLIED
+ rowspan %Number; "1"
+ colspan %Number; "1"
+ %cellhalign;
+ %cellvalign;
+ nowrap (nowrap) #IMPLIED
+ bgcolor %Color; #IMPLIED
+ width %Pixels; #IMPLIED
+ height %Pixels; #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="headers"
+ type="#IMPLIED"
+ value="IDREFS"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="abbr"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="scope"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="row col rowgroup colgroup"
+ default=""/>
+<attribute name="bgcolor"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="colspan"
+ type=""
+ value="CDATA"
+ default="1"/>
+<attribute name="rowspan"
+ type=""
+ value="CDATA"
+ default="1"/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="nowrap"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="nowrap"
+ default=""/>
+<attribute name="height"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="axis"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="title"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="title">
+<attdecl>
+ %i18n;
+ id ID #IMPLIED
+ </attdecl>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+</attlist>
+
+<element name="kbd"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="kbd">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="th"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="noframes"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="th">
+<attdecl>
+ %attrs;
+ abbr %Text; #IMPLIED
+ axis CDATA #IMPLIED
+ headers IDREFS #IMPLIED
+ scope %Scope; #IMPLIED
+ rowspan %Number; "1"
+ colspan %Number; "1"
+ %cellhalign;
+ %cellvalign;
+ nowrap (nowrap) #IMPLIED
+ bgcolor %Color; #IMPLIED
+ width %Pixels; #IMPLIED
+ height %Pixels; #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="headers"
+ type="#IMPLIED"
+ value="IDREFS"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="abbr"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="scope"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="row col rowgroup colgroup"
+ default=""/>
+<attribute name="bgcolor"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="colspan"
+ type=""
+ value="CDATA"
+ default="1"/>
+<attribute name="rowspan"
+ type=""
+ value="CDATA"
+ default="1"/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="nowrap"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="nowrap"
+ default=""/>
+<attribute name="height"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="axis"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="textarea"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="textarea">
+<attdecl>
+ %attrs;
+ %focus;
+ name CDATA #IMPLIED
+ rows %Number; #REQUIRED
+ cols %Number; #REQUIRED
+ disabled (disabled) #IMPLIED
+ readonly (readonly) #IMPLIED
+ onselect %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ </attdecl>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="rows"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onchange"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="cols"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onselect"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="readonly"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="readonly"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="meta"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="meta">
+<attdecl>
+ %i18n;
+ id ID #IMPLIED
+ http-equiv CDATA #IMPLIED
+ name CDATA #IMPLIED
+ content CDATA #REQUIRED
+ scheme CDATA #IMPLIED
+ </attdecl>
+<attribute name="scheme"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="http-equiv"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="content"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+</attlist>
+
+<element name="em"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="em">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="link"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="link">
+<attdecl>
+ %attrs;
+ charset %Charset; #IMPLIED
+ href %URI; #IMPLIED
+ hreflang %LanguageCode; #IMPLIED
+ type %ContentType; #IMPLIED
+ rel %LinkTypes; #IMPLIED
+ rev %LinkTypes; #IMPLIED
+ media %MediaDesc; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ </attdecl>
+<attribute name="rev"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="media"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="hreflang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="target"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="href"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="rel"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="tr"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="+">
+ <element-name name="th"/>
+ <element-name name="td"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="+">
+ <element-name name="th"/>
+ <element-name name="td"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="tr">
+<attdecl>
+ %attrs;
+ %cellhalign;
+ %cellvalign;
+ bgcolor %Color; #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="bgcolor"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="strong"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="strong">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="pre"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="pre.content"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="pre">
+<attdecl>
+ %attrs;
+ width %Number; #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:space"
+ type="#FIXED"
+ enumeration="yes"
+ value="preserve"
+ default="preserve"/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="tt"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="tt">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="input"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="input">
+<attdecl>
+ %attrs;
+ %focus;
+ type %InputType; "text"
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED
+ checked (checked) #IMPLIED
+ disabled (disabled) #IMPLIED
+ readonly (readonly) #IMPLIED
+ size CDATA #IMPLIED
+ maxlength %Number; #IMPLIED
+ src %URI; #IMPLIED
+ alt CDATA #IMPLIED
+ usemap %URI; #IMPLIED
+ onselect %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ accept %ContentTypes; #IMPLIED
+ align %ImgAlign; #IMPLIED
+ </attdecl>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="src"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="size"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="checked"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="checked"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="value"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="accept"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="alt"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom left right"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="maxlength"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type=""
+ enumeration="yes"
+ value="text password checkbox radio submit reset file hidden image button"
+ default="text"/>
+<attribute name="onchange"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onselect"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="readonly"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="readonly"
+ default=""/>
+<attribute name="usemap"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="a"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="a.content"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="a">
+<attdecl>
+ %attrs;
+ %focus;
+ charset %Charset; #IMPLIED
+ type %ContentType; #IMPLIED
+ name NMTOKEN #IMPLIED
+ href %URI; #IMPLIED
+ hreflang %LanguageCode; #IMPLIED
+ rel %LinkTypes; #IMPLIED
+ rev %LinkTypes; #IMPLIED
+ shape %Shape; "rect"
+ coords %Coords; #IMPLIED
+ target %FrameTarget; #IMPLIED
+ </attdecl>
+<attribute name="rev"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charset"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="accesskey"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="hreflang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="target"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="href"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="rel"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="shape"
+ type=""
+ enumeration="yes"
+ value="rect circle poly default"
+ default="rect"/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="coords"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="b"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="b">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="style"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="style">
+<attdecl>
+ %i18n;
+ id ID #IMPLIED
+ type %ContentType; #REQUIRED
+ media %MediaDesc; #IMPLIED
+ title %Text; #IMPLIED
+ xml:space (preserve) #FIXED 'preserve'
+ </attdecl>
+<attribute name="xml:space"
+ type="#FIXED"
+ enumeration="yes"
+ value="preserve"
+ default="preserve"/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="media"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="type"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="param"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="param">
+<attdecl>
+ id ID #IMPLIED
+ name CDATA #REQUIRED
+ value CDATA #IMPLIED
+ valuetype (data|ref|object) "data"
+ type %ContentType; #IMPLIED
+ </attdecl>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="value"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="valuetype"
+ type=""
+ enumeration="yes"
+ value="data ref object"
+ default="data"/>
+<attribute name="name"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="i"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="i">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="html"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="head"/>
+ <element-name name="body"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="head"/>
+ <element-name name="body"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="html">
+<attdecl>
+ %i18n;
+ id ID #IMPLIED
+ xmlns %URI; #FIXED 'http://www.w3.org/1999/xhtml'
+ </attdecl>
+<attribute name="xmlns"
+ type="#FIXED"
+ value="CDATA"
+ default="http://www.w3.org/1999/xhtml"/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+</attlist>
+
+<element name="sub"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="sub">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="code"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="code">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="blockquote"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="p"/>
+ <element-name name="h1"/>
+ <element-name name="h2"/>
+ <element-name name="h3"/>
+ <element-name name="h4"/>
+ <element-name name="h5"/>
+ <element-name name="h6"/>
+ <element-name name="div"/>
+ <element-name name="ul"/>
+ <element-name name="ol"/>
+ <element-name name="dl"/>
+ <element-name name="menu"/>
+ <element-name name="dir"/>
+ <element-name name="pre"/>
+ <element-name name="hr"/>
+ <element-name name="blockquote"/>
+ <element-name name="address"/>
+ <element-name name="center"/>
+ <element-name name="noframes"/>
+ <element-name name="isindex"/>
+ <element-name name="fieldset"/>
+ <element-name name="table"/>
+ <element-name name="form"/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Flow"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="blockquote">
+<attdecl>
+ %attrs;
+ cite %URI; #IMPLIED
+ </attdecl>
+<attribute name="cite"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="p"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="p">
+<attdecl>
+ %attrs;
+ %TextAlign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="q"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="q">
+<attdecl>
+ %attrs;
+ cite %URI; #IMPLIED
+ </attdecl>
+<attribute name="cite"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="s"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="s">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="select"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="+">
+ <element-name name="optgroup"/>
+ <element-name name="option"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="+">
+ <element-name name="optgroup"/>
+ <element-name name="option"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="select">
+<attdecl>
+ %attrs;
+ name CDATA #IMPLIED
+ size %Number; #IMPLIED
+ multiple (multiple) #IMPLIED
+ disabled (disabled) #IMPLIED
+ tabindex %Number; #IMPLIED
+ onfocus %Script; #IMPLIED
+ onblur %Script; #IMPLIED
+ onchange %Script; #IMPLIED
+ </attdecl>
+<attribute name="tabindex"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="disabled"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disabled"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="size"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onchange"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="multiple"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="multiple"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onfocus"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onblur"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="u"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="u">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="isindex"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="isindex">
+<attdecl>
+ %coreattrs;
+ %i18n;
+ prompt %Text; #IMPLIED
+ </attdecl>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="prompt"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+</attlist>
+
+<element name="col"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="col">
+<attdecl>
+ %attrs;
+ span %Number; "1"
+ width %MultiLength; #IMPLIED
+ %cellhalign;
+ %cellvalign;
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="valign"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="top middle bottom baseline"
+ default=""/>
+<attribute name="char"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="width"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="charoff"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="span"
+ type=""
+ value="CDATA"
+ default="1"/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="align"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="left center right justify char"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="br"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="br">
+<attdecl>
+ %coreattrs;
+ clear (left|all|right|none) "none"
+ </attdecl>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="clear"
+ type=""
+ enumeration="yes"
+ value="left all right none"
+ default="none"/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+</attlist>
+
+<element name="ul"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="+">
+ <element-name name="li"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="+">
+ <element-name name="li"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="ul">
+<attdecl>
+ %attrs;
+ type %ULStyle; #IMPLIED
+ compact (compact) #IMPLIED
+ </attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="compact"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="compact"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="type"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="disc square circle"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="sup"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="a"/>
+ <element-name name="br"/>
+ <element-name name="span"/>
+ <element-name name="bdo"/>
+ <element-name name="object"/>
+ <element-name name="applet"/>
+ <element-name name="img"/>
+ <element-name name="map"/>
+ <element-name name="iframe"/>
+ <element-name name="tt"/>
+ <element-name name="i"/>
+ <element-name name="b"/>
+ <element-name name="u"/>
+ <element-name name="s"/>
+ <element-name name="strike"/>
+ <element-name name="big"/>
+ <element-name name="small"/>
+ <element-name name="font"/>
+ <element-name name="basefont"/>
+ <element-name name="em"/>
+ <element-name name="strong"/>
+ <element-name name="dfn"/>
+ <element-name name="code"/>
+ <element-name name="q"/>
+ <element-name name="samp"/>
+ <element-name name="kbd"/>
+ <element-name name="var"/>
+ <element-name name="cite"/>
+ <element-name name="abbr"/>
+ <element-name name="acronym"/>
+ <element-name name="sub"/>
+ <element-name name="sup"/>
+ <element-name name="input"/>
+ <element-name name="select"/>
+ <element-name name="textarea"/>
+ <element-name name="label"/>
+ <element-name name="button"/>
+ <element-name name="ins"/>
+ <element-name name="del"/>
+ <element-name name="script"/>
+ <element-name name="noscript"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="Inline"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="sup">
+<attdecl> %attrs;</attdecl>
+<attribute name="onmouseout"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="onkeyup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeypress"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="style"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmouseup"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="class"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="title"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onmousemove"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:lang"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="ondblclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onkeydown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="dir"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="ltr rtl"
+ default=""/>
+<attribute name="onmousedown"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="onmouseover"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="onclick"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+</dtd>
diff --git a/kate/xmltools/xslt-1.0.dtd.xml b/kate/xmltools/xslt-1.0.dtd.xml
new file mode 100644
index 0000000..4a91a18
--- /dev/null
+++ b/kate/xmltools/xslt-1.0.dtd.xml
@@ -0,0 +1,1690 @@
+<!DOCTYPE dtd PUBLIC "-//Norman Walsh//DTD DTDParse V2.0//EN"
+ "dtd.dtd" [
+]>
+<dtd version='1.0'
+ unexpanded='1'
+ title="?untitled?"
+ namecase-general="1"
+ namecase-entity="0"
+ xml="0"
+ system-id="xslt.dtd"
+ public-id=""
+ declaration=""
+ created-by="DTDParse V2.0beta6"
+ created-on="Sun Sep 23 14:10:52 2001"
+>
+<entity name="pattern"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="char"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="char-template"
+ type="param"
+>
+<text-expanded>
+ (#PCDATA
+
+ | xsl:apply-templates
+ | xsl:call-template
+ | xsl:apply-imports
+ | xsl:for-each
+ | xsl:value-of
+ | xsl:copy-of
+ | xsl:number
+ | xsl:choose
+ | xsl:if
+ | xsl:text
+ | xsl:copy
+ | xsl:variable
+ | xsl:message
+ | xsl:fallback
+)*
+</text-expanded>
+<text>
+ (#PCDATA
+ %char-instructions;)*
+</text>
+</entity>
+
+<entity name="qnames"
+ type="param"
+>
+<text-expanded>NMTOKENS</text-expanded>
+<text>NMTOKENS</text>
+</entity>
+
+<entity name="space-att"
+ type="param"
+>
+<text-expanded>xml:space (default|preserve) #IMPLIED</text-expanded>
+<text>xml:space (default|preserve) #IMPLIED</text>
+</entity>
+
+<entity name="result-elements"
+ type="param"
+>
+<text-expanded></text-expanded>
+<text></text>
+</entity>
+
+<entity name="avt"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="top-level"
+ type="param"
+>
+<text-expanded>
+ (xsl:import*,
+ (xsl:include
+ | xsl:strip-space
+ | xsl:preserve-space
+ | xsl:output
+ | xsl:key
+ | xsl:decimal-format
+ | xsl:attribute-set
+ | xsl:variable
+ | xsl:param
+ | xsl:template
+ | xsl:namespace-alias
+ )*)
+</text-expanded>
+<text>
+ (xsl:import*,
+ (xsl:include
+ | xsl:strip-space
+ | xsl:preserve-space
+ | xsl:output
+ | xsl:key
+ | xsl:decimal-format
+ | xsl:attribute-set
+ | xsl:variable
+ | xsl:param
+ | xsl:template
+ | xsl:namespace-alias
+ %non-xsl-top-level;)*)
+</text>
+</entity>
+
+<entity name="non-xsl-top-level"
+ type="param"
+>
+<text-expanded></text-expanded>
+<text></text>
+</entity>
+
+<entity name="char-instructions"
+ type="param"
+>
+<text-expanded>
+ | xsl:apply-templates
+ | xsl:call-template
+ | xsl:apply-imports
+ | xsl:for-each
+ | xsl:value-of
+ | xsl:copy-of
+ | xsl:number
+ | xsl:choose
+ | xsl:if
+ | xsl:text
+ | xsl:copy
+ | xsl:variable
+ | xsl:message
+ | xsl:fallback
+</text-expanded>
+<text>
+ | xsl:apply-templates
+ | xsl:call-template
+ | xsl:apply-imports
+ | xsl:for-each
+ | xsl:value-of
+ | xsl:copy-of
+ | xsl:number
+ | xsl:choose
+ | xsl:if
+ | xsl:text
+ | xsl:copy
+ | xsl:variable
+ | xsl:message
+ | xsl:fallback
+</text>
+</entity>
+
+<entity name="top-level-atts"
+ type="param"
+>
+<text-expanded>
+ extension-element-prefixes CDATA #IMPLIED
+ exclude-result-prefixes CDATA #IMPLIED
+ id ID #IMPLIED
+ version NMTOKEN #REQUIRED
+ xmlns:xsl CDATA #FIXED "http://www.w3.org/1999/XSL/Transform"
+ xml:space (default|preserve) #IMPLIED
+</text-expanded>
+<text>
+ extension-element-prefixes CDATA #IMPLIED
+ exclude-result-prefixes CDATA #IMPLIED
+ id ID #IMPLIED
+ version NMTOKEN #REQUIRED
+ xmlns:xsl CDATA #FIXED "http://www.w3.org/1999/XSL/Transform"
+ %space-att;
+</text>
+</entity>
+
+<entity name="URI"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="result-element-atts"
+ type="param"
+>
+<text-expanded>
+ xsl:extension-element-prefixes CDATA #IMPLIED
+ xsl:exclude-result-prefixes CDATA #IMPLIED
+ xsl:use-attribute-sets NMTOKENS #IMPLIED
+ xsl:version NMTOKEN #IMPLIED
+</text-expanded>
+<text>
+ xsl:extension-element-prefixes CDATA #IMPLIED
+ xsl:exclude-result-prefixes CDATA #IMPLIED
+ xsl:use-attribute-sets %qnames; #IMPLIED
+ xsl:version NMTOKEN #IMPLIED
+</text>
+</entity>
+
+<entity name="instructions"
+ type="param"
+>
+<text-expanded>
+
+ | xsl:apply-templates
+ | xsl:call-template
+ | xsl:apply-imports
+ | xsl:for-each
+ | xsl:value-of
+ | xsl:copy-of
+ | xsl:number
+ | xsl:choose
+ | xsl:if
+ | xsl:text
+ | xsl:copy
+ | xsl:variable
+ | xsl:message
+ | xsl:fallback
+
+ | xsl:processing-instruction
+ | xsl:comment
+ | xsl:element
+ | xsl:attribute
+</text-expanded>
+<text>
+ %char-instructions;
+ | xsl:processing-instruction
+ | xsl:comment
+ | xsl:element
+ | xsl:attribute
+</text>
+</entity>
+
+<entity name="template"
+ type="param"
+>
+<text-expanded>
+ (#PCDATA
+
+
+ | xsl:apply-templates
+ | xsl:call-template
+ | xsl:apply-imports
+ | xsl:for-each
+ | xsl:value-of
+ | xsl:copy-of
+ | xsl:number
+ | xsl:choose
+ | xsl:if
+ | xsl:text
+ | xsl:copy
+ | xsl:variable
+ | xsl:message
+ | xsl:fallback
+
+ | xsl:processing-instruction
+ | xsl:comment
+ | xsl:element
+ | xsl:attribute
+
+ )*
+</text-expanded>
+<text>
+ (#PCDATA
+ %instructions;
+ %result-elements;)*
+</text>
+</entity>
+
+<entity name="expr"
+ type="param"
+>
+<text-expanded>CDATA</text-expanded>
+<text>CDATA</text>
+</entity>
+
+<entity name="qname"
+ type="param"
+>
+<text-expanded>NMTOKEN</text-expanded>
+<text>NMTOKEN</text>
+</entity>
+
+<entity name="priority"
+ type="param"
+>
+<text-expanded>NMTOKEN</text-expanded>
+<text>NMTOKEN</text>
+</entity>
+
+<element name="xsl:processing-instruction"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="xsl:apply-templates"/>
+ <element-name name="xsl:call-template"/>
+ <element-name name="xsl:apply-imports"/>
+ <element-name name="xsl:for-each"/>
+ <element-name name="xsl:value-of"/>
+ <element-name name="xsl:copy-of"/>
+ <element-name name="xsl:number"/>
+ <element-name name="xsl:choose"/>
+ <element-name name="xsl:if"/>
+ <element-name name="xsl:text"/>
+ <element-name name="xsl:copy"/>
+ <element-name name="xsl:variable"/>
+ <element-name name="xsl:message"/>
+ <element-name name="xsl:fallback"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="char-template"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="xsl:processing-instruction">
+<attdecl>
+ name %avt; #REQUIRED
+ %space-att;
+</attdecl>
+<attribute name="xml:space"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="default preserve"
+ default=""/>
+<attribute name="name"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="xsl:call-template"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="*">
+ <element-name name="xsl:with-param"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <element-name name="xsl:with-param"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="xsl:call-template">
+<attdecl>
+ name %qname; #REQUIRED
+</attdecl>
+<attribute name="name"
+ type="#REQUIRED"
+ value="NMTOKEN"
+ default=""/>
+</attlist>
+
+<element name="xsl:strip-space"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="xsl:strip-space">
+<attdecl> elements CDATA #REQUIRED</attdecl>
+<attribute name="elements"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="xsl:apply-imports"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<element name="xsl:otherwise"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="xsl:apply-templates"/>
+ <element-name name="xsl:call-template"/>
+ <element-name name="xsl:apply-imports"/>
+ <element-name name="xsl:for-each"/>
+ <element-name name="xsl:value-of"/>
+ <element-name name="xsl:copy-of"/>
+ <element-name name="xsl:number"/>
+ <element-name name="xsl:choose"/>
+ <element-name name="xsl:if"/>
+ <element-name name="xsl:text"/>
+ <element-name name="xsl:copy"/>
+ <element-name name="xsl:variable"/>
+ <element-name name="xsl:message"/>
+ <element-name name="xsl:fallback"/>
+ <element-name name="xsl:processing-instruction"/>
+ <element-name name="xsl:comment"/>
+ <element-name name="xsl:element"/>
+ <element-name name="xsl:attribute"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="template"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="xsl:otherwise">
+<attdecl> %space-att;</attdecl>
+<attribute name="xml:space"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="default preserve"
+ default=""/>
+</attlist>
+
+<element name="xsl:comment"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="xsl:apply-templates"/>
+ <element-name name="xsl:call-template"/>
+ <element-name name="xsl:apply-imports"/>
+ <element-name name="xsl:for-each"/>
+ <element-name name="xsl:value-of"/>
+ <element-name name="xsl:copy-of"/>
+ <element-name name="xsl:number"/>
+ <element-name name="xsl:choose"/>
+ <element-name name="xsl:if"/>
+ <element-name name="xsl:text"/>
+ <element-name name="xsl:copy"/>
+ <element-name name="xsl:variable"/>
+ <element-name name="xsl:message"/>
+ <element-name name="xsl:fallback"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="char-template"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="xsl:comment">
+<attdecl> %space-att;</attdecl>
+<attribute name="xml:space"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="default preserve"
+ default=""/>
+</attlist>
+
+<element name="xsl:preserve-space"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="xsl:preserve-space">
+<attdecl> elements CDATA #REQUIRED</attdecl>
+<attribute name="elements"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="xsl:text"
+ content-type="mixed">
+<content-model-expanded>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <pcdata/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="xsl:text">
+<attdecl>
+ disable-output-escaping (yes|no) "no"
+</attdecl>
+<attribute name="disable-output-escaping"
+ type=""
+ enumeration="yes"
+ value="yes no"
+ default="no"/>
+</attlist>
+
+<element name="xsl:import"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="xsl:import">
+<attdecl> href %URI; #REQUIRED</attdecl>
+<attribute name="href"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="xsl:fallback"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="xsl:apply-templates"/>
+ <element-name name="xsl:call-template"/>
+ <element-name name="xsl:apply-imports"/>
+ <element-name name="xsl:for-each"/>
+ <element-name name="xsl:value-of"/>
+ <element-name name="xsl:copy-of"/>
+ <element-name name="xsl:number"/>
+ <element-name name="xsl:choose"/>
+ <element-name name="xsl:if"/>
+ <element-name name="xsl:text"/>
+ <element-name name="xsl:copy"/>
+ <element-name name="xsl:variable"/>
+ <element-name name="xsl:message"/>
+ <element-name name="xsl:fallback"/>
+ <element-name name="xsl:processing-instruction"/>
+ <element-name name="xsl:comment"/>
+ <element-name name="xsl:element"/>
+ <element-name name="xsl:attribute"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="template"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="xsl:fallback">
+<attdecl> %space-att;</attdecl>
+<attribute name="xml:space"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="default preserve"
+ default=""/>
+</attlist>
+
+<element name="xsl:attribute"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="xsl:apply-templates"/>
+ <element-name name="xsl:call-template"/>
+ <element-name name="xsl:apply-imports"/>
+ <element-name name="xsl:for-each"/>
+ <element-name name="xsl:value-of"/>
+ <element-name name="xsl:copy-of"/>
+ <element-name name="xsl:number"/>
+ <element-name name="xsl:choose"/>
+ <element-name name="xsl:if"/>
+ <element-name name="xsl:text"/>
+ <element-name name="xsl:copy"/>
+ <element-name name="xsl:variable"/>
+ <element-name name="xsl:message"/>
+ <element-name name="xsl:fallback"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="char-template"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="xsl:attribute">
+<attdecl>
+ name %avt; #REQUIRED
+ namespace %avt; #IMPLIED
+ %space-att;
+</attdecl>
+<attribute name="xml:space"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="default preserve"
+ default=""/>
+<attribute name="namespace"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="xsl:namespace-alias"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="xsl:namespace-alias">
+<attdecl>
+ stylesheet-prefix CDATA #REQUIRED
+ result-prefix CDATA #REQUIRED
+</attdecl>
+<attribute name="stylesheet-prefix"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="result-prefix"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="xsl:param"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="xsl:apply-templates"/>
+ <element-name name="xsl:call-template"/>
+ <element-name name="xsl:apply-imports"/>
+ <element-name name="xsl:for-each"/>
+ <element-name name="xsl:value-of"/>
+ <element-name name="xsl:copy-of"/>
+ <element-name name="xsl:number"/>
+ <element-name name="xsl:choose"/>
+ <element-name name="xsl:if"/>
+ <element-name name="xsl:text"/>
+ <element-name name="xsl:copy"/>
+ <element-name name="xsl:variable"/>
+ <element-name name="xsl:message"/>
+ <element-name name="xsl:fallback"/>
+ <element-name name="xsl:processing-instruction"/>
+ <element-name name="xsl:comment"/>
+ <element-name name="xsl:element"/>
+ <element-name name="xsl:attribute"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="template"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="xsl:param">
+<attdecl>
+ name %qname; #REQUIRED
+ select %expr; #IMPLIED
+</attdecl>
+<attribute name="select"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#REQUIRED"
+ value="NMTOKEN"
+ default=""/>
+</attlist>
+
+<element name="xsl:with-param"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="xsl:apply-templates"/>
+ <element-name name="xsl:call-template"/>
+ <element-name name="xsl:apply-imports"/>
+ <element-name name="xsl:for-each"/>
+ <element-name name="xsl:value-of"/>
+ <element-name name="xsl:copy-of"/>
+ <element-name name="xsl:number"/>
+ <element-name name="xsl:choose"/>
+ <element-name name="xsl:if"/>
+ <element-name name="xsl:text"/>
+ <element-name name="xsl:copy"/>
+ <element-name name="xsl:variable"/>
+ <element-name name="xsl:message"/>
+ <element-name name="xsl:fallback"/>
+ <element-name name="xsl:processing-instruction"/>
+ <element-name name="xsl:comment"/>
+ <element-name name="xsl:element"/>
+ <element-name name="xsl:attribute"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="template"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="xsl:with-param">
+<attdecl>
+ name %qname; #REQUIRED
+ select %expr; #IMPLIED
+</attdecl>
+<attribute name="select"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#REQUIRED"
+ value="NMTOKEN"
+ default=""/>
+</attlist>
+
+<element name="xsl:if"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="xsl:apply-templates"/>
+ <element-name name="xsl:call-template"/>
+ <element-name name="xsl:apply-imports"/>
+ <element-name name="xsl:for-each"/>
+ <element-name name="xsl:value-of"/>
+ <element-name name="xsl:copy-of"/>
+ <element-name name="xsl:number"/>
+ <element-name name="xsl:choose"/>
+ <element-name name="xsl:if"/>
+ <element-name name="xsl:text"/>
+ <element-name name="xsl:copy"/>
+ <element-name name="xsl:variable"/>
+ <element-name name="xsl:message"/>
+ <element-name name="xsl:fallback"/>
+ <element-name name="xsl:processing-instruction"/>
+ <element-name name="xsl:comment"/>
+ <element-name name="xsl:element"/>
+ <element-name name="xsl:attribute"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="template"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="xsl:if">
+<attdecl>
+ test %expr; #REQUIRED
+ %space-att;
+</attdecl>
+<attribute name="xml:space"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="default preserve"
+ default=""/>
+<attribute name="test"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="xsl:sort"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="xsl:sort">
+<attdecl>
+ select %expr; "."
+ lang %avt; #IMPLIED
+ data-type %avt; "text"
+ order %avt; "ascending"
+ case-order %avt; #IMPLIED
+</attdecl>
+<attribute name="select"
+ type=""
+ value="CDATA"
+ default="."/>
+<attribute name="case-order"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="order"
+ type=""
+ value="CDATA"
+ default="ascending"/>
+<attribute name="data-type"
+ type=""
+ value="CDATA"
+ default="text"/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="xsl:copy"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="xsl:apply-templates"/>
+ <element-name name="xsl:call-template"/>
+ <element-name name="xsl:apply-imports"/>
+ <element-name name="xsl:for-each"/>
+ <element-name name="xsl:value-of"/>
+ <element-name name="xsl:copy-of"/>
+ <element-name name="xsl:number"/>
+ <element-name name="xsl:choose"/>
+ <element-name name="xsl:if"/>
+ <element-name name="xsl:text"/>
+ <element-name name="xsl:copy"/>
+ <element-name name="xsl:variable"/>
+ <element-name name="xsl:message"/>
+ <element-name name="xsl:fallback"/>
+ <element-name name="xsl:processing-instruction"/>
+ <element-name name="xsl:comment"/>
+ <element-name name="xsl:element"/>
+ <element-name name="xsl:attribute"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="template"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="xsl:copy">
+<attdecl>
+ %space-att;
+ use-attribute-sets %qnames; #IMPLIED
+</attdecl>
+<attribute name="xml:space"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="default preserve"
+ default=""/>
+<attribute name="use-attribute-sets"
+ type="#IMPLIED"
+ value="NMTOKENS"
+ default=""/>
+</attlist>
+
+<element name="xsl:stylesheet"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="xsl:import" occurrence="*"/>
+ <or-group occurrence="*">
+ <element-name name="xsl:include"/>
+ <element-name name="xsl:strip-space"/>
+ <element-name name="xsl:preserve-space"/>
+ <element-name name="xsl:output"/>
+ <element-name name="xsl:key"/>
+ <element-name name="xsl:decimal-format"/>
+ <element-name name="xsl:attribute-set"/>
+ <element-name name="xsl:variable"/>
+ <element-name name="xsl:param"/>
+ <element-name name="xsl:template"/>
+ <element-name name="xsl:namespace-alias"/>
+ </or-group>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="top-level"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="xsl:stylesheet">
+<attdecl> %top-level-atts;</attdecl>
+<attribute name="xml:space"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="default preserve"
+ default=""/>
+<attribute name="exclude-result-prefixes"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="version"
+ type="#REQUIRED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="xmlns:xsl"
+ type="#FIXED"
+ value="CDATA"
+ default="http://www.w3.org/1999/XSL/Transform"/>
+<attribute name="extension-element-prefixes"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="xsl:apply-templates"
+ content-type="element">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <element-name name="xsl:sort"/>
+ <element-name name="xsl:with-param"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <or-group occurrence="*">
+ <element-name name="xsl:sort"/>
+ <element-name name="xsl:with-param"/>
+ </or-group>
+</content-model>
+</element>
+
+<attlist name="xsl:apply-templates">
+<attdecl>
+ select %expr; "node()"
+ mode %qname; #IMPLIED
+</attdecl>
+<attribute name="select"
+ type=""
+ value="CDATA"
+ default="node()"/>
+<attribute name="mode"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+</attlist>
+
+<element name="xsl:choose"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="xsl:when" occurrence="+"/>
+ <element-name name="xsl:otherwise" occurrence="?"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <element-name name="xsl:when" occurrence="+"/>
+ <element-name name="xsl:otherwise" occurrence="?"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="xsl:choose">
+<attdecl> %space-att;</attdecl>
+<attribute name="xml:space"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="default preserve"
+ default=""/>
+</attlist>
+
+<element name="xsl:for-each"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="xsl:apply-templates"/>
+ <element-name name="xsl:call-template"/>
+ <element-name name="xsl:apply-imports"/>
+ <element-name name="xsl:for-each"/>
+ <element-name name="xsl:value-of"/>
+ <element-name name="xsl:copy-of"/>
+ <element-name name="xsl:number"/>
+ <element-name name="xsl:choose"/>
+ <element-name name="xsl:if"/>
+ <element-name name="xsl:text"/>
+ <element-name name="xsl:copy"/>
+ <element-name name="xsl:variable"/>
+ <element-name name="xsl:message"/>
+ <element-name name="xsl:fallback"/>
+ <element-name name="xsl:processing-instruction"/>
+ <element-name name="xsl:comment"/>
+ <element-name name="xsl:element"/>
+ <element-name name="xsl:attribute"/>
+ <element-name name="xsl:sort"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <pcdata/>
+ <parament-name name="instructions"/>
+ <parament-name name="result-elements"/>
+ <element-name name="xsl:sort"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="xsl:for-each">
+<attdecl>
+ select %expr; #REQUIRED
+ %space-att;
+</attdecl>
+<attribute name="select"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="xml:space"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="default preserve"
+ default=""/>
+</attlist>
+
+<element name="xsl:transform"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group>
+ <element-name name="xsl:import" occurrence="*"/>
+ <or-group occurrence="*">
+ <element-name name="xsl:include"/>
+ <element-name name="xsl:strip-space"/>
+ <element-name name="xsl:preserve-space"/>
+ <element-name name="xsl:output"/>
+ <element-name name="xsl:key"/>
+ <element-name name="xsl:decimal-format"/>
+ <element-name name="xsl:attribute-set"/>
+ <element-name name="xsl:variable"/>
+ <element-name name="xsl:param"/>
+ <element-name name="xsl:template"/>
+ <element-name name="xsl:namespace-alias"/>
+ </or-group>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="top-level"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="xsl:transform">
+<attdecl> %top-level-atts;</attdecl>
+<attribute name="xml:space"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="default preserve"
+ default=""/>
+<attribute name="exclude-result-prefixes"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="id"
+ type="#IMPLIED"
+ value="ID"
+ default=""/>
+<attribute name="version"
+ type="#REQUIRED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="xmlns:xsl"
+ type="#FIXED"
+ value="CDATA"
+ default="http://www.w3.org/1999/XSL/Transform"/>
+<attribute name="extension-element-prefixes"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="xsl:include"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="xsl:include">
+<attdecl> href %URI; #REQUIRED</attdecl>
+<attribute name="href"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="xsl:number"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="xsl:number">
+<attdecl>
+ level (single|multiple|any) "single"
+ count %pattern; #IMPLIED
+ from %pattern; #IMPLIED
+ value %expr; #IMPLIED
+ format %avt; '1'
+ lang %avt; #IMPLIED
+ letter-value %avt; #IMPLIED
+ grouping-separator %avt; #IMPLIED
+ grouping-size %avt; #IMPLIED
+</attdecl>
+<attribute name="letter-value"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="lang"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="grouping-separator"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="value"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="from"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="level"
+ type=""
+ enumeration="yes"
+ value="single multiple any"
+ default="single"/>
+<attribute name="format"
+ type=""
+ value="CDATA"
+ default="1"/>
+<attribute name="grouping-size"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="count"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="xsl:decimal-format"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="xsl:decimal-format">
+<attdecl>
+ name %qname; #IMPLIED
+ decimal-separator %char; "."
+ grouping-separator %char; ","
+ infinity CDATA "Infinity"
+ minus-sign %char; "-"
+ NaN CDATA "NaN"
+ percent %char; "%"
+ per-mille %char; "&amp;#x2030;"
+ zero-digit %char; "0"
+ digit %char; "#"
+ pattern-separator %char; ";"
+</attdecl>
+<attribute name="NaN"
+ type=""
+ value="CDATA"
+ default="NaN"/>
+<attribute name="pattern-separator"
+ type=""
+ value="CDATA"
+ default=";"/>
+<attribute name="digit"
+ type=""
+ value="CDATA"
+ default="#"/>
+<attribute name="decimal-separator"
+ type=""
+ value="CDATA"
+ default="."/>
+<attribute name="grouping-separator"
+ type=""
+ value="CDATA"
+ default=","/>
+<attribute name="per-mille"
+ type=""
+ value="CDATA"
+ default="&#x2030;"/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="zero-digit"
+ type=""
+ value="CDATA"
+ default="0"/>
+<attribute name="infinity"
+ type=""
+ value="CDATA"
+ default="Infinity"/>
+<attribute name="percent"
+ type=""
+ value="CDATA"
+ default="%"/>
+<attribute name="minus-sign"
+ type=""
+ value="CDATA"
+ default="-"/>
+</attlist>
+
+<element name="xsl:variable"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="xsl:apply-templates"/>
+ <element-name name="xsl:call-template"/>
+ <element-name name="xsl:apply-imports"/>
+ <element-name name="xsl:for-each"/>
+ <element-name name="xsl:value-of"/>
+ <element-name name="xsl:copy-of"/>
+ <element-name name="xsl:number"/>
+ <element-name name="xsl:choose"/>
+ <element-name name="xsl:if"/>
+ <element-name name="xsl:text"/>
+ <element-name name="xsl:copy"/>
+ <element-name name="xsl:variable"/>
+ <element-name name="xsl:message"/>
+ <element-name name="xsl:fallback"/>
+ <element-name name="xsl:processing-instruction"/>
+ <element-name name="xsl:comment"/>
+ <element-name name="xsl:element"/>
+ <element-name name="xsl:attribute"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="template"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="xsl:variable">
+<attdecl>
+ name %qname; #REQUIRED
+ select %expr; #IMPLIED
+</attdecl>
+<attribute name="select"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#REQUIRED"
+ value="NMTOKEN"
+ default=""/>
+</attlist>
+
+<element name="xsl:copy-of"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="xsl:copy-of">
+<attdecl> select %expr; #REQUIRED</attdecl>
+<attribute name="select"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="xsl:output"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="xsl:output">
+<attdecl>
+ method %qname; #IMPLIED
+ version NMTOKEN #IMPLIED
+ encoding CDATA #IMPLIED
+ omit-xml-declaration (yes|no) #IMPLIED
+ standalone (yes|no) #IMPLIED
+ doctype-public CDATA #IMPLIED
+ doctype-system CDATA #IMPLIED
+ cdata-section-elements %qnames; #IMPLIED
+ indent (yes|no) #IMPLIED
+ media-type CDATA #IMPLIED
+</attdecl>
+<attribute name="media-type"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="doctype-system"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="method"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="omit-xml-declaration"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="yes no"
+ default=""/>
+<attribute name="standalone"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="yes no"
+ default=""/>
+<attribute name="cdata-section-elements"
+ type="#IMPLIED"
+ value="NMTOKENS"
+ default=""/>
+<attribute name="version"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="indent"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="yes no"
+ default=""/>
+<attribute name="encoding"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="doctype-public"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="xsl:when"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="xsl:apply-templates"/>
+ <element-name name="xsl:call-template"/>
+ <element-name name="xsl:apply-imports"/>
+ <element-name name="xsl:for-each"/>
+ <element-name name="xsl:value-of"/>
+ <element-name name="xsl:copy-of"/>
+ <element-name name="xsl:number"/>
+ <element-name name="xsl:choose"/>
+ <element-name name="xsl:if"/>
+ <element-name name="xsl:text"/>
+ <element-name name="xsl:copy"/>
+ <element-name name="xsl:variable"/>
+ <element-name name="xsl:message"/>
+ <element-name name="xsl:fallback"/>
+ <element-name name="xsl:processing-instruction"/>
+ <element-name name="xsl:comment"/>
+ <element-name name="xsl:element"/>
+ <element-name name="xsl:attribute"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="template"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="xsl:when">
+<attdecl>
+ test %expr; #REQUIRED
+ %space-att;
+</attdecl>
+<attribute name="xml:space"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="default preserve"
+ default=""/>
+<attribute name="test"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="xsl:key"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="xsl:key">
+<attdecl>
+ name %qname; #REQUIRED
+ match %pattern; #REQUIRED
+ use %expr; #REQUIRED
+</attdecl>
+<attribute name="use"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="match"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="name"
+ type="#REQUIRED"
+ value="NMTOKEN"
+ default=""/>
+</attlist>
+
+<element name="xsl:template"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="xsl:apply-templates"/>
+ <element-name name="xsl:call-template"/>
+ <element-name name="xsl:apply-imports"/>
+ <element-name name="xsl:for-each"/>
+ <element-name name="xsl:value-of"/>
+ <element-name name="xsl:copy-of"/>
+ <element-name name="xsl:number"/>
+ <element-name name="xsl:choose"/>
+ <element-name name="xsl:if"/>
+ <element-name name="xsl:text"/>
+ <element-name name="xsl:copy"/>
+ <element-name name="xsl:variable"/>
+ <element-name name="xsl:message"/>
+ <element-name name="xsl:fallback"/>
+ <element-name name="xsl:processing-instruction"/>
+ <element-name name="xsl:comment"/>
+ <element-name name="xsl:element"/>
+ <element-name name="xsl:attribute"/>
+ <element-name name="xsl:param"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <pcdata/>
+ <parament-name name="instructions"/>
+ <parament-name name="result-elements"/>
+ <element-name name="xsl:param"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="xsl:template">
+<attdecl>
+ match %pattern; #IMPLIED
+ name %qname; #IMPLIED
+ priority %priority; #IMPLIED
+ mode %qname; #IMPLIED
+ %space-att;
+</attdecl>
+<attribute name="xml:space"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="default preserve"
+ default=""/>
+<attribute name="mode"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="priority"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="name"
+ type="#IMPLIED"
+ value="NMTOKEN"
+ default=""/>
+<attribute name="match"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="xsl:attribute-set"
+ content-type="element">
+<content-model-expanded>
+ <sequence-group occurrence="*">
+ <element-name name="xsl:attribute"/>
+ </sequence-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group occurrence="*">
+ <element-name name="xsl:attribute"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="xsl:attribute-set">
+<attdecl>
+ name %qname; #REQUIRED
+ use-attribute-sets %qnames; #IMPLIED
+</attdecl>
+<attribute name="use-attribute-sets"
+ type="#IMPLIED"
+ value="NMTOKENS"
+ default=""/>
+<attribute name="name"
+ type="#REQUIRED"
+ value="NMTOKEN"
+ default=""/>
+</attlist>
+
+<element name="xsl:element"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="xsl:apply-templates"/>
+ <element-name name="xsl:call-template"/>
+ <element-name name="xsl:apply-imports"/>
+ <element-name name="xsl:for-each"/>
+ <element-name name="xsl:value-of"/>
+ <element-name name="xsl:copy-of"/>
+ <element-name name="xsl:number"/>
+ <element-name name="xsl:choose"/>
+ <element-name name="xsl:if"/>
+ <element-name name="xsl:text"/>
+ <element-name name="xsl:copy"/>
+ <element-name name="xsl:variable"/>
+ <element-name name="xsl:message"/>
+ <element-name name="xsl:fallback"/>
+ <element-name name="xsl:processing-instruction"/>
+ <element-name name="xsl:comment"/>
+ <element-name name="xsl:element"/>
+ <element-name name="xsl:attribute"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="template"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="xsl:element">
+<attdecl>
+ name %avt; #REQUIRED
+ namespace %avt; #IMPLIED
+ use-attribute-sets %qnames; #IMPLIED
+ %space-att;
+</attdecl>
+<attribute name="xml:space"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="default preserve"
+ default=""/>
+<attribute name="namespace"
+ type="#IMPLIED"
+ value="CDATA"
+ default=""/>
+<attribute name="use-attribute-sets"
+ type="#IMPLIED"
+ value="NMTOKENS"
+ default=""/>
+<attribute name="name"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+</attlist>
+
+<element name="xsl:message"
+ content-type="mixed">
+<content-model-expanded>
+ <or-group occurrence="*">
+ <pcdata/>
+ <element-name name="xsl:apply-templates"/>
+ <element-name name="xsl:call-template"/>
+ <element-name name="xsl:apply-imports"/>
+ <element-name name="xsl:for-each"/>
+ <element-name name="xsl:value-of"/>
+ <element-name name="xsl:copy-of"/>
+ <element-name name="xsl:number"/>
+ <element-name name="xsl:choose"/>
+ <element-name name="xsl:if"/>
+ <element-name name="xsl:text"/>
+ <element-name name="xsl:copy"/>
+ <element-name name="xsl:variable"/>
+ <element-name name="xsl:message"/>
+ <element-name name="xsl:fallback"/>
+ <element-name name="xsl:processing-instruction"/>
+ <element-name name="xsl:comment"/>
+ <element-name name="xsl:element"/>
+ <element-name name="xsl:attribute"/>
+ </or-group>
+</content-model-expanded>
+<content-model>
+ <sequence-group>
+ <parament-name name="template"/>
+ </sequence-group>
+</content-model>
+</element>
+
+<attlist name="xsl:message">
+<attdecl>
+ %space-att;
+ terminate (yes|no) "no"
+</attdecl>
+<attribute name="xml:space"
+ type="#IMPLIED"
+ enumeration="yes"
+ value="default preserve"
+ default=""/>
+<attribute name="terminate"
+ type=""
+ enumeration="yes"
+ value="yes no"
+ default="no"/>
+</attlist>
+
+<element name="xsl:value-of"
+ content-type="element">
+<content-model-expanded>
+ <empty/>
+</content-model-expanded>
+<content-model>
+ <empty/>
+</content-model>
+</element>
+
+<attlist name="xsl:value-of">
+<attdecl>
+ select %expr; #REQUIRED
+ disable-output-escaping (yes|no) "no"
+</attdecl>
+<attribute name="select"
+ type="#REQUIRED"
+ value="CDATA"
+ default=""/>
+<attribute name="disable-output-escaping"
+ type=""
+ enumeration="yes"
+ value="yes no"
+ default="no"/>
+</attlist>
+
+</dtd>
diff --git a/kdeaddons.lsm b/kdeaddons.lsm
new file mode 100644
index 0000000..1c1ce7c
--- /dev/null
+++ b/kdeaddons.lsm
@@ -0,0 +1,11 @@
+Begin4
+Title: kdeaddons
+Version: 3.5.10
+Entered-date: 2008-08-26
+Description: Add-Ons for the K Desktop Environment (KDE)
+Keywords: KDE X11 desktop Qt
+Author: http://bugs.kde.org/ (KDE Bugtracking System)
+Primary-site: http://www.kde.org/download/
+Platforms: Unix, Qt
+Copying-policy: GPL, Artistic
+End
diff --git a/kfile-plugins/Makefile.am b/kfile-plugins/Makefile.am
new file mode 100644
index 0000000..23348fb
--- /dev/null
+++ b/kfile-plugins/Makefile.am
@@ -0,0 +1,5 @@
+if include_kfileplugin_cert_SUBDIR
+CERT_SUBDIR=cert
+endif
+
+SUBDIRS=txt html desktop folder lnk $(CERT_SUBDIR) mhtml
diff --git a/kfile-plugins/RETURNED_ITEMS b/kfile-plugins/RETURNED_ITEMS
new file mode 100644
index 0000000..245dbff
--- /dev/null
+++ b/kfile-plugins/RETURNED_ITEMS
@@ -0,0 +1,28 @@
+If you make a new plugin, please add the list of returned items to this list.
+
+kfile_txt
+=========
+int Characters
+int Words
+int Lines
+QString Format (Unix/DOS/Macintosh)
+
+kfile_folder
+============
+int items
+QString size (as a string to display bytes, kB, MB, etc)
+
+kfile_lnk
+============
+int Size of target
+QString Location
+QString Points to
+QString Description
+
+kfile_mhtml
+===========
+QString Sender
+QString Recipient
+QString CopyTo (The CC: field)
+QString Subject
+QString Date
diff --git a/kfile-plugins/cert/Makefile.am b/kfile-plugins/cert/Makefile.am
new file mode 100644
index 0000000..0c8c1be
--- /dev/null
+++ b/kfile-plugins/cert/Makefile.am
@@ -0,0 +1,22 @@
+## Makefile.am for cert file meta info plugin
+
+# set the include path for X, qt and KDE
+INCLUDES = $(all_includes)
+
+# these are the headers for your project
+noinst_HEADERS = kfile_cert.h
+
+kde_module_LTLIBRARIES = kfile_cert.la
+
+kfile_cert_la_SOURCES = kfile_cert.cpp
+kfile_cert_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+kfile_cert_la_LIBADD = $(LIB_KSYCOCA)
+
+# let automoc handle all of the meta source files (moc)
+METASOURCES = AUTO
+
+messages: rc.cpp
+ $(XGETTEXT) kfile_cert.cpp -o $(podir)/kfile_cert.pot
+
+services_DATA = kfile_cert.desktop
+servicesdir = $(kde_servicesdir)
diff --git a/kfile-plugins/cert/configure.in.in b/kfile-plugins/cert/configure.in.in
new file mode 100644
index 0000000..29f0193
--- /dev/null
+++ b/kfile-plugins/cert/configure.in.in
@@ -0,0 +1,2 @@
+KDE_CHECK_SSL
+AM_CONDITIONAL(include_kfileplugin_cert_SUBDIR, test "$have_ssl" = yes)
diff --git a/kfile-plugins/cert/kfile_cert.cpp b/kfile-plugins/cert/kfile_cert.cpp
new file mode 100644
index 0000000..78c20f5
--- /dev/null
+++ b/kfile-plugins/cert/kfile_cert.cpp
@@ -0,0 +1,161 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Leonid Zeitlin *
+ * lz@europe.com *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#include <config.h>
+#include "kfile_cert.h"
+
+#include <kgenericfactory.h>
+#include <ksslcertificate.h>
+#include <ksslx509map.h>
+#include <kopenssl.h>
+//#include <kstandarddirs.h>
+//#include <kdebug.h>
+//#include <kio/global.h>
+
+#include <qdatetime.h>
+#include <qfile.h>
+#include <qcstring.h>
+//#include <qfileinfo.h>
+//#include <qdir.h>
+
+typedef KGenericFactory<CertPlugin> CertFactory;
+
+K_EXPORT_COMPONENT_FACTORY(kfile_cert, CertFactory("kfile-cert"))
+
+CertPlugin::CertPlugin(QObject *parent, const char *name, const QStringList &args)
+ : KFilePlugin(parent, name, args)
+{
+ //add the mimetype here - example:
+ //KFileMimeTypeInfo* info = addMimeTypeInfo( "text/html" );
+ KFileMimeTypeInfo* info = addMimeTypeInfo( "application/x-x509-ca-cert" );
+
+ // our new group
+ KFileMimeTypeInfo::GroupInfo* group = 0L;
+ KFileMimeTypeInfo::ItemInfo* item;
+
+ group = addGroupInfo(info, "certInfo", i18n("Certificate Information"));
+ item = addItemInfo(group, "ValidFrom", i18n("Valid From"), QVariant::DateTime);
+ item = addItemInfo(group, "ValidUntil", i18n("Valid Until"), QVariant::DateTime);
+ item = addItemInfo(group, "State", i18n("State"), QVariant::String);
+ item = addItemInfo(group, "SerialNo", i18n("Serial Number"), QVariant::String);
+
+ group = addGroupInfo(info, "certSubjectInfo", i18n("Subject"));
+ item = addItemInfo(group, "O", i18n("Organization"), QVariant::String);
+ item = addItemInfo(group, "OU", i18n("Organizational Unit"), QVariant::String);
+ item = addItemInfo(group, "L", i18n("Locality"), QVariant::String);
+ item = addItemInfo(group, "C", i18n("Country"), QVariant::String);
+ item = addItemInfo(group, "CN", i18n("Common Name"), QVariant::String);
+ item = addItemInfo(group, "E", i18n("Email"), QVariant::String);
+
+ group = addGroupInfo(info, "certIssuerInfo", i18n("Issuer"));
+ item = addItemInfo(group, "O", i18n("Organization"), QVariant::String);
+ item = addItemInfo(group, "OU", i18n("Organizational Unit"), QVariant::String);
+ item = addItemInfo(group, "L", i18n("Locality"), QVariant::String);
+ item = addItemInfo(group, "C", i18n("Country"), QVariant::String);
+ item = addItemInfo(group, "CN", i18n("Common Name"), QVariant::String);
+ item = addItemInfo(group, "E", i18n("Email"), QVariant::String);
+
+ //setUnit(item, KFileMimeTypeInfo::KiloBytes);
+
+ // strings are possible, too:
+ //addItemInfo(group, "Text", i18n("Document Type"), QVariant::String);
+}
+
+void CertPlugin::appendDNItems(KFileMetaInfoGroup &group, const QString &DN)
+{
+ KSSLX509Map map(DN);
+ QString value;
+ //QString dbg;
+ QStringList keys = group.supportedKeys();
+ QStringList::ConstIterator end = keys.end();
+ for (QStringList::ConstIterator it = keys.begin(); it != end; ++it) {
+ value = map.getValue(*it);
+ //dbg += *it + " = " + value + "; ";
+ if (!value.isNull()) appendItem(group, *it, value);
+ //appendItem(group, "CN", dbg);
+ }
+}
+
+static KSSLCertificate *readCertFromFile(const QString &path)
+{
+ KSSLCertificate *ret = NULL;
+
+ QFile file(path);
+ if (!file.open(IO_ReadOnly)) return NULL;
+ QByteArray file_data = file.readAll();
+ file.close();
+
+ QCString file_string = QCString(file_data.data(), file_data.size());
+ // try as is:
+ ret = KSSLCertificate::fromString(file_string);
+ if (ret) return ret;
+ // didn't work. Let's see if begin/end lines are there:
+ KOSSL::self()->ERR_clear_error();
+ const char *begin_line = "-----BEGIN CERTIFICATE-----\n";
+ const char *end_line = "\n-----END CERTIFICATE-----";
+ int begin_pos = file_string.find(begin_line);
+ if (begin_pos >= 0) {
+ begin_pos += strlen(begin_line);
+ int end_pos = file_string.find(end_line, begin_pos);
+ if (end_pos >= 0) {
+ // read the data between begin and end lines
+ QCString body = file_string.mid(begin_pos, end_pos - begin_pos);
+ ret = KSSLCertificate::fromString(body);
+ return ret; // even if it's NULL, we can't help it
+ }
+ }
+ // still didn't work. Assume the file was in DER (binary) encoding
+ unsigned char *p = (unsigned char*) file_data.data();
+ KOSSL::self()->ERR_clear_error();
+ X509 *x = KOSSL::self()->d2i_X509(NULL, &p, file_data.size());
+ if (x) {
+ ret = KSSLCertificate::fromX509(x);
+ KOSSL::self()->X509_free(x);
+ return ret;
+ }
+ else return NULL;
+}
+
+bool CertPlugin::readInfo(KFileMetaInfo& info, uint /*what*/)
+{
+ KSSLCertificate *cert = readCertFromFile(info.path());
+ if (cert) {
+ KFileMetaInfoGroup group = appendGroup(info, "certInfo");
+ appendItem(group, "ValidFrom", cert->getQDTNotBefore());
+ appendItem(group, "ValidUntil", cert->getQDTNotAfter());
+ appendItem(group, "State", KSSLCertificate::verifyText(cert->validate()));
+ appendItem(group, "SerialNo", cert->getSerialNumber());
+
+ group = appendGroup(info, "certSubjectInfo");
+ appendDNItems(group, cert->getSubject());
+
+ group = appendGroup(info, "certIssuerInfo");
+ appendDNItems(group, cert->getIssuer());
+
+ delete cert;
+ return true;
+ }
+ else {
+ KOSSL::self()->ERR_clear_error(); // don't leave errors behind
+ return false;
+ }
+}
+
+#include "kfile_cert.moc"
diff --git a/kfile-plugins/cert/kfile_cert.desktop b/kfile-plugins/cert/kfile_cert.desktop
new file mode 100644
index 0000000..a1571fd
--- /dev/null
+++ b/kfile-plugins/cert/kfile_cert.desktop
@@ -0,0 +1,60 @@
+[Desktop Entry]
+Type=Service
+Name=Certificate Info
+Name[bg]=Информация за удостоверение
+Name[br]=Titouroù diwar-benn an testeni
+Name[ca]=Informació del certificat
+Name[cs]=Informace o certifikátu
+Name[da]=Information om certifikat
+Name[de]=Information zum Zertifikat
+Name[el]=Πληροφορίες πιστοποιητικού
+Name[eo]=Atesta informo
+Name[es]=Información del certificado
+Name[et]=Sertifikaadi info
+Name[eu]=Ziurtagiriaren informazioa
+Name[fa]=اطلاعات گواهی‌نامه
+Name[fi]=Sertifikaatin tiedot
+Name[fr]=Informations sur le certificat
+Name[fy]=Sertifikaatynformaasje
+Name[ga]=Eolas faoin Teastas
+Name[gl]=Informacións do Certificado
+Name[hi]=प्रमाणपत्र जानकारी
+Name[hr]=Podaci potvrde
+Name[hu]=Tanúsítvány-jellemzők
+Name[is]=Upplýsingar um skírteini
+Name[it]=Informazioni del certificato
+Name[ja]=認証情報
+Name[ka]=სერტიფიკატის ინფორმაცია
+Name[kk]=Куәлік мәліметтері
+Name[km]=ព័ត៌មាន​វិញ្ញាបនបត្រ
+Name[lt]=Sertifikato informacija
+Name[mk]=Информации за сертификати
+Name[ms]=Maklumat Sijil
+Name[nb]=Sertifikatinformasjon
+Name[nds]=Zertifikaat-Informatschonen
+Name[ne]=प्रमाणपत्र सूचना
+Name[nl]=Certificaatinformatie
+Name[nn]=Informasjon om sertifikat
+Name[pa]=ਸਰਟੀਫਿਕੇਟ ਜਾਣਕਾਰੀ
+Name[pl]=Informacja o certyfikacie
+Name[pt]=Informações do Certificado
+Name[pt_BR]=Informações sobre Certificado
+Name[ru]=Информация о сертификате
+Name[sk]=Informácie o certifikáte
+Name[sl]=Informacija o certifikatu
+Name[sr]=Информације о сертификату
+Name[sr@Latn]=Informacije o sertifikatu
+Name[sv]=Information om certifikat
+Name[ta]=சான்றிதழ் தகவல்
+Name[tr]=Sertifika Bilgisi
+Name[uk]=Інформація про сертифікат
+Name[uz]=Sertifikat haqida maʼlumot
+Name[uz@cyrillic]=Сертификат ҳақида маълумот
+Name[vi]=Thông tin chứng nhận
+Name[zh_CN]=证书信息
+Name[zh_TW]=憑證資訊
+ServiceTypes=KFilePlugin
+X-KDE-Library=kfile_cert
+MimeType=application/x-x509-ca-cert
+PreferredGroups=certInfo,certSubjectInfo
+PreferredItems=State,CN,O,OU,L,C
diff --git a/kfile-plugins/cert/kfile_cert.h b/kfile-plugins/cert/kfile_cert.h
new file mode 100644
index 0000000..544ef39
--- /dev/null
+++ b/kfile-plugins/cert/kfile_cert.h
@@ -0,0 +1,42 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Leonid Zeitlin *
+ * lz@europe.com *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#ifndef __KFILE_CERT_H__
+#define __KFILE_CERT_H__
+
+/**
+ * Note: For further information look into <$KDEDIR/include/kfilemetainfo.h>
+ */
+#include <kfilemetainfo.h>
+
+class QStringList;
+class QString;
+
+class CertPlugin: public KFilePlugin {
+ Q_OBJECT
+private:
+ void appendDNItems(KFileMetaInfoGroup &group, const QString &DN);
+public:
+ CertPlugin(QObject *parent, const char *name, const QStringList& args);
+ virtual bool readInfo(KFileMetaInfo& info, uint what);
+};
+
+#endif // __KFILE_CERT_H__
+
diff --git a/kfile-plugins/desktop/Makefile.am b/kfile-plugins/desktop/Makefile.am
new file mode 100644
index 0000000..4fdfa7f
--- /dev/null
+++ b/kfile-plugins/desktop/Makefile.am
@@ -0,0 +1,22 @@
+## Makefile.am for .desktop file meta info plugin
+
+# set the include path for X, qt and KDE
+INCLUDES = $(all_includes)
+
+# these are the headers for your project
+noinst_HEADERS = kfile_desktop.h
+
+kde_module_LTLIBRARIES = kfile_desktop.la
+
+kfile_desktop_la_SOURCES = kfile_desktop.cpp
+kfile_desktop_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+kfile_desktop_la_LIBADD = $(LIB_KIO)
+
+# let automoc handle all of the meta source files (moc)
+METASOURCES = AUTO
+
+messages:
+ $(XGETTEXT) *.cpp -o $(podir)/kfile_desktop.pot
+
+services_DATA = kfile_desktop.desktop
+servicesdir = $(kde_servicesdir)
diff --git a/kfile-plugins/desktop/kfile_desktop.cpp b/kfile-plugins/desktop/kfile_desktop.cpp
new file mode 100644
index 0000000..3a78dbc
--- /dev/null
+++ b/kfile-plugins/desktop/kfile_desktop.cpp
@@ -0,0 +1,128 @@
+/* This file is part of the KDE project
+ * Copyright (C) 2002 Rolf Magnus <ramagnus@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation version 2.
+ *
+ * This program 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 the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "kfile_desktop.h"
+
+#include <kurl.h>
+#include <klocale.h>
+#include <kgenericfactory.h>
+#include <kdebug.h>
+#include <kdesktopfile.h>
+#include <kmimetype.h>
+
+typedef KGenericFactory<KDotDesktopPlugin> DotDesktopFactory;
+
+K_EXPORT_COMPONENT_FACTORY(kfile_desktop, DotDesktopFactory("kfile_desktop"))
+
+KDotDesktopPlugin::KDotDesktopPlugin(QObject *parent, const char *name,
+ const QStringList &preferredItems)
+ : KFilePlugin(parent, name, preferredItems)
+{
+ kdDebug(7034) << ".desktop plugin\n";
+
+ KFileMimeTypeInfo* info;
+ KFileMimeTypeInfo::GroupInfo* group;
+ KFileMimeTypeInfo::ItemInfo* item;
+
+ info = addMimeTypeInfo("application/x-desktop");
+ group = addGroupInfo(info, "General", i18n("General"));
+
+ item = addItemInfo(group, "Name", i18n("Name"), QVariant::String);
+ setHint(item, KFileMimeTypeInfo::Name);
+ item = addItemInfo(group, "Comment", i18n("Comment"), QVariant::String);
+ setHint(item, KFileMimeTypeInfo::Description);
+
+ addItemInfo(group, "Type", i18n("Type"), QVariant::String);
+
+ addItemInfo(group, "Device", i18n("Device"), QVariant::String);
+ addItemInfo(group, "Mount Point", i18n("Mount Point"), QVariant::String);
+ addItemInfo(group, "File System", i18n("File System"), QVariant::String);
+ addItemInfo(group, "Writable", i18n("Writable"), QVariant::Bool);
+
+ addItemInfo(group, "File Type", i18n("File Type"), QVariant::String);
+ addItemInfo(group, "Service Type", i18n("Service Type"), QVariant::String);
+ addItemInfo(group, "Preferred Items", i18n("Preferred Items"), QVariant::String);
+ addItemInfo(group, "Link To", i18n("Link To"), QVariant::String);
+}
+
+bool KDotDesktopPlugin::readInfo( KFileMetaInfo& info, uint )
+{
+ if ( info.path().isEmpty() ) // remote file
+ return false;
+
+ KDesktopFile file(info.path(), true);
+
+ QString s;
+
+ KFileMetaInfoGroup group = appendGroup(info, "General");
+
+ s = file.readName();
+ if (!s.isEmpty()) appendItem(group, "Name", s);
+
+ s = file.readComment();
+ if (!s.isEmpty()) appendItem(group, "Comment", s);
+
+ QString type = file.readType();
+ if (type == "FSDevice")
+ {
+ appendItem(group, "Type", i18n("Device"));
+
+ s = file.readDevice();
+ if (!s.isEmpty()) appendItem(group, "Device", s);
+
+ s = file.readEntry("MountPoint");
+ if (!s.isEmpty()) appendItem(group, "Mount Point", s);
+
+ s = i18n(file.readEntry("FSType").local8Bit());
+ if (!s.isEmpty()) appendItem(group, "File System", s);
+
+ appendItem(group, "Writable",
+ QVariant(!file.readBoolEntry("ReadOnly", true), 42));
+
+ }
+ else if (type == "Service")
+ {
+ appendItem(group, "Type", i18n("Service"));
+
+ s = file.readEntry("MimeType");
+ if (!s.isEmpty())
+ {
+ KMimeType::Ptr mt = KMimeType::mimeType(s);
+ appendItem(group, "File Type", mt->comment());
+ }
+
+ QString sType = file.readEntry("ServiceTypes");
+ appendItem(group, "Service Type", sType);
+
+ if (sType == "KFilePlugin")
+ {
+ QStringList preferred = file.readListEntry("PreferredItems");
+ appendItem(group, "Preferred Items", preferred);
+ }
+ }
+ else if (type == "Link")
+ {
+ QString url = file.readPathEntry("URL");
+ appendItem(group, "Link To", url);
+ }
+
+ return true;
+}
+
+#include "kfile_desktop.moc"
diff --git a/kfile-plugins/desktop/kfile_desktop.desktop b/kfile-plugins/desktop/kfile_desktop.desktop
new file mode 100644
index 0000000..4bcb494
--- /dev/null
+++ b/kfile-plugins/desktop/kfile_desktop.desktop
@@ -0,0 +1,68 @@
+[Desktop Entry]
+Type=Service
+Name=Desktop Entry Info
+Name[af]=Werkskerm Inskrywing Inligting
+Name[ar]=معلومات مدخل سطح المكتب
+Name[az]=Masa Üstü Girişi Mə'lumatı
+Name[bg]=Информация за файл Desktop
+Name[br]=Titouroù diwar-benn ar vouetadur burev
+Name[bs]=Informacije o desktop stavci
+Name[ca]=Informació de l'entrada a l'escriptori
+Name[cs]=Info o položce pracovní plochy
+Name[cy]=Gwybodaeth Cofnod Penbwrdd
+Name[da]=Information om desktopindgang
+Name[de]=Information zum Arbeitsflächeneintrag
+Name[el]=Πληροφορίες καταχώρησης επιφάνειας εργασίας
+Name[eo]=Tabula ero informo
+Name[es]=Información de la entrada del escritorio
+Name[et]=Töölaua kirje info
+Name[eu]=Mahaigainaren sarreraren informazioa
+Name[fa]=اطلاعات مدخل رومیزی
+Name[fi]=Työpöytätietueen tiedot
+Name[fo]=Upplýsingar um inngang á skriviborði
+Name[fr]=Informations sur l'entrée du bureau
+Name[fy]=Buroblêdyngong-ynformaasje
+Name[gl]=Información do Campo Desktop
+Name[he]=מידע רשומת שולחן עבודה
+Name[hi]=डेस्कटॉप एन्ट्री जानकारी
+Name[hr]=Podaci o stavki radne površine
+Name[hu]=Információ a munkaasztali bejegyzésekről
+Name[is]=Upplýsingar un skjáborðsfærslu
+Name[it]=Informazioni sulle voci Desktop
+Name[ja]=デスクトップエントリ情報
+Name[ka]=სამუშაო მაგიდის ჩანაწერის ინფორმაცია
+Name[kk]=.desktop жазуының мәліметі
+Name[km]=ព័ត៌មាន​ធាតុ​ផ្ទៃ​តុ
+Name[lt]=Darbastalio įrašo informacija
+Name[mk]=Информации за елемент од работната околина
+Name[ms]=Maklumat Entri Desktop
+Name[nb]=Informasjon om skrivebordsoppføring
+Name[nds]=Schriefdischindrag-Informatschonen
+Name[ne]=डेस्कटप प्रविष्टि सूचना
+Name[nl]=Bureaubladingang-informatie
+Name[nn]=Informasjon om skrivebordsoppføring
+Name[nso]=Tshedimoso Tsenelo ya Desktop
+Name[pa]=ਵੇਹੜਾ ਇੰਦਰਾਜ਼ ਜਾਣਕਾਰੀ
+Name[pl]=Informacja o plikach Desktop
+Name[pt]=Informação do Campo do 'Desktop'
+Name[pt_BR]=Informações sobre a entrada desktop
+Name[ro]=Informaţii înregistrare ecran
+Name[ru]=Информация об элементе .desktop
+Name[sk]=Informácie o položke pracovnej plochy
+Name[sl]=Informacije o vnosu namizja
+Name[sr]=Информације о уносу на радној површини
+Name[sr@Latn]=Informacije o unosu na radnoj površini
+Name[sv]=Information om skrivbordsfil
+Name[ta]=மேல்மேசை உள்ளிடு தகவல்
+Name[tg]=Ахборот дар бораи ҷузъи мизи корӣ
+Name[th]=ข้อมูลรายการพื้นที่ทำงาน
+Name[tr]=Masaüstü Girdi Bilgisi
+Name[uk]=Інформація про елемент стільниці
+Name[vi]=Thông tin mục nhập môi trường
+Name[xh]=Ungeniso Lolwazi lwe Desktop
+Name[zh_CN]=桌面项目信息
+Name[zh_TW]=桌面項目資訊
+ServiceTypes=KFilePlugin
+X-KDE-Library=kfile_desktop
+MimeType=application/x-desktop
+PreferredItems=Name,Comment,Type,Service Type
diff --git a/kfile-plugins/desktop/kfile_desktop.h b/kfile-plugins/desktop/kfile_desktop.h
new file mode 100644
index 0000000..1001e22
--- /dev/null
+++ b/kfile-plugins/desktop/kfile_desktop.h
@@ -0,0 +1,39 @@
+/* This file is part of the KDE project
+ * Copyright (C) 2002 Rolf Magnus <ramagnus@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation version 2.
+ *
+ * This program 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 the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef __KFILE_DESKTOP_H__
+#define __KFILE_DESKTOP_H__
+
+#include <kfilemetainfo.h>
+#include <kurl.h>
+
+class QStringList;
+
+class KDotDesktopPlugin: public KFilePlugin
+{
+ Q_OBJECT
+
+public:
+ KDotDesktopPlugin( QObject *parent, const char *name,
+ const QStringList& args );
+
+ virtual bool readInfo ( KFileMetaInfo& info, uint what );
+};
+
+#endif
diff --git a/kfile-plugins/folder/Makefile.am b/kfile-plugins/folder/Makefile.am
new file mode 100644
index 0000000..8c689dc
--- /dev/null
+++ b/kfile-plugins/folder/Makefile.am
@@ -0,0 +1,21 @@
+## Makefile.am for folder file meta info plugin
+
+INCLUDES = $(all_includes)
+
+# these are the headers for your project
+noinst_HEADERS = kfile_folder.h
+
+kde_module_LTLIBRARIES = kfile_folder.la
+
+kfile_folder_la_SOURCES = kfile_folder.cpp
+kfile_folder_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+kfile_folder_la_LIBADD = $(LIB_KIO)
+
+# let automoc handle all of the meta source files (moc)
+METASOURCES = AUTO
+
+services_DATA = kfile_folder.desktop
+servicesdir = $(kde_servicesdir)
+
+messages:
+ $(XGETTEXT) *.cpp -o $(podir)/kfile_folder.pot
diff --git a/kfile-plugins/folder/kfile_folder.cpp b/kfile-plugins/folder/kfile_folder.cpp
new file mode 100644
index 0000000..911a2e5
--- /dev/null
+++ b/kfile-plugins/folder/kfile_folder.cpp
@@ -0,0 +1,86 @@
+/* This file is part of the KDE project
+ * Copyright (C) 2002 Simon MacMullen
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation version 2.
+ *
+ * This program 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 the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include <config.h>
+#include "kfile_folder.h"
+
+#include <kgenericfactory.h>
+#include <kio/global.h>
+
+#include <qfileinfo.h>
+#include <qdir.h>
+
+typedef KGenericFactory<KFolderPlugin> KFolderFactory;
+
+K_EXPORT_COMPONENT_FACTORY(kfile_folder, KFolderFactory( "kfile_folder" ))
+
+KFolderPlugin::KFolderPlugin(QObject *parent, const char *name,
+ const QStringList &args)
+
+ : KFilePlugin(parent, name, args)
+{
+ KFileMimeTypeInfo* info = addMimeTypeInfo( "inode/directory" );
+
+ KFileMimeTypeInfo::GroupInfo* group = 0L;
+
+ group = addGroupInfo(info, "FolderInfo", i18n("Folder Information"));
+
+ KFileMimeTypeInfo::ItemInfo* item;
+
+ item = addItemInfo(group, "Items", i18n("Items"), QVariant::Int);
+ item = addItemInfo(group, "Size", i18n("Size"), QVariant::Int);
+ setUnit(item, KFileMimeTypeInfo::Bytes);
+}
+
+bool KFolderPlugin::readInfo( KFileMetaInfo& info, uint /*what*/)
+{
+ KFileMetaInfoGroup group = appendGroup(info, "FolderInfo");
+
+ if (info.path().isEmpty())
+ return false;
+
+ QDir dir;
+ if ( !dir.cd(info.path()) )
+ return false;
+
+ const QPtrList<QFileInfo> *fileList = dir.entryInfoList();
+ if (!fileList)
+ return false;
+
+ QPtrListIterator<QFileInfo> list = QPtrListIterator<QFileInfo>(*fileList);
+
+ QFileInfo* file;
+ int items = 0;
+ KIO::filesize_t bytes = 0;
+
+ while ( (file = list.current()) != 0 ) {
+ ++list;
+ if (!file->fileName().startsWith(".")) {
+ items++;
+ bytes += file->size();
+ }
+ }
+
+ appendItem(group, "Items", items);
+ appendItem(group, "Size", bytes);
+
+ return true;
+}
+
+#include "kfile_folder.moc"
diff --git a/kfile-plugins/folder/kfile_folder.desktop b/kfile-plugins/folder/kfile_folder.desktop
new file mode 100644
index 0000000..2cd6873
--- /dev/null
+++ b/kfile-plugins/folder/kfile_folder.desktop
@@ -0,0 +1,70 @@
+[Desktop Entry]
+Type=Service
+Name=Folder Info
+Name[af]=Kabinet Inligting
+Name[ar]=معلومات المجلد
+Name[az]=Qovluq Mə'lumatı
+Name[bg]=Информация за директория
+Name[br]=Titouroù diwar-benn ar renkell
+Name[bs]=Informacije o direktoriju
+Name[ca]=Info. de la carpeta
+Name[cs]=Info o adresáři
+Name[cy]=Gwybodaeth Plygell
+Name[da]=Mappeinformation
+Name[de]=Ordnerinformation
+Name[el]=Πληροφορίες φακέλου
+Name[eo]=Dosieruja informo
+Name[es]=Información de carpeta
+Name[et]=Kataloogi info
+Name[eu]=Karpetaren informazioa
+Name[fa]=اطلاعات پوشه
+Name[fi]=Kansion tiedot
+Name[fo]=Upplýsingar um inngangar á skriviborði
+Name[fr]=Informations sur le dossier
+Name[fy]=Mappenynformaasje
+Name[gl]=Información do Cartafol
+Name[he]=מידע תיקייה
+Name[hi]=फ़ोल्डर जानकारी
+Name[hr]=Podaci mape
+Name[hu]=Mappajellemzők
+Name[is]=Möppuupplýsingar
+Name[it]=Informazioni su directory
+Name[ja]=フォルダ情報
+Name[ka]=საქაღალდის ინფორმაცია
+Name[kk]=Қапшық мәліметі
+Name[km]=ព័ត៌មាន​ថត
+Name[lt]=Aplanko informacija
+Name[mk]=Информации за папка
+Name[ms]=Maklumat Folder
+Name[nb]=Mappeinformasjon
+Name[nds]=Orner-Informatschonen
+Name[ne]=फोल्डर सूचना
+Name[nl]=Mappeninformatie
+Name[nn]=Kataloginformasjon
+Name[pa]=ਫੋਲਡਰ ਜਾਣਕਾਰੀ
+Name[pl]=Informacja o katalogach
+Name[pt]=Informações de Pastas
+Name[pt_BR]=Informações sobre a Pasta
+Name[ro]=Informaţii folder
+Name[ru]=Информация о папке
+Name[sk]=Informácie o priečinku
+Name[sl]=Informacije o mapi
+Name[sr]=Информације о фасцикли
+Name[sr@Latn]=Informacije o fascikli
+Name[sv]=Kataloginformation
+Name[ta]=அடைவுத்தகவல்
+Name[tg]=Ахборот дар бораи каталог
+Name[th]=ข้อมูลโฟลเดอร์
+Name[tr]=Dizin Bilgisi
+Name[uk]=Інформація про теку
+Name[uz]=Jild haqida maʼlumot
+Name[uz@cyrillic]=Жилд ҳақида маълумот
+Name[vi]=Thông tin thư mục
+Name[xh]=Ulwazi lwencwadi enencukhacha
+Name[zh_CN]=文件夹信息
+Name[zh_TW]=資料夾資訊
+ServiceTypes=KFilePlugin
+X-KDE-Library=kfile_folder
+MimeType=inode/directory
+PreferredGroups=FolderInfo
+PreferredItems=Items,Size
diff --git a/kfile-plugins/folder/kfile_folder.h b/kfile-plugins/folder/kfile_folder.h
new file mode 100644
index 0000000..602c369
--- /dev/null
+++ b/kfile-plugins/folder/kfile_folder.h
@@ -0,0 +1,37 @@
+/* This file is part of the KDE project
+ * Copyright (C) 2002 Simon MacMullen
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation version 2.
+ *
+ * This program 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 the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef __KFILE_KFOLDER_H__
+#define __KFILE_KFOLDER_H__
+
+#include <kfilemetainfo.h>
+
+class QStringList;
+
+class KFolderPlugin: public KFilePlugin
+{
+ Q_OBJECT
+
+public:
+ KFolderPlugin( QObject *parent, const char *name, const QStringList& args );
+
+ virtual bool readInfo( KFileMetaInfo& info, uint what);
+};
+
+#endif
diff --git a/kfile-plugins/html/Makefile.am b/kfile-plugins/html/Makefile.am
new file mode 100644
index 0000000..610b74f
--- /dev/null
+++ b/kfile-plugins/html/Makefile.am
@@ -0,0 +1,22 @@
+## Makefile.am for html file meta info plugin
+
+# set the include path for X, qt and KDE
+INCLUDES = $(all_includes)
+
+# these are the headers for your project
+noinst_HEADERS = kfile_html.h
+
+kde_module_LTLIBRARIES = kfile_html.la
+
+kfile_html_la_SOURCES = kfile_html.cpp
+kfile_html_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+kfile_html_la_LIBADD = $(LIB_KSYCOCA)
+
+# let automoc handle all of the meta source files (moc)
+METASOURCES = AUTO
+
+messages: rc.cpp
+ $(XGETTEXT) kfile_html.cpp -o $(podir)/kfile_html.pot
+
+services_DATA = kfile_html.desktop
+servicesdir = $(kde_servicesdir)
diff --git a/kfile-plugins/html/kfile_html.cpp b/kfile-plugins/html/kfile_html.cpp
new file mode 100644
index 0000000..bfe736b
--- /dev/null
+++ b/kfile-plugins/html/kfile_html.cpp
@@ -0,0 +1,158 @@
+/* This file is part of the KDE project
+ * Copyright (C) 2001, 2002 Rolf Magnus <ramagnus@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation version 2.
+ *
+ * This program 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 the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * $Id$
+ */
+
+#include "kfile_html.h"
+#include "kfile_html.moc"
+#include <kgenericfactory.h>
+#include <kmimetype.h>
+#include <kurl.h>
+#include <kprocess.h>
+#include <kdebug.h>
+#include <qcstring.h>
+#include <qfile.h>
+#include <qregexp.h>
+#include <qtextcodec.h>
+
+typedef KGenericFactory<KHtmlPlugin> HtmlFactory;
+
+K_EXPORT_COMPONENT_FACTORY( kfile_html, HtmlFactory( "kfile_html" ) )
+
+KHtmlPlugin::KHtmlPlugin( QObject *parent, const char *name,
+ const QStringList &args )
+ : KFilePlugin( parent, name, args )
+{
+ kdDebug(7034) << "html plugin\n";
+
+ KFileMimeTypeInfo* info = addMimeTypeInfo("text/html");
+
+ KFileMimeTypeInfo::GroupInfo* group;
+ KFileMimeTypeInfo::ItemInfo* item;
+
+ group = addGroupInfo(info, "General", i18n("General"));
+ addItemInfo(group, "Doctype", i18n("Document Type"), QVariant::String);
+ addItemInfo(group, "Javascript", i18n("JavaScript"), QVariant::Bool);
+ item = addItemInfo(group, "Title", i18n("Title"), QVariant::String);
+ setHint(item, KFileMimeTypeInfo::Name);
+
+ group = addGroupInfo(info, "Metatags", i18n("Meta Tags"));
+ addVariableInfo(group, QVariant::String, 0);
+}
+
+
+bool KHtmlPlugin::readInfo( KFileMetaInfo& info, uint )
+{
+ if ( info.path().isEmpty() ) // remote file
+ return false;
+
+ QFile f(info.path());
+ if (!f.open(IO_ReadOnly))
+ return false;
+
+ // we're only interested in the header, so just read until before </head>
+ // or until <body> if the author forgot it
+ // In this case, it's better to limit the size of the buffer to something
+ // sensible. Think a 0-filled 3GB file with an .html extension.
+ int maxBufSize = QMIN(f.size(), 32768);
+ QByteArray data(maxBufSize + 1);
+ f.readBlock(data.data(), maxBufSize);
+ data[maxBufSize]='\0';
+
+ QString s(data);
+
+ int start=0, last=0;
+ QRegExp exp;
+ exp.setCaseSensitive(false);
+ exp.setMinimal(true);
+
+ KFileMetaInfoGroup group = appendGroup(info, "General");
+
+ exp.setPattern("\\s*<\\s*!doctype\\s*([^>]*)\\s*>");
+ if (exp.search(s, last) != -1)
+ {
+ kdDebug(7034) << "DocType: " << exp.capturedTexts().join("-") << endl;
+ appendItem(group, "Doctype", exp.cap(1));
+ last += exp.matchedLength();
+ }
+
+ QString title;
+ exp.setPattern("<\\s*title\\s*>\\s*(.*)\\s*<\\s*/\\s*title\\s*>");
+ if (exp.search(s, last) != -1)
+ {
+ title = exp.cap(1);
+ last += exp.matchedLength();
+ }
+
+ KFileMetaInfoGroup metatags = appendGroup(info, "Metatags");
+
+ QString meta, name, content;
+ exp.setPattern("<\\s*meta\\s*([^>]*)\\s*>");
+ QRegExp rxName("(?:name|http-equiv)\\s*=\\s*\"([^\"]+)\"", false);
+ QRegExp rxContent("content\\s*=\\s*\"([^\"]+)\"", false);
+ QRegExp rxCharset("charset\\s*=\\s*(.*)", false);
+ QTextCodec *codec = 0;
+
+ // find the meta tags
+ last = 0;
+ while (1)
+ {
+ if ((start=exp.search(s, last)) == -1)
+ break;
+ meta = exp.cap(1);
+ last = start+exp.matchedLength();
+
+ kdDebug(7034) << "Found Meta: " << meta << endl;
+
+ if (rxName.search(meta) == -1)
+ continue;
+ name = rxName.cap(1);
+
+ if (rxContent.search(meta) == -1)
+ continue;
+ content = rxContent.cap(1);
+
+ appendItem(metatags, name, content.left(50));
+
+ // check if it has a charset defined
+ if ( rxCharset.search(content) != -1 )
+ {
+ kdDebug(7034) << "CodecForName : " << rxCharset.cap(1) << endl;
+ codec = QTextCodec::codecForName(rxCharset.cap(1).ascii());
+ }
+ }
+
+ if ( ! title.isEmpty() )
+ {
+ if ( codec )
+ {
+ title = codec->toUnicode(title.ascii());
+ kdDebug(7034) << "Codec : " << codec->name() << endl;
+ }
+
+ appendItem(group, "Title", title);
+ }
+
+ // find out if it contains javascript
+ exp.setPattern("<script>");
+
+ appendItem(group, "Javascript", QVariant( s.find(exp)!=-1, 42));
+
+ return true;
+}
+
diff --git a/kfile-plugins/html/kfile_html.desktop b/kfile-plugins/html/kfile_html.desktop
new file mode 100644
index 0000000..fd75703
--- /dev/null
+++ b/kfile-plugins/html/kfile_html.desktop
@@ -0,0 +1,66 @@
+[Desktop Entry]
+Type=Service
+Name=HTML Playlist Info
+Name[af]=Html Liedjielys Inligting
+Name[ar]=معلومات قائمة أغاني HTML
+Name[az]=HTML Çalğı Siyahısı Mə'lumatı
+Name[bg]=Информация за HTML файл
+Name[br]=Titouroù diwar-benn ar roll tonioù HTML
+Name[ca]=Info. de la llista de reproducció HTML
+Name[cs]=Informace o seznamu skladeb HTML
+Name[cy]=Gwybodaeth Rhestr Chwarae HTML
+Name[da]=Information om HTML-spilleliste
+Name[de]=HTML-Wiedergabelisteninfo
+Name[el]=Πληροφορίες λίστας αναπαραγωγής HTML
+Name[eo]=HTML-ludlistinformo
+Name[es]=Información de la lista de reproducción HTML
+Name[et]=HTML esitusnimekirja info
+Name[eu]=HTML erreprodukzio-zerrendaren informazioa
+Name[fa]=اطلاعات فهرست پخش زنگام
+Name[fi]=HTML soittolistan tiedot
+Name[fo]=HTML spælilistaupplýsingar
+Name[fr]=Informations sur une liste de lecture HTML
+Name[fy]=HTML-ôfspyllistynfo
+Name[gl]=Información de Listas de Reprodución HTML
+Name[he]=מידע רשימת ניגון HTML
+Name[hi]=एचटीएमएल प्लेलिस्ट जानकारी
+Name[hr]=HTML podaci o popisu za sviranje
+Name[hu]=HTML lejátszási lista jellemzői
+Name[is]=Upplýsingar um HTML lagalista
+Name[it]=Informazioni playlist HTML
+Name[ja]=HTML プレイリスト情報
+Name[ka]=HTML სიმღერათა სიის ინფორმაცია
+Name[kk]=HTML орындау тізім мәліметі
+Name[km]=ព័ត៌មាន​បញ្ជី​ចាក់ HTML
+Name[lt]=HTML grojaraščio informacija
+Name[mk]=Информации за HTML-листа на нумери
+Name[ms]=Maklumat Senarai Main HTML
+Name[nb]=HTML-spilleliste-informasjon
+Name[nds]=HTML-Afspellistinformatschonen
+Name[ne]=एचटीएमएल प्लेसूची सूचना
+Name[nl]=HTML-afspeellijstinfo
+Name[nn]=Informasjon om HTML-speleliste
+Name[pa]=HTML ਸੰਗੀਤ-ਸੂਚੀ ਜਾਣਕਾਰੀ
+Name[pl]=Informacja o liście nagrań w HTML-u
+Name[pt]=Informações de Listas de Músicas HTML
+Name[pt_BR]=Informação de listas de reprodução HTML
+Name[ro]=Informaţii listă de redare HTML
+Name[ru]=Информация о списке песен в формате HTML
+Name[sk]=HTML informácie o playliste
+Name[sl]=Informacije o predvajalnem seznamu HTML
+Name[sr]=HTML информације о листи нумера
+Name[sr@Latn]=HTML informacije o listi numera
+Name[sv]=Information om HTML-spellista
+Name[ta]=HTML வாசிப்புப்பட்டியல் தகவல்
+Name[tg]=Ахборот дар бораи рӯйхати сурудҳо дар HTML
+Name[th]=ข้อมูลรายการเล่น HTML
+Name[tr]=HTML Çalma Listesi Bilgisi
+Name[uk]=Інформація списку композицій в HTML
+Name[vi]=Thông tin danh mục nhạc HTML
+Name[xh]=Ulwazi loluhlu lodweliso lomdlali we HTML
+Name[zh_CN]=HTML 播放列表信息
+Name[zh_TW]=HTML 播放清單資訊
+ServiceTypes=KFilePlugin
+X-KDE-Library=kfile_html
+MimeType=text/html
+PreferredItems=Title,Javascript,Doctype,Keywords
diff --git a/kfile-plugins/html/kfile_html.h b/kfile-plugins/html/kfile_html.h
new file mode 100644
index 0000000..4d9eec6
--- /dev/null
+++ b/kfile-plugins/html/kfile_html.h
@@ -0,0 +1,38 @@
+/* This file is part of the KDE project
+ * Copyright (C) 2001, 2002 Rolf Magnus <ramagnus@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation version 2.
+ *
+ * This program 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 the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * $Id$
+ */
+
+#ifndef __KMIME_HTML_H__
+#define __KMIME_HTML_H__
+
+#include <kfilemetainfo.h>
+#include <kurl.h>
+
+class QStringList;
+
+class KHtmlPlugin: public KFilePlugin
+{
+ Q_OBJECT
+
+public:
+ KHtmlPlugin( QObject *parent, const char *name, const QStringList& args );
+ virtual bool readInfo( KFileMetaInfo& info, uint what );
+};
+
+#endif
diff --git a/kfile-plugins/lnk/Makefile.am b/kfile-plugins/lnk/Makefile.am
new file mode 100644
index 0000000..9d97978
--- /dev/null
+++ b/kfile-plugins/lnk/Makefile.am
@@ -0,0 +1,34 @@
+## Makefile.am for lnk file meta info plugin
+
+INCLUDES = $(all_includes)
+
+bin_PROGRAMS = lnkforward
+
+lnkforward_SOURCES = lnkforward.cpp
+lnkforward_LDADD = $(LIB_KDECORE) $(LIB_KIO)
+lnkforward_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+lnkforward_METASOURCES = lnkforward.moc
+
+lnkforward_DATA = lnkforward.desktop
+lnkforwarddir = $(kde_appsdir)/.hidden
+
+# these are the headers for your project
+noinst_HEADERS = kfile_lnk.h read_lnk.h lnkforward.h
+
+kde_module_LTLIBRARIES = kfile_lnk.la
+
+kfile_lnk_la_SOURCES = kfile_lnk.cpp read_lnk.cpp
+kfile_lnk_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+kfile_lnk_la_LIBADD = $(LIB_KIO)
+kfile_lnk_la_METASOURCES = kfile_lnk.moc
+
+# let automoc handle all of the meta source files (moc)
+METASOURCES = AUTO
+
+kde_services_DATA = kfile_lnk.desktop
+
+mime_DATA = x-win-lnk.desktop
+mimedir = $(kde_mimedir)/application
+
+messages:
+ $(XGETTEXT) *.cpp -o $(podir)/kfile_lnk.pot
diff --git a/kfile-plugins/lnk/README b/kfile-plugins/lnk/README
new file mode 100644
index 0000000..a61c473
--- /dev/null
+++ b/kfile-plugins/lnk/README
@@ -0,0 +1,29 @@
+29.May 2004, Martin Koller, m.koller@surfeu.at
+
+This package shall help a better integration of KDE/Linux into a Windows environment
+by providing tools to work with Windows .lnk files
+
+This package contains 2 tools:
+
+- a KFile plugin, kfile_lnk, which gives metadata information for a .lnk file (where does it point to)
+
+- a small tool, lnkforward, to start an associated application for which the path is in a .lnk file
+ (e.g. when you double-click a file in konqueror)
+
+The .lnk file is registered as MIME type application/x-win-lnk
+
+If you have a dual-boot machine, and you have your Windows partition(s) mounted,
+then you should adapt where konqi can find the corresponding C:, D: or other drives.
+For this you have to adapt the used commandline arguments for lnkforward, which you
+can do in konqis file-associations for the MIME type application/x-win-lnk
+
+The lnkforward tool shall get a commandline option like this:
+
+-map C=/mnt/winC -map D=/mnt/winD
+
+NOTE: both tools work with .lnk files which are either readable via the local filesystem
+(smbfs mounted filesystems) or also via URLs on the network, e.g. smb://something
+
+Have fun.
+
+Martin
diff --git a/kfile-plugins/lnk/kfile_lnk.cpp b/kfile-plugins/lnk/kfile_lnk.cpp
new file mode 100644
index 0000000..6d8ea94
--- /dev/null
+++ b/kfile-plugins/lnk/kfile_lnk.cpp
@@ -0,0 +1,93 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Martin Koller *
+ * m.koller@surfeu.at *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+// format of a .lnk file retrieved from:
+// http://www.i2s-lab.com/Papers/The_Windows_Shortcut_File_Format.pdf
+
+#include <config.h>
+#include "kfile_lnk.h"
+#include "read_lnk.h"
+
+#include <kgenericfactory.h>
+
+//--------------------------------------------------------------------------------
+
+typedef KGenericFactory<lnkPlugin> lnkFactory;
+
+K_EXPORT_COMPONENT_FACTORY(kfile_lnk, lnkFactory( "kfile_lnk" ))
+
+//--------------------------------------------------------------------------------
+
+lnkPlugin::lnkPlugin(QObject *parent, const char *name,
+ const QStringList &args)
+ : KFilePlugin(parent, name, args)
+{
+ KFileMimeTypeInfo* info = addMimeTypeInfo( "application/x-win-lnk" );
+
+ // our new group
+ KFileMimeTypeInfo::GroupInfo* group = 0;
+ group = addGroupInfo(info, "lnkInfo", i18n("Windows Link File Information"));
+
+ KFileMimeTypeInfo::ItemInfo* item;
+
+ // our new items in the group
+ item = addItemInfo(group, "TargetSize", i18n("Size of Target"), QVariant::Int);
+ setUnit(item, KFileMimeTypeInfo::Bytes);
+
+ addItemInfo(group, "Where", i18n("Location"), QVariant::String);
+ addItemInfo(group, "PointsTo", i18n("Points To"), QVariant::String);
+ addItemInfo(group, "Description", i18n("Description"), QVariant::String);
+}
+
+//--------------------------------------------------------------------------------
+
+bool lnkPlugin::readInfo( KFileMetaInfo& info, uint /*what*/)
+{
+ KFileMetaInfoGroup group = appendGroup(info, "lnkInfo");
+
+ LNKInfo lnkInfo;
+ bool ret = readLNK(info.url(), lnkInfo);
+
+ if ( ! ret ) return false;
+
+ if ( ! lnkInfo.isDirectory ) // not a directory
+ appendItem(group, "TargetSize", lnkInfo.fileSize);
+
+ if ( ! lnkInfo.isFileOrDir ) // points to something != file or directory
+ return false;
+
+ if ( ! lnkInfo.isNetworkPath )
+ {
+ appendItem(group, "Where", i18n("on Windows disk: %1").arg(lnkInfo.volumeName)); // volume label
+ appendItem(group, "PointsTo", QString("%1%2").arg(lnkInfo.driveName).arg(lnkInfo.path));
+ }
+ else
+ {
+ appendItem(group, "Where", i18n("on network share"));
+ appendItem(group, "PointsTo", lnkInfo.path);
+ }
+
+ if ( ! lnkInfo.description.isNull() ) // has description string
+ appendItem(group, "Description", lnkInfo.description);
+
+ return true;
+}
+
+#include "kfile_lnk.moc"
diff --git a/kfile-plugins/lnk/kfile_lnk.desktop b/kfile-plugins/lnk/kfile_lnk.desktop
new file mode 100644
index 0000000..bad39b3
--- /dev/null
+++ b/kfile-plugins/lnk/kfile_lnk.desktop
@@ -0,0 +1,62 @@
+[Desktop Entry]
+Type=Service
+Name=Windows lnk File Info
+Name[bg]=Информация за файл връзка на Windows
+Name[br]=Titouroù diwar-benn ar restr Windows lnk
+Name[bs]=Windows lnk informacije o datoteci
+Name[ca]=Informació dels fitxers lnk de Windows
+Name[cs]=Informace o Windows lnk souboru
+Name[da]=Information om Windows lnk-fil
+Name[de]=Informationen zur Windows-Verknüpfungsdatei
+Name[el]=Πληροφορίες αρχείου lnk των Windows
+Name[eo]=Vindoza lnk dosiera informo
+Name[es]=Información del archivo lnk de Windows
+Name[et]=Windowsi .lnk-faili info
+Name[eu]=Windowsen Ink fitxategiaren informazioa
+Name[fa]=اطلاعات پروندۀ lnk ویندوز
+Name[fi]=Windows lnk-tiedoston tiedot
+Name[fr]=Informations sur le fichier « .lnk » Windows
+Name[fy]=Windows lnk-triemynformaasje
+Name[ga]=Eolas faoin Chomhad lnk Windows
+Name[gl]=Información de Ficheiros lnk de Windows
+Name[he]= מידע קובץ lnk של Windows
+Name[hi]=विंडो लिंक फ़ाइल जानकारी
+Name[hr]=Podaci Windows prečaca
+Name[hu]=Információ Windows-os Lnk-fájlokról
+Name[is]=Upplýsingar um Windows lnk-skrá
+Name[it]=File di informazioni Windows lnk
+Name[ja]=Windows lnk ファイル情報
+Name[ka]=Windows lnk ფაილის ინფორმაცია
+Name[kk]=Windows жарлық файлдың мәліметі
+Name[km]=ព័ត៌មាន​ឯកសារ​​បង្អួច​ឯកសារ lnk​
+Name[lt]=Windows lnk bylos informacija
+Name[mk]=Информации за Windows Ink-датотека
+Name[ms]=Maklumat Fail Dakwat Tetingkap
+Name[nb]=Informasjon om Windows lnk-fil
+Name[nds]=Informatschonen över de Windows-Linkdatei (.lnk)
+Name[ne]=विन्डोज lnk फाइल सूचना
+Name[nl]=Windows lnk-bestandsinformatie
+Name[nn]=Informasjon om Windows lnk-fil
+Name[pa]=Windows lnk ਫਾਇਲ ਜਾਣਕਾਰੀ
+Name[pl]=Informacja plików lnk systemu Windows
+Name[pt]=Informação do Ficheiro '.lnk' do Windows
+Name[pt_BR]=Informações de Arquivo do Windows
+Name[ru]=Сведения о ярлыке Windows
+Name[sk]=Informácie o súbore Windows lnk
+Name[sl]=Informacija o datoteki Windows .lnk
+Name[sr]=Подаци о Windows-овом .lnk фајлу
+Name[sr@Latn]=Podaci o Windows-ovom .lnk fajlu
+Name[sv]=Information om Windows länkfil
+Name[ta]=விண்டோஸ் இங்க் கோப்பு தகவல்
+Name[tg]=Маълумотҳо дар бораи ярлиқи Windows
+Name[tr]=Windows lnk Dosya Bilgisi
+Name[uk]=Інформація про файл lnk для Windows
+Name[uz]=Windows lnk fayli haqida maʼlumot
+Name[uz@cyrillic]=Windows lnk файли ҳақида маълумот
+Name[vi]=Thông tin tập tin Ink Windows
+Name[zh_CN]=Windows lnk 文件信息
+Name[zh_TW]=Windows lnk 檔資訊
+ServiceTypes=KFilePlugin
+X-KDE-Library=kfile_lnk
+MimeType=application/x-win-lnk
+PreferredItems=PointsTo,Where,TargetSize,Description
diff --git a/kfile-plugins/lnk/kfile_lnk.h b/kfile-plugins/lnk/kfile_lnk.h
new file mode 100644
index 0000000..3ee4ae8
--- /dev/null
+++ b/kfile-plugins/lnk/kfile_lnk.h
@@ -0,0 +1,46 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Martin Koller *
+ * m.koller@surfeu.at *
+ * *
+ * This plugin provides information about the content of a *
+ * M$-Windoze .lnk file, which is useful if you work in a mixed *
+ * Linux/Windoze environment. *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#ifndef __KFILE_LNK_H__
+#define __KFILE_LNK_H__
+
+/**
+ * Note: For further information look into <$KDEDIR/include/kfilemetainfo.h>
+ */
+#include <kfilemetainfo.h>
+
+class QStringList;
+
+class lnkPlugin: public KFilePlugin
+{
+ Q_OBJECT
+
+public:
+ lnkPlugin( QObject *parent, const char *name, const QStringList& args );
+
+ virtual bool readInfo( KFileMetaInfo& info, uint what);
+};
+
+#endif // __KFILE_LNK_H__
+
diff --git a/kfile-plugins/lnk/lnkforward.cpp b/kfile-plugins/lnk/lnkforward.cpp
new file mode 100644
index 0000000..a79a7db
--- /dev/null
+++ b/kfile-plugins/lnk/lnkforward.cpp
@@ -0,0 +1,130 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Martin Koller *
+ * m.koller@surfeu.at *
+ * *
+ * This helper app runs the associated action for a linked file inside a *
+ * M$-Windoze .lnk file, which is useful if you work in a mixed *
+ * Linux/Windoze environment. *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#include "read_lnk.cpp"
+#include "lnkforward.h"
+
+#include <stdlib.h>
+
+#include <klocale.h>
+#include <krun.h>
+#include <kdebug.h>
+
+//--------------------------------------------------------------------------------
+
+static const char appName[] = "lnkforward";
+static const char programName[] = I18N_NOOP("lnkforward");
+
+static const char description[] = I18N_NOOP("KDE tool for opening URLs given in a Windows .lnk file");
+
+static const char version[] = "1.0";
+
+static const KCmdLineOptions options[] =
+{
+ { "map <drive=path>", I18N_NOOP("Map a Windows drive to a local mountpoint, e.g. \"C=/mnt/windows\""
+ "\nThis option can be given multiple times"), 0},
+ { "+URL", I18N_NOOP("Windows .lnk file to open"), 0},
+ KCmdLineLastOption
+};
+
+//--------------------------------------------------------------------------------
+
+int main(int argc, char **argv)
+{
+ KCmdLineArgs::init(argc, argv, appName, programName, description, version, false);
+
+ KCmdLineArgs::addCmdLineOptions(options);
+
+ LNKForwarder app;
+
+ return app.run(KCmdLineArgs::parsedArgs());
+}
+
+//--------------------------------------------------------------------------------
+
+int LNKForwarder::run(KCmdLineArgs *args)
+{
+ if ( args->count() == 0 ) return 1;
+
+ LNKInfo info;
+
+ bool ret = readLNK(args->arg(0), info);
+ if ( ! ret ) return 1;
+
+ info.path.replace(QChar('\\'), QChar('/'));
+
+ QString path;
+
+ if ( info.isNetworkPath )
+ {
+ path = "smb:" + info.path;
+ }
+ else
+ {
+ if ( info.driveName.isNull() ) return 1; // can this ever happen ?
+
+ QCStringList map = args->getOptionList("map");
+ bool found = false;
+
+ for (unsigned int i = 0; i < map.count(); i++)
+ {
+ if ( map[i].lower()[0] == info.driveName.lower()[0] )
+ {
+ if ( map[i].length() < 3 )
+ {
+ return 1;
+ }
+ path = map[i].mid(2); // skip e.g. "C="
+ found = true;
+ break;
+ }
+ }
+
+ if ( !found ) return 1; // no mapped drive found
+
+ path += '/'; // make sure that the dir ends with /
+ path += info.path;
+ }
+
+ kdDebug(7034) << "running:" << path << endl;
+ KRun * run = new KRun(path);
+ QObject::connect(run, SIGNAL(finished()), this, SLOT(delayedQuit()));
+ QObject::connect(run, SIGNAL(error()), this, SLOT(delayedQuit()));
+
+ return exec();
+}
+
+//--------------------------------------------------------------------------------
+// copied from kfmclient.cc
+
+void LNKForwarder::delayedQuit()
+{
+ // Quit in 2 seconds. This leaves time for KRun to pop up
+ // "app not found" in KProcessRunner, if that was the case.
+ QTimer::singleShot(2000, this, SLOT(deref()));
+}
+
+//--------------------------------------------------------------------------------
+
+#include "lnkforward.moc"
diff --git a/kfile-plugins/lnk/lnkforward.desktop b/kfile-plugins/lnk/lnkforward.desktop
new file mode 100644
index 0000000..b7e2303
--- /dev/null
+++ b/kfile-plugins/lnk/lnkforward.desktop
@@ -0,0 +1,114 @@
+[Desktop Entry]
+Type=Application
+Comment=Start link given in Windows .lnk file
+Comment[bg]=Стартиране на файл връзка на Windows
+Comment[bs]=Pokreni link dat u Windows .lnk datoteci
+Comment[ca]=Inicia l'enllaç donat pel fitxer .lnk de Windows
+Comment[cs]=Spustit odkaz daný v .lnk souboru
+Comment[da]=Start link givet i Windows .lnk-fil
+Comment[de]=Ausführen der Verknüpfung aus einer Windows-Verknüpfungsdatei
+Comment[el]=Εκκίνηση του δεσμού που δίνεται στο αρχείο .lnk των Windows
+Comment[es]=Inicia el enlace que se encuentra en el archivo .lnk de Windows
+Comment[et]=Käivitab Windowsi .lnk-failis antud viida
+Comment[eu]=Hasieratu Windowsen .Ink fitxategiaren esteka
+Comment[fa]=آغاز پیوند داده‌شده در پروندۀ .lnk ویندوز
+Comment[fi]=Käynnistä Windows .lnk-tiedostossa annettu linkki
+Comment[fr]=Lancer le lien issu d'un fichier « .lnk » Windows
+Comment[fy]=Folget keppeling yn de Windows .lnk-triem
+Comment[ga]=Nasc tosaigh ón chomhad .lnk Windows
+Comment[gl]=Iniciar o enlace dado nun ficheiro .lnk de Windows
+Comment[he]=התחל קיצור בקובץ lnk של Windows
+Comment[hi]=विंडोज़ के .lnk फ़ाइल में स्टार्ट लिंक दिया गया है
+Comment[hr]=Pokretanje veze iz Windows datoteke .lnk
+Comment[hu]=Link megnyitása Windows-os Lnk-fájl alapján
+Comment[is]=Ræsa tengil í Windows lnk skrá
+Comment[it]=Collegamento iniziale dato nel file .lnk di Windows
+Comment[ja]=Windows の .lnk ファイルのリンクを開始
+Comment[ka]=Windows .lnk ფაილში მოცემული ბმულის გაშვება
+Comment[kk]=Windows .lnk файл сілтегенің жегу
+Comment[km]=ចាប់ផ្ដើម​តំណ​ដែល​បានផ្ដល់​​ក្នុង​បង្អួច​ឯកសារ .lnk
+Comment[lt]=Atverti nuorodą, nurodytą Windows .lnk byloje
+Comment[mk]=Ја стартува врската дадена во Windows .lnk-датотека
+Comment[ms]=Mulakan pautan yang diberikan dalam Tetingkap. Fail dakwat
+Comment[nb]=Start lenka oppgitt i en Windows .lnk-fil
+Comment[nds]=Den Link ut Windows-Linkdatei utföhren
+Comment[ne]=विन्डोज .lnk फाइलमा दिएको लिङ्क सुरुआत गर्नुहोस्
+Comment[nl]=Volgt koppeling in het Windows .lnk-bestand
+Comment[nn]=Start lenkja oppgjeve i ei Windows .lnk-fil
+Comment[pl]=Uruchamia odnośnik znajdujący się w plikach .lnk systemu Windows
+Comment[pt]=Iniciar a ligação definida pelo ficheiro .lnk do Windows
+Comment[pt_BR]=Inicia um link fornecido de um arquivo .lnk do Windows
+Comment[ru]=Перейти по ссылке из ярлыка Windows (.lnk)
+Comment[sk]=Spustenie zadaného odkazu v súbore Windows .lnk
+Comment[sl]=Zaženi povezavo, dano v datoteki Windows .lnk
+Comment[sr]=Покреће везу дату у Windows-овом .lnk фајлу
+Comment[sr@Latn]=Pokreće vezu datu u Windows-ovom .lnk fajlu
+Comment[sv]=Starta länk given i en Windows länkfil
+Comment[ta]=விண்டோஸ் .lnk fileசில் கொடுக்கப்பட்டதற்கு இணைப்பை துவக்கவும்
+Comment[tg]=Гузаштан бо истинод аз ярлиқи Windows (.lnk)
+Comment[tr]=Windows .lnk dosyasında verilen başlangıç kısayolu
+Comment[uk]=Перейти по посиланню з файла .lnk для Windows
+Comment[uz]=Windows .lnk faylida koʻrsatilgan bogʻga oʻtish
+Comment[uz@cyrillic]=Windows .lnk файлида кўрсатилган боғга ўтиш
+Comment[vi]=Liên kết bắt đầu được ghi trong tập tin .Ink của Windows
+Comment[zh_CN]=启动 Windows .lnk 文件中给出的链接
+Comment[zh_TW]=連結 Windows .lnk 檔中指定的網址
+Exec=lnkforward -map C=/mnt/winc
+MimeType=application/x-win-lnk
+Name=Windows lnk File Forwarder
+Name[bg]=Препращане за файл връзка на Windows
+Name[bs]=Windows lnk datoteka preusmjerivač
+Name[ca]=Enviador de fitxers Windows Ink
+Name[cs]=Informace o odkazech
+Name[da]=Videresender af Windows ink-fil
+Name[de]=Weiterleitung für Windows-Verknüpfungsdateien
+Name[el]=Προωθητής αρχείου lnk των Windows
+Name[eo]=Vindoza lnk dosiera antaŭigilo
+Name[es]=Expedidor de archivos lnk de Windows
+Name[et]=Windowsi .lnk-faili käivitaja
+Name[eu]=Windowsen Ink fitxategiaren berbidaltzailea
+Name[fa]=پیش‌سوی پروندۀ lnk ویندوز
+Name[fi]=Windows lnk-tiedoston edelleenohjaus
+Name[fr]=Transmetteur de fichiers « .lnk » Windows
+Name[fy]=Windows lnk-triemferwizing
+Name[gl]=Reenvio através de Ficheiros Windows lnk
+Name[he]=קיצור דרך של Windows
+Name[hi]=विंडोज़ लिंक फ़ाइल फॉर्वर्डर
+Name[hr]=Prosljeđivanje Windows prečaca
+Name[hu]=Windows-os Lnk-fájl továbbítása
+Name[is]=Windows lnk skráarframsendir
+Name[it]=File lnk di windows con funzione forwarder
+Name[ja]=Windows lnk ファイルフォワーダ
+Name[ka]=Windows lnk ფაილის გადამცემი
+Name[kk]=Windows жарлығының сілтемесіне өту
+Name[km]=កម្មវិធី​បញ្ជូន​បន្ត​បង្អួច​​ឯកសារ lnk​
+Name[lt]=Windows lnk bylų nuorodos
+Name[mk]=Пренасочувач на Windows lnk-датотеки
+Name[ms]=Pemaju Fail Dakwat Tetingkap
+Name[nb]=Videresender Windows lnk-fil
+Name[nds]=Wiederledden för Windows-Linkdateien
+Name[ne]=विन्डोज lnk फाइल अगाडि बढाउने
+Name[nl]=Windows lnk-bestandsverwijzing
+Name[nn]=Vidaresender Windows lnk-fil
+Name[pa]=Windows lnk ਫਾਇਲ ਫਾਰਵਰਡਰ
+Name[pl]=Interpretacja plików lnk systemu Windows
+Name[pt]=Encaminhamento de Ficheiros do Windows
+Name[pt_BR]=Informações de Aplicativos do Windows
+Name[ru]=Перенаправление по ярлыку Windows
+Name[sk]=Presmerovač súborov Windows lnk
+Name[sl]=Posredovalnik za bližnjice v Windows
+Name[sr]=Прослеђивач Windows-ових .lnk фајлова
+Name[sr@Latn]=Prosleđivač Windows-ovih .lnk fajlova
+Name[sv]=Följ Windows länkfil
+Name[ta]=விண்டோஸ் மை கோப்பு திருப்புபவன்
+Name[tg]=Равона бо ярлиқи Windows
+Name[tr]=Windows lnk Dosya Yönlendirici
+Name[uk]=Спрямування за файлом lnk для Windows
+Name[vi]=Bộ chuyển tiếp tập tin Ink Windows
+Name[zh_CN]=Windows lnk 文件转发器
+Name[zh_TW]=Windows lnk 檔轉載
+StartupNotify=false
+Terminal=false
+X-KDE-SubstituteUID=false
+Icon=exec_wine
+NoDisplay=true
diff --git a/kfile-plugins/lnk/lnkforward.h b/kfile-plugins/lnk/lnkforward.h
new file mode 100644
index 0000000..8810902
--- /dev/null
+++ b/kfile-plugins/lnk/lnkforward.h
@@ -0,0 +1,42 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Martin Koller *
+ * m.koller@surfeu.at *
+ * *
+ * This helper app runs the associated action for a linked file inside a *
+ * M$-Windoze .lnk file, which is useful if you work in a mixed *
+ * Linux/Windoze environment. *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#include <kapplication.h>
+#include <kcmdlineargs.h>
+
+#ifndef _LNKFORWARDER_H_
+#define _LNKFORWARDER_H_
+
+class LNKForwarder : public KApplication
+{
+ Q_OBJECT
+
+ public:
+ int run(KCmdLineArgs *args);
+
+ protected slots:
+ void delayedQuit();
+};
+
+#endif
diff --git a/kfile-plugins/lnk/read_lnk.cpp b/kfile-plugins/lnk/read_lnk.cpp
new file mode 100644
index 0000000..2d627fb
--- /dev/null
+++ b/kfile-plugins/lnk/read_lnk.cpp
@@ -0,0 +1,227 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Martin Koller *
+ * m.koller@surfeu.at *
+ * *
+ * This function reads the content of a M$-Windoze .lnk file *
+ * and returns data in the given structure. *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#include "read_lnk.h"
+#include <stdio.h>
+#include <kdebug.h>
+#include <kio/netaccess.h>
+
+//--------------------------------------------------------------------------------
+
+//TODO: little/big endian problem ?
+struct LNKHeader
+{
+ char magic[4];
+ char GUID[16];
+ Q_UINT32 flags;
+ Q_UINT32 attributes;
+ char time1[8];
+ char time2[8];
+ char time3[8];
+ Q_UINT32 length;
+ Q_UINT32 iconNum;
+ Q_UINT32 showWnd;
+ Q_UINT32 hotKey;
+ char filler[8];
+};
+
+struct LNKFileLocation
+{
+ Q_UINT32 totalLen;
+ Q_UINT32 ptr;
+ Q_UINT32 flags;
+ Q_UINT32 localVolume;
+ Q_UINT32 basePath;
+ Q_UINT32 netVolume;
+ Q_UINT32 pathname;
+};
+
+//--------------------------------------------------------------------------------
+
+bool readLNK(const KURL &url, LNKInfo &info)
+{
+ const char* lnkFile = 0;
+
+ QString tempFile;
+ if ( KIO::NetAccess::download(url, tempFile, 0) )
+ lnkFile = tempFile.latin1();
+ else
+ return false;
+
+ kdDebug(7034) << "opening:" << lnkFile << endl;
+ FILE *fd = fopen(lnkFile, "rb");
+ if ( !fd )
+ {
+ kdWarning(7034) << "could not open file " << lnkFile << endl;
+ KIO::NetAccess::removeTempFile(tempFile);
+ return false;
+ }
+
+ LNKHeader header;
+
+ if ( fread(&header, sizeof(header), 1, fd) != 1 )
+ {
+ kdWarning(7034) << "wrong header size" << endl;
+ fclose(fd);
+ KIO::NetAccess::removeTempFile(tempFile);
+ return false;
+ }
+
+ if ( memcmp(header.magic, "L\0\0\0", 4) != 0 )
+ {
+ kdWarning(7034) << "wrong magic in header" << endl;
+ fclose(fd);
+ KIO::NetAccess::removeTempFile(tempFile);
+ return false;
+ }
+
+ if ( header.flags & 0x1 ) // the shell item id list is present
+ {
+ Q_UINT16 len;
+
+ // skip that list
+ if ( (fread(&len, sizeof(len), 1, fd) != 1) || (fseek(fd, len, SEEK_CUR) != 0) )
+ {
+ kdWarning(7034) << "could not read shell item id list" << endl;
+ fclose(fd);
+ KIO::NetAccess::removeTempFile(tempFile);
+ return false;
+ }
+ }
+
+ info.isDirectory = (header.attributes & 0x10);
+
+ if ( ! info.isDirectory ) // not a directory
+ info.fileSize = header.length;
+
+ info.isFileOrDir = (header.flags & 0x2); // points to file or directory
+
+ if ( info.isFileOrDir )
+ {
+ LNKFileLocation loc;
+
+ if ( fread(&loc, sizeof(loc), 1, fd) != 1 )
+ {
+ kdWarning(7034) << "could not read file localtion table" << endl;
+ fclose(fd);
+ KIO::NetAccess::removeTempFile(tempFile);
+ return false;
+ }
+
+ // limit the following "new", because the size to allocate is in the file
+ // which can easily be manipulted to contain a huge number and lead to a crash
+ if ( (loc.totalLen <= sizeof(loc)) || (loc.totalLen > 4096) ) // 4096 is just an arbitrary number I think shall be enough
+ {
+ fclose(fd);
+ KIO::NetAccess::removeTempFile(tempFile);
+ return false;
+ }
+
+ size_t size = loc.totalLen - sizeof(loc);
+ char *data = new char[size];
+ char *start = data - sizeof(loc);
+
+ if ( fread(data, size, 1, fd) != 1 )
+ {
+ kdWarning(7034) << "could not read pathes data" << endl;
+ delete [] data;
+ fclose(fd);
+ KIO::NetAccess::removeTempFile(tempFile);
+ return false;
+ }
+
+ info.isNetworkPath = !(loc.flags & 0x1);
+
+ if ( !info.isNetworkPath )
+ {
+ info.volumeName = (start + loc.localVolume + 0x10); // volume label
+
+ info.path = QString::null;
+
+ if ( *(start + loc.basePath) )
+ {
+ // Don't put any more than "X:" into info.driveName.
+ info.driveName = *(start + loc.basePath);
+ info.driveName += ':';
+
+ // If we in fact do have more than just "X:", store any additional
+ // path information separately in info.path.
+ if ( *(start + loc.basePath + 1) == ':' &&
+ *(start + loc.basePath + 2) != 0)
+ info.path = (start + loc.basePath + 2);
+ }
+
+ if ( *(start + loc.pathname) != 0 )
+ {
+ if ( info.path.isNull() )
+ info.path = (start + loc.pathname);
+ else
+ info.path = info.path + "\\" + (start + loc.pathname);
+ }
+ }
+ else // network path
+ {
+ info.path = QString("%1\\%2")
+ .arg(start + loc.netVolume + 0x14) // network share name
+ .arg(start + loc.pathname);
+ }
+
+ delete [] data;
+ data = 0;
+
+ if ( header.flags & 0x4 ) // has description string
+ {
+ Q_UINT16 len;
+
+ if ( fread(&len, sizeof(len), 1, fd) != 1 )
+ {
+ kdWarning(7034) << "could not read description string length" << endl;
+ fclose(fd);
+ KIO::NetAccess::removeTempFile(tempFile);
+ return false;
+ }
+
+ data = new char[len+1]; // this can never be > 65K, so its OK to not check the size
+
+ if ( fread(data, len, 1, fd) != 1 )
+ {
+ kdWarning(7034) << "could not read description string" << endl;
+ delete [] data;
+ fclose(fd);
+ KIO::NetAccess::removeTempFile(tempFile);
+ return false;
+ }
+
+ data[len] = 0; // nullbyte seems to miss
+
+ info.description = data;
+
+ delete [] data;
+ }
+ }
+
+ fclose(fd);
+ KIO::NetAccess::removeTempFile(tempFile);
+
+ return true;
+}
diff --git a/kfile-plugins/lnk/read_lnk.h b/kfile-plugins/lnk/read_lnk.h
new file mode 100644
index 0000000..da947a1
--- /dev/null
+++ b/kfile-plugins/lnk/read_lnk.h
@@ -0,0 +1,46 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Martin Koller *
+ * m.koller@surfeu.at *
+ * *
+ * This function reads the content of a M$-Windoze .lnk file *
+ * and returns data in the given structure. *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+#ifndef _READ_LNK_H_
+#define _READ_LNK_H_
+
+#include <qstring.h>
+class KURL;
+
+struct LNKInfo
+{
+ LNKInfo() : fileSize(0), isNetworkPath(false), isDirectory(false), isFileOrDir(false) {}
+
+ Q_UINT32 fileSize;
+ bool isNetworkPath;
+ bool isDirectory;
+ bool isFileOrDir;
+ QString volumeName;
+ QString driveName;
+ QString path;
+ QString description;
+};
+
+bool readLNK(const KURL &url, LNKInfo &info);
+
+#endif
diff --git a/kfile-plugins/lnk/x-win-lnk.desktop b/kfile-plugins/lnk/x-win-lnk.desktop
new file mode 100644
index 0000000..18429dc
--- /dev/null
+++ b/kfile-plugins/lnk/x-win-lnk.desktop
@@ -0,0 +1,61 @@
+[Desktop Entry]
+Type=MimeType
+Comment=Windows Link-File
+Comment[bg]=Файл връзка на Windows
+Comment[bs]=Windows link datoteka
+Comment[ca]=Fitxer enllaç de Windows
+Comment[cs]=Soubor s odkazem Windows
+Comment[da]=Windows link-fil
+Comment[de]=Windows-Verknüpfungsdatei
+Comment[el]=Αρχείο δεσμού των Windows
+Comment[eo]=Vindoza ligdosiero
+Comment[es]=Archivo de enlace de Windows
+Comment[et]=Windowsi link-fail
+Comment[eu]=Windowsen esteka-fitxategia
+Comment[fa]=پروندۀ پیوند ویندوز
+Comment[fi]=Windows linkkitiedosto
+Comment[fr]=Fichier de lien de Windows
+Comment[fy]=Windows snelkeppeling
+Comment[ga]=Comhad Naisc Windows
+Comment[gl]=Ficheiro Windows Link
+Comment[he]=קיצור דרך של Windows
+Comment[hi]=विंडो लिंक-फ़ाइल
+Comment[hr]=Datoteka Windows prečaca
+Comment[hu]=Windows-os Lnk-fájl
+Comment[is]=Windows tengiskrá
+Comment[it]=Windows file di link
+Comment[ja]=Windows リンクファイル
+Comment[ka]=Windows-ის ბმულის ფაილი
+Comment[kk]=Windows сілтеме файлы
+Comment[km]=បង្អួច​ឯកសារ​​តំណ​
+Comment[lt]=Windows bylų nuorodos
+Comment[mk]=Windows Link-датотека
+Comment[ms]=Fail Pautan Tetingkap
+Comment[nb]=Windows Link-fil
+Comment[nds]=Windows-Linkdatei
+Comment[ne]=विन्डोज लिङ्क- फाइल
+Comment[nl]=Windows snelkoppeling
+Comment[nn]=Windows lenkjefil
+Comment[pa]=Windows ਸਬੰਧ-ਫਾਇਲ
+Comment[pl]=Plik odnośnika Windows
+Comment[pt]=Ficheiro Windows Link
+Comment[pt_BR]=Arquivo Link do Windows
+Comment[ru]=Ярлык Windows
+Comment[sk]=Odkaz Windows
+Comment[sl]=Datoteka z bližnjico v Windows
+Comment[sr]=Windows-ов фајл везе
+Comment[sr@Latn]=Windows-ov fajl veze
+Comment[sv]=Windows länkfil
+Comment[ta]=விண்டோஸ் இணைப்பு-கோப்பு
+Comment[tg]=Ярлиқи Windows
+Comment[tr]=Windows Kısayol Dosyası
+Comment[uk]=файл посилання для Windows
+Comment[uz]=Windows bogʻ fayli
+Comment[uz@cyrillic]=Windows боғ файли
+Comment[vi]=Tập tin liên kết Windows
+Comment[zh_CN]=Windows 快捷方式文件
+Comment[zh_TW]=Windows Link 檔
+Hidden=false
+Icon=exec_wine
+MimeType=application/x-win-lnk
+Patterns=*.lnk
diff --git a/kfile-plugins/mhtml/Makefile.am b/kfile-plugins/mhtml/Makefile.am
new file mode 100644
index 0000000..326820d
--- /dev/null
+++ b/kfile-plugins/mhtml/Makefile.am
@@ -0,0 +1,21 @@
+## Makefile.am for folder file meta info plugin
+
+INCLUDES = $(all_includes)
+
+# these are the headers for your project
+noinst_HEADERS = kfile_mhtml.h
+
+kde_module_LTLIBRARIES = kfile_mhtml.la
+
+kfile_mhtml_la_SOURCES = kfile_mhtml.cpp
+kfile_mhtml_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+kfile_mhtml_la_LIBADD = $(LIB_KIO)
+
+# let automoc handle all of the meta source files (moc)
+METASOURCES = AUTO
+
+services_DATA = kfile_mhtml.desktop
+servicesdir = $(kde_servicesdir)
+
+messages:
+ $(XGETTEXT) *.cpp -o $(podir)/kfile_mhtml.pot
diff --git a/kfile-plugins/mhtml/kfile_mhtml.cpp b/kfile-plugins/mhtml/kfile_mhtml.cpp
new file mode 100644
index 0000000..f9ef320
--- /dev/null
+++ b/kfile-plugins/mhtml/kfile_mhtml.cpp
@@ -0,0 +1,201 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Spiros Georgaras *
+ * sngeorgaras@otenet.gr *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+
+#include <config.h>
+#include "kfile_mhtml.h"
+
+#include <kgenericfactory.h>
+#include <kmdcodec.h>
+#include <qstring.h>
+#include <qcstring.h>
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qtextcodec.h>
+
+typedef KGenericFactory<mhtmlPlugin> mhtmlFactory;
+
+K_EXPORT_COMPONENT_FACTORY(kfile_mhtml, mhtmlFactory( "kfile_mhtml" ))
+
+mhtmlPlugin::mhtmlPlugin(QObject *parent, const char *name,
+ const QStringList &args)
+ : KFilePlugin(parent, name, args)
+{
+ KFileMimeTypeInfo* info = addMimeTypeInfo( "application/x-mimearchive" );
+ KFileMimeTypeInfo::GroupInfo* group = 0L;
+ group = addGroupInfo(info, "mhtmlInfo", i18n("Document Information"));
+ KFileMimeTypeInfo::ItemInfo* item;
+ item = addItemInfo(group, "Subject", i18n("Subject"), QVariant::String);
+ item = addItemInfo(group, "Sender", i18n("Sender"), QVariant::String);
+ item = addItemInfo(group, "Recipient", i18n("Recipient"), QVariant::String);
+ item = addItemInfo(group, "CopyTo", i18n("CC"), QVariant::String);
+ item = addItemInfo(group, "BlindCopyTo", i18n("BCC"), QVariant::String);
+ item = addItemInfo(group, "Date", i18n("Date"), QVariant::String);
+}
+
+bool mhtmlPlugin::readInfo( KFileMetaInfo& info, uint /*what*/)
+{
+ QString mSender;
+ QString mRecipient;
+ QString mCopyTo;
+ QString mBlindCopyTo;
+ QString mSubject;
+ QString mDate;
+ bool canUnfold;
+ if ( info.path().isEmpty() ) // remote file
+ return false;
+
+ QFile f(info.path());
+ if (!f.open(IO_ReadOnly)) return false;
+ QTextStream stream(&f);
+ QString l=stream.readLine();
+ int nFieldsFound = 0;
+ while(!l.isEmpty()){
+ if(l.startsWith("From: ")) {
+ mSender=l.mid(6);
+ nFieldsFound |= 1;
+ canUnfold=TRUE;
+ } else if(l.startsWith("To: ")) {
+ mRecipient=l.mid(4);
+ nFieldsFound |= 2;
+ canUnfold=TRUE;
+ } else if(l.startsWith("Subject: ")) {
+ mSubject=l.mid(9);
+ nFieldsFound |= 4;
+ canUnfold=TRUE;
+ } else if(l.startsWith("Cc: ")) {
+ mCopyTo=l.mid(4);
+ nFieldsFound |= 8;
+ canUnfold=TRUE;
+ } else if(l.startsWith("Bcc: ")) {
+ mBlindCopyTo=l.mid(5);
+ nFieldsFound |= 16;
+ canUnfold=TRUE;
+ } else if(l.startsWith("Date: ")) {
+ mDate=l.mid(6);
+ nFieldsFound |= 32;
+ canUnfold=FALSE;
+ }else if(l.startsWith(" ") || l.startsWith("\t")){
+ // unfold field
+ if(canUnfold){
+ QString tmp=l.stripWhiteSpace();
+ if(nFieldsFound & 16) mBlindCopyTo=mBlindCopyTo+" "+tmp;
+ else if(nFieldsFound & 8) mCopyTo=mCopyTo+" "+tmp;
+ else if(nFieldsFound & 4) mSubject=mSubject+" "+tmp;
+ else if(nFieldsFound & 2) mRecipient=mRecipient+" "+tmp;
+ else if(nFieldsFound & 1) mSender=mSender+" "+tmp;
+ }
+ }else canUnfold=FALSE;
+ // break out of the loop once the six fields have been found
+ if ( nFieldsFound == 32+16+8+4+2+1 )
+ break;
+ l=stream.readLine();
+ }
+ f.close();
+ KFileMetaInfoGroup group = appendGroup(info, "mhtmlInfo");
+ appendItem(group, "Subject", decodeRFC2047Phrase(mSubject,FALSE));
+ appendItem(group, "Sender", decodeRFC2047Phrase(mSender));
+ appendItem(group, "Recipient", decodeRFC2047Phrase(mRecipient));
+ appendItem(group, "CopyTo", decodeRFC2047Phrase(mCopyTo));
+ appendItem(group, "BlindCopyTo", decodeRFC2047Phrase(mBlindCopyTo));
+ appendItem(group, "Date", mDate);
+ return true;
+}
+
+QString mhtmlPlugin::decodeRFC2047Phrase(const QString &msg, bool removeLessGreater){
+ int st=msg.find("=?");
+ int en=-1;
+ QString msgCopy=msg;
+ QString decodedText=msgCopy.left(st);
+ QString encodedText=msgCopy.mid(st);
+ st=encodedText.find("=?");
+ while(st!=-1){
+ en=encodedText.find("?=");
+ while(encodedText.mid(en+2,1)!=" " && en+2<(int)encodedText.length()) en=encodedText.find("?=",en+1);
+ if(en==-1) break;
+ decodedText+=encodedText.left(st);
+ QString tmp=encodedText.mid(st,en-st+2);
+ encodedText=encodedText.mid(en+2);
+ decodedText+=decodeRFC2047String(tmp);
+ st=encodedText.find("=?",st+1);
+ }
+ decodedText += encodedText;
+ // remove unwanted '<' and '>'
+ if(removeLessGreater){
+ if(decodedText.stripWhiteSpace().startsWith("<") && decodedText.stripWhiteSpace().endsWith(">")){
+ QString tmp=decodedText.stripWhiteSpace();
+ tmp=tmp.mid(1,tmp.length()-2);
+ decodedText=tmp;
+ }else{
+ QString dec=decodedText;
+ QString tmp;
+
+ st=decodedText.find("<");
+ while(st!=-1){
+ st=dec.find("<",st);
+ if(st==0 || (st!=0 && (dec.mid(st-2,2)==", "))){
+ en=dec.find(">",st);
+ if(en==-1 && dec.find(",",st)<en){
+ st++;
+ continue;
+ }
+ dec=dec.left(st)+dec.mid(st+1,en-st-1)+dec.mid(en+1);
+ }else if(st!=-1) st++;
+ }
+ decodedText=dec;
+ }
+ }
+ return decodedText;
+}
+
+QString mhtmlPlugin::decodeRFC2047String(const QString &msg){
+ QString charset;
+ QString encoding;
+ QString notEncodedText;
+ QString encodedText;
+ QString decodedText;
+ int encEnd=0;
+ if(msg.startsWith("=?") && (encEnd=msg.findRev("?="))!=-1){
+ notEncodedText=msg.mid(encEnd+2);
+ encodedText=msg.left(encEnd);
+ encodedText=encodedText.mid(2,encodedText.length()-2);
+ int questionMark=encodedText.find('?');
+ if(questionMark==-1) return msg;
+ charset=encodedText.left(questionMark).lower();
+ encoding=encodedText.mid(questionMark+1,1).lower();
+ if(encoding!="b" && encoding!="q") return msg;
+ encodedText=encodedText.mid(questionMark+3);
+ if(charset.find(" ")!=-1 && encodedText.find(" ")!=-1) return msg;
+ QCString tmpIn;
+ QCString tmpOut;
+ tmpIn = encodedText.local8Bit();
+ if(encoding=="q")tmpOut=KCodecs::quotedPrintableDecode(tmpIn);
+ else tmpOut=KCodecs::base64Decode(tmpIn);
+ if(charset!="us-ascii"){
+ QTextCodec *codec = QTextCodec::codecForName(charset.local8Bit());
+ if(!codec) return msg;
+ decodedText=codec->toUnicode(tmpOut);
+ decodedText=decodedText.replace("_"," ");
+ }else decodedText=tmpOut.replace("_"," ");
+ return decodedText + notEncodedText;
+ }else return msg;
+}
+#include "kfile_mhtml.moc"
+
diff --git a/kfile-plugins/mhtml/kfile_mhtml.desktop b/kfile-plugins/mhtml/kfile_mhtml.desktop
new file mode 100644
index 0000000..5e73302
--- /dev/null
+++ b/kfile-plugins/mhtml/kfile_mhtml.desktop
@@ -0,0 +1,60 @@
+[Desktop Entry]
+Type=Service
+Name=mhtml Info
+Name[bg]=Информация за mhtml
+Name[br]=Titouroù mhtml
+Name[ca]=Informació mhtml
+Name[cs]=mhtml informace
+Name[da]=mhtml-info
+Name[de]=MHTML-Information
+Name[el]=Πληροφορίες mhtml
+Name[eo]=mhtml informo
+Name[es]=Información mhtml
+Name[et]=mhtmli info
+Name[eu]=mhtml infoa
+Name[fa]=اطلاعات mhtml
+Name[fi]=mhtml tiedot
+Name[fr]=Informations sur « mhtml »
+Name[fy]=mhtml-ynformaasje
+Name[ga]=Eolas mhtml
+Name[gl]=Información de mhtml
+Name[he]=מידע אודות mhtml
+Name[hr]=Podaci o mhtml
+Name[hu]=Mhtml-információ
+Name[is]=Upplýsingar um mhtml
+Name[it]=Informazioni su mhtml
+Name[ja]=mhtml 情報
+Name[ka]=mhtml ინფორმაცია
+Name[kk]=mhtml мәліметі
+Name[km]=ព័ត៌មាន mhtml
+Name[lt]=mhtml info
+Name[mk]=Информации за mhtml
+Name[ms]=Maklumat mhtml
+Name[nb]=mhtml-informasjon
+Name[nds]=MHTML-Informatschonen
+Name[ne]=एमएचटीएमएल सूचना
+Name[nl]=mhtml-informatie
+Name[nn]=mhtml-informasjon
+Name[pa]=mhtml ਜਾਣਕਾਰੀ
+Name[pl]=Informacja mhtml
+Name[pt]=Informações de mhtml
+Name[pt_BR]=Informações sobre mhtml
+Name[ru]=Информация mhtml
+Name[sk]=Informácie o mhtml
+Name[sl]=Informacija o mhtml
+Name[sr]=MHTML информације
+Name[sr@Latn]=MHTML informacije
+Name[sv]=MHTML-information
+Name[ta]=mhtml தகவல்
+Name[tr]=mhtml Bilgisi
+Name[uk]=Інформація про mhtml
+Name[uz]=mhtml fayllari haqida maʼlumot
+Name[uz@cyrillic]=mhtml файллари ҳақида маълумот
+Name[vi]=Thông tin mhtml
+Name[zh_CN]=mhtml 信息
+Name[zh_TW]=mhtml 資訊
+ServiceTypes=KFilePlugin
+X-KDE-Library=kfile_mhtml
+MimeType=application/x-mimearchive
+PreferredGroups=mhtmlInfo
+PreferredItems=Subject,Sender,Recipient,CopyTo,BlindCopyTo,Date
diff --git a/kfile-plugins/mhtml/kfile_mhtml.h b/kfile-plugins/mhtml/kfile_mhtml.h
new file mode 100644
index 0000000..dc29ec3
--- /dev/null
+++ b/kfile-plugins/mhtml/kfile_mhtml.h
@@ -0,0 +1,45 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Spiros Georgaras *
+ * sngeorgaras@otenet.gr *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+
+#ifndef __KFILE_MHTML_H__
+#define __KFILE_MHTML_H__
+
+/**
+ * Note: For further information look into <$KDEDIR/include/kfilemetainfo.h>
+ */
+#include <kfilemetainfo.h>
+
+class QStringList;
+
+class mhtmlPlugin: public KFilePlugin
+{
+ Q_OBJECT
+
+public:
+ mhtmlPlugin( QObject *parent, const char *name, const QStringList& args );
+ virtual bool readInfo( KFileMetaInfo& info, uint what);
+private:
+ QString decodeRFC2047Phrase(const QString &msg, bool removeLessGreater=TRUE);
+ QString decodeRFC2047String(const QString &msg);
+};
+
+#endif // __KFILE_MHTML_H__
+
diff --git a/kfile-plugins/txt/Makefile.am b/kfile-plugins/txt/Makefile.am
new file mode 100644
index 0000000..84e6ce7
--- /dev/null
+++ b/kfile-plugins/txt/Makefile.am
@@ -0,0 +1,21 @@
+## Makefile.am for text file meta info plugin
+
+# set the include path for X, qt and KDE
+INCLUDES = $(all_includes)
+
+noinst_HEADERS = kfile_txt.h
+
+kde_module_LTLIBRARIES = kfile_txt.la
+
+kfile_txt_la_SOURCES = kfile_txt.cpp
+kfile_txt_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+kfile_txt_la_LIBADD = $(LIB_KIO)
+
+# let automoc handle all of the meta source files (moc)
+METASOURCES = AUTO
+
+messages:
+ $(XGETTEXT) *.cpp -o $(podir)/kfile_txt.pot
+
+services_DATA = kfile_txt.desktop
+servicesdir = $(kde_servicesdir)
diff --git a/kfile-plugins/txt/kfile_txt.cpp b/kfile-plugins/txt/kfile_txt.cpp
new file mode 100644
index 0000000..02e166c
--- /dev/null
+++ b/kfile-plugins/txt/kfile_txt.cpp
@@ -0,0 +1,129 @@
+/* This file is part of the KDE project
+ * Copyright (C) 2002 Nadeem Hasan <nhasan@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation version 2.
+ *
+ * This program 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 the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "kfile_txt.h"
+
+#include <kgenericfactory.h>
+#include <kdebug.h>
+
+#include <qfile.h>
+#include <qstringlist.h>
+#include <qregexp.h>
+
+typedef KGenericFactory<KTxtPlugin> TxtFactory;
+
+K_EXPORT_COMPONENT_FACTORY(kfile_txt, TxtFactory("kfile_txt"))
+
+KTxtPlugin::KTxtPlugin(QObject *parent, const char *name,
+ const QStringList &args) : KFilePlugin(parent, name, args)
+{
+ kdDebug(7034) << "Text file meta info plugin\n";
+ makeMimeTypeInfo( "text/plain" );
+}
+
+void KTxtPlugin::makeMimeTypeInfo(const QString& mimeType)
+{
+ KFileMimeTypeInfo* info = addMimeTypeInfo(mimeType);
+
+ KFileMimeTypeInfo::GroupInfo* group =
+ addGroupInfo(info, "General", i18n("General"));
+
+ KFileMimeTypeInfo::ItemInfo* item;
+ item = addItemInfo(group, "Lines", i18n("Lines"), QVariant::Int);
+ setAttributes(item, KFileMimeTypeInfo::Averaged);
+ item = addItemInfo(group, "Words", i18n("Words"), QVariant::Int);
+ setAttributes(item, KFileMimeTypeInfo::Averaged);
+ item = addItemInfo(group, "Characters", i18n("Characters"), QVariant::ULongLong);
+ setAttributes(item, KFileMimeTypeInfo::Averaged);
+ item = addItemInfo(group, "Format", i18n("Format"), QVariant::String);
+}
+
+bool KTxtPlugin::readInfo(KFileMetaInfo& info, uint)
+{
+ if ( info.path().isEmpty() ) // remote file
+ return false;
+
+ QFile f(info.path());
+ if (!f.open(IO_ReadOnly))
+ return false;
+
+ bool firstline = true;
+ int totLines = 0;
+ int totWords = 0;
+ unsigned long long totChars = f.size();
+ QString fileFormat;
+ QString line;
+ bool skipTotals = (totChars > 100*1024); // 100K is the max we read
+
+ unsigned int bytesRead = 0;
+ while (!f.atEnd())
+ {
+ f.readLine(line, 4096);
+
+ int len = line.length();
+
+ // The checks below are necessary to handle embedded NULLs
+ // QFile::readLine() does not handle them well
+ bytesRead += len;
+ if (bytesRead > totChars)
+ break;
+ if (len == 0)
+ break;
+
+ if (firstline)
+ {
+ firstline = false;
+ if (line[len-1]=='\n')
+ {
+ if (len>=2 && line[len-2]=='\r')
+ fileFormat = i18n("DOS");
+ else
+ fileFormat = i18n("UNIX");
+ }
+ else if (line[len-1]=='\r')
+ fileFormat = i18n("Macintosh");
+ if (skipTotals)
+ break;
+ }
+
+ totWords += (QStringList::split(QRegExp("\\s+"), line)).count();
+ totLines++;
+ }
+
+ if (fileFormat.isEmpty())
+ fileFormat = i18n("Unknown");
+
+ kdDebug(7034) << "Lines: " << totLines << endl;
+ kdDebug(7034) << "Words: " << totWords << endl;
+ kdDebug(7034) << "Characters: " << totChars << endl;
+ kdDebug(7034) << "fileFormat: " << fileFormat << endl;
+
+ KFileMetaInfoGroup group = appendGroup(info, "General");
+ if (!skipTotals)
+ {
+ appendItem(group, "Lines", totLines);
+ appendItem(group, "Words", totWords);
+ }
+ appendItem(group, "Characters", totChars);
+ appendItem(group, "Format", fileFormat);
+
+ return true;
+}
+
+#include "kfile_txt.moc"
diff --git a/kfile-plugins/txt/kfile_txt.desktop b/kfile-plugins/txt/kfile_txt.desktop
new file mode 100644
index 0000000..2c332f3
--- /dev/null
+++ b/kfile-plugins/txt/kfile_txt.desktop
@@ -0,0 +1,70 @@
+[Desktop Entry]
+Type=Service
+Name=Text File Info
+Name[af]=Teks Lêer Inligting
+Name[ar]=معلومات ملف نصي
+Name[az]=Mətn Faylı Mə'lumatı
+Name[bg]=Информация за текстов файл
+Name[br]=Titouroù diwar-benn ar skrid restr
+Name[bs]=Info o tekst datoteci
+Name[ca]=Info. del fitxer de text
+Name[cs]=Info o textovém souboru
+Name[cy]=Gwybodaeth Ffeil Testun
+Name[da]=Information om tekstfil
+Name[de]=Informationen zur Textdatei
+Name[el]=Πληροφορίες αρχείου κειμένου
+Name[eo]=Tekstdosiera informo
+Name[es]=Información del archivo de texto
+Name[et]=Tekstifaili info
+Name[eu]=Testu fitxategiaren informazioa
+Name[fa]=اطلاعات پروندۀ متن
+Name[fi]=Tekstitiedoston tiedot
+Name[fo]=Tekstfíluupplýsingar
+Name[fr]=Informations sur le fichier texte
+Name[fy]=Teksttriem-ynfo
+Name[gl]=Información de Ficheiro de Texto
+Name[he]=מידע קובץ טקסט
+Name[hi]=पाठ फ़ाइल जानकारी
+Name[hr]=Podaci o tekstualnoj datoteci
+Name[hu]=Információ szöveges fájlokról
+Name[is]=Upplýsingar um textaskrá
+Name[it]=Informazioni File di testo
+Name[ja]=テキストファイル情報
+Name[ka]=ტექსტური ფაილის ინფორმაცია
+Name[kk]=Мәтін файлдың мәліметі
+Name[km]=ព័ត៌មាន​ឯកសារ​អត្ថបទ
+Name[lt]=Teksto bylos informacija
+Name[mk]=Информации за текстуална датотека
+Name[ms]=Maklumat Fail Teks
+Name[nb]=Tekstfilinformasjon
+Name[nds]=Textdatei-Informatschonen
+Name[ne]=पाठ फाइल सूचना
+Name[nl]=Tekstbestand-info
+Name[nn]=Informasjon om tekstfil
+Name[pa]=ਪਾਠ ਫਾਇਲ ਜਾਣਕਾਰੀ
+Name[pl]=Informacja o plikach tekstowych
+Name[pt]=Informações de Ficheiros de Texto
+Name[pt_BR]=Informações Sobre Arquivo texto
+Name[ro]=Informaţii fişier text
+Name[ru]=Информация о текстовом файле
+Name[sk]=Informácie o textovom súbore
+Name[sl]=Informacije o besedilni datoteki
+Name[sr]=Информације о текстуалном фајлу
+Name[sr@Latn]=Informacije o tekstualnom fajlu
+Name[sv]=Information om textfil
+Name[ta]=உரைக் கோப்பு தகவல்
+Name[tg]=Ахборот дар бораи файли матнӣ
+Name[th]=ข้อมูลแฟ้มข้อความ
+Name[tr]=Metin Dosyası Bilgisi
+Name[uk]=Інформація про текстовий файл
+Name[uz]=Matn fayli haqida maʼlumot
+Name[uz@cyrillic]=Матн файли ҳақида маълумот
+Name[vi]=Thông tin tập tin văn bản
+Name[xh]=Ulwazi Lombhalo Wefayile
+Name[zh_CN]=文本文件信息
+Name[zh_TW]=文字檔案資訊
+ServiceTypes=KFilePlugin
+X-KDE-Library=kfile_txt
+MimeType=text/plain
+PreferredGroups=General
+PreferredItems=Lines,Words,Characters,Format
diff --git a/kfile-plugins/txt/kfile_txt.h b/kfile-plugins/txt/kfile_txt.h
new file mode 100644
index 0000000..9b0196d
--- /dev/null
+++ b/kfile-plugins/txt/kfile_txt.h
@@ -0,0 +1,39 @@
+/* This file is part of the KDE project
+ * Copyright (C) 2002 Nadeem Hasan <nhasan@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation version 2.
+ *
+ * This program 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 the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef __KFILE_TXT_H_
+#define __KFILE_TXT_H_
+
+#include <kfilemetainfo.h>
+
+class QStringList;
+
+class KTxtPlugin: public KFilePlugin
+{
+ Q_OBJECT
+
+public:
+ KTxtPlugin(QObject *parent, const char *name, const QStringList& args);
+ virtual bool readInfo(KFileMetaInfo& info, uint what);
+
+private:
+ void makeMimeTypeInfo(const QString& mimeType);
+};
+
+#endif
diff --git a/kicker-applets/Makefile.am b/kicker-applets/Makefile.am
new file mode 100644
index 0000000..462f19f
--- /dev/null
+++ b/kicker-applets/Makefile.am
@@ -0,0 +1,2 @@
+SUBDIRS = $(AUTODIRS)
+
diff --git a/kicker-applets/kbinaryclock/Makefile.am b/kicker-applets/kbinaryclock/Makefile.am
new file mode 100644
index 0000000..5039925
--- /dev/null
+++ b/kicker-applets/kbinaryclock/Makefile.am
@@ -0,0 +1,22 @@
+INCLUDES = $(all_includes)
+
+kde_module_LTLIBRARIES = kbinaryclock_panelapplet.la
+
+kbinaryclock_panelapplet_la_SOURCES = kbinaryclock.cpp settings.ui datepicker.cpp prefs.kcfgc
+
+METASOURCES = AUTO
+
+noinst_HEADERS = kbinaryclock.h datepicker.h
+
+lnkdir = $(kde_datadir)/kicker/applets
+lnk_DATA = kbinaryclock.desktop
+kde_kcfg_DATA = kbinaryclock.kcfg
+
+EXTRA_DIST = $(lnk_DATA)
+
+kbinaryclock_panelapplet_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+kbinaryclock_panelapplet_la_LIBADD = $(LIB_KDEUI)
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/kbinaryclock.pot
+
diff --git a/kicker-applets/kbinaryclock/datepicker.cpp b/kicker-applets/kbinaryclock/datepicker.cpp
new file mode 100644
index 0000000..19efc1d
--- /dev/null
+++ b/kicker-applets/kbinaryclock/datepicker.cpp
@@ -0,0 +1,51 @@
+/************************************************************
+
+Copyright (c) 1996-2002 the kicker authors. See file AUTHORS.
+
+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 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.
+
+******************************************************************/
+
+#include "datepicker.h"
+
+
+#include <kdatepicker.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kwin.h>
+
+DatePicker::DatePicker(QWidget *parent, const QDate& date)
+ : QVBox( parent, 0, WType_TopLevel | WDestructiveClose |
+ WStyle_Customize | WStyle_StaysOnTop | WStyle_NoBorder )
+{
+ setFrameStyle( QFrame::PopupPanel | QFrame::Raised );
+ KWin::setOnAllDesktops( handle(), true );
+ picker = new KDatePicker(this, date);
+ picker->setCloseButton(true);
+
+ /* name and icon for kicker's taskbar */
+ setCaption(i18n("Calendar"));
+ setIcon(SmallIcon("date"));
+}
+
+void DatePicker::keyReleaseEvent(QKeyEvent *e)
+{
+ DATEPICKER_INHERITED::keyReleaseEvent(e);
+ if (e->key() == Qt::Key_Escape)
+ close();
+}
diff --git a/kicker-applets/kbinaryclock/datepicker.h b/kicker-applets/kbinaryclock/datepicker.h
new file mode 100644
index 0000000..2cf524a
--- /dev/null
+++ b/kicker-applets/kbinaryclock/datepicker.h
@@ -0,0 +1,42 @@
+/*****************************************************************
+
+Copyright (c) 1996-2000 the kicker authors. See file AUTHORS.
+
+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 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.
+
+******************************************************************/
+
+#ifndef __DATEPICKER_H
+#define __DATEPICKER_H
+
+#include <qvbox.h>
+
+class QDate;
+class KDatePicker;
+
+#define DATEPICKER_INHERITED QVBox
+class DatePicker : public QVBox
+{
+public:
+ DatePicker(QWidget*, const QDate&);
+private:
+ KDatePicker *picker;
+ void keyReleaseEvent(QKeyEvent *e);
+};
+
+#endif
diff --git a/kicker-applets/kbinaryclock/kbinaryclock.cpp b/kicker-applets/kbinaryclock/kbinaryclock.cpp
new file mode 100644
index 0000000..33e8ced
--- /dev/null
+++ b/kicker-applets/kbinaryclock/kbinaryclock.cpp
@@ -0,0 +1,411 @@
+/*
+ * Copyright (C) 2003 Benjamin C Meyer (ben+kbinaryclock@meyerhome.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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 the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+#include "kbinaryclock.h"
+#include "datepicker.h"
+
+#include <kapplication.h>
+#include <kconfigdialog.h>
+#include <kconfig.h>
+#include <kiconloader.h>
+#include <kglobalsettings.h>
+
+#include <qradiobutton.h>
+#include <kcolorbutton.h>
+#include <kpopupmenu.h>
+#include <qslider.h>
+#include <qcursor.h>
+#include <qtimer.h>
+#include <qtooltip.h>
+#include <qlabel.h>
+
+#include <kprocess.h>
+#include <kstandarddirs.h>
+#include <qclipboard.h>
+#include <kled.h>
+
+extern "C"
+{
+ KDE_EXPORT KPanelApplet* init( QWidget *parent, const QString& configFile ) {
+ KGlobal::locale()->insertCatalogue( "kbinaryclock");
+ return new KBinaryClock( configFile, KPanelApplet::Normal,
+ KPanelApplet::Preferences, parent, "kbinaryclock");
+ }
+}
+
+KConfigDialogImp::KConfigDialogImp( QWidget *parent, const char *name, KConfigSkeleton *prefs, KDialogBase::DialogType dialogType, KDialogBase::ButtonCode defaultButton, bool modal) :
+ KConfigDialog(parent, name, prefs, dialogType,(KDialogBase::ButtonCode) (KDialogBase::Default | KDialogBase::Ok | KDialogBase::Apply | KDialogBase::Cancel ), defaultButton, modal)
+{
+ // As a temporary mesure until the kicker applet's app name is set to the
+ // applets name so KDialogBase gets the right info.
+ setPlainCaption(i18n("Configure - KBinaryClock"));
+ setIcon(SmallIcon("date"));
+
+ settings = new SettingsImp(0, "General");
+ addPage(settings, i18n("General"), "package_settings");
+ connect(this, SIGNAL(widgetModified()), settings, SLOT(updatePreview()));
+}
+
+SettingsImp::SettingsImp(QWidget* parent, const char* name, WFlags fl): Settings(parent, name, fl){
+}
+
+/**
+ * Update the preview
+ */
+void SettingsImp::updatePreview(){
+ int shape = Shape_Circular->isChecked() ? Prefs::EnumShape::Circular : Prefs::EnumShape::Rectangular;
+ int look = KLed::Raised;
+ look = Look_Flat->isChecked() ? Prefs::EnumLook::Flat : look;
+ look = Look_Sunken->isChecked() ? Prefs::EnumLook::Sunken : look;
+ QColor color = kcfg_Color->color();
+ int darkFactor = kcfg_DarkFactor->value();
+ QColor backgroundColor = kcfg_Background->color();
+ frame1->setBackgroundColor(backgroundColor);
+
+ kLed1->setBackgroundColor(backgroundColor);
+ kLed2->setBackgroundColor(backgroundColor);
+ kLed3->setBackgroundColor(backgroundColor);
+ kLed4->setBackgroundColor(backgroundColor);
+ kLed5->setBackgroundColor(backgroundColor);
+ kLed6->setBackgroundColor(backgroundColor);
+
+ kLed1->setShape((KLed::Shape)shape);
+ kLed2->setShape((KLed::Shape)shape);
+ kLed3->setShape((KLed::Shape)shape);
+ kLed4->setShape((KLed::Shape)shape);
+ kLed5->setShape((KLed::Shape)shape);
+ kLed6->setShape((KLed::Shape)shape);
+
+ kLed1->setColor(color);
+ kLed2->setColor(color);
+ kLed3->setColor(color);
+ kLed4->setColor(color);
+ kLed5->setColor(color);
+ kLed6->setColor(color);
+
+ kLed1->setLook((KLed::Look)look);
+ kLed2->setLook((KLed::Look)look);
+ kLed3->setLook((KLed::Look)look);
+ kLed4->setLook((KLed::Look)look);
+ kLed5->setLook((KLed::Look)look);
+ kLed6->setLook((KLed::Look)look);
+
+ kLed1->setDarkFactor(darkFactor);
+ kLed2->setDarkFactor(darkFactor);
+ kLed3->setDarkFactor(darkFactor);
+ kLed4->setDarkFactor(darkFactor);
+ kLed5->setDarkFactor(darkFactor);
+ kLed6->setDarkFactor(darkFactor);
+}
+
+/**
+ * Constructor, create LED's
+ */
+KBinaryClock::KBinaryClock(const QString& configFile, Type type, int actions, QWidget *parent, const char *name)
+ : KPanelApplet(configFile, type, actions, parent, name), ledWidth(6),
+ _calendar(NULL), _disableCalendar(false),
+ prefs( new Prefs(sharedConfig())), m_tooltip(this)
+{
+ prefs->readConfig();
+ setBackgroundOrigin(AncestorOrigin);
+ for(int i=0; i < 4; i++){
+ for(int j=0; j < ledWidth;j++){
+ KLed *led = new KLed( this );
+ led->setBackgroundOrigin(AncestorOrigin);
+ ledMatrix[j][i] = led;
+ }
+ }
+
+ // Why does kicker start out with a size of 800x409?
+ // Kicker bug?
+ resize(60,42);
+
+ updateClock();
+ loadSettings();
+ QTimer *timer=new QTimer(this);
+ connect (timer, SIGNAL (timeout()), this, SLOT (updateClock()));
+ timer->start(500,false);
+}
+
+KBinaryClock::~KBinaryClock()
+{
+ delete prefs;
+ KGlobal::locale()->removeCatalogue( "kbinaryclock");
+}
+
+/**
+ * Return the computed height of the widget.
+ */
+int KBinaryClock::widthForHeight( int height ) const {
+ return (height-2)/4*ledWidth;
+}
+
+/**
+ * Return the computed width of the widget.
+ */
+int KBinaryClock::heightForWidth( int width ) const {
+ return (width/ledWidth)*4;
+}
+
+void KBinaryClock::resizeEvent( QResizeEvent *e ) {
+ int width = e->size().width();
+ for (int i=0; i < ledWidth; i++)
+ for (int j=0; j < 4; j++)
+ ledMatrix[i][j]->setGeometry( QRect( (width/ledWidth)*i, (width/ledWidth)*j, width/ledWidth, width/ledWidth) );
+}
+
+/**
+ * Load the settings for the clock.
+ */
+void KBinaryClock::loadSettings(){
+ int shape = prefs->shape();
+ int look = prefs->look();
+ QColor color = prefs->color();
+
+ int darkFactor = prefs->darkFactor();
+ QColor backgroundColor = prefs->background();
+ bool modifyBackground = false;
+ if(backgroundColor != KApplication::palette().active().background()){
+ setPaletteBackgroundColor(backgroundColor);
+ modifyBackground = true;
+ }
+
+ bool showSeconds = prefs->show_Seconds();
+ ledWidth = (showSeconds == true) ? 6 : 4;
+ for(int i=0; i < 4; i++){
+ for(int j=4; j < 6;j++){
+ if(showSeconds)
+ ledMatrix[j][i]->show();
+ else
+ ledMatrix[j][i]->hide();
+ }
+ }
+ for(int i=0; i < 4; i++){
+ for(int j=0; j < ledWidth;j++){
+ ledMatrix[j][i]->setShape((KLed::Shape)shape);
+ ledMatrix[j][i]->setColor(color);
+ ledMatrix[j][i]->setLook((KLed::Look)look);
+ ledMatrix[j][i]->setDarkFactor(darkFactor);
+ // Dammed if you do, dammed if you don't
+ if(modifyBackground || ledMatrix[j][i]->backgroundColor() != backgroundColor)
+ ledMatrix[j][i]->setPaletteBackgroundColor(backgroundColor);
+ }
+ }
+ updateLayout();
+}
+
+/**
+ * Show Settings dialog.
+ */
+void KBinaryClock::preferences(){
+ if(KConfigDialog::showDialog("settings"))
+ return;
+
+ KConfigDialogImp *dialog = new KConfigDialogImp(this, "settings", prefs, KDialogBase::Swallow);
+ connect(dialog, SIGNAL(settingsChanged()), this, SLOT(loadSettings()));
+ dialog->show();
+ dialog->settings->updatePreview();
+}
+
+/**
+ * Get the time and update the LED's
+ */
+void KBinaryClock::updateClock(){
+ QString time = "hhmmss";
+ if(KGlobal::locale()->use12Clock())
+ time += "ap";
+
+ QString currentTime = (QTime::currentTime()).toString(time);
+ int splice[6];
+ splice[0] = currentTime.mid( 0, 1 ).toInt();
+ splice[1] = currentTime.mid( 1, 1 ).toInt();
+ splice[2] = currentTime.mid( 2, 1 ).toInt();
+ splice[3] = currentTime.mid( 3, 1 ).toInt();
+ splice[4] = currentTime.mid( 4, 1 ).toInt();
+ splice[5] = currentTime.mid( 5, 1 ).toInt();
+
+ for (int i=0; i<ledWidth; i++) {
+ (splice[i] & 8) != 0 ? ledMatrix[i][0]->setState(KLed::On) : ledMatrix[i][0]->setState(KLed::Off);
+ (splice[i] & 4) != 0 ? ledMatrix[i][1]->setState(KLed::On) : ledMatrix[i][1]->setState(KLed::Off);
+ (splice[i] & 2) != 0 ? ledMatrix[i][2]->setState(KLed::On) : ledMatrix[i][2]->setState(KLed::Off);
+ (splice[i] & 1) != 0 ? ledMatrix[i][3]->setState(KLed::On) : ledMatrix[i][3]->setState(KLed::Off);
+ }
+
+ // TODO add hide_Off_Leds checkbox to ui file post 3.3
+ // sense we can't add strings.
+ if(prefs->hide_Off_Leds())
+ for (int i=0; i<ledWidth; i++) {
+ for( int j=0; j < 4;j++){
+ if(ledMatrix[i][j]->state() == KLed::Off)
+ ledMatrix[i][j]->hide();
+ else
+ ledMatrix[i][j]->show();
+ }
+ }
+}
+
+/**
+ * Catch the right click press
+ */
+ void KBinaryClock::mousePressEvent(QMouseEvent *event) {
+ switch (event->button()) {
+ case QMouseEvent::RightButton:
+ QToolTip::remove(this);
+ openContextMenu();
+ break;
+ case QMouseEvent::LeftButton:
+ toggleCalendar();
+ QToolTip::remove(this);
+ break;
+ case QMouseEvent::MidButton:
+ QToolTip::remove(this);
+ break;
+ default:
+ break;
+ }
+}
+
+/**
+ * Deal with right click's
+ */
+void KBinaryClock::openContextMenu() {
+ bool bImmutable = config()->isImmutable();
+
+ KPopupMenu *menu = new KPopupMenu();
+ menu->insertTitle( SmallIcon( "clock" ), i18n( "KBinaryClock" ) );
+
+ KLocale *loc = KGlobal::locale();
+ QDateTime dt = QDateTime::currentDateTime();
+
+ KPopupMenu *copyMenu = new KPopupMenu( menu );
+ copyMenu->insertItem(loc->formatDateTime(dt), 201);
+ copyMenu->insertItem(loc->formatDate(dt.date()), 202);
+ copyMenu->insertItem(loc->formatDate(dt.date(), true), 203);
+ copyMenu->insertItem(loc->formatTime(dt.time()), 204);
+ copyMenu->insertItem(loc->formatTime(dt.time(), true), 205);
+ copyMenu->insertItem(dt.date().toString(), 206);
+ copyMenu->insertItem(dt.time().toString(), 207);
+ copyMenu->insertItem(dt.toString(), 208);
+ connect( copyMenu, SIGNAL( activated(int) ), this, SLOT( slotCopyMenuActivated(int) ) );
+
+ if (!bImmutable)
+ {
+ if (kapp->authorize("user/root"))
+ {
+ menu->insertItem(SmallIcon("date"), i18n("&Adjust Date && Time..."), 103, 4);
+ }
+ menu->insertItem(SmallIcon("kcontrol"), i18n("Date && Time &Format..."), 104, 5);
+ }
+
+ menu->insertItem(SmallIcon("editcopy"), i18n("C&opy to Clipboard"), copyMenu, 105, 6);
+ if (!bImmutable)
+ {
+ menu->insertSeparator(7);
+ menu->insertItem(SmallIcon("configure"), i18n("&Configure KBinaryClock..."), 102, 8);
+ }
+ int result = menu->exec( QCursor::pos() );
+
+ KProcess proc;
+ switch (result) {
+ case 102:
+ preferences();
+ break;
+ case 103:
+ proc << locate("exe", "kdesu");
+ proc << "--nonewdcop";
+ proc << QString("%1 clock --lang %2")
+ .arg(locate("exe", "kcmshell"))
+ .arg(KGlobal::locale()->language());
+ proc.start(KProcess::DontCare);
+ break;
+ case 104:
+ proc << locate("exe", "kcmshell");
+ proc << "language";
+ proc.start(KProcess::DontCare);
+ break;
+ case 110:
+ preferences();
+ break;
+ } /* switch() */
+ delete menu;
+}
+
+void KBinaryClock::slotCopyMenuActivated( int id ) {
+ QPopupMenu *m = (QPopupMenu *) sender();
+ QString s = m->text(id);
+ QApplication::clipboard()->setText(s);
+}
+
+void KBinaryClock::toggleCalendar()
+{
+ if (_calendar && !_disableCalendar) {
+ // calls slotCalendarDeleted which does the cleanup for us
+ _calendar->close();
+ return;
+ }
+ if (_calendar || _disableCalendar){
+ return;
+ }
+ _calendar = new DatePicker(this, QDateTime::currentDateTime().date());
+ connect( _calendar, SIGNAL( destroyed() ), SLOT( slotCalendarDeleted() ));
+
+ // some extra spacing is included if aligned on a desktop edge
+ QPoint c = mapToGlobal(QPoint(0,0));
+
+ int w = _calendar->sizeHint().width() + 28;
+ // Added 28 px. to size poperly as said in API
+ int h = _calendar->sizeHint().height();
+
+ switch (position()) {
+ case KPanelApplet::pLeft: c.setX(c.x()+width()+2); break;
+ case KPanelApplet::pRight: c.setX(c.x()-w-2); break;
+ case KPanelApplet::pTop: c.setY(c.y()+height()+2); break;
+ case KPanelApplet::pBottom: c.setY(c.y()-h-2); break;
+ }
+
+ // make calendar fully visible
+ QRect deskR = KGlobalSettings::desktopGeometry(QPoint(0,0));
+
+ if (c.y()+h > deskR.bottom()) c.setY(deskR.bottom()-h-1);
+ if (c.x()+w > deskR.right()) c.setX(deskR.right()-w-1);
+
+ _calendar->move(c);
+ _calendar->show();
+}
+
+void KBinaryClock::slotCalendarDeleted()
+{
+ _calendar = 0L;
+ // don't reopen the calendar immediately ...
+ _disableCalendar = true;
+ QTimer::singleShot(100, this, SLOT(slotEnableCalendar()));
+}
+
+void KBinaryClock::slotEnableCalendar()
+{
+ _disableCalendar = false;
+}
+
+ClockAppletToolTip::ClockAppletToolTip( KBinaryClock *clock ) : QToolTip( clock ), m_clock( clock ) {}
+
+void ClockAppletToolTip::maybeTip( const QPoint & /*point*/ )
+{
+ tip(m_clock->geometry(), KGlobal::locale()->formatDate(QDateTime::currentDateTime().date(), false));
+}
+
+#include "kbinaryclock.moc"
diff --git a/kicker-applets/kbinaryclock/kbinaryclock.desktop b/kicker-applets/kbinaryclock/kbinaryclock.desktop
new file mode 100644
index 0000000..962d48e
--- /dev/null
+++ b/kicker-applets/kbinaryclock/kbinaryclock.desktop
@@ -0,0 +1,108 @@
+[Desktop Entry]
+Type=Plugin
+Name=Binary Clock
+Name[bg]=Двоичен часовник
+Name[br]=Eurier binarel
+Name[ca]=Rellotge binari
+Name[cs]=Binární hodiny
+Name[cy]=Cloc Deuaidd
+Name[da]=Binært ur
+Name[de]=Binäruhr
+Name[el]=Δυαδικό ρολόι
+Name[eo]=Duuma horloĝo
+Name[es]=Reloj binario
+Name[et]=Binaarkell
+Name[eu]=Erloju bitarra
+Name[fa]=ساعت دودویی
+Name[fi]=Binäärikello
+Name[fr]=Horloge binaire
+Name[fy]=Binêre klok
+Name[ga]=Clog Dénártha
+Name[gl]=Relóxio Binário
+Name[he]=שעון בינרי
+Name[hi]=बाइनरी क्लॉक
+Name[hr]=Binarni sat
+Name[hu]=KBinaryClock
+Name[is]=Tvíundarklukka
+Name[it]=Orologio binario
+Name[ja]=バイナリ時計
+Name[ka]=ორობითი საათი
+Name[kk]=Бинарлы сағат
+Name[km]=នាឡិកា​គោលពីរ
+Name[lt]=Skaitmeninis laikrodis
+Name[mk]=Бинарен часовник
+Name[ms]=Jam Binari
+Name[nb]=Binærklokke
+Name[nds]=Bineerklock
+Name[ne]=बाइनरि घडी
+Name[nl]=Binaire klok
+Name[nn]=Binærklokke
+Name[pa]=ਬਾਈਨਰੀ ਘੜੀ
+Name[pl]=Zegar binarny
+Name[pt]=Relógio Binário
+Name[pt_BR]=Relógio Binário
+Name[ru]=Двоичные часы
+Name[sk]=Binárne hodiny
+Name[sl]=Dvojiška ura
+Name[sr]=Бинарни часовник
+Name[sr@Latn]=Binarni časovnik
+Name[sv]=Binärklocka
+Name[ta]=இருநிலை கடிகாரம்
+Name[tr]=İkili Saat
+Name[uk]=KBinaryClock
+Name[uz]=Binar soat
+Name[uz@cyrillic]=Бинар соат
+Name[vi]=Đồng hồ nhị phân
+Name[zh_CN]=二进制时钟
+Name[zh_TW]=二位元鐘
+Comment=Shows the time in binary format
+Comment[bg]=Показване на времето в двоичен формат
+Comment[ca]=Mostra l'hora en format binari
+Comment[cs]=Zobrazuje čas v binárním tvaru
+Comment[da]=Viser tiden i binært format
+Comment[de]=Zeigt die Zeit in binärem Format
+Comment[el]=Εμφάνιση του χρόνου σε δυαδική μορφή
+Comment[eo]=Montras la tempon per duuma formato
+Comment[es]=Muestra la hora en formato binario
+Comment[et]=Näitab aega binaarkujul
+Comment[eu]=Erakutsi ordua formatu bitarrean
+Comment[fa]=فقره‌ها را در قالب دودویی نمایش می‌دهد
+Comment[fi]=Näyttää ajan binäärimuodossa
+Comment[fr]=Affiche l'heure en binaire
+Comment[fy]=Toant de tiid yn in binêr formaat
+Comment[ga]=Taispeáin an t-am i bhformáid dhénártha
+Comment[gl]=Mostra a hora en formato binário
+Comment[hr]=Prikaz vremena u binarnom obliku
+Comment[hu]=Bináris formátumban jeleníti meg az időt
+Comment[is]=Sýnir tímann í tvíunarsniði
+Comment[it]=Mostra il tempo in formato binario
+Comment[ja]=時刻をバイナリ形式で表示します
+Comment[ka]=დროს ორობით ფორმატში აჩვენებს
+Comment[kk]=Уақытты бинарлы пішімінде көрсету
+Comment[km]=បង្ហាញ​ម៉ោង​ជា​​ទ្រង់ទ្រាយ​គោលពីរ
+Comment[lt]=Rodo laiką skaitmeniniu formatu
+Comment[mk]=Го прикажува времето во бинарен формат
+Comment[nb]=Viser klokkeslett i binært format
+Comment[nds]=Wiest de Tiet in bineer Formaat
+Comment[ne]=बाइनरि ढाँचामा समय देखाउछ
+Comment[nl]=Toont de tijd in een binair formaat
+Comment[nn]=Viser tida i binærformat
+Comment[pl]=Pokazuje czas w postaci binarnej
+Comment[pt]=Mostra a hora em formato binário
+Comment[pt_BR]=Mostra a hora em formato binário
+Comment[ru]=Показ времени в двоичном формате
+Comment[sk]=Zobrazí čas v binárnom formáte
+Comment[sl]=Prikazuje čas v dvojiški obliki
+Comment[sr]=Приказује време у бинарном формату
+Comment[sr@Latn]=Prikazuje vreme u binarnom formatu
+Comment[sv]=Visar tiden med binärformat
+Comment[tr]=Zamanı ikili biçemde gösterir
+Comment[uk]=Показує час в двійковому форматі
+Comment[uz]=Vaqtni ikkili sanoq tizimida koʻrsatish
+Comment[uz@cyrillic]=Вақтни иккили саноқ тизимида кўрсатиш
+Comment[vi]=Hiển thị giờ định dạng nhị phân
+Comment[zh_CN]=以二进制格式显示时间
+Comment[zh_TW]=以二進位格式顯示時間
+Icon=kbinaryclock
+X-KDE-Library=kbinaryclock_panelapplet
+X-KDE-UniqueApplet = false
diff --git a/kicker-applets/kbinaryclock/kbinaryclock.h b/kicker-applets/kbinaryclock/kbinaryclock.h
new file mode 100644
index 0000000..9edf51d
--- /dev/null
+++ b/kicker-applets/kbinaryclock/kbinaryclock.h
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2003 Benjamin C Meyer (ben+kbinaryclock@meyerhome.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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 the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+#ifndef KBINARYCLOCK_H
+#define KBINARYCLOCK_H
+
+#include <kpanelapplet.h>
+#include <qevent.h>
+#include <kglobal.h>
+#include <kaboutdata.h>
+#include <qdatetime.h>
+#include <qtooltip.h>
+#include <kconfigdialog.h>
+
+#include "settings.h"
+#include "prefs.h"
+
+class KLed;
+class QGridLayout;
+class DatePicker;
+class QGridLayout;
+class KBinaryClock;
+
+class SettingsImp : public Settings {
+ Q_OBJECT
+public:
+ SettingsImp(QWidget* parent=0,
+ const char* name=0,
+ WFlags fl=0);
+public slots:
+ void updatePreview();
+
+};
+
+class KConfigDialogImp : public KConfigDialog {
+public:
+ KConfigDialogImp(QWidget *parent, const char *name,
+ KConfigSkeleton *prefs,
+ KDialogBase::DialogType dialogType = KDialogBase::IconList,
+ KDialogBase::ButtonCode defaultButton = Ok,
+ bool modal=false);
+ SettingsImp *settings;
+};
+
+class ClockAppletToolTip : public QToolTip
+{
+ public:
+ ClockAppletToolTip( KBinaryClock* clock );
+
+ protected:
+ virtual void maybeTip( const QPoint & );
+
+ private:
+ KBinaryClock *m_clock;
+};
+
+class KBinaryClock : public KPanelApplet {
+ Q_OBJECT
+public:
+ KBinaryClock(const QString& configFile, Type t = Normal, int actions = 0, QWidget *parent = 0, const char *name = 0);
+ ~KBinaryClock();
+
+ virtual int widthForHeight (int height) const;
+ virtual int heightForWidth (int width) const;
+
+protected:
+ virtual void resizeEvent(QResizeEvent *event);
+ virtual void mousePressEvent(QMouseEvent *event);
+
+protected slots:
+ void preferences();
+ void updateClock();
+ void loadSettings();
+ void slotCopyMenuActivated(int);
+ void slotCalendarDeleted();
+ void slotEnableCalendar();
+
+private:
+ void openContextMenu();
+ void toggleCalendar();
+ KLed *ledMatrix[6][4];
+ int ledWidth;
+ DatePicker *_calendar;
+ bool _disableCalendar;
+ Prefs *prefs;
+ ClockAppletToolTip m_tooltip;
+};
+
+#endif // KBINARYCLOCK_H
+
diff --git a/kicker-applets/kbinaryclock/kbinaryclock.kcfg b/kicker-applets/kbinaryclock/kbinaryclock.kcfg
new file mode 100644
index 0000000..b5a5fb3
--- /dev/null
+++ b/kicker-applets/kbinaryclock/kbinaryclock.kcfg
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+ <include>kapplication.h</include>
+ <kcfgfile arg="true"/>
+ <group name="General">
+ <entry name="Shape" type="Enum">
+ <label>Shape of the LEDs</label>
+ <choices>
+ <choice name="Rectangular"/>
+ <choice name="Circular"/>
+ </choices>
+ <default>Circular</default>
+ </entry>
+ <entry name="Look" type="Enum">
+ <label>Look</label>
+ <choices>
+ <choice name="Flat"/>
+ <choice name="Raised"/>
+ <choice name="Sunken"/>
+ </choices>
+ <default>Raised</default>
+ </entry>
+ <entry name="Color" type="Color">
+ <label>Color of the LEDs</label>
+ <default>55,49,238</default>
+ </entry>
+ <entry name="DarkFactor" type="Int">
+ <label>Darkness of disabled LEDs</label>
+ <default>300</default>
+ <min>0</min>
+ <max>1000</max>
+ </entry>
+ <entry name="Background" type="Color">
+ <label>Background color</label>
+ <default code="true">KApplication::palette().active().background()</default>
+ </entry>
+ <entry name="Show_Seconds" type="Bool">
+ <label>Whether to show seconds</label>
+ <default>true</default>
+ </entry>
+ <entry name="Hide_Off_Leds" type="Bool">
+ <label>Whether to show LEDs that are off</label>
+ <default>false</default>
+ </entry>
+ </group>
+</kcfg>
diff --git a/kicker-applets/kbinaryclock/prefs.kcfgc b/kicker-applets/kbinaryclock/prefs.kcfgc
new file mode 100644
index 0000000..7e91072
--- /dev/null
+++ b/kicker-applets/kbinaryclock/prefs.kcfgc
@@ -0,0 +1,7 @@
+# Code generation options for kconfig_compiler
+File=kbinaryclock.kcfg
+#IncludeFiles=defines.h
+ClassName=Prefs
+Singleton=false
+#CustomAdditions=true
+#Mutators=Zoom
diff --git a/kicker-applets/kbinaryclock/settings.ui b/kicker-applets/kbinaryclock/settings.ui
new file mode 100644
index 0000000..43462af
--- /dev/null
+++ b/kicker-applets/kbinaryclock/settings.ui
@@ -0,0 +1,483 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>Settings</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Settings</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>452</width>
+ <height>247</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>groupBox6</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>GroupBoxPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="title">
+ <string>Disabled LED</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>Light</string>
+ </property>
+ </widget>
+ <widget class="QSlider" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>kcfg_DarkFactor</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="maxValue">
+ <number>1000</number>
+ </property>
+ <property name="lineStep">
+ <number>5</number>
+ </property>
+ <property name="pageStep">
+ <number>10</number>
+ </property>
+ <property name="value">
+ <number>300</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="tickmarks">
+ <enum>NoMarks</enum>
+ </property>
+ <property name="tickInterval">
+ <number>50</number>
+ </property>
+ </widget>
+ <spacer row="1" column="1">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="1" column="2">
+ <property name="name">
+ <cstring>textLabel6</cstring>
+ </property>
+ <property name="text">
+ <string>Dark</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Color</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Background:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>LED:</string>
+ </property>
+ </widget>
+ <widget class="KColorButton" row="0" column="1">
+ <property name="name">
+ <cstring>kcfg_Color</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="KColorButton" row="1" column="1">
+ <property name="name">
+ <cstring>kcfg_Background</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <spacer row="0" column="2" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>16</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QButtonGroup" row="2" column="2">
+ <property name="name">
+ <cstring>kcfg_Shape</cstring>
+ </property>
+ <property name="title">
+ <string>LED Shape</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>Shape_Rectangular</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Rectangular</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>Shape_Circular</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Circular</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QButtonGroup" row="1" column="2">
+ <property name="name">
+ <cstring>kcfg_Look</cstring>
+ </property>
+ <property name="title">
+ <string>LED Look</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>Look_Flat</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Flat</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>Look_Raised</cstring>
+ </property>
+ <property name="text">
+ <string>R&amp;aised</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>Look_Sunken</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Sunken</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="4" rowspan="3" colspan="1">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>preview</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>4</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Preview</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QFrame">
+ <property name="name">
+ <cstring>frame1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>4</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>StyledPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Raised</enum>
+ </property>
+ <property name="lineWidth">
+ <number>1</number>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <widget class="KLed" row="0" column="0">
+ <property name="name">
+ <cstring>kLed1</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="state">
+ <enum>Off</enum>
+ </property>
+ </widget>
+ <widget class="KLed" row="0" column="1">
+ <property name="name">
+ <cstring>kLed2</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ </widget>
+ <widget class="KLed" row="1" column="1">
+ <property name="name">
+ <cstring>kLed4</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ </widget>
+ <widget class="KLed" row="1" column="0">
+ <property name="name">
+ <cstring>kLed3</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="state">
+ <enum>Off</enum>
+ </property>
+ </widget>
+ <widget class="KLed" row="2" column="1">
+ <property name="name">
+ <cstring>kLed6</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="state">
+ <enum>Off</enum>
+ </property>
+ </widget>
+ <widget class="KLed" row="2" column="0">
+ <property name="name">
+ <cstring>kLed5</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>84</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>kcfg_Show_Seconds</cstring>
+ </property>
+ <property name="text">
+ <string>Show seconds</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>kcfg_Hide_Off_Leds</cstring>
+ </property>
+ <property name="text">
+ <string>Hide unlit LEDs</string>
+ </property>
+ </widget>
+ <widget class="Line" row="0" column="3" rowspan="3" colspan="1">
+ <property name="name">
+ <cstring>line1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>VLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kcolorbutton.h</includehint>
+ <includehint>kled.h</includehint>
+</includehints>
+</UI>
diff --git a/kicker-applets/kolourpicker/Makefile.am b/kicker-applets/kolourpicker/Makefile.am
new file mode 100644
index 0000000..8c86635
--- /dev/null
+++ b/kicker-applets/kolourpicker/Makefile.am
@@ -0,0 +1,23 @@
+
+INCLUDES = $(all_includes)
+
+kde_module_LTLIBRARIES = kolourpicker_panelapplet.la
+
+kolourpicker_panelapplet_la_SOURCES = kolourpicker.cpp simplebutton.cpp
+
+noinst_HEADERS = kolourpicker.h
+
+kolourpicker_panelapplet_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+kolourpicker_panelapplet_la_LIBADD = $(LIB_KDEUI)
+
+METASOURCES = AUTO
+
+lnkdir = $(kde_datadir)/kicker/applets
+
+lnk_DATA = kolourpicker.desktop
+
+EXTRA_DIST = $(lnk_DATA)
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/kolourpicker.pot
+
diff --git a/kicker-applets/kolourpicker/TODO b/kicker-applets/kolourpicker/TODO
new file mode 100644
index 0000000..44d9566
--- /dev/null
+++ b/kicker-applets/kolourpicker/TODO
@@ -0,0 +1 @@
+Add a menu item to edit the colour via KColorDialog (wish by Neil Stevens <neil@qualityassistant.com>)
diff --git a/kicker-applets/kolourpicker/kolourpicker.cpp b/kicker-applets/kolourpicker/kolourpicker.cpp
new file mode 100644
index 0000000..98f5302
--- /dev/null
+++ b/kicker-applets/kolourpicker/kolourpicker.cpp
@@ -0,0 +1,382 @@
+/* This file is part of KolourPicker
+ Copyright (c) 2001 Malte Starostik <malte@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+$Id$
+*/
+
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qlayout.h>
+#include <qimage.h>
+#include <qclipboard.h>
+#include <qregexp.h>
+#include <qbitmap.h>
+#include <qpainter.h>
+#include <qtooltip.h>
+#include <qcursor.h>
+
+#include <kglobal.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kinstance.h>
+#include <kconfig.h>
+#include <kaboutdata.h>
+#include <kaboutapplication.h>
+#include <kmessagebox.h>
+#include <kpopupmenu.h>
+
+#include "kolourpicker.h"
+#include "kolourpicker.moc"
+
+#include <X11/Xlib.h>
+
+// Applet initialization function
+extern "C"
+{
+ KDE_EXPORT KPanelApplet* init(QWidget *parent, const QString& configFile)
+ {
+ KGlobal::locale()->insertCatalogue("kolourpicker");
+ return new KolourPicker(configFile, KPanelApplet::Normal,
+ KPanelApplet::About,
+ parent, "kolourpicker");
+ }
+}
+
+KolourPicker::KolourPicker(const QString& configFile, Type type,
+ int actions, QWidget *parent, const char *name)
+ : KPanelApplet(configFile, type, actions, parent, name),
+ m_picking(0)
+{
+ KAboutData *about = new KAboutData("kolourpicker",
+ I18N_NOOP("Color Picker"),
+ "v0.1",
+ I18N_NOOP("An applet to pick color values from anywhere on the screen"),
+ KAboutData::License_GPL_V2,
+ "(c) 2001 Malte Starostik");
+ about->addAuthor("Malte Starostik", I18N_NOOP("Original Author"), "malte@kde.org");
+ m_instance = new KInstance(about);
+
+ KConfig *conf = config();
+ conf->setGroup("General");
+ QStringList history = conf->readListEntry("History");
+ for (QStringList::ConstIterator it = history.begin(); it != history.end(); ++it)
+ m_history.append(QColor(*it));
+
+ setBackgroundOrigin(AncestorOrigin);
+
+ m_colourButton = new SimpleButton(this);
+ m_colourButton->setPixmap(SmallIcon("colorpicker"));
+ m_colourButton->setFixedSize(20, 20);
+ QToolTip::add(m_colourButton, i18n("Pick a color"));
+ connect(m_colourButton, SIGNAL(clicked()), SLOT(slotPick()));
+
+ m_historyButton = new SimpleButton(this);
+ m_historyButton->setFixedSize(20, 20);
+ if (m_history.count())
+ m_historyButton->setPixmap(colorPixmap(m_history.last()));
+ else
+ {
+ m_historyButton->setPixmap(colorPixmap(QColor()));
+ m_historyButton->setEnabled(false);
+ }
+ QToolTip::add(m_historyButton, i18n("History"));
+ connect(m_historyButton, SIGNAL(clicked()), SLOT(slotHistory()));
+}
+
+KolourPicker::~KolourPicker()
+{
+ KGlobal::locale()->removeCatalogue("kolourpicker");
+}
+
+
+int KolourPicker::heightForWidth(int width) const
+{
+ return (width > 40) ? 22 : 44;
+}
+
+int KolourPicker::widthForHeight(int height) const
+{
+ return (height > 40) ? 22 : 44;
+}
+
+void KolourPicker::about()
+{
+ KAboutApplication dlg(m_instance->aboutData());
+ dlg.exec();
+}
+
+void KolourPicker::slotPick()
+{
+ m_picking = true;
+ grabMouse(crossCursor);
+ grabKeyboard();
+}
+
+void KolourPicker::slotHistory()
+{
+ KPopupMenu popup;
+ popup.insertTitle(SmallIcon("colorize"), i18n("History"));
+ QPtrList<QPopupMenu> subMenus;
+ subMenus.setAutoDelete(true);
+ for (QValueList<QColor>::ConstIterator it = m_history.fromLast();
+ it != m_history.end();
+ --it)
+ {
+ QPopupMenu *sub = copyPopup(*it, false);
+ subMenus.append(sub);
+ popup.insertItem(colorPixmap(*it),
+ QString("%1, %2, %3").arg((*it).red()).arg((*it).green()).arg((*it).blue()),
+ sub);
+ }
+ popup.insertSeparator();
+ int clear = popup.insertItem(SmallIcon("history_clear"), i18n("&Clear History"));
+ int id = popup.exec(QCursor::pos());
+ if (id == clear)
+ {
+ m_history.clear();
+ m_historyButton->setEnabled(false);
+ arrangeButtons();
+ KConfig *conf = config();
+ conf->setGroup("General");
+ conf->writeEntry("History", QStringList());
+ conf->sync();
+ }
+ else if (id != -1)
+ setClipboard(popup.findItem(id)->text());
+}
+
+void KolourPicker::mouseReleaseEvent(QMouseEvent *e)
+{
+ if (m_picking)
+ {
+ m_picking = false;
+ releaseMouse();
+ releaseKeyboard();
+ QWidget *desktop = QApplication::desktop();
+ QPixmap pm = QPixmap::grabWindow(desktop->winId(),
+ e->globalPos().x(), e->globalPos().y(), 1, 1);
+ QImage img = pm.convertToImage();
+ QColor color(img.pixel(0, 0));
+
+ // eventually remove a dupe
+ QValueListIterator<QColor> dupe = m_history.find(color);
+ if (dupe != m_history.end())
+ m_history.remove(dupe);
+
+ m_history.append(color);
+ while (m_history.count() >= 10)
+ m_history.remove(m_history.begin());
+ m_historyButton->setEnabled(true);
+ arrangeButtons();
+ QStringList history;
+ for (QValueList<QColor>::ConstIterator it = m_history.begin();
+ it != m_history.end();
+ ++it)
+ {
+ history.append((*it).name());
+ }
+ KConfig *conf = config();
+ conf->setGroup("General");
+ conf->writeEntry("History", history);
+ conf->sync();
+ m_historyButton->setPixmap(colorPixmap(color));
+ QPopupMenu *popup = copyPopup(color, true);
+ int id = popup->exec(e->globalPos());
+ if (id != -1)
+ setClipboard( popup->findItem(id)->text() );
+ delete popup;
+ }
+ else
+ KPanelApplet::mouseReleaseEvent(e);
+}
+
+// set both clipboard and selection
+void KolourPicker::setClipboard(const QString& text)
+{
+ QClipboard *clip = QApplication::clipboard();
+ bool oldMode = clip->selectionModeEnabled();
+ clip->setSelectionMode(true);
+ clip->setText(text);
+ clip->setSelectionMode(false);
+ clip->setText(text);
+ clip->setSelectionMode( oldMode );
+}
+
+void KolourPicker::keyPressEvent(QKeyEvent *e)
+{
+ if (m_picking)
+ {
+ if (e->key() == Key_Escape)
+ {
+ m_picking = false;
+ releaseMouse();
+ releaseKeyboard();
+ }
+ e->accept();
+ return;
+ }
+ KPanelApplet::keyPressEvent(e);
+}
+
+void KolourPicker::resizeEvent(QResizeEvent *)
+{
+ arrangeButtons();
+}
+
+void KolourPicker::arrangeButtons()
+{
+ int h, w, p;
+
+ if (orientation() == Horizontal)
+ {
+ h = height();
+ if (h > 40)
+ {
+ // vertical layout
+ p = (h - 40)/3;
+ m_colourButton->setGeometry(2, p, 20, 20);
+ m_historyButton->setGeometry(2, 2*p+20, 20, 20);
+ }
+ else
+ {
+ // horizontal layout
+ p = (h - 20)/2;
+ m_colourButton->setGeometry(2, p, 20, 20);
+ m_historyButton->setGeometry(24, p, 20, 20);
+ }
+ }
+ else
+ {
+ w = width();
+ if (w > 40)
+ {
+ // horizontal layout
+ p = (w - 40)/3;
+ m_colourButton->setGeometry(p, 2, 20, 20);
+ m_historyButton->setGeometry(2*p+20, 2, 20, 20);
+ }
+ else
+ {
+ // vertical layout
+ p = (w - 20)/2;
+ m_colourButton->setGeometry(p, 2, 20, 20);
+ m_historyButton->setGeometry(p, 24, 20, 20);
+ }
+ }
+
+ updateGeometry();
+}
+
+QPopupMenu *KolourPicker::copyPopup(const QColor &c, bool title) const
+{
+ KPopupMenu *popup = new KPopupMenu;
+ if (title)
+ popup->insertTitle(colorPixmap(c), i18n("Copy Color Value"));
+ QString value;
+ // r, g, b
+ value.sprintf("%u, %u, %u", c.red(), c.green(), c.blue());
+ popup->insertItem(SmallIcon("text"), value);
+ // HTML, lower case hex chars
+ value.sprintf("#%.2x%.2x%.2x", c.red(), c.green(), c.blue());
+ popup->insertItem(SmallIcon("html"), value);
+ if (value.find(QRegExp("[a-f]")) >= 0)
+ {
+ // HTML, upper case hex chars
+ value.sprintf("#%.2X%.2X%.2X", c.red(), c.green(), c.blue());
+ popup->insertItem(SmallIcon("html"), value);
+ }
+ // lower case hex chars
+ value.sprintf( "%.2x%.2x%.2x", c.red(), c.green(), c.blue() );
+ popup->insertItem( SmallIcon( "html" ), value );
+ if ( value.find( QRegExp( "[a-f]" ) ) >= 0 )
+ {
+ // upper case hex chars
+ value.sprintf( "%.2X%.2X%.2X", c.red(), c.green(), c.blue() );
+ popup->insertItem( SmallIcon( "html" ), value );
+ }
+ // Color name
+ QStringList names = colorNames(c.red(), c.green(), c.blue());
+ for (QStringList::ConstIterator it = names.begin(); it != names.end(); ++it)
+ popup->insertItem(SmallIcon("text"), *it);
+ return popup;
+}
+
+#define AAFACTOR 4
+
+QPixmap KolourPicker::colorPixmap(const QColor &c) const
+{
+ int x, y, dx, dy, d;
+
+ QImage img(16 * AAFACTOR, 16 * AAFACTOR, 32);
+ img.setAlphaBuffer(true);
+ img.fill(0);
+
+ for (x = 0; x < img.width(); x++)
+ for (y = 0; y < img.height(); y++)
+ {
+ dx = 1 + x - 15 * AAFACTOR / 2;
+ dy = 1 + y - 15 * AAFACTOR / 2;
+ d = dx * dx + dy * dy;
+
+ if (d < (36 * AAFACTOR * AAFACTOR))
+ img.setPixel(x, y, c.pixel());
+ else if (d < (56.25 * AAFACTOR * AAFACTOR))
+ img.setPixel(x, y, qRgba(128, 128, 128, 255));
+ }
+
+ QBitmap mask(16, 16);
+ mask.fill(Qt::color0);
+ QPainter p(&mask);
+ p.setPen(Qt::NoPen);
+ p.setBrush(Qt::color1);
+ p.drawEllipse(0, 0, 15, 15);
+ p.end();
+
+ QPixmap pm = QPixmap(img.smoothScale(16, 16));
+ pm.setMask(mask);
+
+ return pm;
+}
+
+const QStringList &KolourPicker::colorNames(int r, int g, int b) const
+{
+ static QStringList NullList;
+ if (m_colorNames.isEmpty())
+ {
+ QFile f("/usr/lib/X11/rgb.txt");
+ if (!f.open(IO_ReadOnly))
+ return NullList;
+ QTextStream str(&f);
+ QString red, green, blue;
+ while (!str.atEnd())
+ {
+ str >> red;
+ if (red.simplifyWhiteSpace()[0].latin1() == '!')
+ {
+ str.readLine();
+ continue;
+ }
+ str >> green >> blue;
+ const_cast<KolourPicker *>(this)->m_colorNames[(red.toInt() << 16) + (green.toInt() << 8) + blue.toInt()]
+ .append(str.readLine().simplifyWhiteSpace());
+ }
+ }
+ return m_colorNames[(r << 16) + (g << 8) + b];
+}
+
+// vim: ts=4 sw=4 noet
diff --git a/kicker-applets/kolourpicker/kolourpicker.desktop b/kicker-applets/kolourpicker/kolourpicker.desktop
new file mode 100644
index 0000000..34f13d0
--- /dev/null
+++ b/kicker-applets/kolourpicker/kolourpicker.desktop
@@ -0,0 +1,145 @@
+[Desktop Entry]
+Type=Plugin
+Name=Color Picker
+Name[af]=Kleur Kieser
+Name[ar]=أداة اختيار الألوان
+Name[az]=Rəng Alıcısı
+Name[bg]=Избор на цвят
+Name[br]=Dibaber al liv
+Name[bs]=Izbornik boja
+Name[ca]=Selector de colors
+Name[cs]=Výběr barev
+Name[cy]=Dewisydd Lliw
+Name[da]=Farveplukker
+Name[de]=Farbauswahl
+Name[el]=Επιλογή χρωμάτων
+Name[en_GB]=Colour Picker
+Name[eo]=Kolorelektilo
+Name[es]=Selector de color
+Name[et]=Värvide valimine
+Name[eu]=Kolore hautagailua
+Name[fa]=برگزینندۀ رنگ
+Name[fi]=Värivalitsin
+Name[fo]=Litveljari
+Name[fr]=Pipette
+Name[fy]=Kleurekiezer
+Name[gl]=Escolla de Cores
+Name[he]=בוחר צבעים
+Name[hi]=रंग चयनक
+Name[hr]=Birač boja
+Name[hu]=Színválasztó
+Name[is]=Litaval
+Name[it]=Scelta colore
+Name[ja]=色の抽出
+Name[ka]=ფერთა ამღები
+Name[kk]=Түсті шұқып алу
+Name[km]=កម្មវិធី​រើស​ពណ៌
+Name[ko]=색 고르기
+Name[lt]=Spalvų rinkėjas
+Name[lv]=Krāsu Lasītājs
+Name[mk]=Бирач на бои
+Name[ms]=Pengutip Warna
+Name[mt]=Agħżel kulur
+Name[nb]=Fargevelger
+Name[nds]=Klöörutwahl
+Name[ne]=रङ पिकर
+Name[nl]=Kleurenkiezer
+Name[nn]=Fargeveljar
+Name[pa]=ਰੰਗ ਚੋਣਕਾਰ
+Name[pl]=Wybór koloru
+Name[pt]=Escolha de Cores
+Name[pt_BR]=Seletor de cores
+Name[ro]=Selector de culori
+Name[ru]=Выбор цвета
+Name[sk]=Výber farieb
+Name[sl]=Izbirnik barv
+Name[sr]=Бирач боја
+Name[sr@Latn]=Birač boja
+Name[sv]=Färgväljare
+Name[ta]=வண்ண எடுப்பான்
+Name[tg]=Интихоби рангҳо
+Name[th]=เครื่องมือเลือกสี
+Name[tr]=Renk Seçici
+Name[uk]=Селектор кольорів
+Name[uz]=Rang tanlagich
+Name[uz@cyrillic]=Ранг танлагич
+Name[ven]=Tshidobamuvhala
+Name[vi]=Bộ kén màu
+Name[xh]=Umkhethi Wombala
+Name[zh_CN]=颜色提取程序
+Name[zh_TW]=色彩選擇器
+Name[zu]=Umcoshi Wombala
+Icon=colorpicker
+Comment=Pick colors from anywhere and get their values
+Comment[af]=Kies kleure van orals en kry hulle waardes
+Comment[ar]=اختر الألوان من أي مكان و احصل على قيمتها الرقمية
+Comment[az]=İstədiyiniz yerdən rəng alaraq qiymətlərini öyrənin
+Comment[bg]=Избор на цвят от екрана и получаване на неговата стойност
+Comment[bs]=Izbor boje sa bilo kojeg mjesta i ispis njenih vrijednosti
+Comment[ca]=Selecciona colors des de qualsevol lloc i obté els seus valors
+Comment[cs]=Výběr barev z libovolného místa a získání jejich hodnot
+Comment[cy]=Dewis lliwiau oddiwrth unrhyw man a cael eu gwerthoedd
+Comment[da]=Pluk farver fra et vilkårligt sted og få deres værdier
+Comment[de]=Farben aufnehmen und ihre RGB-Werte ermitteln
+Comment[el]=Επιλέξτε χρώματα από οπουδήποτε και πάρτε τις τιμές τους
+Comment[en_GB]=Pick colours from anywhere and get their values
+Comment[eo]=Elprenas koloron de ie sur la ekrano kaj montras ĝiajn valorojn
+Comment[es]=Selecciona colores desde cualquier sitio y devuelve sus valores
+Comment[et]=Värvide valimine ekraanilt ja nende väärtuste vaatamine
+Comment[eu]=Hautatu koloreak edonondik eta euren balioak eskuratu
+Comment[fa]=رنگها را از هر جایی برگزیده و مقادیر آنها را به دست می‌آورد.
+Comment[fi]=Valitse värejä kaikkialta ja tutki värien arvoja
+Comment[fo]=Vel litir frá skriviborði.
+Comment[fr]=Capture une couleur n'importe où et obtient sa composition
+Comment[fy]=Kies kleuren fan elk willekeurich plak en krij harren wearden
+Comment[ga]=Roghnaigh dath ó áit ar bith agus faigh a luach
+Comment[gl]=Extrai as cores de calquer sítio e obtén os seus valores
+Comment[he]=בחירת צבעים מכל מקום שהוא וקבלת ערכיהם
+Comment[hi]=कहीं से भी रंग चुने तथा उसका मान प्रदर्शित करता है
+Comment[hr]=Odabir boja s bilo kojeg mjesta i iščitavanje njihovih vrijednosti
+Comment[hu]=Színleolvasás a képernyő bármely képpontjáról
+Comment[is]=Velja liti hvaðan sem er af skjánum og fá tölugildi þeirra
+Comment[it]=Scegli un colore da un posto qualsiasi e scopri il suo valore
+Comment[ja]=色を抽出してそれの値を読み込みます
+Comment[ka]=ნებისმიერი ადგილიდან იღებს ფერს, მათი მნიშვნელობის მისაღებად
+Comment[kk]=Кез келген жерден түсті шұқып, параметрлерін алу
+Comment[km]=រើស​ពណ៌​ពី​​កន្លែង​ណាមួយ ​និង​យក​តម្លៃ​របស់​ពួក​វា
+Comment[ko]=어디에 있는 색이든 고를 수 있는 도구
+Comment[lt]=Paima iš bet kur spalvas ir parodo jų reikšmes
+Comment[lv]= Lasa krāsas no jebkurienes un iegūst to vērtības
+Comment[mk]=Избира бои од каде било и ги зема нивните вредности
+Comment[ms]=Memungut warna dari mana-mana dan dapatkan nilainya
+Comment[mt]=Agħżel kulur minn fejn trid u ħu l-valur tiegħu
+Comment[nb]=Plukk opp farger fra hvor som helst og se verdiene deres
+Comment[nds]=Klören jichtenswo utsöken un ehr Weerten faststellen
+Comment[ne]=सबै ठाउको रङ लिनुहोस् र तिनका मान प्राप्त गर्नुहोस्
+Comment[nl]=Kies kleuren van elke willekeurige plek en verkrijg hun waarden
+Comment[nn]=Plukk fargar frå kvar som helst og finn verdien deira
+Comment[pa]=ਕਿਤੋਂ ਵੀ ਰੰਗ ਵੀ ਚੁੱਕੋ ਅਤੇ ਉਹਨਾਂ ਦੇ ਮੁੱਲ ਲਵੋ
+Comment[pl]=Wybierz kolory z dowolnego miejsca i pobierz ich wartości
+Comment[pt]=Extrai as cores de qualquer sítio e obtém os seus valores
+Comment[pt_BR]=Selecione as cores de qualquer lugar e obtenha seus valores
+Comment[ro]=Preia culori de oriunde şi afişează valorile lor
+Comment[ru]=Подбирает цвет из любого места экрана и показывает его значение
+Comment[sk]=Výber farieb z ktoréhokoľvek miesta a získanie ich hodnôt
+Comment[sl]=Pobira barve od vsepovsod in dobiva njihove vrednosti
+Comment[sr]=Узмите узорак боје одакле било и сазнајте њену вредност
+Comment[sr@Latn]=Uzmite uzorak boje odakle bilo i saznajte njenu vrednost
+Comment[sv]=Välj färger var som helst och få deras värden
+Comment[ta]=எங்கிருந்தும் வண்ணங்களைத் எடுத்து அதன் மதிப்புகளை பெறு
+Comment[tg]=Интихоб кардани ранг аз ҳар ҷойи экран ва нишон додани қимати ӯ
+Comment[th]=เลือกสีจากที่ใด ๆ และรับค่าของมัน
+Comment[tr]=Herhangi bir yerden renk seçer ve değerlerini alır
+Comment[uk]=Вибирає кольори будь-звідки та отримує їхні значення
+Comment[uz]=Ekranning istalgan joyidan rang va uning qiymatini olish
+Comment[uz@cyrillic]=Экраннинг исталган жойидан ранг ва унинг қийматини олиш
+Comment[ven]=Zwi doba mivhala hothe na hothe zwa wana kuitele kwazwo
+Comment[vi]=Kén màu từ bất cứ nơi nào và lấy giá trị của nó
+Comment[xh]=Khetha imibala esuka naphi na ze ufumane amaxabiso awo
+Comment[zh_CN]=从任何地方获取颜色值
+Comment[zh_TW]=從點選的地方取得顏色值
+Comment[zu]=Cosha imibala kunoma ikephi kanye namabizo azo ufumane amaxabiso ayo
+X-KDE-Library=kolourpicker_panelapplet
+X-KDE-UniqueApplet=true
+DocPath=kicker-applets/kolourpicker.html
+X-KDE-ParentApp=applets
diff --git a/kicker-applets/kolourpicker/kolourpicker.h b/kicker-applets/kolourpicker/kolourpicker.h
new file mode 100644
index 0000000..0b576e9
--- /dev/null
+++ b/kicker-applets/kolourpicker/kolourpicker.h
@@ -0,0 +1,70 @@
+/* This file is part of Kolourpicker
+ Copyright (c) 2001 Malte Starostik <malte@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+*/
+
+#ifndef _KOLOURPICKER_H_
+#define _KOLOURPICKER_H_
+
+#include <qmap.h>
+#include <qvaluelist.h>
+
+#include <kpanelapplet.h>
+
+#include "simplebutton.h"
+
+class KInstance;
+class QPopupMenu;
+
+class KolourPicker : public KPanelApplet
+{
+ Q_OBJECT
+public:
+ KolourPicker(const QString& configFile, Type t = Normal, int actions = 0,
+ QWidget *parent = 0, const char *name = 0);
+ ~KolourPicker();
+ virtual int heightForWidth(int) const;
+ virtual int widthForHeight(int) const;
+ virtual void about();
+
+protected:
+ virtual void mouseReleaseEvent(QMouseEvent *);
+ virtual void keyPressEvent(QKeyEvent *);
+ virtual void resizeEvent(QResizeEvent*);
+
+private slots:
+ void slotPick();
+ void slotHistory();
+
+private:
+ QPopupMenu *copyPopup(const QColor &, bool title) const;
+ QPixmap colorPixmap(const QColor &) const;
+ const QStringList &colorNames(int r, int g, int b) const;
+ void arrangeButtons();
+ void setClipboard(const QString& text);
+
+ KInstance *m_instance;
+ bool m_picking;
+ SimpleButton *m_historyButton, *m_colourButton;
+ QValueList<QColor> m_history;
+ QMap<int, QStringList> m_colorNames;
+};
+
+#endif
+
+// vim: ts=4 sw=4 noet
diff --git a/kicker-applets/kolourpicker/simplebutton.cpp b/kicker-applets/kolourpicker/simplebutton.cpp
new file mode 100644
index 0000000..9daa926
--- /dev/null
+++ b/kicker-applets/kolourpicker/simplebutton.cpp
@@ -0,0 +1,256 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003-2004 Nadeem Hasan <nhasan@kde.org>
+ Copyright (C) 2004-2005 Aaron J. Seigo <aseigo@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "simplebutton.h"
+
+#include <qpainter.h>
+#include <qstyle.h>
+
+#include <kapplication.h>
+#include <kcursor.h>
+#include <kdialog.h>
+#include <kglobalsettings.h>
+#include <kiconeffect.h>
+#include <kicontheme.h>
+#include <kipc.h>
+#include <kstandarddirs.h>
+
+SimpleButton::SimpleButton(QWidget *parent, const char *name)
+ : QButton(parent, name),
+ m_highlight(false),
+ m_orientation(Qt::Horizontal)
+{
+ setBackgroundOrigin( AncestorOrigin );
+
+ connect( kapp, SIGNAL( settingsChanged( int ) ),
+ SLOT( slotSettingsChanged( int ) ) );
+ connect( kapp, SIGNAL( iconChanged( int ) ),
+ SLOT( slotIconChanged( int ) ) );
+
+ kapp->addKipcEventMask( KIPC::SettingsChanged );
+ kapp->addKipcEventMask( KIPC::IconChanged );
+
+ slotSettingsChanged( KApplication::SETTINGS_MOUSE );
+}
+
+void SimpleButton::setPixmap(const QPixmap &pix)
+{
+ QButton::setPixmap(pix);
+ generateIcons();
+ update();
+}
+
+void SimpleButton::setOrientation(Qt::Orientation orientation)
+{
+ m_orientation = orientation;
+ update();
+}
+
+QSize SimpleButton::sizeHint() const
+{
+ const QPixmap* pm = pixmap();
+
+ if (!pm)
+ return QButton::sizeHint();
+ else
+ return QSize(pm->width() + KDialog::spacingHint(), pm->height() + KDialog::spacingHint());
+}
+
+QSize SimpleButton::minimumSizeHint() const
+{
+ const QPixmap* pm = pixmap();
+
+ if (!pm)
+ return QButton::minimumSizeHint();
+ else
+ return QSize(pm->width(), pm->height());
+}
+
+void SimpleButton::drawButton( QPainter *p )
+{
+ drawButtonLabel(p);
+}
+
+void SimpleButton::drawButtonLabel( QPainter *p )
+{
+ if (!pixmap())
+ {
+ return;
+ }
+
+ QPixmap pix = isEnabled() ? (m_highlight? m_activeIcon : m_normalIcon) : m_disabledIcon;
+
+ if (isOn() || isDown())
+ {
+ pix = pix.convertToImage().smoothScale(pix.width() - 2,
+ pix.height() - 2);
+ }
+
+ int h = height();
+ int w = width();
+ int ph = pix.height();
+ int pw = pix.width();
+ int margin = KDialog::spacingHint();
+ QPoint origin(margin / 2, margin / 2);
+
+ if (ph < (h - margin))
+ {
+ origin.setY((h - ph) / 2);
+ }
+
+ if (pw < (w - margin))
+ {
+ origin.setX((w - pw) / 2);
+ }
+
+ p->drawPixmap(origin, pix);
+}
+
+void SimpleButton::generateIcons()
+{
+ if (!pixmap())
+ {
+ return;
+ }
+
+ QImage image = pixmap()->convertToImage();
+ KIconEffect effect;
+
+ m_normalIcon = effect.apply(image, KIcon::Panel, KIcon::DefaultState);
+ m_activeIcon = effect.apply(image, KIcon::Panel, KIcon::ActiveState);
+ m_disabledIcon = effect.apply(image, KIcon::Panel, KIcon::DisabledState);
+
+ updateGeometry();
+}
+
+void SimpleButton::slotSettingsChanged(int category)
+{
+ if (category != KApplication::SETTINGS_MOUSE)
+ {
+ return;
+ }
+
+ bool changeCursor = KGlobalSettings::changeCursorOverIcon();
+
+ if (changeCursor)
+ {
+ setCursor(KCursor::handCursor());
+ }
+ else
+ {
+ unsetCursor();
+ }
+}
+
+void SimpleButton::slotIconChanged( int group )
+{
+ if (group != KIcon::Panel)
+ {
+ return;
+ }
+
+ generateIcons();
+ update();
+}
+
+void SimpleButton::enterEvent( QEvent *e )
+{
+ m_highlight = true;
+
+ repaint( false );
+ QButton::enterEvent( e );
+}
+
+void SimpleButton::leaveEvent( QEvent *e )
+{
+ m_highlight = false;
+
+ repaint( false );
+ QButton::enterEvent( e );
+}
+
+void SimpleButton::resizeEvent( QResizeEvent * )
+{
+ generateIcons();
+}
+
+
+SimpleArrowButton::SimpleArrowButton(QWidget *parent, Qt::ArrowType arrow, const char *name)
+ : SimpleButton(parent, name)
+{
+ setBackgroundOrigin(AncestorOrigin);
+ _arrow = arrow;
+ _inside = false;
+}
+
+QSize SimpleArrowButton::sizeHint() const
+{
+ return QSize( 12, 12 );
+}
+
+void SimpleArrowButton::setArrowType(Qt::ArrowType a)
+{
+ if (_arrow != a)
+ {
+ _arrow = a;
+ update();
+ }
+}
+
+Qt::ArrowType SimpleArrowButton::arrowType() const
+{
+ return _arrow;
+}
+
+void SimpleArrowButton::drawButton( QPainter *p )
+{
+ QRect r(1, 1, width() - 2, height() - 2);
+
+ QStyle::PrimitiveElement pe = QStyle::PE_ArrowLeft;
+ switch (_arrow)
+ {
+ case Qt::LeftArrow: pe = QStyle::PE_ArrowLeft; break;
+ case Qt::RightArrow: pe = QStyle::PE_ArrowRight; break;
+ case Qt::UpArrow: pe = QStyle::PE_ArrowUp; break;
+ case Qt::DownArrow: pe = QStyle::PE_ArrowDown; break;
+ }
+
+ int flags = QStyle::Style_Default | QStyle::Style_Enabled;
+ if (isDown() || isOn()) flags |= QStyle::Style_Down;
+ style().drawPrimitive(pe, p, r, colorGroup(), flags);
+}
+
+void SimpleArrowButton::enterEvent( QEvent *e )
+{
+ _inside = true;
+ SimpleButton::enterEvent( e );
+ update();
+}
+
+void SimpleArrowButton::leaveEvent( QEvent *e )
+{
+ _inside = false;
+ SimpleButton::enterEvent( e );
+ update();
+}
+
+#include "simplebutton.moc"
+
+// vim:ts=4:sw=4:et
diff --git a/kicker-applets/kolourpicker/simplebutton.h b/kicker-applets/kolourpicker/simplebutton.h
new file mode 100644
index 0000000..5423dff
--- /dev/null
+++ b/kicker-applets/kolourpicker/simplebutton.h
@@ -0,0 +1,89 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003-2004 Nadeem Hasan <nhasan@kde.org>
+ Copyright (C) 2004-2005 Aaron J. Seigo <aseigo@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SIMPLEBUTTON_H
+#define SIMPLEBUTTON_H
+
+#include <qbutton.h>
+#include <qpixmap.h>
+
+#include <kdemacros.h>
+
+class KDE_EXPORT SimpleButton : public QButton
+{
+ Q_OBJECT
+
+ public:
+ SimpleButton(QWidget *parent, const char *name = 0);
+ void setPixmap(const QPixmap &pix);
+ void setOrientation(Qt::Orientation orientaton);
+ QSize sizeHint() const;
+ QSize minimumSizeHint() const;
+
+ protected:
+ void drawButton( QPainter *p );
+ void drawButtonLabel( QPainter *p );
+ void generateIcons();
+
+ void enterEvent( QEvent *e );
+ void leaveEvent( QEvent *e );
+ void resizeEvent( QResizeEvent *e );
+
+ protected slots:
+ virtual void slotSettingsChanged( int category );
+ virtual void slotIconChanged( int group );
+
+ private:
+ bool m_highlight;
+ QPixmap m_normalIcon;
+ QPixmap m_activeIcon;
+ QPixmap m_disabledIcon;
+ Qt::Orientation m_orientation;
+ class SimpleButtonPrivate;
+ SimpleButtonPrivate* d;
+};
+
+class KDE_EXPORT SimpleArrowButton: public SimpleButton
+{
+ Q_OBJECT
+
+ public:
+ SimpleArrowButton(QWidget *parent = 0, Qt::ArrowType arrow = Qt::UpArrow, const char *name = 0);
+ virtual ~SimpleArrowButton() {};
+ QSize sizeHint() const;
+
+ protected:
+ virtual void enterEvent( QEvent *e );
+ virtual void leaveEvent( QEvent *e );
+ virtual void drawButton(QPainter *p);
+ Qt::ArrowType arrowType() const;
+
+ public slots:
+ void setArrowType(Qt::ArrowType a);
+
+ private:
+ Qt::ArrowType _arrow;
+ bool _inside;
+};
+
+
+#endif // HIDEBUTTON_H
+
+// vim:ts=4:sw=4:et
diff --git a/kicker-applets/ktimemon/Makefile.am b/kicker-applets/ktimemon/Makefile.am
new file mode 100644
index 0000000..fee10c7
--- /dev/null
+++ b/kicker-applets/ktimemon/Makefile.am
@@ -0,0 +1,22 @@
+kde_module_LTLIBRARIES = ktimemon_panelapplet.la
+
+ktimemon_panelapplet_la_SOURCES = confdlg.cc sample.cc timemon.cc
+METASOURCES = AUTO
+
+noinst_HEADERS = confdlg.h sample.h timemon.h
+
+INCLUDES= $(all_includes)
+
+ktimemon_panelapplet_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+ktimemon_panelapplet_la_LIBADD = $(LIB_KDEUI) $(LIBKSTAT) $(LIB_KIO)
+
+KDE_ICON = ktimemon
+
+lnk_DATA = ktimemon.desktop
+lnkdir = $(kde_datadir)/kicker/applets
+
+EXTRA_DIST = $(lnk_DATA)
+
+messages:
+ $(XGETTEXT) *.cc -o $(podir)/ktimemon.pot
+
diff --git a/kicker-applets/ktimemon/README b/kicker-applets/ktimemon/README
new file mode 100644
index 0000000..ec8fb3a
--- /dev/null
+++ b/kicker-applets/ktimemon/README
@@ -0,0 +1,65 @@
+
+This is the CVS version of KTimemon. Check out the original authors
+homepage at
+
+http://www.fortunecity.com/victorian/university/394/sw/ktimemon.html
+
+for more information. This version is based (despite the original readme
+below says) on KTimemon 0.3b and modified to compile under KDE 2.0 &
+Qt 2.0 by Dirk A. Mueller <dmuell@gmx.net>.
+
+2006-04-08: version 0.3c, modified to add iowait display
+by Michael Blakeley <mike@blakeley.com>
+
+Credits go to the original author(s) Helmut & Martin Maierhofer for
+writing such a useful tool and allowing me to include it into CVS :-).
+
+Please don't bother them with bugs, problems, etc. you may experience
+with this version. It's likely that they're my fault, so report them
+to dmuell@gmx.net. Thanks!
+
+original README attached below....
+
+==========================================================================
+
+
+KTimemon 0.3a
+-------------
+
+KTimemon is a small but nifty system monitor, which can display information
+about CPU and memory/swap usage as well as ongoing paging/swapping and
+context switch activity. It is well integrated in KDE and can be
+configured graphically. For more information, see the associated
+documentation (before installation it can be found in ktimemon/doc/*.html)
+
+KTimemon works on Linux using the /proc filesystem, on Solaris using the
+kstat interface, and on Digital Unix (formerly known as DEC/OSF1) using
+the table() system call interface. If you can help me to port it to other
+platforms, please drop me a note!
+
+While I was able to test the system interface on Solaris and DEC/OSF1 in
+isolation, I could not test the whole application for lack of KDE on the
+machines I have access to. Hence I have no idea whether this thing
+actually compiles, let alone works on these platforms. The machines I tested
+were running DEC/OSF V4.0 and Solaris 2.5.1 respectively. If you get it to
+work (or not) on such a system, please let me know!
+
+
+Noteworthy changes from version 0.2:
+- Port to DEC/OSF1 and Solaris
+- Configurable mouse bindings
+- Slight rearrangement of memory information
+- Bars can be displayed vertically
+- Improved (actually working) configuration interface
+- Fixed a few bugs and doubtlessly introduced some more
+
+Version 0.3a has only minor improvements over 0.3:
+- New tooltips with numeric information about system load
+- Translation fixes
+
+Note that some of the configuration entry names have changed from version
+0.2 to 0.3, so you may want to delete your current configuration in
+$(HOME)/.kde/share/config/ktimemonrc and start with a fresh installation
+if you are upgrading from 0.2
+
+Martin <m.maierhofer@tees.ac.uk>
diff --git a/kicker-applets/ktimemon/TODO b/kicker-applets/ktimemon/TODO
new file mode 100644
index 0000000..eec7578
--- /dev/null
+++ b/kicker-applets/ktimemon/TODO
@@ -0,0 +1,13 @@
+* port it to more platforms (what about remote monitoring?)
+
+* include some sort of support for SMP status (smaller bars?); also for
+ multiple swap partitions/files?
+
+* make it more flexible (plug-in concept?)
+
+* improve documentation (add images?), better internationalisation
+
+* add help button in configuration dialog
+
+* have some way of attaching watchdogs (e.g. if %idle > 90 for more than
+ 10 seconds, do this or that (or pop up a dialog))
diff --git a/kicker-applets/ktimemon/confdlg.cc b/kicker-applets/ktimemon/confdlg.cc
new file mode 100644
index 0000000..ff5ab9d
--- /dev/null
+++ b/kicker-applets/ktimemon/confdlg.cc
@@ -0,0 +1,295 @@
+/**********************************************************************/
+/* TimeMon (c) 1994 Helmut Maierhofer */
+/* KDE-ified M. Maierhofer 1998 */
+/**********************************************************************/
+
+/*
+ * confdlg.h
+ *
+ * Definitions for the timemon configuration dialog.
+ */
+
+#include <config.h>
+#include <stdio.h>
+#include <qgroupbox.h>
+#include <qlineedit.h>
+#include <qslider.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qvgroupbox.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+
+#include <kcolorbutton.h>
+#include <klineedit.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kurlrequester.h>
+
+#include "confdlg.h"
+#include "timemon.h"
+
+// -- KConfDialog definition ---------------------------------------------
+
+KConfDialog::KConfDialog(KTimeMon *t)
+ : KDialogBase( Tabbed, i18n("Configuration" ),
+ Ok|Cancel|Apply, Ok, t, 0, false ),
+ timemon(t)
+{
+ QFrame *page;
+ QBoxLayout *bl;
+ QGridLayout *gl;
+ QLabel *l;
+ QGroupBox *b;
+ KColorButton *cb;
+ unsigned i, j;
+
+ setIcon( SmallIcon( "ktimemon" ) );
+
+ // first tab: general
+ page = addPage( i18n( "&General" ) );
+
+ bl = new QVBoxLayout(page, 0, spacingHint());
+
+ b = new QVGroupBox(i18n("Sample &Rate"), page);
+ bl->addWidget(b);
+
+ intervalEdit = new KIntNumInput(250, b);
+ intervalEdit->setRange(20, 1000, 10);
+ intervalEdit->setSuffix(i18n(" msec"));
+
+ // scaling group box
+ b = new QVGroupBox(i18n("Scaling"), page);
+ bl->addWidget(b);
+
+ bl->addStretch();
+
+ autoScaleBox = new QCheckBox(i18n("&Automatic"), b);
+ connect(autoScaleBox, SIGNAL(toggled(bool)), this, SLOT(toggle(bool)));
+
+ pageScaleEdit = new KIntNumInput(intervalEdit, 1000, b);
+ pageScaleEdit->setRange(10, 10000, 10);
+ pageScaleEdit->setLabel(i18n("&Paging:"), AlignVCenter | AlignLeft);
+
+ swapScaleEdit = new KIntNumInput(pageScaleEdit, 1000, b);
+ swapScaleEdit->setRange(1, 10000, 5);
+ swapScaleEdit->setLabel(i18n("&Swapping:"), AlignVCenter | AlignLeft);
+
+ ctxScaleEdit = new KIntNumInput(swapScaleEdit, 10000, b);
+ ctxScaleEdit->setLabel(i18n("&Context switch:"), AlignVCenter | AlignLeft);
+ ctxScaleEdit->setRange(1, 10000, 30);
+
+ bl->addStretch(1);
+
+ // second tab: colours
+ page = addPage( i18n( "C&olors" ) );
+
+ gl = new QGridLayout(page, 12, 10, 0, spacingHint());
+
+ gl->setColStretch(3, 1); gl->setColStretch(6, 1); // eat up horizontal space
+ gl->setRowStretch(11, 1); // eat up vertical space
+
+ gl->addRowSpacing(0, 20); gl->addRowSpacing(4, 20); gl->addRowSpacing(8, 20);
+ gl->addRowSpacing(2, 8); gl->addRowSpacing(6, 8); gl->addRowSpacing(10, 8);
+
+ gl->addColSpacing(0, 10); gl->addColSpacing(9, 25);
+
+ QString cpuColourLabels[4];
+ cpuColourLabels[0] = i18n("Kernel:");
+ cpuColourLabels[1] = i18n("User:");
+ cpuColourLabels[2] = i18n("Nice:");
+ cpuColourLabels[3] = i18n("IOWait:");
+
+ QString memColourLabels[4];
+ memColourLabels[0] = i18n("Kernel:");
+ memColourLabels[1] = i18n("Used:");
+ memColourLabels[2] = i18n("Buffers:");
+ memColourLabels[3] = i18n("Cached:");
+
+ KColorButton **cpuColourButtons[4] = { &kernelCB, &userCB, &niceCB, &iowaitCB };
+ b = new QGroupBox(i18n("CPU"), page);
+ gl->addMultiCellWidget(b, 0, 2, 0, 13);
+
+ for (j = 0; j < 4; j++) {
+ l = new QLabel(cpuColourLabels[j], page);
+ gl->addWidget(l, 1, 3*j+1, AlignVCenter | AlignRight);
+
+ cb = *cpuColourButtons[j] = new KColorButton(white, page);
+ gl->addWidget(cb, 1, 3*j+2, AlignCenter);
+
+ connect(cb, SIGNAL(changed(const QColor &)),
+ this, SLOT(updateSampleWidget(const QColor &)));
+ }
+
+ KColorButton **memColourButtons[4] = { &mkernelCB, &usedCB, &buffersCB, &cachedCB };
+ b = new QGroupBox(i18n("Memory"), page);
+ gl->addMultiCellWidget(b, 4, 6, 0, 13);
+
+ for (j = 0; j < 4; j++) {
+ l = new QLabel(memColourLabels[j], page);
+ gl->addWidget(l, 5, 3*j+1, AlignVCenter | AlignRight);
+
+ cb = *memColourButtons[j] = new KColorButton(white, page);
+ gl->addWidget(cb, 5, 3*j+2, AlignCenter);
+
+ connect(cb, SIGNAL(changed(const QColor &)),
+ this, SLOT(updateSampleWidget(const QColor &)));
+ }
+
+ b = new QGroupBox(i18n("Swap"), page);
+ gl->addMultiCellWidget(b, 8, 10, 0, 6);
+
+ l = new QLabel(i18n("Swap:"), page);
+ gl->addWidget(l, 9, 1, AlignVCenter | AlignRight);
+
+ cb = swapCB = new KColorButton(red, page);
+ gl->addWidget(cb, 9, 2);
+
+ connect(cb, SIGNAL(changed(const QColor &)),
+ this, SLOT(updateSampleWidget(const QColor &)));
+
+ l = new QLabel(i18n("Backgd:"), page);
+ gl->addWidget(l, 9, 4, AlignVCenter | AlignRight);
+
+ cb = bgCB = new KColorButton(blue, page);
+ gl->addWidget(cb, 9, 5);
+
+ connect(cb, SIGNAL(changed(const QColor &)),
+ this, SLOT(updateSampleWidget(const QColor &)));
+
+ //b = new QGroupBox(i18n("Sample"), page);
+ //gl->addMultiCellWidget(b, 8, 10, 7, 9);
+
+ // third tab: interaction
+ page = addPage( i18n( "&Interaction" ) );
+
+ bl = new QVBoxLayout(page, 0, spacingHint());
+
+ b = new QGroupBox(i18n("Mouse Events"), page);
+ b->setColumnLayout( 0, Qt::Vertical );
+ bl->addWidget(b);
+ bl->addStretch();
+
+ QVBoxLayout *vbox = new QVBoxLayout( b->layout() );
+
+ gl = new QGridLayout(b, MAX_MOUSE_ACTIONS + 1, 3, 0, 6 );
+
+ vbox->addLayout( gl );
+
+ for (i = 1; i < MAX_MOUSE_ACTIONS + 1; i++)
+ gl->setRowStretch(i, 1);
+ gl->setColStretch(2, 1);
+
+ QString buttonText[MAX_MOUSE_ACTIONS] = { i18n("Left button:"),
+ i18n("Middle button:"),
+ i18n("Right button:") };
+
+ for (i = 0; i < (int) MAX_MOUSE_ACTIONS; i++) {
+
+ l = new QLabel(buttonText[i], b);
+ gl->addWidget(l, i+1, 0);
+
+ mouseC[i] = new KComboBox(false, b);
+ mouseC[i]->insertItem(i18n("Is Ignored"), KTimeMon::NOTHING);
+// SWITCH doesn't DO anything. remove it from config dialog for now
+// mouseC[i]->insertItem(i18n("Switches Mode"), KTimeMon::SWITCH);
+ mouseC[i]->insertItem(i18n("Pops Up Menu"), KTimeMon::MENU - 1);
+ mouseC[i]->insertItem(i18n("Starts"), KTimeMon::COMMAND - 1);
+ gl->addWidget(mouseC[i], i+1, 1);
+
+ connect( mouseC[ i ], SIGNAL( activated( int ) ), this,
+ SLOT( mouseCommandEnable() ) );
+
+ mouseLE[i] = new KURLRequester(b);
+ mouseLE[i]->lineEdit()->setText(t->mouseActionCommand[i]);
+ gl->addWidget(mouseLE[i], i+1, 2);
+ }
+
+ gl->activate();
+
+ resize(380, 300);
+
+ connect(this, SIGNAL(applyClicked()), timemon, SLOT(apply()));
+ connect(this, SIGNAL(okClicked()), timemon, SLOT(apply()));
+}
+
+// Adjust the colours of the sample widget in the configuration dialog.
+void KConfDialog::updateSampleWidget(const QColor &)
+{
+#if 0
+ sample->kernelColour = kernelCB->color();
+ sample->userColour = userCB->color();
+ sample->niceColour = niceCB->color();
+ sample->iowaitColour = iowaitCB->color();
+ sample->kernelColour = kernelCB->color();
+ sample->cachedColour = cachedCB->color();
+ sample->usedColour = usedCB->color();
+ sample->buffersColour = buffersCB->color();
+ sample->swapColour = swapCB->color();
+ sample->bgColour = bgCB->color();
+ sample->update();
+#endif
+}
+
+// -----------------------------------------------------------------------------
+
+// enable/disable the scale widgets
+void KConfDialog::toggle(bool state)
+{
+ swapScaleEdit->setEnabled(!state);
+ pageScaleEdit->setEnabled(!state);
+ ctxScaleEdit->setEnabled(!state);
+}
+
+void KConfDialog::mouseCommandEnable()
+{
+ for ( int i = 0; i < MAX_MOUSE_ACTIONS; i++ ) {
+ unsigned action = mouseC[ i ]->currentItem();
+
+ // the - 1 is for compat with the no longer shown Switch option
+ mouseLE[ i ]->setEnabled( action == KTimeMon::COMMAND - 1);
+ }
+}
+
+// update the dialog fields
+void KConfDialog::update()
+{
+ intervalEdit->setValue(timemon->interval);
+ kernelCB->setColor(timemon->kernelColour);
+ userCB->setColor(timemon->userColour);
+ niceCB->setColor(timemon->niceColour);
+ iowaitCB->setColor(timemon->iowaitColour);
+ buffersCB->setColor(timemon->buffersColour);
+ mkernelCB->setColor(timemon->mkernelColour);
+ usedCB->setColor(timemon->usedColour);
+ cachedCB->setColor(timemon->cachedColour);
+ swapCB->setColor(timemon->swapColour);
+ bgCB->setColor(timemon->bgColour);
+ pageScaleEdit->setValue(timemon->pageScale);
+ swapScaleEdit->setValue(timemon->swapScale);
+ ctxScaleEdit->setValue(timemon->ctxScale);
+ autoScaleBox->setChecked(timemon->autoScale);
+
+ for ( int i = 0; i < MAX_MOUSE_ACTIONS; i++ )
+ {
+ int action = timemon->mouseAction[i];
+ if (action > 0)
+ --action; // compat for the no longer shown Switch action
+ mouseC[i]->setCurrentItem(action);
+ }
+ mouseCommandEnable();
+
+ updateSampleWidget(white); // fake colour
+}
+
+unsigned int KConfDialog::getMouseAction(int i) const
+{
+ int action = mouseC[i]->currentItem();
+
+ if (action > 0)
+ ++action; // compat for the no longer shown Switch action
+
+ return action;
+}
+
+#include "confdlg.moc"
diff --git a/kicker-applets/ktimemon/confdlg.h b/kicker-applets/ktimemon/confdlg.h
new file mode 100644
index 0000000..d458bf2
--- /dev/null
+++ b/kicker-applets/ktimemon/confdlg.h
@@ -0,0 +1,99 @@
+/* -*- C++ -*- */
+
+/**********************************************************************/
+/* TimeMon (c) 1994 Helmut Maierhofer */
+/* KDE-ified M. Maierhofer 1998 */
+/* */
+/* Ported to KDE 2.0 and other stuff: */
+/* Copyright (c) Dirk A. Mueller <dmuell@gmx.net> */
+/* */
+/**********************************************************************/
+
+/*
+ * confdlg.h
+ *
+ * Definitions for the timemon configuration dialog.
+ */
+
+#ifndef CONFDLG_H
+#define CONFDLG_H
+
+#include <qcolor.h>
+#include <qcheckbox.h>
+#include <qtabdialog.h>
+
+#include <kcolorbutton.h>
+#include <kcombobox.h>
+#include <klineedit.h>
+#include <knuminput.h>
+#include <kdialogbase.h>
+#include <kurlrequester.h>
+
+#include "timemon.h"
+
+// -- forward declaration ------------------------------------------------
+
+class KTimeMon;
+class QLineEdit;
+class QSlider;
+class KColorButton;
+
+// -- KConfDialog declaration --------------------------------------------
+
+/*
+ * KConfDialog
+ */
+
+class KConfDialog : public KDialogBase
+{
+
+ Q_OBJECT
+
+public:
+ KConfDialog(KTimeMon *timemon);
+ ~KConfDialog() {}
+
+ void update(); // get values from timemon
+
+ unsigned getInterval() const { return intervalEdit->value(); }
+ QColor getKernelColour() const { return kernelCB->color(); }
+ QColor getUserColour() const { return userCB->color(); }
+ QColor getNiceColour() const { return niceCB->color(); }
+ QColor getIOWaitColour() const { return iowaitCB->color(); }
+ QColor getCachedColour() const { return cachedCB->color(); }
+ QColor getUsedColour() const { return usedCB->color(); }
+ QColor getBuffersColour() const { return buffersCB->color(); }
+ QColor getMKernelColour() const { return mkernelCB->color(); }
+ QColor getSwapColour() const { return swapCB->color(); }
+ QColor getBgColour() const { return bgCB->color(); }
+
+ bool getAutoScale() const { return autoScaleBox->isChecked(); }
+ unsigned getPageScale() const { return pageScaleEdit->value(); }
+ unsigned getSwapScale() const { return swapScaleEdit->value(); }
+ unsigned getCtxScale() const { return ctxScaleEdit->value(); }
+
+ unsigned getMouseAction(int i) const;
+ QString getMouseActionCommand(int i) const { return mouseLE[i]->lineEdit()->text(); }
+
+private slots:
+ void updateSampleWidget(const QColor &); // update colours in configuration
+ void toggle(bool state); // enable/disable scales
+ void mouseCommandEnable();
+
+private:
+
+ KTimeMon *timemon;
+ KIntNumInput *intervalEdit, *swapScaleEdit, *pageScaleEdit, *ctxScaleEdit;
+ QLineEdit *procFileEdit;
+ QCheckBox *autoScaleBox;
+ KColorButton *kernelCB, *userCB, *niceCB, *iowaitCB;
+ KColorButton *buffersCB, *usedCB, *cachedCB, *mkernelCB;
+ KColorButton *swapCB, *bgCB;
+ KURLRequester *mouseLE[MAX_MOUSE_ACTIONS];
+ KComboBox *mouseC[MAX_MOUSE_ACTIONS];
+ bool haveWarned;
+
+ friend class KTimeMon;
+};
+
+#endif // CONFDLG_H
diff --git a/kicker-applets/ktimemon/configure.in.in b/kicker-applets/ktimemon/configure.in.in
new file mode 100644
index 0000000..7b9657e
--- /dev/null
+++ b/kicker-applets/ktimemon/configure.in.in
@@ -0,0 +1,3 @@
+AC_CHECK_HEADERS(fcntl.h)
+AC_CHECK_LIB(kstat, kstat_open, LIBKSTAT="-lkstat")
+AC_SUBST(LIBKSTAT)
diff --git a/kicker-applets/ktimemon/cr16-app-ktimemon.png b/kicker-applets/ktimemon/cr16-app-ktimemon.png
new file mode 100644
index 0000000..d9295e6
--- /dev/null
+++ b/kicker-applets/ktimemon/cr16-app-ktimemon.png
Binary files differ
diff --git a/kicker-applets/ktimemon/cr32-app-ktimemon.png b/kicker-applets/ktimemon/cr32-app-ktimemon.png
new file mode 100644
index 0000000..71ff476
--- /dev/null
+++ b/kicker-applets/ktimemon/cr32-app-ktimemon.png
Binary files differ
diff --git a/kicker-applets/ktimemon/ktimemon.desktop b/kicker-applets/ktimemon/ktimemon.desktop
new file mode 100644
index 0000000..9f9013e
--- /dev/null
+++ b/kicker-applets/ktimemon/ktimemon.desktop
@@ -0,0 +1,129 @@
+[Desktop Entry]
+Type=Plugin
+Icon=ktimemon
+X-KDE-Library=ktimemon_panelapplet
+X-KDE-UniqueApplet=true
+Comment=A simple system monitor
+Comment[ar]=مراقب النظام بسيط
+Comment[bg]=Системен монитор за KDE
+Comment[br]=Un diskweler reizhiad eeun
+Comment[ca]=Un monitor del sistema senzill
+Comment[cs]=Jednoduchý monitor systému
+Comment[da]=En simpel systemovervåger til KDE
+Comment[de]=Ein einfacher Systemmonitor
+Comment[el]=Ένας απλός επόπτης συστήματος
+Comment[eo]=Simpla sistemobservilo
+Comment[es]=Un monitor de sistema sencillo
+Comment[et]=Lihtne süsteemi monitor
+Comment[eu]=Sistemaren monitore sinplea
+Comment[fa]=نمایشگر سیستم ساده
+Comment[fi]=Yksinkertainen järjestelmänvalvontaohjelma
+Comment[fr]=Un moniteur système simple
+Comment[fy]=In ienfâldige systeemmonitor
+Comment[ga]=Monatóir simplí an chórais
+Comment[gl]=Un monitor do sistema simples
+Comment[he]=צג מערכת פשוט עבור KDE
+Comment[hr]=Jednostavan nadzor sustava
+Comment[hu]=Egyszerű rendszermonitor
+Comment[is]=Einfalt kerfiseftirlit
+Comment[it]=Un semplice monitor di sistema
+Comment[ja]=シンプルなシステムモニタ
+Comment[ka]=მარტივი სისტემური მონიტორი
+Comment[kk]=Қарапайым жүйе қадағалауышы
+Comment[km]=កម្មវិធី​ត្រួត​ពិនិត្យ​ប្រព័ន្ធ​​ធម្មតា​មួយ
+Comment[lt]=Sistemos stebėjimo priemonė
+Comment[mk]=Едноставен набљудувач на системот
+Comment[nb]=En enkel systemovervåker
+Comment[nds]=En eenfach Systeemkieker
+Comment[ne]=एउट सामान्य प्रणाली मनिटर
+Comment[nl]=Een eenvoudige systeemmonitor
+Comment[nn]=Ein enkel systemovervakar
+Comment[pa]=ਇੱਕ ਸਧਾਰਨ ਸਿਸਟਮ ਨਿਗਰਾਨ
+Comment[pl]=Prosty monitor systemu
+Comment[pt]=Um monitor do sistema simples
+Comment[pt_BR]=Um monitor de sistema simples
+Comment[ru]=Простой системный монитор
+Comment[sk]=Jednoduchý monitor systému
+Comment[sl]=Preprost nadzornik sistema
+Comment[sr]=Једноставно надгледање система
+Comment[sr@Latn]=Jednostavno nadgledanje sistema
+Comment[sv]=En enkel systemövervakare
+Comment[tr]=Basit bir sistem izleyici
+Comment[uk]=Простий системний монітор
+Comment[uz]=Tizimni nazorat qilish uchun oddiy vosita
+Comment[uz@cyrillic]=Тизимни назорат қилиш учун оддий восита
+Comment[vi]=Bộ theo dõi hệ thống đơn giản
+Comment[zh_CN]=简单的系统监视器
+Comment[zh_TW]=簡單的系統監視器
+Name=System Monitor
+Name[af]=Stelsel Monitor
+Name[ar]=مراقب النظام
+Name[az]=Sistem İzləyici
+Name[bg]=Системен монитор
+Name[br]=Diskwel saviad ar reizhiad
+Name[bs]=Stanje sistema
+Name[ca]=Monitor del sistema
+Name[cs]=Monitor systému
+Name[cy]=Gwarchodydd Cysawd
+Name[da]=Systemovervåger
+Name[de]=Systemmonitor
+Name[el]=Εποπτεία συστήματος
+Name[eo]=Sistemobservilo
+Name[es]=Monitor de sistema
+Name[et]=Süsteemi monitor
+Name[eu]=Sistemaren monitorea
+Name[fa]=نمایشگر سیستم
+Name[fi]=Järjestelmänvalvonta
+Name[fo]=Skipanaryvirvakari
+Name[fr]=Surveillance du système
+Name[fy]=Systeemmonitor
+Name[ga]=Monatóir Córais
+Name[gl]=Monitor do Sistema
+Name[he]=צג מערכת
+Name[hi]=तंत्र मॉनीटर
+Name[hr]=Nadzor sustava
+Name[hu]=Rendszermonitor
+Name[is]=Kerfiseftirlit
+Name[it]=Monitor di sistema
+Name[ja]=システムモニタ
+Name[ka]=სისტემური მონიტორი
+Name[kk]=Жүйе қадағалауышы
+Name[km]=កម្មវិធី​ត្រួត​ពិនិត្យ​ប្រព័ន្ធ
+Name[ko]=시스템 지켜보기
+Name[lt]=Sistemos stebėtojas
+Name[lv]=Sistēmas Monitors
+Name[mk]=Набљудувач на системот
+Name[ms]=Monitor Sistem
+Name[mt]=Monitur tas-sistema
+Name[nb]=Systemovervåker
+Name[nds]=Systeemkieker
+Name[ne]=प्रणाली मनिटर
+Name[nl]=Systeemmonitor
+Name[nn]=Systemovervakar
+Name[pa]=ਸਿਸਟਮ ਨਿਗਰਾਨ
+Name[pl]=Monitor systemu
+Name[pt]=Monitor do Sistema
+Name[pt_BR]=Monitor do sistema
+Name[ro]=Monitor de sistem
+Name[ru]=Системный монитор
+Name[sk]=Monitor systému
+Name[sl]=Sistemski nadzornik
+Name[sr]=Надгледање система
+Name[sr@Latn]=Nadgledanje sistema
+Name[sv]=Systemövervakare
+Name[ta]=அமைப்பு திரை
+Name[tg]=Монитори системавӣ
+Name[th]=สอดส่องระบบ
+Name[tr]=Sistem İzleyici
+Name[uk]=Системний монітор
+Name[uz]=Oddiy tizim nazoratchisi
+Name[uz@cyrillic]=Оддий тизим назоратчиси
+Name[ven]=Monitha wa Sistemu
+Name[vi]=Bộ theo dõi hệ thống
+Name[xh]=Indlela yokwenza yeCebo lokubonisa
+Name[zh_CN]=系统监视器
+Name[zh_TW]=系統監視器
+Name[zu]=Umphendli Wendlela esetshenziswayo
+DocPath=kicker-applets/ktimemon.html
+X-KDE-StartupNotify=true
+X-KDE-ParentApp=applets
diff --git a/kicker-applets/ktimemon/lo16-app-ktimemon.png b/kicker-applets/ktimemon/lo16-app-ktimemon.png
new file mode 100644
index 0000000..d9295e6
--- /dev/null
+++ b/kicker-applets/ktimemon/lo16-app-ktimemon.png
Binary files differ
diff --git a/kicker-applets/ktimemon/lo32-app-ktimemon.png b/kicker-applets/ktimemon/lo32-app-ktimemon.png
new file mode 100644
index 0000000..71ff476
--- /dev/null
+++ b/kicker-applets/ktimemon/lo32-app-ktimemon.png
Binary files differ
diff --git a/kicker-applets/ktimemon/sample.cc b/kicker-applets/ktimemon/sample.cc
new file mode 100644
index 0000000..25f25a3
--- /dev/null
+++ b/kicker-applets/ktimemon/sample.cc
@@ -0,0 +1,508 @@
+/**********************************************************************/
+/* TimeMon (c) 1994 Helmut Maierhofer */
+/* KDE-ified M. Maierhofer 1998 */
+/**********************************************************************/
+
+/*
+ * sample.cc
+ *
+ * Definitions for the system dependent sampling class.
+ */
+
+#include <config.h>
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <stdarg.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#include <fstream>
+#include <stdio.h>
+
+#ifdef __osf__
+#include <sys/table.h>
+#elif defined(USE_SOLARIS)
+#include <kstat.h>
+#include <sys/sysinfo.h>
+#include <sys/stat.h>
+#include <sys/swap.h>
+#endif
+
+#include <qwidget.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+
+#include "timemon.h"
+#include "sample.h"
+
+// -- global definitions -------------------------------------------------
+
+#if defined(__osf__) || defined(USE_SOLARIS)
+extern "C" int getpagesize(); // argh, have to define prototype!
+#endif
+
+#ifdef __linux__
+// -- global constants ---------------------------------------------------
+#define STAT_NAME "/proc/stat"
+#define MEMINFO_NAME "/proc/meminfo"
+#endif
+
+// -- KSample::Sample definition -----------------------------------------
+
+// Fill sample with some default values (e.g. used in preview widget
+// in configuration)
+void KSample::Sample::fill(unsigned scale)
+{
+ user = scale * 40; user /= 100;
+ nice = scale * 25; user /= 100;
+ kernel = scale * 10; kernel /= 100;
+ iowait = scale * 5; iowait /= 100;
+ cpus = 1;
+ buffers = scale * 20; buffers /= 100;
+ used = scale * 30; used /= 100;
+ cached = scale * 20; cached /= 100;
+ sused = scale * 25; sused /= 100;
+}
+
+// -- KSample definition -------------------------------------------------
+
+// Initialise the member variables and try to open the standard files in
+// the proc filesystem; for other platforms perform equivalent initialisation
+KSample::KSample(KTimeMon *t, bool a, unsigned p, unsigned s, unsigned c) :
+ timemon(t),
+#ifdef __linux__
+ memFD(-1), statFD(-1),
+#elif defined (USE_SOLARIS)
+ kc(0), warned(false),
+#endif
+ pageScale(p), swapScale(s), cxScale(c), autoscale(a)
+{
+#ifdef __linux__
+ memstats[0].name = "SwapTotal:";
+ memstats[0].stat = &sample.stotal;
+ memstats[1].name = "MemTotal:";
+ memstats[1].stat = &sample.mtotal;
+ memstats[2].name = "MemFree:";
+ memstats[2].stat = &sample.free;
+ memstats[3].name = "Buffers:";
+ memstats[3].stat = &sample.buffers;
+ memstats[4].name = "Cached:";
+ memstats[4].stat = &sample.cached;
+ memstats[5].name = "SwapFree:";
+ memstats[5].stat = &sample.sfree;
+ memstats[6].name = 0;
+ memstats[6].stat = 0;
+
+ if ((memFD = open(MEMINFO_NAME, O_RDONLY)) == -1) {
+ KMessageBox::error(timemon,
+ i18n("Unable to open the file '%1'. The diagnostics are:\n%2.\n"
+ "This file is required to determine current memory usage.\n"
+ "Maybe your proc filesystem is non-Linux standard?").arg(MEMINFO_NAME).arg(strerror(errno)));
+ exit(1);
+ }
+
+ fcntl( memFD,F_SETFD, FD_CLOEXEC );
+
+ if ((statFD = open(STAT_NAME, O_RDONLY)) == -1) {
+ KMessageBox::error(timemon,
+ i18n("Unable to open the file '%1'. The diagnostics are:\n%2.\n"
+ "This file is required to determine current system info. "
+ "Maybe your proc filesystem is non-Linux standard?").arg(MEMINFO_NAME).arg(strerror(errno)));
+ exit(1);
+ }
+
+ fcntl( statFD,F_SETFD, FD_CLOEXEC );
+
+#elif defined (USE_SOLARIS)
+ if ((kc = kstat_open()) == 0) {
+ KMessageBox::error(timemon, i18n("Unable to initialize the 'kstat' library. "
+ "This library is used for accessing kernel information. "
+ "The diagnostics are:\n%1.\n"
+ "Are you really running Solaris? "
+ "Please contact the maintainer at mueller@kde.org "
+ "who will try to figure out what went wrong.").arg(strerror(errno)));
+ exit(1);
+ }
+#endif
+
+#if defined(USE_SOLARIS) || defined(__osf__)
+ pagesPerMB = (1024*1024) / getpagesize();
+ if (pagesPerMB == 0) pagesPerMB = 1; // paranoia sanity check
+#endif
+
+ readSample();
+ updateSample();
+}
+
+// Get rid of the resources we acquired in the constructor.
+KSample::~KSample()
+{
+#ifdef __linux__
+ close(memFD);
+ close(statFD);
+#elif defined (USE_SOLARIS)
+ if (kc != 0) kstat_close(kc);
+#endif
+}
+
+// Set the appropriate scaling parameters
+void KSample::setScaling(bool a, unsigned p, unsigned s, unsigned c)
+{
+ autoscale = a;
+ pageScale = p;
+ swapScale = s;
+ cxScale = c;
+}
+
+// -----------------------------------------------------------------------------
+// Show a message box with the given message and terminate the application.
+
+void KSample::fatal(const QString& msg)
+{
+ timemon->stop();
+
+ KMessageBox::error(timemon, msg);
+// exit(1);
+}
+
+
+// -----------------------------------------------------------------------------
+// Show a message box with the given message and don't terminate the app ;-)
+
+void KSample::nonfatal(const QString& msg)
+{
+ timemon->stop();
+
+ KMessageBox::sorry(timemon, msg);
+ timemon->cont();
+}
+
+
+// -----------------------------------------------------------------------------
+// Read a new sample from the files or whatever resource the OS implements
+
+/* For 2.5 kernels */
+static inline void
+scan_one(const char* buff, const char *key, unsigned long int* val)
+{
+ const char *b = strstr(buff, key);
+ if (b) {
+ b = strstr(b, " ");
+ if (b)
+ sscanf(b, " %lu", val);
+ }
+}
+
+void KSample::readSample()
+{
+ sample.cpus = 0; // just to make sure...
+
+#ifdef __linux__ // linux makes it simple: use the /proc if
+ int l;
+ char buffer[4096];
+
+ lseek(memFD, 0, 0);
+ if ((l = read(memFD, buffer, sizeof(buffer) - 1)) < 0)
+ {
+ fatal(i18n("Unable to read the memory usage file '%1'.\n"
+ "The diagnostics are: %2").arg(MEMINFO_NAME).arg(strerror(errno)));
+ }
+ buffer[l] = '\0';
+ l = 0;
+ char *p;
+ while (memstats[l].name != 0) {
+ p = strstr(buffer, memstats[l].name);
+ if (p == 0 ||
+ sscanf(p + strlen(memstats[l].name), "%lu kB", memstats[l].stat) < 1)
+ fatal(i18n("The memory usage file '%1' seems to use a "
+ "different file format than expected.\n"
+ "Maybe your version of the proc filesystem is "
+ "incompatible with supported versions. "
+ "Please contact the developer at http://bugs.kde.org/ who will try to sort this out.").arg(MEMINFO_NAME));
+ l++;
+ }
+
+ if ( ( p = strstr(buffer, "Slab:") ) ) {
+ unsigned long slabs;
+ sscanf(p + 5, "%lu kB", &slabs);
+ sample.mkernel = slabs;
+ }
+
+ /* read the data for the cpu stats */
+ lseek(statFD, 0, 0);
+ if ((l = read(statFD, buffer, sizeof(buffer)-1)) < 0)
+ fatal(i18n("Unable to read the system usage file '%1'.\n"
+ "The diagnostics are: %2").arg(STAT_NAME).arg(strerror(errno)));
+
+ buffer[l] = '\0';
+
+ bool ok = (sscanf(buffer, "cpu %lu %lu %lu %lu %lu", &sample.user,
+ &sample.nice, &sample.kernel, &sample.idle, &sample.iowait) == 5);
+
+ if (ok) {
+ for (l = 0; l < MAX_CPU; l++) { // get individual stat for SMP machines
+ char cpuname[10];
+ sprintf(cpuname, "cpu%d", l);
+
+ if ((p = strstr(buffer, cpuname)) == NULL) break;
+
+ unsigned long u, n, k, i;
+ ok = sscanf(p, "cpu%*d %lu %lu %lu %lu", &u, &n, &k, &i);
+ if (!ok) break;
+
+ sample.smptotal[l] = u+n+k+i;
+ sample.smpbusy[l] = sample.smptotal[l] - i;
+ }
+ }
+ sample.cpus = l;
+
+#elif defined(__osf__) // in OSF/2, we can use table()
+
+ QString msg = i18n("Unable to obtain system information.\n"
+ "The table(2) system call returned an error "
+ "for table %1.\n"
+ "Please contact the maintainer at mueller@kde.org "
+ "who will try to figure out what went wrong.");
+
+ struct tbl_sysinfo sysinfo;
+ if (table(TBL_SYSINFO, 0, &sysinfo, 1, sizeof(sysinfo)) != 1)
+ fatal(msg.arg("TBL_SYSINFO"));
+
+ sample.user = sysinfo.si_user;
+ sample.nice = sysinfo.si_nice;
+ sample.kernel = sysinfo.si_sys;
+ sample.iowait = sysinfo.wait;
+ sample.idle = sysinfo.si_idle;
+
+ struct tbl_vmstats vmstats;
+ if (table(TBL_VMSTATS, 0, &vmstats, 1, sizeof(vmstats)) != 1)
+ fatal(msg.arg("TBL_VMSTATS"));
+
+ sample.mtotal = vmstats.free_count + vmstats.active_count +
+ vmstats.inactive_count + vmstats.wire_count;
+ sample.free = vmstats.free_count;
+ sample.buffers = vmstats.inactive_count; // pages not used for some time
+ sample.cached = vmstats.wire_count; // kernel/driver memory
+
+ struct tbl_swapinfo swapinfo;
+ if (table(TBL_SWAPINFO, -1, &swapinfo, 1, sizeof(swapinfo)) != 1)
+ fatal(msg.arg("TBL_SWAPINFO"));
+
+ sample.stotal = swapinfo.size;
+ sample.sfree = swapinfo.free;
+
+#elif defined(USE_SOLARIS)
+ kstat_t *ksp;
+
+ sample.cpus = 0;
+ for (ksp = kc->kc_chain; ksp != 0; ksp = ksp->ks_next) {
+ if (strncmp(ksp->ks_name, "cpu_stat", 8) != 0) continue;
+ sample.cpus++;
+ }
+
+ if (sample.cpus == 0)
+ fatal(i18n("Unable to find any entries for CPU statistics "
+ "in the 'kstat' library. Are you running a non-standard "
+ "version of Solaris?\n"
+ "Please contact the maintainer via http://bugs.kde.org/ who will try to sort this out."));
+
+ sample.user = sample.nice = sample.kernel = sample.iowait = sample.idle = 0;
+ sample.stotal = sample.sfree = 0;
+
+ int cpus = 0;
+ for (ksp = kc->kc_chain; ksp != 0; ksp = ksp->ks_next) {
+ if (strncmp(ksp->ks_name, "cpu_stat", 8) != 0) continue;
+ cpus++;
+
+ cpu_stat_t cstat;
+ if (kstat_read(kc, ksp, 0) == -1 || // update from kernel
+ kstat_read(kc, ksp, &cstat) == -1) // and read into buffer
+ fatal(i18n("Unable to read the CPU statistics entry "
+ "from the 'kstat' library. The diagnostics are '%1'.\n"
+ "Please contact the maintainer via http://bugs.kde.org/ who will try to sort this out.").arg(strerror(errno)));
+
+ // fields are: idle user kernel iowait (no nice info?)
+ sample.user += cstat.cpu_sysinfo.cpu[1] / sample.cpus;
+ sample.nice += 0;
+ sample.kernel += cstat.cpu_sysinfo.cpu[2] / sample.cpus;
+ sample.iowait += cstat.cpu_sysinfo.cpu[3] / sample.cpus;
+ sample.idle += cstat.cpu_sysinfo.cpu[0] / sample.cpus;
+ }
+
+ if (cpus != sample.cpus)
+ fatal(i18n("The number of CPUs appears to have changed at "
+ "very short notice, or the 'kstat' library returns "
+ "inconsistent results (%1 vs. %2 CPUs).\n"
+ "Please contact the maintainer via http://bugs.kde.org/ who will try to sort this out.").arg(sample.cpus).arg(cpus));
+
+ // availrmem = pages of core for user-proc ( == physmem - kernelmem)
+ // freemem = no of free pages
+ // physmem == total mem in 4KB blocks
+
+ errno = 0;
+ if ((ksp = kstat_lookup(kc, "unix", -1, "system_pages")) == 0 ||
+ kstat_read(kc, ksp, 0) == -1)
+ fatal(i18n("Unable to read the memory statistics entry "
+ "from the 'kstat' library. The diagnostics are '%1'\n"
+ "You might want to contact the maintainer at "
+ "http://bugs.kde.org/ who will try to sort this out.").arg(strerror(errno)));
+
+ int i;
+ unsigned long physmem = 0, freemem = 0, availrmem = 0;
+
+ kstat_named_t *kn = (kstat_named_t *)ksp->ks_data;
+ for (i = 0; i < (int) ksp->ks_ndata; i++) {
+ if (strcmp(kn->name, "physmem") == 0) physmem = kn->value.ul;
+ else if (strcmp(kn->name, "freemem") == 0) freemem = kn->value.ul;
+ else if (strcmp(kn->name, "availrmem") == 0) availrmem = kn->value.ul;
+ kn++;
+ }
+
+ if (physmem == 0) // sanity check, this should always be > 0
+ fatal(i18n("There seems to be a problem with KTimeMon's handling "
+ "of the 'kstat' library: 0 bytes of physical memory determined!\n"
+ "Free memory is %1, available memory is %2.\n"
+ "Please contact the maintainer at mueller@kde.org who will try to sort this out.").arg(freemem).arg(availrmem));
+
+ sample.mtotal = physmem;
+ sample.free = freemem;
+ sample.buffers = 0;
+ sample.cached = physmem - availrmem; // memory used by the kernel
+
+ int swapentries;
+ if ((swapentries = swapctl(SC_GETNSWP, 0)) == -1)
+ fatal(i18n("Unable to determine the number of "
+ "swap spaces. The diagnostics are '%1'.\n"
+ "Please contact the maintainer at http://bugs.kde.org/ who will try to sort this out.").arg(strerror(errno)));
+
+ if (swapentries != 0) {
+ // 2* to get some space for padding??
+ swaptbl_t *stbl = (swaptbl_t *) malloc(2*sizeof(int) + swapentries *
+ sizeof(struct swapent));
+ if (stbl == 0)
+ fatal(i18n("KTimeMon ran out of memory while "
+ "trying to determine the swap usage.\n"
+ "Attempted to allocate %1 bytes of memory (2 * %2 + %3 * %4).\n"
+ "Please contact the maintainer at http://bugs.kde.org/ who will try to sort this out.")
+ .arg(2 * sizeof(int) + swapentries * sizeof(struct swapent))
+ .arg(sizeof(int)).arg(swapentries).arg(sizeof(struct swapent)));
+
+ char path[1024];
+ stbl->swt_n = swapentries;
+ for (i = 0; i < swapentries; i++) stbl->swt_ent[i].ste_path = path;
+
+ if ((swapentries = swapctl(SC_LIST, stbl)) == -1)
+ fatal(i18n("Unable to determine the swap usage.\n"
+ "The diagnostics are '%1'.\n"
+ "Please contact the maintainer at http://bugs.kde.org/ who will try to sort this out.").arg(strerror(errno)));
+
+
+ if (!warned && swapentries != stbl->swt_n) {
+ warned = true;
+ nonfatal(i18n("Information was requested for "
+ "%1 swap spaces, but only %2 swap entries were returned.\n"
+ "KTimeMon will attempt to continue.\n"
+ "Please contact the maintainer at http://bugs.kde.org/ who will try to sort this out.").arg(stbl->swt_n).arg(swapentries));
+ }
+
+ for (i = 0; i < swapentries; i++) {
+ sample.stotal += stbl->swt_ent[i].ste_pages;
+ sample.sfree += stbl->swt_ent[i].ste_free;
+ }
+
+ free(stbl);
+ }
+
+#else
+#warning This type of system is not supported
+ sample.stotal = sample.sfree = 0;
+#endif
+
+ sample.cputotal =
+ sample.user + sample.nice + sample.kernel + sample.iowait + sample.idle;
+ sample.used = sample.mtotal - sample.mkernel - sample.free - sample.buffers - sample.cached;
+ sample.sused = sample.stotal - sample.sfree;
+}
+
+// Read a new sample after copying the old one.
+void KSample::updateSample()
+{
+ oldSample = sample;
+ readSample();
+}
+
+// Convert v to a value representing megabytes.
+inline void KSample::makeMBytes(unsigned long &v)
+{
+#ifdef __linux__
+ v /= 1024; // can it be simpler ;-)
+#elif defined (__osf__) || defined(USE_SOLARIS)
+ v /= pagesPerMB;
+#endif
+}
+
+// Return unscaled sample
+KSample::Sample KSample::getRawSample()
+{
+ Sample diff = sample;
+
+ diff.cputotal -= oldSample.cputotal;
+
+ diff.user -= oldSample.user;
+ diff.nice -= oldSample.nice;
+ diff.kernel -= oldSample.kernel;
+ diff.iowait -= oldSample.iowait;
+
+ for (int i = 0; i < diff.cpus; i++) {
+ diff.smptotal[i] -= oldSample.smptotal[i];
+ diff.smpbusy[i] -= oldSample.smpbusy[i];
+ }
+
+ return diff;
+}
+
+// Better scaling, round according to first decimal
+inline unsigned long KSample::doScale(unsigned long value, unsigned scale1,
+ unsigned long scale2)
+{
+ if (scale2 == 0) scale2 = (unsigned long)~0; // avoid SEGVs
+
+ unsigned long v = value * scale1 * 10;
+ v /= scale2;
+ unsigned r = v % 10;
+ v /= 10;
+ if (r > 4) v++;
+ return v;
+}
+
+// Provide the difference from the last to the current sample, scale it
+// and return it.
+KSample::Sample KSample::getSample(unsigned scale)
+{
+ Sample s = getRawSample();
+
+ s.user = doScale(s.user, scale, s.cputotal);
+ s.nice = doScale(s.nice, scale, s.cputotal);
+ s.kernel = doScale(s.kernel, scale, s.cputotal);
+ s.iowait = doScale(s.iowait, scale, s.cputotal);
+
+ for (int i = 0; i < s.cpus; i++)
+ s.smpbusy[i] = doScale(s.smpbusy[i], scale, s.smptotal[i]);
+
+ s.cached = doScale(s.cached, scale, s.mtotal);
+ s.buffers = doScale(s.buffers, scale, s.mtotal);
+ s.used = doScale(s.used, scale, s.mtotal);
+ s.mkernel = doScale(s.mkernel, scale, s.mtotal);
+ makeMBytes(s.mtotal);
+
+ s.sused = doScale(s.sused, scale, s.stotal);
+ makeMBytes(s.stotal);
+
+ return s;
+}
+
diff --git a/kicker-applets/ktimemon/sample.h b/kicker-applets/ktimemon/sample.h
new file mode 100644
index 0000000..b4a0723
--- /dev/null
+++ b/kicker-applets/ktimemon/sample.h
@@ -0,0 +1,94 @@
+/* -*- C++ -*- */
+
+/**********************************************************************/
+/* TimeMon (c) 1994 Helmut Maierhofer */
+/* KDE-ified M. Maierhofer 1998 */
+/**********************************************************************/
+
+/*
+ * sample.h
+ *
+ * Definitions for the system dependent sampling class (currently relies
+ * on the linux /proc filesystem).
+ */
+
+#ifndef SAMPLE_H
+#define SAMPLE_H
+
+// -- global constants ---------------------------------------------------
+
+#define MAX_CPU 16 // max number of CPUS in an SMP machine
+ // we get the status for
+
+// -- forward declaration ------------------------------------------------
+class KTimeMon;
+
+#ifdef USE_SOLARIS
+struct kstat_ctl;
+#endif
+
+// -- class declaration --------------------------------------------------
+
+/*
+ * KSample
+ *
+ * This class is responsible for reading the /proc file system and parsing
+ * the system information.
+ */
+class KSample {
+public:
+ // -- Sample declaration -----------------------------------------------
+ struct Sample {
+ unsigned long cputotal;
+ unsigned long user, nice, kernel, iowait, idle;
+ int cpus;
+ unsigned long smptotal[MAX_CPU], smpbusy[MAX_CPU];
+ unsigned long mtotal, free, buffers, cached, mkernel, used;
+ unsigned long stotal, sused, sfree;
+
+ void fill(unsigned scale); // fill sample with some fake values
+ };
+
+ struct MemStats {
+ const char *name;
+ unsigned long *stat;
+ };
+
+ KSample(KTimeMon *timemon, bool autoScale, unsigned pageScale,
+ unsigned swapScale, unsigned ctxScale);
+ virtual ~KSample();
+
+ void setScaling(bool autoScale, unsigned pageScale,
+ unsigned swapScale, unsigned ctxScale);
+
+ Sample getSample(unsigned scale); // returns the current sample
+ Sample getRawSample(); // returns unscaled sample
+ void updateSample(); // updates the internally stored sample
+
+private:
+ void readSample(); // reads a new sample from /proc
+ unsigned long doScale(unsigned long value, unsigned scale1,
+ unsigned long scale2);
+ // converts pages to MB
+ void makeMBytes(unsigned long &pages);
+
+ void fatal(const QString& msg);
+ void nonfatal(const QString& msg);
+
+ KTimeMon *timemon;
+#ifdef __linux__
+ int memFD, statFD;
+#elif defined(USE_SOLARIS)
+ struct kstat_ctl *kc;
+ bool warned;
+#endif
+#if defined(USE_SOLARIS) || defined(__osf__)
+ unsigned long pagesPerMB;
+#endif
+ Sample sample, oldSample;
+ unsigned pageScale, swapScale, cxScale;
+ bool autoscale;
+ struct MemStats memstats[7];
+};
+
+#endif // SAMPLE_H
diff --git a/kicker-applets/ktimemon/timemon.cc b/kicker-applets/ktimemon/timemon.cc
new file mode 100644
index 0000000..84b0e79
--- /dev/null
+++ b/kicker-applets/ktimemon/timemon.cc
@@ -0,0 +1,435 @@
+
+/**********************************************************************/
+/* TimeMon (c) 1994 Helmut Maierhofer */
+/* KDE-ified M. Maierhofer 1998 */
+/* maintained by Dirk A. Mueller <mueller@kde.org> */
+/**********************************************************************/
+
+/*
+ * timemon.h
+ *
+ * Definitions for the timemon widget.
+ */
+
+#include <config.h>
+
+#include <qpainter.h>
+#include <qtimer.h>
+#include <qtooltip.h>
+
+#include <kconfig.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <khelpmenu.h>
+#include <kpopupmenu.h>
+#include <kprocess.h>
+#include <kmessagebox.h>
+#include <kdebug.h>
+
+#include "timemon.h"
+#include "confdlg.h"
+#include "sample.h"
+
+#include "timemon.moc"
+#include <stdio.h>
+
+extern "C"
+{
+ KDE_EXPORT KPanelApplet* init(QWidget *parent, const QString& configFile)
+ {
+ KGlobal::locale()->insertCatalogue("ktimemon");
+ KTimeMon *mon = new KTimeMon(configFile, KPanelApplet::Normal,
+ KPanelApplet::Preferences, parent, "ktimemon");
+ return mon;
+ }
+}
+
+// Update colour settings with the new ones from the config dialog.
+void KTimeMon::updateConfig(KConfDialog *d)
+{
+ kernelColour = d->getKernelColour();
+ userColour = d->getUserColour();
+ iowaitColour = d->getIOWaitColour();
+ niceColour = d->getNiceColour();
+ cachedColour = d->getCachedColour();
+ usedColour = d->getUsedColour();
+ buffersColour = d->getBuffersColour();
+ mkernelColour = d->getMKernelColour();
+ swapColour = d->getSwapColour();
+ bgColour = d->getBgColour();
+}
+
+// -----------------------------------------------------------------------------
+// some KPanelApplet API functions
+
+int KTimeMon::widthForHeight(int height) const
+{
+ int s = (int) (vertical ? 2/3.*height : height);
+ return s>=18? s : 18;
+}
+
+
+int KTimeMon::heightForWidth(int width) const
+{
+ int s = (int) (vertical ? width : 2/3.*width);
+ return s>=18? s : 18;
+}
+
+void KTimeMon::preferences()
+{
+ configure();
+}
+
+
+// -----------------------------------------------------------------------------
+// Repaint the object; get the current sample and paint the bar graphs
+// correspondingly. Use a pixmap to minimise flicker.
+
+void KTimeMon::paintEvent(QPaintEvent *)
+{
+ int w, h, x, y, b, r;
+
+ w = vertical ? width() : height();
+ h = vertical ? height() : width();
+
+ r = w; // remaining height
+
+ x = 0;
+
+ KSample::Sample s;
+
+ if (sample != 0)
+ s = sample->getSample(h);
+ else
+ s.fill(h);
+
+ QPixmap pixmap(width(), height());
+ pixmap.fill(this, 0, 0);
+
+ QPainter painter(&pixmap);
+
+ b = r / 3; // bar width
+ r -= b;
+
+ if (bgColour != colorGroup().background())
+ {
+ paintRect(x, 0, b, h, bgColour, &painter);
+ }
+
+ y = h - s.kernel; paintRect(x, y, b, s.kernel, kernelColour, &painter);
+ y -= s.iowait; paintRect(x, y, b, s.iowait, iowaitColour, &painter);
+ y -= s.user; paintRect(x, y, b, s.user, userColour, &painter);
+ y -= s.nice; paintRect(x, y, b, s.nice, niceColour, &painter);
+
+ x += b;
+ b = r / 2;
+ r -= b;
+
+ if (bgColour != colorGroup().background())
+ {
+ paintRect(x, 0, b, h, bgColour, &painter);
+ }
+
+ y = h - s.mkernel; paintRect(x, y, b, s.mkernel, mkernelColour, &painter);
+ y -= s.used; paintRect(x, y, b, s.used, usedColour, &painter);
+ y -= s.buffers; paintRect(x, y, b, s.buffers, buffersColour, &painter);
+ y -= s.cached; paintRect(x, y, b, s.cached, cachedColour, &painter);
+
+ x += b;
+ b = r;
+
+ if (bgColour != colorGroup().background())
+ {
+ paintRect(x, 0, b, h, bgColour, &painter);
+ }
+
+ y = h - s.sused; paintRect(x, y, b, s.sused, swapColour, &painter);
+ painter.end();
+
+ bitBlt(this, 0, 0, &pixmap);
+}
+
+// -----------------------------------------------------------------------------
+// Draw part of a bar, depending on the bar orientation.
+
+void KTimeMon::paintRect(int x, int y, int w, int h, QColor c, QPainter *p)
+{
+ if (vertical)
+ p->fillRect(x, y, w, h, c);
+ else
+ p->fillRect(width() - y - h, x, h, w, c);
+}
+
+// Show a tool-tip with some status information.
+void KTimeMon::maybeTip(const QPoint& p)
+{
+ if (sample == 0) return; // no associated sample...
+ if(!rect().contains(p)) return;
+
+ KSample::Sample s = sample->getSample(100); // scale to 100(%)
+ int idle = 100 - s.kernel - s.user - s.nice;
+ if ( idle < 0 )
+ idle = 0;
+ QString str = i18n("cpu: %1% idle\nmem: %2 MB %3% free\nswap: %4 MB %5% free")
+ .arg(idle)
+ .arg(KGlobal::locale()->formatNumber(s.used/100.*s.mtotal, 0))
+ .arg(100-s.used)
+ .arg(KGlobal::locale()->formatNumber(s.stotal, 0))
+ .arg(100-s.sused);
+
+ tip(rect(), str);
+}
+
+// -- KTimeMon definition ------------------------------------------------
+
+// Initialise the member variables, read the configuration data base,
+// set up the widget, and start the timer.
+KTimeMon::KTimeMon(const QString& configFile, Type type, int actions,
+ QWidget *parent, const char *name)
+ : KPanelApplet(configFile, type, actions, parent, name, WRepaintNoErase), QToolTip(this),
+ configDialog(0), bgProcess(0),
+ kernelColour("red1"), userColour("blue"),
+ niceColour("yellow"), iowaitColour("darkgreen"),
+ usedColour("blue1"), buffersColour("yellow"),
+ cachedColour("darkgreen"), mkernelColour("red1"),
+ swapColour("cyan3"), bgColour(colorGroup().background())
+{
+ mouseAction[0] = NOTHING;
+ mouseAction[1] = NOTHING;
+ mouseAction[2] = MENU;
+
+ KConfig* conf = config();
+ conf->setGroup("Parameters");
+ interval = conf->readUnsignedNumEntry("Interval", 500);
+ autoScale = conf->readBoolEntry("AutoScale", true);
+
+ pageScale = conf->readUnsignedNumEntry("PageScale", 10);
+ swapScale = conf->readUnsignedNumEntry("SwapScale", 5);
+ ctxScale = conf->readUnsignedNumEntry("ContextScale", 300);
+ for (int i = 0; i < MAX_MOUSE_ACTIONS; i++) {
+ QString n;
+ n.setNum(i);
+
+ mouseAction[i] = (MouseAction)
+ conf->readUnsignedNumEntry(QString("MouseAction")+n, mouseAction[i]);
+ mouseActionCommand[i] = conf->readPathEntry(QString("MouseActionCommand")+n);
+ }
+
+ conf->setGroup("Interface");
+ kernelColour = conf->readColorEntry("KernelColour", &kernelColour);
+ userColour = conf->readColorEntry("UserColour", &userColour);
+ niceColour = conf->readColorEntry("NiceColour", &niceColour);
+ iowaitColour = conf->readColorEntry("IOWaitColour", &iowaitColour);
+ cachedColour = conf->readColorEntry("CachedColour", &cachedColour);
+ usedColour = conf->readColorEntry("UsedColour", &usedColour);
+ buffersColour = conf->readColorEntry("BuffersColour", &buffersColour);
+ swapColour = conf->readColorEntry("SwapColour", &swapColour);
+ mkernelColour = conf->readColorEntry("MKernelColour", &mkernelColour);
+ bgColour = conf->readColorEntry("BgColour", &bgColour);
+
+ vertical = conf->readBoolEntry("Vertical", true);
+
+ timer = new QTimer(this);
+ connect(timer, SIGNAL(timeout()), this, SLOT(timeout()));
+ timer->start(interval);
+
+ sample = new KSample(this, autoScale, pageScale, swapScale, ctxScale);
+
+ QString aboutmsg = i18n("KTimeMon for KDE\n"
+ "Maintained by Dirk A. Mueller <dmuell@gmx.net>\n"
+ "Written by M. Maierhofer (m.maierhofer@tees.ac.uk)\n"
+ "Based on timemon by H. Maierhofer");
+
+ hmenu = new KHelpMenu(this, aboutmsg);
+ menu = new KPopupMenu(this);
+
+ menu->insertTitle( SmallIcon( "ktimemon" ), i18n( "System Monitor" ) ) ;
+ menu->insertItem(i18n("Horizontal Bars"), 4);
+ menu->insertItem(SmallIcon( "configure" ), i18n( "Preferences..." ), 2);
+ menu->insertSeparator();
+ menu->insertItem(SmallIcon( "help" ), i18n("Help"), hmenu->menu(), 1);
+
+ menu->connectItem(2, this, SLOT(configure()));
+ menu->connectItem(4, this, SLOT(orientation()));
+
+ menu->setCheckable(true);
+
+ vertical = !vertical; // and similar for orientation
+ orientation();
+}
+
+// -----------------------------------------------------------------------------
+
+// delete the member variables
+KTimeMon::~KTimeMon()
+{
+ delete sample;
+ delete bgProcess;
+ KGlobal::locale()->removeCatalogue("ktimemon");
+}
+
+
+// Apply the settings from the configuration dialog and save them.
+void KTimeMon::apply()
+{
+ stop();
+ interval = configDialog->getInterval();
+ cont();
+
+ updateConfig(configDialog);
+
+ sample->setScaling(configDialog->getAutoScale(),
+ configDialog->getPageScale(),
+ configDialog->getSwapScale(),
+ configDialog->getCtxScale());
+
+ for (int i = 0; i < MAX_MOUSE_ACTIONS; i++) {
+ mouseAction[i] = (MouseAction) configDialog->getMouseAction(i);
+ mouseActionCommand[i] = configDialog->getMouseActionCommand(i);
+ }
+
+ update();
+ writeConfiguration();
+}
+
+void KTimeMon::stop()
+{
+ timer->stop();
+}
+
+void KTimeMon::cont()
+{
+ timer->start(interval);
+}
+
+// Dump the current configuration entries to the data base.
+void KTimeMon::writeConfiguration()
+{
+ KConfig* conf = config();
+ conf->setGroup("Interface");
+ conf->writeEntry("KernelColour", kernelColour);
+ conf->writeEntry("UserColour", userColour);
+ conf->writeEntry("NiceColour", niceColour);
+ conf->writeEntry("IOWaitColour", iowaitColour);
+ conf->writeEntry("CachedColour", cachedColour);
+ conf->writeEntry("UsedColour", usedColour);
+ conf->writeEntry("BuffersColour", buffersColour);
+ conf->writeEntry("MKernelColour", mkernelColour);
+ conf->writeEntry("SwapColour", swapColour);
+ conf->writeEntry("BgColour", bgColour);
+ conf->writeEntry("Mode", true);
+ conf->writeEntry("Vertical", vertical);
+
+ conf->setGroup("Parameters");
+ conf->writeEntry("Interval", interval);
+ conf->writeEntry("AutoScale", autoScale);
+ conf->writeEntry("PageScale", pageScale);
+ conf->writeEntry("SwapScale", swapScale);
+ conf->writeEntry("ContextScale", ctxScale);
+ conf->writeEntry("WidgetSize", size());
+ for (int i = 0; i < MAX_MOUSE_ACTIONS; i++) {
+ QString n;
+ n.setNum(i);
+
+ conf->writeEntry(QString("MouseAction")+n, (unsigned)mouseAction[i]);
+ conf->writePathEntry(QString("MouseActionCommand")+n, mouseActionCommand[i]);
+ }
+ conf->sync();
+}
+
+// Make the KSample object update its internal sample and repaint the
+// object.
+void KTimeMon::timeout()
+{
+ sample->updateSample();
+ update();
+}
+
+// This is called when the session management strikes, and also when the
+// main program exits with a code of 0 (i.e. there was no error).
+void KTimeMon::save()
+{
+ writeConfiguration();
+}
+
+// -----------------------------------------------------------------------------
+// Update the configuration dialog with the current values and show it.
+
+void KTimeMon::configure()
+{
+ if (configDialog == 0) configDialog = new KConfDialog(this);
+ configDialog->update();
+ configDialog->show();
+}
+
+// -----------------------------------------------------------------------------
+// Change the orientation of the status bars
+
+void KTimeMon::orientation()
+{
+ vertical = !vertical;
+
+ KConfig* conf = config();
+ conf->setGroup("Interface");
+ conf->writeEntry("Vertical", vertical);
+
+ menu->setItemChecked(4, !vertical);
+
+ update();
+ emit updateLayout();
+}
+
+// Pop up the menu when the appropriate button has been pressed.
+void KTimeMon::mousePressEvent(QMouseEvent *event)
+{
+ if (event == 0) return;
+
+ int index = -1;
+ if (event->button() == LeftButton) index = 0;
+ else if (event->button() == MidButton) index = 1;
+ else if (event->button() == RightButton) index = 2;
+
+ if (index == -1) return;
+
+ switch (mouseAction[index]) {
+ case NOTHING:
+ break;
+ case SWITCH:
+ break;
+ case MENU:
+ menu->popup(mapToGlobal(event->pos()));
+ break;
+ case COMMAND:
+ runCommand(index);
+ break;
+ }
+}
+
+// Start the given command
+void KTimeMon::runCommand(int index)
+{
+ // just in case it still hangs around
+ delete bgProcess;
+
+ bgProcess = new KShellProcess;
+ *bgProcess << mouseActionCommand[index];
+ connect(bgProcess, SIGNAL(receivedStderr(KProcess *, char *, int)),
+ this, SLOT(commandStderr(KProcess *, char *, int)));
+ bgProcess->start(KProcess::DontCare, KProcess::Stderr);
+}
+
+// -----------------------------------------------------------------------------
+// Check if there is any diagnostic output (command not found or such)
+
+void KTimeMon::commandStderr(KProcess * /*proc*/, char *buffer, int /*length*/)
+{
+ QString msgbuf;
+
+ msgbuf = i18n("Got diagnostic output from child command:\n\n");
+ msgbuf += QString::fromLocal8Bit(buffer);
+
+ KMessageBox::information(this, msgbuf);
+}
+
+
+// -----------------------------------------------------------------------------
diff --git a/kicker-applets/ktimemon/timemon.h b/kicker-applets/ktimemon/timemon.h
new file mode 100644
index 0000000..8f5664c
--- /dev/null
+++ b/kicker-applets/ktimemon/timemon.h
@@ -0,0 +1,107 @@
+/* -*- C++ -*- */
+
+/**********************************************************************/
+/* TimeMon (c) 1994 Helmut Maierhofer */
+/* KDE-ified M. Maierhofer 1998 */
+/* maintained by Dirk A. Mueller <mueller@kde.org */
+/**********************************************************************/
+
+/*
+ * timemon.h
+ *
+ * Definitions for the timemon widget.
+ */
+
+#ifndef TIMEMON_H
+#define TIMEMON_H
+
+#include <qtooltip.h>
+#include <kiconloader.h>
+#include <kpanelapplet.h>
+
+// -- global constants ---------------------------------------------------
+
+const int MAX_MOUSE_ACTIONS = 3; // event handlers for the three buttons only
+
+// -- forward declaration ------------------------------------------------
+class KSample;
+class KConfDialog;
+class QPaintEvent;
+class QMouseEvent;
+class QPainter;
+class KProcess;
+class KShellProcess;
+class KHelpMenu;
+class KPopupMenu;
+
+// -- KTimeMon declaration -----------------------------------------------
+
+/*
+ * KTimeMon
+ *
+ * This is the main widget of the application. It handles the configuration
+ * dialog and may have an associated KTimeMonWidget in the panel (in which
+ * case it hides itself).
+ */
+
+class KTimeMon : public KPanelApplet, QToolTip {
+ Q_OBJECT
+public:
+ enum MouseAction { NOTHING, SWITCH, MENU, COMMAND };
+
+ KTimeMon(const QString& configFile, Type t = Normal, int actions = 0,
+ QWidget *parent = 0, const char *name = 0);
+ virtual ~KTimeMon();
+
+ void writeConfiguration(); // write back the configuration data
+
+ // reimplemented from KPanelApplet
+ virtual int widthForHeight(int height) const;
+ virtual int heightForWidth(int width) const;
+
+ virtual void preferences();
+
+ void stop();
+ void cont();
+
+public slots:
+ void timeout(); // timer expired
+ void save(); // session management callback
+ void apply(); // apply configuration information
+
+protected:
+ virtual void maybeTip(const QPoint&);
+ virtual void mousePressEvent(QMouseEvent *event);
+ virtual void updateConfig(KConfDialog *d);
+ virtual void paintEvent(QPaintEvent *event);
+
+private slots: // called from the menu
+ void configure(); // show the configuration dialog
+ void orientation(); // switch vertical/horizontal orientation
+ void commandStderr(KProcess *proc, char *buffer, int length);
+
+private:
+ void runCommand(int index);
+ void paintRect(int x, int y, int w, int h, QColor c, QPainter *p);
+
+ unsigned interval;
+ bool autoScale;
+ unsigned pageScale, swapScale, ctxScale;
+ KPopupMenu* menu;
+ KHelpMenu* hmenu;
+ QTimer* timer;
+ KConfDialog *configDialog;
+ MouseAction mouseAction[MAX_MOUSE_ACTIONS];
+ QString mouseActionCommand[MAX_MOUSE_ACTIONS];
+ KShellProcess *bgProcess;
+
+ KSample *sample;
+ QColor kernelColour, userColour, niceColour, iowaitColour;
+ QColor usedColour, buffersColour, cachedColour, mkernelColour;
+ QColor swapColour, bgColour;
+ bool vertical, tooltip;
+
+ friend class KConfDialog;
+};
+
+#endif // TIMEMON_H
diff --git a/kicker-applets/math/Makefile.am b/kicker-applets/math/Makefile.am
new file mode 100644
index 0000000..da94ffb
--- /dev/null
+++ b/kicker-applets/math/Makefile.am
@@ -0,0 +1,19 @@
+INCLUDES = $(all_includes)
+
+kde_module_LTLIBRARIES = math_panelapplet.la
+
+math_panelapplet_la_SOURCES = mathapplet.cpp parser.cpp
+
+METASOURCES = mathapplet.moc
+noinst_HEADERS = mathapplet.h parser.h
+
+lnkdir = $(kde_datadir)/kicker/applets
+lnk_DATA = mathapplet.desktop
+
+EXTRA_DIST = $(lnk_DATA)
+
+math_panelapplet_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+math_panelapplet_la_LIBADD = $(LIB_KSYCOCA) $(LIB_KDEUI)
+
+messages:
+ $(XGETTEXT) *.cpp *.h -o $(podir)/kmathapplet.pot
diff --git a/kicker-applets/math/mathapplet.cpp b/kicker-applets/math/mathapplet.cpp
new file mode 100644
index 0000000..b4966b2
--- /dev/null
+++ b/kicker-applets/math/mathapplet.cpp
@@ -0,0 +1,285 @@
+/*****************************************************************
+
+Based on code 'Run' applet code, copyright (c) 2000 Matthias Elter <elter@kde.org>
+
+Modifications made by Andrew Coles, 2004 <andrew_coles@yahoo.co.uk>
+
+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 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.
+
+******************************************************************/
+
+#include <qlabel.h>
+#include <qfont.h>
+#include <qstringlist.h>
+#include <qpushbutton.h>
+#include <qhbox.h>
+
+#include <kapplication.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kcombobox.h>
+#include <kurifilter.h>
+#include <kdialog.h>
+#include <krun.h>
+#include <kmessagebox.h>
+#include <kpopupmenu.h>
+
+#include "parser.h"
+
+
+
+#include "mathapplet.h"
+#include "mathapplet.moc"
+
+extern "C"
+{
+ KDE_EXPORT KPanelApplet* init(QWidget *parent, const QString& configFile)
+ {
+ KGlobal::locale()->insertCatalogue("kmathapplet");
+ return new MathApplet(configFile, KPanelApplet::Stretch, 0, parent, "kmathapplet");
+ }
+}
+
+MathApplet::MathApplet(const QString& configFile, Type type, int actions,
+ QWidget *parent, const char *name)
+ : KPanelApplet(configFile, type, actions, parent, name),
+ m_hasFocus(false)
+{
+ // setBackgroundMode(X11ParentRelative);
+ setBackgroundOrigin( AncestorOrigin );
+ // setup label
+ _label = new QLabel(i18n("Evaluate:"), this);
+ QFont f(_label->font());
+ f.setPixelSize(12);
+// _label->setBackgroundMode(X11ParentRelative);
+ _label->setBackgroundOrigin( AncestorOrigin );
+ _label->setFixedHeight(14);
+ _label->setFont(f);
+
+ // setup popup button
+ _btn = new QPushButton(this);
+ f = _btn->font();
+ f.setPixelSize(12);
+ _btn->setFont(f);
+ connect(_btn, SIGNAL(clicked()), SLOT(popup_combo()));
+
+ // setup history combo
+ _input = new KHistoryCombo(this);
+ _input->setFocus();
+ _input->clearEdit();
+ watchForFocus(_input->lineEdit());
+ connect(_input, SIGNAL(activated(const QString&)),
+ SLOT(evaluate(const QString&)));
+
+ initContextMenu();
+ useDegrees();
+
+ KConfig *c = config();
+ c->setGroup("General");
+
+
+ // restore history and completion list
+ QStringList list = c->readListEntry("Completion list");
+ _input->completionObject()->setItems(list);
+ list = c->readListEntry("History list");
+ _input->setHistoryItems(list);
+ int mode = c->readNumEntry( "CompletionMode", KGlobalSettings::completionMode() );
+ _input->setCompletionMode( (KGlobalSettings::Completion) mode );
+
+ _hbox = new QHBox( 0, 0, WStyle_Customize | WType_Popup );
+ _hbox->setFixedSize(120, 22);
+
+
+}
+
+void MathApplet::initContextMenu()
+{
+ mContextMenu = new KPopupMenu(this);
+ mContextMenu->setCheckable(true);
+ mContextMenu->insertItem(i18n("Use &Degrees"), this, SLOT(useDegrees()), 0, 0, 0);
+ mContextMenu->insertItem(i18n("Use &Radians"), this, SLOT(useRadians()), 0, 1, 1);
+ setCustomMenu(mContextMenu);
+}
+
+
+MathApplet::~MathApplet()
+{
+ KConfig *c = config();
+ c->setGroup("General");
+
+ // save history and completion list
+ QStringList list = _input->completionObject()->items();
+ c->writeEntry("Completion list", list);
+ list = _input->historyItems();
+ c->writeEntry("History list", list);
+ c->writeEntry( "CompletionMode", (int) _input->completionMode() );
+ c->sync();
+
+ KGlobal::locale()->removeCatalogue("kmathapplet");
+}
+
+void MathApplet::useDegrees() {
+
+ mContextMenu->setItemChecked(0, true);
+ mContextMenu->setItemChecked(1, false);
+ Parser dummy;
+ dummy.setAngleMode(1);
+}
+
+void MathApplet::useRadians() {
+ mContextMenu->setItemChecked(0, false);
+ mContextMenu->setItemChecked(1, true);
+ Parser dummy;
+ dummy.setAngleMode(0);
+}
+
+void MathApplet::resizeEvent(QResizeEvent*)
+{
+ if(orientation() == Horizontal)
+ {
+ _btn->hide();
+ _input->reparent(this, QPoint(0,0), true);
+ _label->setGeometry(0,0, width(), _label->height());
+
+ if(height() >= _input->sizeHint().height() + _label->height())
+ {
+ int inputVOffset = height() - _input->sizeHint().height() - 2;
+ int labelHeight = _label->sizeHint().height();
+ _label->setGeometry(0, inputVOffset - labelHeight,
+ width(), labelHeight);
+ _input->setGeometry(0, inputVOffset,
+ width(), _input->sizeHint().height());
+ _label->show();
+ }
+ else
+ {
+ _label->hide();
+
+ // make it as high as the combobox naturally wants to be
+ // but no taller than the panel is!
+ // don't forget to center it vertically either.
+ int newHeight = _input->sizeHint().height();
+ if (newHeight > height())
+ newHeight = height();
+ _input->setGeometry(0, (height() - newHeight) / 2,
+ width(), newHeight);
+ }
+ }
+ else
+ {
+ _btn->show();
+ _btn->setFixedSize(width(), 22);
+ _input->reparent( _hbox, QPoint(0, 0), false);
+ _label->hide();
+ }
+ setButtonText();
+}
+
+void MathApplet::positionChange(KPanelApplet::Position)
+{
+ setButtonText();
+}
+
+void MathApplet::setButtonText()
+{
+ QString t;
+
+ if (position() == pLeft)
+ {
+ if (width() >= 42)
+ t = i18n("< Eval");
+ else
+ t = "<";
+ }
+ else
+ {
+ if(width() >= 42)
+ t = i18n("Eval >");
+ else
+ t = ">";
+ }
+
+ _btn->setText(t);
+}
+
+int MathApplet::widthForHeight(int ) const
+{
+ return 110;
+}
+
+int MathApplet::heightForWidth(int ) const
+{
+ return 22;
+}
+
+void MathApplet::popup_combo()
+{
+ QPoint p;
+ if (position() == pLeft)
+ p = mapToGlobal(QPoint(-_input->width()-1, 0));
+ else
+ p = mapToGlobal(QPoint(width()+1, 0));
+ _hbox->move(p);
+ _hbox->show();
+ _input->setFocus();
+}
+
+void MathApplet::evaluate(const QString& command)
+{
+ QString exec;
+
+ Parser evaluator;
+
+ kapp->propagateSessionManager();
+
+ _input->addToHistory(command);
+
+
+ QString cmd = command;
+
+ // Nothing interesting. Quit!
+ if ( cmd.isEmpty() ){
+ KMessageBox::sorry(0L, i18n("You have to enter an expression to be evaluated first."));
+ needsFocus(true);
+ } else {
+ double answer = evaluator.eval(command);
+ if (evaluator.errmsg() == 0) {
+ QString ansAsString = QString::number(answer);
+ _input->clearEdit();
+ _input->setEditText(ansAsString);
+ } else {
+ _input->removeFromHistory(_input->currentText());
+ needsFocus(true);
+ }
+ }
+
+ if (orientation() == Vertical)
+ _hbox->hide();
+}
+
+void MathApplet::mousePressEvent(QMouseEvent *e)
+{
+ if ( e->button() != RightButton )
+ {
+ KPanelApplet::mousePressEvent( e );
+ return;
+ }
+
+ mContextMenu->exec(e->globalPos());
+}
diff --git a/kicker-applets/math/mathapplet.desktop b/kicker-applets/math/mathapplet.desktop
new file mode 100644
index 0000000..9aba622
--- /dev/null
+++ b/kicker-applets/math/mathapplet.desktop
@@ -0,0 +1,114 @@
+[Desktop Entry]
+Type=Plugin
+Name=Math Expression Evaluator
+Name[bg]=Математически изрази
+Name[bs]=Procjena matematičkih izraza
+Name[ca]=Avaluador d'expressions matemàtiques
+Name[cs]=Vyhodnocení matematického výrazu
+Name[da]=Evaluering af matematiske udtryk
+Name[de]=Auswertung mathematischer Ausdrücke
+Name[el]=Ελεγκτής εγκυρότητας μαθηματικής έκφρασης
+Name[en_GB]=Maths Expression Evaluator
+Name[eo]=Matematikesprima interpretilo
+Name[es]=Evaluador de expresiones matemáticas
+Name[et]=Matemaatikaavaldiste kontrollija
+Name[eu]=Espresio matematikoen balidatzailea
+Name[fa]=ارزیاب عبارت ریاضی
+Name[fi]=Matemaattisen lausekkeen laskija
+Name[fr]=Interpréteur d'expressions mathématique
+Name[fy]=Lytse rekkenmachine
+Name[ga]=Luachálaí Slonn Matamaiticiúil
+Name[gl]=Avaliación de Expresións Matemáticas
+Name[he]=מפענח נוסחאות מתמטיות
+Name[hi]=मैथ एक्सप्रेशन इवेल्यूएटर्स
+Name[hr]=Ocjena matematičkih izraza
+Name[hu]=Kifejezéskiértékelő
+Name[is]=Algebrureiknivél
+Name[it]=Disegnatore di funzioni matematiche
+Name[ja]=数学的表現の評価者
+Name[ka]=მათემატიკური გამოსახულებების გამომთვლელი
+Name[kk]=Математикалық өрнегін есептеу
+Name[km]=កម្មវិធី​វាយ​តម្លៃ​កន្សោម​ពិជគណិត
+Name[lt]=Matematinių išraiškų vertinimo priemonė
+Name[mk]=Пресметувач на математички изрази
+Name[ms]=Penilaian Ungkapan Matematik
+Name[nb]=Matematikkberegner
+Name[nds]=Mathemaatsche Utdrück utreken
+Name[ne]=गणित अभिव्यक्ति मुल्याङ्कनकर्ता
+Name[nl]=Kleine rekenmachine
+Name[nn]=Matteuttrykkevaluerar
+Name[pl]=Program wyliczający wyrażenia matematyczne
+Name[pt]=Avaliação de Expressões Matemáticas
+Name[pt_BR]=Validador de Expressões Matemáticas
+Name[ru]=Вычисление математических выражений
+Name[sk]=Vyhodnotenie matematického výrazu
+Name[sl]=Vrednotenje matematičnih izrazov
+Name[sr]=Рачунар математичких израза
+Name[sr@Latn]=Računar matematičkih izraza
+Name[sv]=Utvärdering av matematiska uttryck
+Name[ta]=கணிதத் தொடர் மதிப்பிடு
+Name[tg]=Тафтиши ифодаҳои математикӣ
+Name[tr]=Matematiksel İşlem Değerlendiricisi
+Name[uk]=Перевірка математичних виразів
+Name[uz]=Matematik ifodalarni hisoblagich
+Name[uz@cyrillic]=Математик ифодаларни ҳисоблагич
+Name[vi]=Bộ định giá biểu thức toán học
+Name[zh_CN]=数学表达式计算器
+Name[zh_TW]=數學運算模擬器
+Comment=A mathematical expression evaluator
+Comment[bg]=Изчисление на математически изрази
+Comment[bs]=Procjena matematičkih izraza
+Comment[ca]=Un avaluador d'expressions matemàtiques
+Comment[cs]=Program pro vyhodnocování matematických výrazů
+Comment[da]=Til evaluering af matematiske udtryk
+Comment[de]=Auswerten von mathematischen Ausdrücken
+Comment[el]=Ένας ελεγκτής εγκυρότητας μαθηματικών εκφράσεων
+Comment[eo]=Matematikesprima interpretilo
+Comment[es]=Un evaluador de expresiones matemáticas
+Comment[et]=Matemaatikaavaldiste kontrollija
+Comment[eu]=Espresio matematikoen ebaluatzailea
+Comment[fa]=ارزیاب عبارتهای ریاضی
+Comment[fi]=Matemaattisen lausekkeen laskija
+Comment[fr]=Un interpréteur d'expressions mathématiques
+Comment[fy]=In applet om wiskundige útdrukkingen te evaluearjen
+Comment[ga]=Luachálaí slonn matamaiticiúil
+Comment[gl]=Un avaliador de expresións matemáticas
+Comment[he]=מפענח נוסחאות מתמטיות
+Comment[hi]=एक मैथमेटिकल एक्सप्रेशन इवेल्यूएटर
+Comment[hr]=Ocjenjivanje matematičkih izraza
+Comment[hu]=Matematikai kifejezések kiszámítására alkalmas program
+Comment[is]=Algebrureiknivél
+Comment[it]=Uno strumento per disegnare funzioni matematiche
+Comment[ja]=数学的表現の評価者
+Comment[ka]=მათემატიკური გამოსახულებების გამომთვლელი
+Comment[kk]=Математикалық өрнекті есептеп шығару
+Comment[km]=កម្មវិធី​វាយ​តម្លៃ​កន្សោម​ពិជ​គណិត
+Comment[lt]=Matematinių išraiškų vertinimo priemonė
+Comment[mk]=Пресметување математички изрази
+Comment[ms]=Penilai ungkapan matematik
+Comment[nb]=En beregner for matematiske uttrykk
+Comment[nds]=Utreken vun mathemaatsche Utdrück
+Comment[ne]=एउटा गणितिय अभिव्यक्ति मुल्याङ्कनकर्ता
+Comment[nl]=Een applet waarmee u wiskundige uitdrukkingen kunt evalueren
+Comment[nn]=Ein utreknar for matematiske uttrykk
+Comment[pl]=Program wyliczający wyrażenia matematyczne
+Comment[pt]=Um avaliador de expressões matemáticas
+Comment[pt_BR]=Um validador de expressões
+Comment[ru]=Вычисление математических выражений
+Comment[sk]=Program pre vyhodnotenie matematických výrazov
+Comment[sl]=Vrednotenje matematičnih izrazov
+Comment[sr]=Израчунава задате математичке изразе
+Comment[sr@Latn]=Izračunava zadate matematičke izraze
+Comment[sv]=Ett verktyg för utvärdering av matematiska uttryck
+Comment[ta]=கணிதத் தொடர் மதிப்பிடு
+Comment[tg]=Тафтиши ифодаҳои математикӣ
+Comment[tr]=Matematiksel işlem değerlendirici
+Comment[uk]=Перевірка математичних виразів
+Comment[uz]=Matematik ifodalarni hisoblagich
+Comment[uz@cyrillic]=Математик ифодаларни ҳисоблагич
+Comment[vi]=Bộ định giá biểu thức toán học
+Comment[zh_CN]=数学表达式计算器
+Comment[zh_TW]=數學運算模擬器
+Icon=math_int
+X-KDE-Library=math_panelapplet
+X-KDE-UniqueApplet=true
diff --git a/kicker-applets/math/mathapplet.h b/kicker-applets/math/mathapplet.h
new file mode 100644
index 0000000..1a918c3
--- /dev/null
+++ b/kicker-applets/math/mathapplet.h
@@ -0,0 +1,74 @@
+/*****************************************************************
+
+Based on code 'Run' applet code, copyright (c) 2000 Matthias Elter <elter@kde.org>
+
+Modifications made by Andrew Coles, 2004 <andrew_coles@yahoo.co.uk>
+
+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 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.
+
+******************************************************************/
+
+#ifndef __mathapplet_h__
+#define __mathapplet_h__
+
+#include <qstring.h>
+#include <kpanelapplet.h>
+
+class QLabel;
+class QHBox;
+class QPushButton;
+class KHistoryCombo;
+class KPopupMenu;
+
+class MathApplet : public KPanelApplet
+{
+ Q_OBJECT
+
+public:
+ MathApplet(const QString& configFile, Type t = Stretch, int actions = 0,
+ QWidget *parent = 0, const char *name = 0);
+ virtual ~MathApplet();
+
+ int widthForHeight(int height) const;
+ int heightForWidth(int width) const;
+
+protected:
+ void resizeEvent(QResizeEvent*);
+ void positionChange(KPanelApplet::Position);
+
+protected slots:
+ void evaluate(const QString&);
+ void popup_combo();
+ void setButtonText();
+ void useDegrees();
+ void useRadians();
+
+private:
+
+ void initContextMenu();
+ void mousePressEvent(QMouseEvent *e);
+
+ KHistoryCombo *_input;
+ QLabel *_label;
+ QPushButton *_btn;
+ QHBox *_hbox;
+ KPopupMenu *mContextMenu;
+ bool m_hasFocus;
+};
+
+#endif
diff --git a/kicker-applets/math/parser.cpp b/kicker-applets/math/parser.cpp
new file mode 100644
index 0000000..7d99c87
--- /dev/null
+++ b/kicker-applets/math/parser.cpp
@@ -0,0 +1,813 @@
+/*
+* Code based on parser from KmPlot - a math. function plotter for the KDE-Desktop
+*
+* Original code
+* Copyright (C) 1998, 1999 Klaus-Dieter Mller
+* 2000, 2002 kd.moeller@t-online.de
+*
+* Modifications: 2004 Andrew Coles (andrew_coles@yahoo.co.uk)
+*
+* This file is part of the KDE Project.
+* KmPlot is part of the KDE-EDU Project.
+*
+* This program is free software; you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation; either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program 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 the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*
+*/
+
+// standard c(++) includes
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+
+//KDE includes
+#include <kdebug.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+
+// local includes
+#include "parser.h"
+//#include "settings.h"
+//#include "xparser.h"
+
+double Parser::m_anglemode = 0;
+
+/// List of predefined functions.
+Parser::Mfkt Parser::mfkttab[ FANZ ]=
+{
+ {"tanh", ltanh}, // Tangens hyperbolicus
+ {"tan", ltan}, // Tangens
+ {"sqrt", sqrt}, // Square root
+ {"sqr", sqr}, // Square
+ {"sinh", lsinh}, // Sinus hyperbolicus
+ {"sin", lsin}, // Sinus
+ {"sign", sign}, // Signum
+ {"sech", sech}, // Secans hyperbolicus
+ {"sec", sec}, // Secans
+ {"log", log10}, // Logarithm base 10
+ {"ln", log}, // Logarithm base e
+ {"exp", exp}, // Exponential function base e
+ {"coth", coth}, // Co-Tangens hyperbolicus
+ {"cot", cot}, // Co-Tangens = 1/tan
+ {"cosh", lcosh}, // Cosinus hyperbolicus
+ {"cosech", cosech}, // Co-Secans hyperbolicus
+ {"cosec", cosec}, // Co-Secans
+ {"cos", lcos}, // Cosinus
+ {"artanh", artanh}, // Area-tangens hyperbolicus = inverse of tanh
+ {"arsinh", arsinh}, // Area-sinus hyperbolicus = inverse of sinh
+ {"arsech", arsech}, // Area-secans hyperbolicus = invers of sech
+ {"arctan", arctan}, // Arcus tangens = inverse of tan
+ {"arcsin", arcsin}, // Arcus sinus = inverse of sin
+ {"arcsec", arcsec}, // Arcus secans = inverse of sec
+ {"arcoth", arcoth}, // Area-co-tangens hyperbolicus = inverse of coth
+ {"arcosh", arcosh}, // Area-cosinus hyperbolicus = inverse of cosh
+ {"arcosech", arcosech}, // Area-co-secans hyperbolicus = inverse of cosech
+ {"arccot", arccot}, // Arcus co-tangens = inverse of cotan
+ {"arccosec", arccosec}, // Arcus co-secans = inverse of cosec
+ {"arccos", arccos}, // Arcus cosinus = inverse of cos
+ {"abs", fabs} // Absolute value
+};
+
+
+Parser::Parser()
+{ ps_init( UFANZ, MEMSIZE, STACKSIZE );
+}
+
+
+Parser::Parser( int anz, int m_size, int s_size )
+{ ps_init( anz, m_size, s_size );
+}
+
+
+void Parser::ps_init(int anz, int m_size, int s_size)
+{ int ix;
+
+ ufanz=anz;
+ memsize=m_size;
+ stacksize=s_size;
+ ufkt=new Ufkt[ufanz];
+ evalflg=ixa=0;
+ for(ix=0; ix<ufanz; ++ix)
+ { ufkt[ix].memsize=memsize;
+ ufkt[ix].stacksize=stacksize;
+ ufkt[ix].fname=""; //.resize(1);
+ ufkt[ix].fvar=""; //.resize(1);
+ ufkt[ix].fpar=""; //.resize(1);
+ ufkt[ix].fstr=""; //.resize(1);
+ ufkt[ix].mem=new unsigned char [memsize];
+ }
+}
+
+
+Parser::~Parser()
+{ delete [] ufkt;
+}
+
+
+Parser::Ufkt::Ufkt()
+{
+}
+
+
+Parser::Ufkt::~Ufkt()
+{ delete [] mem;
+}
+
+
+void Parser::setAngleMode(int angle)
+{ if(angle==0)
+ m_anglemode = 1;
+ else
+ m_anglemode = M_PI/180;
+}
+
+double Parser::anglemode()
+{ return m_anglemode;
+}
+
+double Parser::eval(QString str)
+{ double erg;
+
+ stack=new double [stacksize];
+ stkptr=stack;
+ evalflg=1;
+ lptr=str.latin1();
+ err=0;
+ heir1();
+ if(*lptr!=0 && err==0) err=1;
+ evalflg=0;
+ erg=*stkptr;
+ delete [] stack;
+ if(err==0)
+ { errpos=0;
+ return erg;
+ }
+ else
+ { errpos=lptr-(str.latin1())+1;
+ return 0.;
+ }
+}
+
+
+double Parser::Ufkt::fkt(double x)
+{ unsigned char token;
+ double *pd, (**pf)(double);
+ double erg, *stack, *stkptr;
+ Ufkt **puf;
+
+ mptr=mem;
+ stack=stkptr= new double [stacksize];
+ while(1)
+ { switch(token=*mptr++)
+ { case KONST: pd=(double*)mptr;
+ *stkptr=*pd++;
+ mptr=(unsigned char*)pd;
+ break;
+ case XWERT: *stkptr=x;
+ break;
+ case YWERT: *stkptr=oldy;
+ break;
+ case KWERT: *stkptr=k;
+ break;
+
+ case PUSH: ++stkptr;
+ break;
+
+ case PLUS: stkptr[-1]+=*stkptr;
+ --stkptr;
+ break;
+
+ case MINUS: stkptr[-1]-=*stkptr;
+ --stkptr;
+ break;
+
+ case MULT: stkptr[-1]*=*stkptr;
+ --stkptr;
+ break;
+
+ case DIV: if(*stkptr==0.)*(--stkptr)=HUGE_VAL;
+ else
+ { stkptr[-1]/=*stkptr;
+ --stkptr;
+ }
+ break;
+
+ case POW: stkptr[-1]=pow(*(stkptr-1), *stkptr);
+ --stkptr;
+ break;
+
+ case NEG: *stkptr=-*stkptr;
+ break;
+
+ case FKT: pf=(double(**)(double))mptr;
+ *stkptr=(*pf++)(*stkptr);
+ mptr=(unsigned char*)pf;
+ break;
+
+ case UFKT: puf=(Ufkt**)mptr;
+ *stkptr=(*puf++)->fkt(*stkptr);
+ mptr=(unsigned char*)puf;
+ break;
+
+ case ENDE: erg=*stkptr;
+ delete [] stack;
+ return erg;
+ }
+ }
+}
+
+int Parser::getNextIndex()
+{
+ int ix = 0;
+ while( ( ix < ufanz ) && !ufkt[ ix ].fname.isEmpty() ) ix++;
+ if( ix == ufanz ) ix = -1;
+ return ix;
+}
+
+int Parser::addfkt(QString str)
+{
+ int ix;
+
+ stkptr=stack=0;
+ err=0;
+ errpos=1;
+ str.remove(" " );
+ const int p1=str.find('(');
+ int p2=str.find(',');
+ const int p3=str.find(")=");
+
+ //insert '*' when it is needed
+ for(int i=p1+3; i < (int) str.length();i++)
+ {
+ if( (str.at(i).isNumber() || str.at(i).category()==QChar::Letter_Uppercase )&& ( str.at(i-1).isLetter() || str.at(i-1) == ')' ) )
+ {
+ str.insert(i,'*');
+ }
+ else if( (str.at(i).isNumber() || str.at(i) == ')' || str.at(i).category()==QChar::Letter_Uppercase) && ( str.at(i+1).isLetter() || str.at(i+1) == '(' ) )
+ {
+ str.insert(i+1,'*');
+ i++;
+ }
+ }
+
+ if(p1==-1 || p3==-1 || p1>p3)
+ { err=4;
+ return -1;
+ }
+ if ( p3+2 == (int) str.length()) //empty function
+ { err=11;
+ return -1;
+ }
+ if(p2==-1 || p2>p3) p2=p3;
+ if(getfix(str.left(p1))!=-1)
+ { err=8;
+ return -1;
+ }
+ else err=0;
+
+ if (str.mid(p1+1, p2-p1-1) == "e")
+ { err=4;
+ return -1;
+ }
+
+ for(ix=0; ix<ufanz; ++ix)
+ { if(ufkt[ix].fname.isEmpty())
+ { ufkt[ix].fname=str.left(p1);
+ ufkt[ix].fvar=str.mid(p1+1, p2-p1-1);
+ ufkt[ix].fstr=str;
+ if(p2<p3) ufkt[ix].fpar=str.mid(p2+1, p3-p2-1);
+ else ufkt[ix].fpar=""; //.resize(1);
+ break;
+ }
+ }
+
+ if(ix==ufanz)
+ { err=5;
+ return -1;
+ } // zu viele Funktionen
+
+ ixa=ix;
+ mem=mptr=ufkt[ix].mem;
+ lptr=(str.latin1())+p3+2;
+ heir1();
+ if(*lptr!=0 && err==0) err=1; // Syntaxfehler
+ addtoken(ENDE);
+
+ if(err!=0)
+ { ufkt[ix].fname=""; //.resize(1);
+ errpos=lptr-(str.latin1())+1;
+ return -1;
+ }
+
+
+ errpos=0;
+ return ix;
+}
+
+
+int Parser::delfkt(QString name)
+{ int ix;
+
+ ix=getfix(name);
+ if(ix!=-1) ufkt[ix].fname=""; //.resize(1); // Name l�chen
+ return ix;
+}
+
+
+int Parser::delfkt(int ix)
+{ if(ix<0 || ix>=ufanz) return -1; // ungltiger Index
+
+ ufkt[ix].fname=""; //.resize(1); // Name l�chen
+ return ix;
+}
+
+
+double Parser::fkt(QString name, double x)
+{ int ix;
+
+ ix=getfix(name);
+ if(ix==-1) return 0.;
+
+ return ufkt[ix].fkt(x);
+}
+
+
+void Parser::heir1()
+{ char c;
+
+ heir2();
+ if(err!=0) return ;
+
+ while(1)
+ { switch(c=*lptr)
+ { default: return ;
+
+ case ' ': ++lptr;
+ continue;
+
+ case '+':
+ case '-': ++lptr;
+ addtoken(PUSH);
+ heir2();
+ if(err!=0) return ;
+ }
+
+ switch(c)
+ { case '+': addtoken(PLUS);
+ break;
+
+ case '-': addtoken(MINUS);
+ }
+ }
+}
+
+
+void Parser::heir2()
+{ if(match("-"))
+ { heir2();
+ if(err!=0) return;
+
+ addtoken(NEG);
+ }
+
+ else heir3();
+}
+
+
+void Parser::heir3()
+{ char c;
+
+ heir4();
+ if(err!=0) return;
+
+ while(1)
+ { switch(c=*lptr)
+ { default: return ;
+
+ case ' ': ++lptr;
+ continue;
+
+ case '*':
+ case '/': ++lptr;
+ addtoken(PUSH);
+ heir4();
+ if(err!=0) return ;
+ }
+
+ switch(c)
+ { case '*': addtoken(MULT);
+ break;
+
+ case '/': addtoken(DIV);
+ }
+ }
+}
+
+
+void Parser::heir4()
+{ primary();
+ if(err!=0) return;
+
+ while(match("^"))
+ { addtoken(PUSH);
+ primary();
+ if(err!=0) return;
+ addtoken(POW);
+ }
+}
+
+
+void Parser::primary()
+{ char *p;
+ int i;
+ double w;
+
+ if(match("("))
+ { heir1();
+ if(match(")")==0) err=2; // fehlende Klammer
+ return;
+ }
+
+ for(i=0; i<FANZ; ++i)
+ { if(match(mfkttab[i].mfstr))
+ { primary();
+ addtoken(FKT);
+ addfptr(mfkttab[i].mfadr);
+ return;
+ }
+ }
+
+ for(i=0; i<ufanz; ++i)
+ { if(ufkt[i].fname[0]==0) continue;
+ if(match(ufkt[i].fname.latin1()))
+ { if(i==ixa) {err=9; return;}
+
+ primary();
+ addtoken(UFKT);
+ addfptr(&ufkt[i]);
+ return;
+ }
+ }
+ // A constant
+ if(lptr[0] >='A' && lptr[0]<='Z' )
+ { char tmp[2];
+ tmp[1] = '\0';
+ for( int i = 0; i< (int)constant.size();i++)
+ {
+ tmp[0] = constant[i].constant;
+ if ( match( tmp) )
+ {
+ addtoken(KONST);
+ addwert(constant[i].value);
+ return;
+ }
+
+ }
+ err = 10;
+ return;
+ }
+
+
+ if(match("pi"))
+ { addtoken(KONST);
+ addwert(M_PI);
+ return;
+ }
+
+ if(match("e"))
+ { addtoken(KONST);
+ addwert(M_E);
+ return;
+ }
+
+ if(match(ufkt[ixa].fvar.latin1()))
+ { addtoken(XWERT);
+ return;
+ }
+
+ if(match("y"))
+ { addtoken(YWERT);
+ return;
+ }
+
+ if(match(ufkt[ixa].fpar.latin1()))
+ { addtoken(KWERT);
+ return;
+ }
+
+ w=strtod(lptr, &p);
+ if(lptr!=p)
+ { lptr=p;
+ addtoken(KONST);
+ addwert(w);
+ }
+ else err=1; // Syntax-Fehler
+}
+
+
+int Parser::match(const char *lit)
+{ const char *p;
+
+ if(*lit==0) return 0;
+
+ while(*lptr==' ') ++lptr;
+ p=lptr;
+ while(*lit)
+ { if(*lit++!=*p++) return 0;
+ }
+ lptr=p;
+ return 1;
+}
+
+
+void Parser::addtoken(unsigned char token)
+{ if(stkptr>=stack+stacksize-1)
+ { err=7;
+ return;
+ }
+
+ if(evalflg==0)
+ { if(mptr>=&mem[memsize-10]) err=6;
+ else *mptr++=token;
+
+ switch(token)
+ { case PUSH: ++stkptr;
+ break;
+
+ case PLUS:
+ case MINUS:
+ case MULT:
+ case DIV:
+ case POW: --stkptr;
+ }
+ }
+ else switch(token)
+ { case PUSH: ++stkptr;
+ break;
+
+ case PLUS: stkptr[-1]+=*stkptr;
+ --stkptr;
+ break;
+
+ case MINUS: stkptr[-1]-=*stkptr;
+ --stkptr;
+ break;
+
+ case MULT: stkptr[-1]*=*stkptr;
+ --stkptr;
+ break;
+
+ case DIV: if(*stkptr==0.) *(--stkptr)=HUGE_VAL;
+ else
+ { stkptr[-1]/=*stkptr;
+ --stkptr;
+ }
+ break;
+
+ case POW: stkptr[-1]=pow(*(stkptr-1), *stkptr);
+ --stkptr;
+ break;
+ case NEG: *stkptr=-*stkptr;
+ }
+}
+
+
+void Parser::addwert(double x)
+{ double *pd=(double*)mptr;
+
+ if(evalflg==0)
+ { if(mptr>=&mem[memsize-10]) err=6;
+ else
+ { *pd++=x;
+ mptr=(unsigned char*)pd;
+ }
+ }
+ else *stkptr=x;
+}
+
+
+void Parser::addfptr(double(*fadr)(double))
+{ double (**pf)(double)=(double(**)(double))mptr;
+
+ if(evalflg==0)
+ { if(mptr>=&mem[memsize-10]) err=6;
+ else
+ { *pf++=fadr;
+ mptr=(unsigned char*)pf;
+ }
+ }
+ else *stkptr=(*fadr)(*stkptr);
+}
+
+
+void Parser::addfptr(Ufkt *adr)
+{ Ufkt **p=(Ufkt**)mptr;
+
+ if(evalflg==0)
+ { if(mptr>=&mem[memsize-10]) err=6;
+ else
+ { *p++=adr;
+ mptr=(unsigned char*)p;
+ }
+ }
+ else *stkptr=adr->fkt(*stkptr);
+}
+
+
+int Parser::chkfix(int ix)
+{ if(ix<0 || ix>=ufanz) return -1; // ungltiger Index
+ if(ufkt[ix].fname.isEmpty()) return -1; // keine Funktion
+ return ix;
+}
+
+
+int Parser::getfkt(int ix, QString& name, QString& str)
+{ if(ix<0 || ix>=ufanz) return -1; // ungltiger Index
+ if(ufkt[ix].fname.isEmpty()) return -1; // keine Funktion
+ name=ufkt[ix].fname.copy();
+ str=ufkt[ix].fstr.copy();
+ return ix;
+}
+
+
+int Parser::getfix(QString name)
+{ int ix;
+
+ err=0;
+ for(ix=0; ix<ufanz; ++ix)
+ { if(name==ufkt[ix].fname) return ix;
+ }
+ err=3; // Name nicht bekannt
+ return -1;
+}
+
+
+int Parser::errmsg()
+{ switch(err)
+ { case 1: KMessageBox::error(0, i18n("Parser error at position %1:\n"
+ "Syntax error").arg(QString::number(errpos)), i18n("Math Expression Evaluator"));
+ break;
+
+ case 2: KMessageBox::error(0, i18n("Parser error at position %1:\n"
+ "Missing parenthesis").arg(QString::number(errpos)), i18n("Math Expression Evaluator"));
+ break;
+
+ case 3: KMessageBox::error(0, i18n("Parser error at position %1:\n"
+ "Function name unknown").arg(QString::number(errpos)), i18n("Math Expression Evaluator"));
+ break;
+
+ case 4: KMessageBox::error(0, i18n("Parser error at position %1:\n"
+ "Void function variable").arg(QString::number(errpos)), i18n("Math Expression Evaluator"));
+ break;
+
+ case 5: KMessageBox::error(0, i18n("Parser error at position %1:\n"
+ "Too many functions").arg(QString::number(errpos)), i18n("Math Expression Evaluator"));
+ break;
+
+ case 6: KMessageBox::error(0, i18n("Parser error at position %1:\n"
+ "Token-memory overflow").arg(QString::number(errpos)), i18n("Math Expression Evaluator"));
+ break;
+
+ case 7: KMessageBox::error(0, i18n("Parser error at position %1:\n"
+ "Stack overflow").arg(QString::number(errpos)), i18n("Math Expression Evaluator"));
+ break;
+
+ case 8: KMessageBox::error(0, i18n("Parser error at position %1:\n"
+ "Name of function not free").arg(QString::number(errpos)), i18n("Math Expression Evaluator"));
+ break;
+
+ case 9: KMessageBox::error(0, i18n("Parser error at position %1:\n"
+ "recursive function not allowed").arg(QString::number(errpos)), i18n("Math Expression Evaluator"));
+ break;
+ case 10: KMessageBox::error(0, i18n("Could not find a defined constant at position %1" ).arg(QString::number(errpos)),
+ i18n("Math Expression Evaluator"));
+ break;
+ case 11: KMessageBox::error(0, i18n("Empty function"), i18n("Math Expression Evaluator"));
+ break;
+ }
+
+ return err;
+}
+
+
+double sign(double x)
+{ if(x<0.) return -1.;
+ else if(x>0.) return 1.;
+ return 0.;
+}
+
+double sqr(double x)
+{ return x*x;
+}
+
+double arsinh(double x)
+{ return log(x+sqrt(x*x+1));
+}
+
+
+double arcosh(double x)
+{ return log(x+sqrt(x*x-1));
+}
+
+
+double artanh(double x)
+{ return log((1+x)/(1-x))/2;
+}
+
+// sec, cosec, cot and their inverses
+
+double sec(double x)
+{ return (1 / cos(x*Parser::anglemode()));
+}
+
+double cosec(double x)
+{ return (1 / sin(x*Parser::anglemode()));
+}
+
+double cot(double x)
+{ return (1 / tan(x*Parser::anglemode()));
+}
+
+double arcsec(double x)
+{ if ( !Parser::anglemode() ) return ( 1/acos(x)* 180/M_PI );
+ else return acos(1/x);
+}
+
+double arccosec(double x)
+{ return asin(1/x)* 1/Parser::anglemode();
+}
+
+double arccot(double x)
+{ return atan(1/x)* 1/Parser::anglemode();
+}
+
+// sech, cosech, coth and their inverses
+
+
+double sech(double x)
+{ return (1 / cosh(x*Parser::anglemode()));
+}
+
+double cosech(double x)
+{ return (1 / sinh(x*Parser::anglemode()));
+}
+
+double coth(double x)
+{ return (1 / tanh(x*Parser::anglemode()));
+}
+
+double arsech(double x)
+{ return arcosh(1/x)* 1/Parser::anglemode();
+}
+
+double arcosech(double x)
+{ return arsinh(1/x)* 1/Parser::anglemode();
+}
+
+double arcoth(double x)
+{ return artanh(1/x)* 1/Parser::anglemode();
+}
+
+//basic trigonometry functions
+
+double lcos(double x)
+{ return cos(x*Parser::anglemode());
+}
+double lsin(double x)
+{ return sin(x*Parser::anglemode());
+}
+double ltan(double x)
+{ return tan(x*Parser::anglemode());
+}
+
+double lcosh(double x)
+{ return cosh(x*Parser::anglemode());
+}
+double lsinh(double x)
+{ return sinh(x*Parser::anglemode());
+}
+double ltanh(double x)
+{ return tanh(x*Parser::anglemode());
+}
+
+double arccos(double x)
+{ return acos(x) * 1/Parser::anglemode();
+}
+double arcsin(double x)
+{ return asin(x)* 1/Parser::anglemode();
+}
+
+double arctan(double x)
+{ return atan(x)* 1/Parser::anglemode();
+}
diff --git a/kicker-applets/math/parser.h b/kicker-applets/math/parser.h
new file mode 100644
index 0000000..44e82ba
--- /dev/null
+++ b/kicker-applets/math/parser.h
@@ -0,0 +1,241 @@
+/*
+* Code based on parser from KmPlot - a math. function plotter for the KDE-Desktop
+*
+* Original code
+* Copyright (C) 1998, 1999 Klaus-Dieter Mller
+* 2000, 2002 kd.moeller@t-online.de
+*
+* Modifications: 2004 Andrew Coles (andrew_coles@yahoo.co.uk)
+*
+* This file is part of the KDE Project.
+* KmPlot is part of the KDE-EDU Project.
+*
+* This program is free software; you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation; either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program 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 the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*
+*/
+
+/** @file parser.h
+ * \brief Contains the parser core class Parser. */
+
+// Qt includes
+#include <qstring.h>
+#include <qvaluevector.h>
+
+#ifndef parser_included
+#define parser_included
+
+// Voreinstellungen bei Verwendung des Standardkonstruktors :
+
+
+#define UFANZ 10 ///< max. count of user defined functions
+#define MEMSIZE 200 ///< memory size for tokens
+#define STACKSIZE 50 ///< stack depth
+
+//@{
+/** Token type. */
+#define KONST 0 // double value follows
+#define XWERT 1 // get x value
+#define KWERT 2 // get function parameter
+#define PUSH 3 // push value to stack
+#define PLUS 4 // add
+#define MINUS 5 // subtract
+#define MULT 6 // multiply
+#define DIV 7 // divide
+#define POW 8 // exponentiate
+#define NEG 9 // negate
+#define FKT 10 // address to function followes
+#define UFKT 11 // address to user defined function follows
+#define ENDE 12 // end of function
+#define YWERT 13 // get y value
+#define FANZ 31 // number of mathematical functions in mfkttab[]
+//@}
+
+//@{
+/** Predefined mathematical function. */
+double sign(double x);
+double sqr(double x);
+double arsinh(double x);
+double arcosh(double x);
+double artanh(double x);
+
+double sec(double x);
+double cosec(double x);
+double cot(double x);
+double arcsec(double x);
+double arccosec(double x);
+double arccot(double x);
+
+double sech(double x);
+double cosech(double x);
+double coth(double x);
+double arsech(double x);
+double arcosech(double x);
+double arcoth(double x);
+
+double lcos(double x);
+double lsin(double x);
+double ltan(double x);
+
+double lcosh(double x);
+double lsinh(double x);
+double ltanh(double x);
+
+double arccos(double x);
+double arcsin(double x);
+double arctan(double x);
+
+//@}
+
+class Constant
+{
+public:
+ Constant( char c='A', double v=0)
+ {
+ constant = c;
+ value = v;
+ }
+
+ char constant;
+ double value;
+};
+
+/** @short Parser.
+ *
+ * Tokenizes a function equation to be evaluated.
+ */
+class Parser
+{
+public:
+
+ Parser();
+ Parser(int, int, int);
+
+ ~Parser();
+
+ /// Evaluates the given expression.
+ double eval(QString);
+ /// Evaluates the function with the given name at the position.
+ double fkt(QString, double);
+ /// Evaluates the function with the given index at the position.
+ double fkt(int ix, double x) {return ufkt[ix].fkt(x);}
+ /// Adds a user defined function with the given equation.
+ int addfkt(QString);
+ /// Removes the function with the given name.
+ int delfkt(QString);
+ /// Removes the function with the given index.
+ int delfkt(int);
+ /// Returns name and expression of the function with the given index.
+ int getfkt(int, QString&, QString&);
+ /// Checks, if at the given index a function is stored.
+ int chkfix(int);
+ /// Returns the index of the function with the given name.
+ int getfix(QString);
+ /// Returns the lowest index in the array of user defined functions which is empty,
+ /// or -1, if the array is full.
+ int getNextIndex();
+ /// Shows an error message box.
+ int errmsg();
+ /// ?
+ void setparameter(int ix, double k) {ufkt[ix].k=k;}
+ /// return the angletype
+ static double anglemode();
+ /// sets the angletype. TRUE is radians and FALSE degrees
+ void setAngleMode(int);
+
+ QValueVector<Constant> constant;
+
+ /// Error codes.
+ /**
+ * The values have following meanings:
+ * \li 0 => parse success
+ * \li 1 => syntax error
+ * \li 2 => missing bracket
+ * \li 3 => function unknown
+ * \li 4 => function variable not valid
+ * \li 5 => too much functions
+ * \li 6 => memory overflow
+ * \li 7 => stack overflow
+ * \li 8 => function name allready used
+ * \li 9 => recursive function call
+ * \li 10 => didn't found the wanted constant
+ * \li 11 => emtpy function
+ */
+ int err,
+ errpos, ///< Position where the error occured.
+ ufanz; ///< Max. count of user defined functions.
+
+
+ /** User function. */
+ class Ufkt
+ {
+ public:
+ Ufkt();
+ ~Ufkt();
+ double fkt(double); ///< User defined function.
+
+ unsigned char *mem; ///< Pointer to the allocated memory for the tokens.
+ unsigned char *mptr; ///< Pointer to the token.
+ QString fname; ///< Name of the function.
+ QString fvar; ///< Dummy variable.
+ QString fpar; ///< Parameter.
+ QString fstr; ///< Function expression.
+ int memsize; ///< Size of token memory
+ int stacksize; ///< Size of the stack.
+ double k, ///< Function parameter.
+ oldy; ///< The last y-value needed for Euler's method
+ }
+ *ufkt; ///< Points to the array of user defined functions.
+
+protected:
+ /** Mathematical function. */
+ struct Mfkt
+ {
+ const char *mfstr;
+ double (*mfadr)(double);
+ };
+ static Mfkt mfkttab[FANZ];
+
+//private:
+public:
+
+ void ps_init(int, int, int),
+ heir1(),
+ heir2(),
+ heir3(),
+ heir4(),
+ primary(),
+ addtoken(unsigned char),
+ addwert(double),
+ addfptr(double(*)(double)),
+ addfptr(Ufkt*);
+ int match(const char*);
+
+ unsigned
+ char evalflg, // 0 => String wird tokenisiert
+ // 1 => String wird direkt ausgewertet
+ *mem, // Zeiger auf Speicher fr Token
+ *mptr; // Zeiger fr Token
+ const
+ char *lptr; // Zeiger fr Funktions-String
+ int memsize, // Gr�e des Tokenspeichers
+ stacksize, // Gr�e des Stack
+ ixa; // Index der aktuellen Funktion
+ double *stack, // Zeiger auf Stackanfang
+ *stkptr; // Stackpointer
+ static double m_anglemode;
+
+};
+
+#endif // parser_included
diff --git a/kicker-applets/mediacontrol/AUTHORS b/kicker-applets/mediacontrol/AUTHORS
new file mode 100644
index 0000000..b7d6d85
--- /dev/null
+++ b/kicker-applets/mediacontrol/AUTHORS
@@ -0,0 +1,5 @@
+Michael Startek <micha.startek@op.pl>
+Stefan Gehn <metz {AT} gehn {DOT} net>
+Teemu Rytilahti <teemu.rytilahti@kde-fi.org>
+Thomas Capricelli <orzel@freehackers.org>
+William Robinson <airbaggins@yahoo.co.uk>
diff --git a/kicker-applets/mediacontrol/Makefile.am b/kicker-applets/mediacontrol/Makefile.am
new file mode 100644
index 0000000..0afe266
--- /dev/null
+++ b/kicker-applets/mediacontrol/Makefile.am
@@ -0,0 +1,28 @@
+SUBDIRS = . pics
+INCLUDES = $(XMMS_INCLUDES) $(all_includes)
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = mediacontrol_panelapplet.la
+
+mediacontrol_panelapplet_la_COMPILE_FIRST = mediacontrolconfigwidget.h
+mediacontrol_panelapplet_la_SOURCES = mcslider.cpp \
+ mediacontrol.cpp playerInterface.cpp \
+ configfrontend.cpp mediacontrolconfigwidget.ui \
+ mediacontrolconfig.cpp mediacontroliface.skel \
+ noatunInterface.cpp \
+ xmmsInterface.cpp \
+ mpdInterface.cpp \
+ jukInterface.cpp \
+ amarokInterface.cpp \
+ kscdInterface.cpp \
+ simplebutton.cpp
+
+mediacontrol_panelapplet_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) $(XMMS_LIBS)
+mediacontrol_panelapplet_la_LIBADD = $(LIB_KDEUI)
+
+lnkdir = $(kde_datadir)/kicker/applets
+lnk_DATA = mediacontrol.desktop
+EXTRA_DIST = $(lnk_DATA)
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/mediacontrol.pot
diff --git a/kicker-applets/mediacontrol/README b/kicker-applets/mediacontrol/README
new file mode 100644
index 0000000..0c3acc7
--- /dev/null
+++ b/kicker-applets/mediacontrol/README
@@ -0,0 +1,28 @@
+MediaControl v0.4
+Stefan Gehn <metz AT gehn.net>
+----------------------------------------------------------------------
+
+This is a small applet for the kde-panel (kicker) to control various
+mediaplayers with.
+
+Supported players at the moment are:
+- Noatun
+- XMMS
+- JuK
+- Amarok
+- KsCD
+- more to come :)
+
+If you ask "Why another applet for xmms?" then there are a few answers for you:
+
+1. most of those applets are for XMMS _only_ and I wanted to support various
+ mediaplayers
+2. there was no applet for noatun (... and I was never able to find that noatun
+ -window on my huge desktop)
+3. many xmms-applets use skins to look like xmms itself, I really dislike that
+ on a panel
+
+The applet is still very small and can't make coffee yet but this will surely
+come one day ;)
+
+Have fun with this small and (hopefully) handy tool.
diff --git a/kicker-applets/mediacontrol/TODO b/kicker-applets/mediacontrol/TODO
new file mode 100644
index 0000000..0066900
--- /dev/null
+++ b/kicker-applets/mediacontrol/TODO
@@ -0,0 +1,7 @@
+Tooltip -> DONE (want to make it configurable)
+Themes -> DONE (need some more contributions)
+i18n -> need to find out where to put it in kde-cvs
+Drag n Drop -> DONE
+Playlist-Popup -> maybe never, what about 9000 files playlists in a popup, eh? :)
+Squelch-Support -> when squelch got its dcopiface
+more players -> hey gimme a nice interface for it and I'll add support ;)
diff --git a/kicker-applets/mediacontrol/amarokInterface.cpp b/kicker-applets/mediacontrol/amarokInterface.cpp
new file mode 100644
index 0000000..2045c12
--- /dev/null
+++ b/kicker-applets/mediacontrol/amarokInterface.cpp
@@ -0,0 +1,310 @@
+/***************************************************************************
+ Interface to access Amarok
+ -------------------
+ begin : Tue Dec 2 23:54:53 CET 2003
+ copyright : (c) 2003 by Thomas Capricelli
+ adapted from juk* (C) 2001-2002 by Stefan Gehn (metz {AT} gehn {DOT} net)
+ email : orzel@freehackers.org
+ ***************************************************************************/
+
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "amarokInterface.h"
+#include "amarokInterface.moc"
+
+#include <kdebug.h>
+#include <qstringlist.h>
+#include <qstrlist.h>
+#include <kurldrag.h>
+
+#define TIMER_FAST 250
+
+AmarokInterface::AmarokInterface() : PlayerInterface()
+{
+ mTimerValue = TIMER_FAST;
+ mAmarokTimer = new QTimer ( this, "mAmaroKTimer" );
+
+ connect(mAmarokTimer, SIGNAL(timeout()), SLOT(updateSlider()) );
+ kapp->dcopClient()->setNotifications ( true );
+
+ connect(kapp->dcopClient(), SIGNAL(applicationRegistered(const QCString&)),
+ SLOT(appRegistered(const QCString&)) );
+
+ connect(kapp->dcopClient(), SIGNAL(applicationRemoved(const QCString&)),
+ SLOT(appRemoved(const QCString&)));
+
+ QTimer::singleShot(0, this, SLOT(myInit()));
+}
+
+AmarokInterface::~AmarokInterface()
+{
+ kapp->dcopClient()->setNotifications(false);
+ delete mAmarokTimer;
+}
+
+void AmarokInterface::myInit()
+{
+ // Start the timer if amarok is already running
+ // Needed if user adds applet while running amarok
+ if ( findRunningAmarok() )
+ {
+ emit playerStarted();
+ mAmarokTimer->start(mTimerValue);
+ }
+ else
+ {
+ emit playerStopped();
+ emit newSliderPosition(0,0);
+ }
+}
+
+void AmarokInterface::appRegistered ( const QCString &appId )
+{
+ if(appId.contains("amarok",false) )
+ {
+ mAppId = appId;
+ emit playerStarted();
+ mAmarokTimer->start(mTimerValue);
+ }
+}
+
+void AmarokInterface::appRemoved ( const QCString &appId )
+{
+ if ( appId.contains("amarok",false) )
+ {
+ // is there still another amarok alive?
+ if ( findRunningAmarok() )
+ return;
+ mAmarokTimer->stop();
+ emit playerStopped();
+ emit newSliderPosition(0,0);
+ }
+}
+
+void AmarokInterface::updateSlider ( )
+{
+ // length/time in msecs, -1 means "no playobject in amarok"
+ int len, time;
+ QByteArray data, replyData;
+ QCString replyType;
+
+ if (!kapp->dcopClient()->call(mAppId, "player", "trackTotalTime()",data, replyType, replyData))
+ {
+ //kdDebug(90200) << "mediacontrol: DCOP communication Error" << endl;
+ // -2 is an internal errornumber, might be used later
+ len = -2;
+ }
+ else
+ {
+ QDataStream reply(replyData, IO_ReadOnly);
+ if (replyType == "int")
+ {
+ reply >> len;
+ }
+ else
+ {
+ //kdDebug(90200) << "mediacontrol: unexpected type of DCOP-reply" << endl;
+ // -3 is an internal errornumber, might be used later
+ len = -3;
+ }
+ }
+
+ data = 0;
+ replyData = 0;
+ replyType = 0;
+
+ if (!kapp->dcopClient()->call(mAppId, "player", "trackCurrentTime()",data, replyType, replyData))
+ {
+ //kdDebug(90200) << "mediacontrol: DCOP communication error" << endl;
+ time = -2;
+ }
+ else
+ {
+ QDataStream reply(replyData, IO_ReadOnly);
+ if (replyType == "int")
+ {
+ reply >> time;
+ }
+ else
+ {
+ //kdDebug(90200) << "mediacontrol: unexpected type of DCOP-reply" << endl;
+ time = -3;
+ }
+ }
+
+ if ( (time < 0) || (len < 0)) // Amarok isn't playing and thus returns -1
+ {
+ len = 0;
+ time = 0;
+ }
+ emit newSliderPosition(len,time);
+ emit playingStatusChanged(playingStatus());
+}
+
+// Drag-n-Drop stuff =================================================================
+
+void AmarokInterface::dragEnterEvent(QDragEnterEvent* event)
+{
+// kdDebug(90200) << "AmarokInterface::dragEnterEvent()" << endl;
+ event->accept( KURLDrag::canDecode(event) );
+}
+
+void AmarokInterface::dropEvent(QDropEvent* event)
+{
+ kdDebug(90200) << "AmarokInterface::dropEvent()" << endl;
+ KURL::List list;
+ if (KURLDrag::decode(event, list))
+ {
+ QByteArray data;
+ QDataStream arg(data, IO_WriteOnly);
+ arg << list;
+ if (!kapp->dcopClient()->send(mAppId, "player", "addMediaList(KURL::List)",data))
+ kdDebug(90200) << "Couldn't send drop to amarok" << endl;
+ }
+}
+
+// ====================================================================================
+
+void AmarokInterface::sliderStartDrag()
+{
+ mAmarokTimer->stop();
+}
+
+void AmarokInterface::sliderStopDrag()
+{
+ mAmarokTimer->start(mTimerValue);
+}
+
+void AmarokInterface::jumpToTime( int sec )
+{
+ QByteArray data;
+ QDataStream arg(data, IO_WriteOnly);
+ arg << sec;
+ kapp->dcopClient()->send(mAppId, "player", "seek(int)", data);
+}
+
+void AmarokInterface::playpause()
+{
+ if (!findRunningAmarok())
+ startPlayer("amarok");
+ QByteArray data;
+ kapp->dcopClient()->send(mAppId, "player", "playPause()", data);
+}
+
+void AmarokInterface::stop()
+{
+ QByteArray data;
+ kapp->dcopClient()->send(mAppId, "player", "stop()", data);
+}
+
+void AmarokInterface::next()
+{
+ QByteArray data;
+ kapp->dcopClient()->send(mAppId, "player", "next()", data);
+}
+
+void AmarokInterface::prev()
+{
+ QByteArray data;
+ kapp->dcopClient()->send(mAppId, "player", "prev()", data);
+}
+
+void AmarokInterface::volumeUp()
+{
+ QByteArray data;
+ kapp->dcopClient()->send(mAppId, "player", "volumeUp()", data);
+}
+
+void AmarokInterface::volumeDown()
+{
+ QByteArray data;
+ kapp->dcopClient()->send(mAppId, "player", "volumeDown()", data);
+}
+
+const QString AmarokInterface::getTrackTitle() const
+{
+ QString title;
+ QByteArray data, replyData;
+ QCString replyType;
+ if (!kapp->dcopClient()->call(mAppId, "player", "nowPlaying()",data, replyType, replyData))
+ {
+ //kdDebug(90200) << "mediacontrol: DCOP communication Error" << endl;
+ return QString("");
+ }
+ else
+ {
+ QDataStream reply(replyData, IO_ReadOnly);
+ if (replyType == "QString")
+ {
+ reply >> title;
+ return title;
+ }
+ else
+ {
+ //kdDebug(90200) << "mediacontrol: unexpected type of DCOP-reply" << endl;
+ return QString("");
+ }
+ }
+}
+
+bool AmarokInterface::findRunningAmarok()
+{
+ QCStringList allApps = kapp->dcopClient()->registeredApplications();
+ QValueList<QCString>::const_iterator iterator;
+ QByteArray data, replyData;
+ QCString replyType;
+
+ for (iterator = allApps.constBegin(); iterator != allApps.constEnd(); ++iterator)
+ {
+ if ((*iterator).contains("amarok",false))
+ {
+ if (kapp->dcopClient()->call((*iterator), "player", "interfaces()", data, replyType, replyData) )
+ {
+ if ( replyType == "QCStringList" )
+ {
+ QDataStream reply(replyData, IO_ReadOnly);
+ QCStringList list;
+ reply >> list;
+
+ if ( list.contains("AmarokPlayerInterface") )
+ {
+ kdDebug(90200) << "mediacontrol: amarok found" << endl;
+ mAppId = *iterator;
+ return true;
+ }
+ }
+ }
+ }
+ }
+ kdDebug(90200) << "mediacontrol: amarok not found" << endl;
+ return false;
+}
+
+
+int AmarokInterface::playingStatus()
+{
+ QByteArray data, replyData;
+ QCString replyType;
+
+ if (kapp->dcopClient()->call(mAppId, "player", "status()", data, replyType,
+ replyData))
+ {
+ int status = 0;
+ QDataStream reply(replyData, IO_ReadOnly);
+ if (replyType == "int")
+ reply >> status;
+ if (status == 2)
+ return Playing;
+ else if (status == 1)
+ return Paused;
+ }
+ return Stopped;
+}
diff --git a/kicker-applets/mediacontrol/amarokInterface.h b/kicker-applets/mediacontrol/amarokInterface.h
new file mode 100644
index 0000000..3a71031
--- /dev/null
+++ b/kicker-applets/mediacontrol/amarokInterface.h
@@ -0,0 +1,69 @@
+/***************************************************************************
+ Interface to access Amarok
+ -------------------
+ begin : Tue Dec 2 23:54:53 CET 2003
+ copyright : (c) 2003 by Thomas Capricelli
+ adapted from juk* (C) 2001-2002 by Stefan Gehn (metz {AT} gehn {DOT} net)
+ email : orzel@freehackers.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef AMAROKINTERFACE_H
+#define AMAROKINTERFACE_H
+
+#include "playerInterface.h"
+
+#include <kapplication.h>
+#include <dcopclient.h>
+
+#include <qtimer.h>
+
+class AmarokInterface : public PlayerInterface
+{
+ Q_OBJECT
+ public:
+ AmarokInterface();
+ ~AmarokInterface();
+
+ public slots:
+ virtual void updateSlider(); // gets called on timer-timeout
+ virtual void sliderStartDrag();
+ virtual void sliderStopDrag();
+ virtual void jumpToTime( int msec );
+ virtual void playpause();
+ virtual void stop();
+ virtual void next();
+ virtual void prev();
+ virtual void volumeUp();
+ virtual void volumeDown();
+ virtual void dragEnterEvent(QDragEnterEvent* event);
+ virtual void dropEvent(QDropEvent* event);
+ virtual const QString getTrackTitle() const;
+ virtual int playingStatus();
+
+ private slots:
+ void myInit();
+ void appRegistered ( const QCString &appId );
+ void appRemoved ( const QCString &appId );
+
+ private:
+ QTimer *mAmarokTimer;
+ int mTimerValue;
+ QCString mAppId;
+
+ /**
+ * Tries to find a DCOP registered instance of AmaroK
+ * Stores the name of the first found instance in appId
+ * @returns true is instance is found, false otherwise
+ */
+ bool findRunningAmarok();
+};
+#endif
diff --git a/kicker-applets/mediacontrol/configfrontend.cpp b/kicker-applets/mediacontrol/configfrontend.cpp
new file mode 100644
index 0000000..ba206c8
--- /dev/null
+++ b/kicker-applets/mediacontrol/configfrontend.cpp
@@ -0,0 +1,99 @@
+/***************************************************************************
+ provides access to mediacontrol configuration file
+ -------------------
+ begin : forgot :/
+ copyright : (C) 2000-2002 by Stefan Gehn
+ email : metz {AT} gehn {DOT} net
+
+ code-skeleton taken from knewsticker which is
+ Copyright (c) Frerich Raabe <raabe@kde.org>
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "configfrontend.h"
+// #include <kdebug.h>
+
+ConfigFrontend::ConfigFrontend() : QObject(0, 0)
+{
+ _config = new KConfig(QString::null, true, false);
+ _ownConfig = true;
+}
+
+ConfigFrontend::~ConfigFrontend()
+{
+ if (_ownConfig)
+ {
+ delete _config;
+ }
+}
+
+ConfigFrontend::ConfigFrontend(KConfig *config) : QObject(0, 0)
+{
+ _config = config;
+ _config->setGroup("MediaControl");
+ _ownConfig = false;
+}
+
+// ====================================================================================
+
+uint ConfigFrontend::mouseWheelSpeed() const
+{
+ return _config->readNumEntry("Mouse wheel speed", 5);
+}
+
+void ConfigFrontend::setMouseWheelSpeed(const uint mouseWheelSpeed)
+{
+ _config->writeEntry("Mouse wheel speed", mouseWheelSpeed);
+ _config->sync();
+}
+
+// ====================================================================================
+
+QString ConfigFrontend::player() const
+{
+ return _config->readPathEntry("Player", "Noatun");
+}
+
+void ConfigFrontend::setPlayer(const QString &player)
+{
+ _config->writePathEntry("Player", player);
+ _config->sync();
+}
+
+// ====================================================================================
+
+QString ConfigFrontend::theme() const
+{
+ return _config->readEntry("Theme", "default");
+}
+
+void ConfigFrontend::setTheme(const QString &theme)
+{
+ _config->writeEntry("Theme", theme);
+ _config->sync();
+}
+
+// ====================================================================================
+
+bool ConfigFrontend::useCustomTheme() const
+{
+ return _config->readBoolEntry("UseCustomTheme", false);
+}
+
+void ConfigFrontend::setUseCustomTheme(const bool use)
+{
+ _config->writeEntry("UseCustomTheme", use);
+ _config->sync();
+}
+
+// ====================================================================================
+
+#include "configfrontend.moc"
diff --git a/kicker-applets/mediacontrol/configfrontend.h b/kicker-applets/mediacontrol/configfrontend.h
new file mode 100644
index 0000000..87a0bf4
--- /dev/null
+++ b/kicker-applets/mediacontrol/configfrontend.h
@@ -0,0 +1,52 @@
+/***************************************************************************
+ provides access to mediacontrol configuration file
+ -------------------
+ begin : forgot :/
+ copyright : (C) 2000-2002 by Stefan Gehn
+ email : metz {AT} gehn {DOT} net
+
+ code-skeleton taken from knewsticker which is
+ Copyright (c) Frerich Raabe <raabe@kde.org>
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef CONFIGFRONTEND_H
+#define CONFIGFRONTEND_H
+
+#include <kconfig.h>
+#include <klocale.h>
+
+class ConfigFrontend : public QObject
+{
+ Q_OBJECT
+ public:
+ ConfigFrontend();
+ ConfigFrontend(KConfig *);
+ virtual ~ConfigFrontend();
+
+ uint mouseWheelSpeed() const;
+ QString player() const;
+ QString theme() const;
+ bool useCustomTheme() const;
+
+ public slots:
+ void setMouseWheelSpeed(const uint);
+ void setPlayer(const QString &player);
+ void setTheme(const QString &theme);
+ void setUseCustomTheme(const bool use);
+ void reparseConfiguration() { _config->reparseConfiguration(); }
+
+ private:
+ KConfig *_config;
+ bool _ownConfig:1;
+};
+
+#endif // CONFIGFRONTEND_H
diff --git a/kicker-applets/mediacontrol/configure.in.in b/kicker-applets/mediacontrol/configure.in.in
new file mode 100644
index 0000000..8a48beb
--- /dev/null
+++ b/kicker-applets/mediacontrol/configure.in.in
@@ -0,0 +1,48 @@
+dnl AM_PATH_XMMS([1.0.0])
+dnl AM_INIT_AUTOMAKE(mediacontrol, 0.1)
+dnl AC_PATH_PROG(XMMS_CONFIG, xmms-config, no)
+dnl AM_PATH_XMMS(1.0.0,,AC_MSG_ERROR([*** XMMS >= 1.0.0 not installed - please install first ***]))
+
+AC_DEFUN([AC_CHECK_XMMS],
+[
+ AC_MSG_CHECKING([for libxmms])
+ AC_CACHE_VAL(ac_cv_have_xmms,
+ [
+ ac_save_libs="$LIBS"
+ LIBS="`xmms-config --libs`"
+ ac_CPPFLAGS_save="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $all_includes `xmms-config --cflags 2> /dev/null`"
+ ac_LDFLAGS_save="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $all_libraries"
+ AC_TRY_LINK(
+ [#include <xmms/xmmsctrl.h>],
+ [xmms_remote_play_pause(0);],
+ [ac_cv_have_xmms="yes"],
+ [ac_cv_have_xmms="no"]
+ )
+ LIBS="$ac_save_libs"
+ LDFLAGS="$ac_LDFLAGS_save"
+ CPPFLAGS="$ac_CPPFLAGS_save"
+ ])
+ AC_MSG_RESULT($ac_cv_have_xmms)
+ if test "$ac_cv_have_xmms" = "yes"; then
+ XMMS_LIBS="`xmms-config --libs`"
+ XMMS_INCLUDES="`xmms-config --cflags`"
+ AC_DEFINE(HAVE_XMMS, 1, [Define if you have xmms libraries and header files.])
+ fi
+])
+
+AC_ARG_WITH(xmms,
+ [AC_HELP_STRING([--with-xmms],[enable XMMS control applet @<:@default=check@:>@])],
+ [], with_xmms=check)
+
+if test "x$with_xmms" != xno; then
+ AC_CHECK_XMMS
+
+ if test "x$with_xmms" != xcheck && test "x$ac_cv_have_xmms" != xyes; then
+ AC_MSG_ERROR([--with-xmms was given, but test for XMMS failed])
+ fi
+fi
+
+AC_SUBST(XMMS_LIBS)
+AC_SUBST(XMMS_INCLUDES)
diff --git a/kicker-applets/mediacontrol/jukInterface.cpp b/kicker-applets/mediacontrol/jukInterface.cpp
new file mode 100644
index 0000000..302e7f2
--- /dev/null
+++ b/kicker-applets/mediacontrol/jukInterface.cpp
@@ -0,0 +1,314 @@
+/***************************************************************************
+ Interface to access JuK
+ -------------------
+ begin : Mon Jan 15 21:09:00 CEST 2001
+ copyright : (C) 2001-2002 by Stefan Gehn
+ email : metz {AT} gehn {DOT} net
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "jukInterface.h"
+#include "jukInterface.moc"
+
+#include <kapplication.h>
+#include <kdebug.h>
+#include <qstringlist.h>
+#include <qstrlist.h>
+#include <qprocess.h>
+#include <kurldrag.h>
+
+#define TIMER_FAST 250
+
+JuKInterface::JuKInterface() : PlayerInterface(), mProc(0)
+{
+ mTimerValue = TIMER_FAST;
+ mJuKTimer = new QTimer ( this, "mJukTimer" );
+
+ connect(mJuKTimer, SIGNAL(timeout()), SLOT(updateSlider()) );
+ kapp->dcopClient()->setNotifications ( true );
+
+ connect(kapp->dcopClient(), SIGNAL(applicationRegistered(const QCString&)),
+ SLOT(appRegistered(const QCString&)) );
+
+ connect(kapp->dcopClient(), SIGNAL(applicationRemoved(const QCString&)),
+ SLOT(appRemoved(const QCString&)));
+
+ QTimer::singleShot(0, this, SLOT(myInit()));
+}
+
+JuKInterface::~JuKInterface()
+{
+ kapp->dcopClient()->setNotifications(false);
+ delete mJuKTimer;
+}
+
+void JuKInterface::myInit()
+{
+ // Start the timer if juk is already running
+ // Needed if user adds applet while running juk
+ if ( findRunningJuK() )
+ {
+ emit playerStarted();
+ mJuKTimer->start(mTimerValue);
+ }
+ else
+ {
+ emit playerStopped();
+ emit newSliderPosition(0,0);
+ }
+}
+
+void JuKInterface::appRegistered ( const QCString &appId )
+{
+ if(appId.contains("juk",false) )
+ {
+ mAppId = appId;
+
+ // BWAHAHAHA EVIL HACK
+ // JuK blocks DCOP signals on its startup, so if we try to
+ // ping it now, it'll simply cause us to block, which will
+ // cause kicker to block, which is bad, m'kay?
+ //
+ // So what we do is launch the dcop command instead, and let
+ // *it* block for us. As soon as the command exits, we know
+ // that JuK is ready to go (and so are we).
+ mProc = new QProcess(this, "jukdcopCheckProc");
+ mProc->addArgument("dcop");
+ mProc->addArgument("juk");
+ mProc->addArgument("Player");
+ mProc->addArgument("status()");
+
+ connect(mProc, SIGNAL(processExited()), SLOT(jukIsReady()));
+ mProc->start();
+ }
+}
+
+void JuKInterface::appRemoved ( const QCString &appId )
+{
+ if ( appId.contains("juk",false) )
+ {
+ // is there still another juk alive?
+ if ( findRunningJuK() )
+ return;
+ mJuKTimer->stop();
+ emit playerStopped();
+ emit newSliderPosition(0,0);
+ }
+}
+
+/* Called when the dcop process we launch terminates */
+void JuKInterface::jukIsReady()
+{
+ emit playerStarted();
+ mJuKTimer->start(mTimerValue);
+
+ mProc->deleteLater();
+ mProc = 0;
+}
+
+void JuKInterface::updateSlider ()
+{
+ // length/time in msecs, -1 means "no playobject in juk"
+ int len = -1;
+ int time = -1;
+ QByteArray data, replyData;
+ QCString replyType;
+
+ if (kapp->dcopClient()->call(mAppId, "Player", "totalTime()", data,
+ replyType, replyData))
+ {
+ QDataStream reply(replyData, IO_ReadOnly);
+ if (replyType == "int")
+ reply >> len;
+ }
+
+ data = 0;
+ replyData = 0;
+ replyType = 0;
+
+ if (kapp->dcopClient()->call(mAppId, "Player", "currentTime()", data,
+ replyType, replyData))
+ {
+ QDataStream reply(replyData, IO_ReadOnly);
+ if (replyType == "int")
+ reply >> time;
+ }
+
+ if ( (time < 0) || (len < 0)) // JuK isn't playing and thus returns -1
+ {
+ len = 0;
+ time = 0;
+ }
+ emit ( newSliderPosition(len,time) );
+ emit playingStatusChanged(playingStatus());
+}
+
+// Drag-n-Drop stuff =================================================================
+
+void JuKInterface::dragEnterEvent(QDragEnterEvent* event)
+{
+// kdDebug(90200) << "JuKInterface::dragEnterEvent()" << endl;
+ event->accept( KURLDrag::canDecode(event) );
+}
+
+void JuKInterface::dropEvent(QDropEvent* event)
+{
+// kdDebug(90200) << "JuKInterface::dropEvent()" << endl;
+ KURL::List list;
+ if (KURLDrag::decode(event, list))
+ {
+ QByteArray data, replyData;
+ QStringList fileList;
+ QCString replyType;
+ QDataStream arg(data, IO_WriteOnly);
+
+ // Juk doesn't handle KURL's yet, so we need to form a list
+ // that contains the local paths.
+ for (KURL::List::ConstIterator it = list.begin(); it != list.end(); ++it)
+ fileList += (*it).path();
+
+ arg << fileList << false;
+
+ // Use call instead of send to make sure the files are added
+ // before we try to play.
+ if (!kapp->dcopClient()->call(mAppId, "Collection", "openFile(QStringList)", data,
+ replyType, replyData, true))
+ {
+ kdDebug(90200) << "Couldn't send drop to juk" << endl;
+ }
+
+ // Apparently we should auto-play?
+ QByteArray strData;
+ QDataStream strArg(strData, IO_WriteOnly);
+ strArg << *fileList.begin();
+
+ if (!kapp->dcopClient()->send(mAppId, "Player", "play(QString)", strData))
+ kdDebug(90200) << "Couldn't send play command to juk" << endl;
+ }
+}
+
+// ====================================================================================
+
+void JuKInterface::sliderStartDrag()
+{
+ mJuKTimer->stop();
+}
+
+void JuKInterface::sliderStopDrag()
+{
+ mJuKTimer->start(mTimerValue);
+}
+
+void JuKInterface::jumpToTime( int sec )
+{
+ QByteArray data;
+ QDataStream arg(data, IO_WriteOnly);
+ arg << sec;
+ // Used in JuK shipping with KDE < 3.3
+ //kapp->dcopClient()->send(mAppId, "Player", "setTime(int)", data);
+ kapp->dcopClient()->send(mAppId, "Player", "seek(int)", data);
+}
+
+void JuKInterface::playpause()
+{
+ if (!findRunningJuK())
+ startPlayer("juk");
+ QByteArray data;
+ kapp->dcopClient()->send(mAppId, "Player", "playPause()", data);
+}
+
+void JuKInterface::stop()
+{
+ QByteArray data;
+ kapp->dcopClient()->send(mAppId, "Player", "stop()", data);
+}
+
+void JuKInterface::next()
+{
+ QByteArray data;
+ kapp->dcopClient()->send(mAppId, "Player", "forward()", data);
+}
+
+void JuKInterface::prev()
+{
+ QByteArray data;
+ kapp->dcopClient()->send(mAppId, "Player", "back()", data);
+}
+
+void JuKInterface::volumeUp()
+{
+ QByteArray data;
+ kapp->dcopClient()->send(mAppId, "Player", "volumeUp()", data);
+}
+
+void JuKInterface::volumeDown()
+{
+ QByteArray data;
+ kapp->dcopClient()->send(mAppId, "Player", "volumeDown()", data);
+}
+
+const QString JuKInterface::getTrackTitle() const
+{
+ QString title;
+ QByteArray data, replyData;
+ QCString replyType;
+
+ if (kapp->dcopClient()->call(mAppId, "Player", "playingString()",data,
+ replyType, replyData))
+ {
+ QDataStream reply(replyData, IO_ReadOnly);
+ if (replyType == "QString")
+ {
+ reply >> title;
+ return title;
+ }
+ }
+ return QString("");
+}
+
+// FIXME: what if we have a dcop app named, let's say, 'jukfrontend'?
+bool JuKInterface::findRunningJuK()
+{
+ QCStringList allApps = kapp->dcopClient()->registeredApplications();
+ QValueList<QCString>::const_iterator iterator;
+
+ for (iterator = allApps.constBegin(); iterator != allApps.constEnd(); ++iterator)
+ {
+ if ((*iterator).contains("juk",false))
+ {
+ mAppId = *iterator;
+ return true;
+ }
+ }
+ return false;
+}
+
+int JuKInterface::playingStatus()
+{
+ QByteArray data, replyData;
+ QCString replyType;
+
+ if (kapp->dcopClient()->call(mAppId, "Player", "status()", data, replyType,
+ replyData))
+ {
+ int status = 0;
+ QDataStream reply(replyData, IO_ReadOnly);
+ if (replyType == "int")
+ reply >> status;
+
+ if (status == 2)
+ return Playing;
+ else if (status == 1)
+ return Paused;
+ }
+
+ return Stopped;
+}
diff --git a/kicker-applets/mediacontrol/jukInterface.h b/kicker-applets/mediacontrol/jukInterface.h
new file mode 100644
index 0000000..fb7f9bb
--- /dev/null
+++ b/kicker-applets/mediacontrol/jukInterface.h
@@ -0,0 +1,72 @@
+/***************************************************************************
+ Interface to access JuK
+ -------------------
+ begin : Mon Jan 15 21:09:00 CEST 2001
+ copyright : (C) 2001-2002 by Stefan Gehn
+ email : metz {AT} gehn {DOT} net
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef JUKINTERFACE_H
+#define JUKINTERFACE_H
+
+#include "playerInterface.h"
+
+#include <kapplication.h>
+#include <dcopclient.h>
+
+#include <qtimer.h>
+
+class QProcess;
+
+class JuKInterface : public PlayerInterface
+{
+ Q_OBJECT
+ public:
+ JuKInterface();
+ ~JuKInterface();
+
+ public slots:
+ void updateSlider();
+ void sliderStartDrag();
+ void sliderStopDrag();
+ void jumpToTime( int sec );
+ void playpause();
+ void stop();
+ void next();
+ void prev();
+ void volumeUp();
+ void volumeDown();
+ void dragEnterEvent(QDragEnterEvent* event);
+ void dropEvent(QDropEvent* event);
+ const QString getTrackTitle() const;
+ int playingStatus();
+
+ private slots:
+ void myInit();
+ void appRegistered ( const QCString &appId );
+ void appRemoved ( const QCString &appId );
+ void jukIsReady();
+
+ private:
+ QTimer *mJuKTimer;
+ QProcess *mProc;
+ int mTimerValue;
+ QCString mAppId;
+
+ /**
+ * Tries to find a DCOP registered instance of juk
+ * Stores the name of the first found instance in appId
+ * @returns true is instance is found, false otherwise
+ */
+ bool findRunningJuK();
+};
+#endif
diff --git a/kicker-applets/mediacontrol/kscdInterface.cpp b/kicker-applets/mediacontrol/kscdInterface.cpp
new file mode 100644
index 0000000..f7f7e90
--- /dev/null
+++ b/kicker-applets/mediacontrol/kscdInterface.cpp
@@ -0,0 +1,332 @@
+/***************************************************************************
+ Interface to access KsCD
+ -------------------
+ begin : Sat Dec 04 13:36:00 CET 2004
+ copyright : (C) 2004 by Michal Startek
+ adapted from JuK interface which is (C) 2001-2002 by Stefan Gehn
+ email : michal.startek@op.pl
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "kscdInterface.h"
+#include "kscdInterface.moc"
+
+#include <kapplication.h>
+#include <kdebug.h>
+#include <qstringlist.h>
+#include <qstrlist.h>
+#include <kurldrag.h>
+#include <klocale.h>
+
+#define TIMER_FAST 250
+
+KsCDInterface::KsCDInterface() : PlayerInterface()
+{
+ mKsCDTimer = new QTimer(this, "mKsCDTimer");
+
+ connect(mKsCDTimer, SIGNAL(timeout()), SLOT(updateSlider()) );
+ kapp->dcopClient()->setNotifications ( true );
+
+ connect(kapp->dcopClient(), SIGNAL(applicationRegistered(const QCString&)),
+ SLOT(appRegistered(const QCString&)) );
+
+ connect(kapp->dcopClient(), SIGNAL(applicationRemoved(const QCString&)),
+ SLOT(appRemoved(const QCString&)));
+
+ QTimer::singleShot(0, this, SLOT(myInit()));
+}
+
+KsCDInterface::~KsCDInterface()
+{
+ kapp->dcopClient()->setNotifications(false);
+ delete mKsCDTimer;
+}
+
+void KsCDInterface::myInit()
+{
+ // Start the timer if KsCD is already running
+ // Needed if user adds applet while running KsCD
+ if (findRunningKsCD())
+ {
+ emit playerStarted();
+ mKsCDTimer->start(TIMER_FAST);
+ }
+ else
+ {
+ emit playerStopped();
+ emit newSliderPosition(0,0);
+ }
+}
+
+void KsCDInterface::appRegistered(const QCString &appId)
+{
+ if((appId) == "kscd")
+ {
+ mAppId = appId;
+ emit playerStarted();
+ mKsCDTimer->start(TIMER_FAST);
+ }
+}
+
+void KsCDInterface::appRemoved(const QCString &appId)
+{
+ if ((appId) == "kscd")
+ {
+ // is there still another KsCD alive?
+ // Okay, KsCD does not allow multiple instances
+ // of it to run at the same time, but
+ // this can change.
+ if (findRunningKsCD())
+ return;
+ mKsCDTimer->stop();
+ emit playerStopped();
+ emit newSliderPosition(0,0);
+ }
+}
+
+void KsCDInterface::updateSlider()
+{
+ // length/time in secs, -1 means "no playobject in kscd"
+ int len = -1;
+ int time = -1;
+ QByteArray data, replyData;
+ QCString replyType;
+
+ if (kapp->dcopClient()->call(mAppId, "CDPlayer", "currentTrackLength()", data,
+ replyType, replyData))
+ {
+ QDataStream reply(replyData, IO_ReadOnly);
+ if (replyType == "int")
+ reply >> len;
+ }
+
+ data = 0;
+ replyData = 0;
+ replyType = 0;
+
+ if (kapp->dcopClient()->call(mAppId, "CDPlayer", "currentPosition()", data,
+ replyType, replyData))
+ {
+ QDataStream reply(replyData, IO_ReadOnly);
+ if (replyType == "int")
+ reply >> time;
+ }
+
+ if ( (time < 0) || (len < 0)) // KsCD isn't playing and thus returns -1
+ {
+ len = 0;
+ time = 0;
+ }
+ emit newSliderPosition(len,time);
+ emit playingStatusChanged(playingStatus());
+}
+
+// Drag-n-Drop stuff =================================================================
+// As far as I know there is currently no way to drag an AudioCD track to KsCD,
+// or even no application to drag AudioCD track from (not the KIO-wrapped track
+// path (audiocd:/...) like from Konqueror)
+
+void KsCDInterface::dragEnterEvent(QDragEnterEvent* event)
+{
+ event->ignore();
+}
+
+void KsCDInterface::dropEvent(QDropEvent* event)
+{
+ event->ignore();
+}
+
+// ====================================================================================
+
+void KsCDInterface::sliderStartDrag()
+{
+ mKsCDTimer->stop();
+}
+
+void KsCDInterface::sliderStopDrag()
+{
+ mKsCDTimer->start(TIMER_FAST);
+}
+
+void KsCDInterface::jumpToTime(int sec)
+{
+ QByteArray data;
+ QDataStream arg(data, IO_WriteOnly);
+ arg << sec;
+ kapp->dcopClient()->send(mAppId, "CDPlayer", "jumpTo(int)", data);
+}
+
+void KsCDInterface::playpause()
+{
+ if (!findRunningKsCD())
+ startPlayer("kscd");
+ QByteArray data;
+ kapp->dcopClient()->send(mAppId, "CDPlayer", "play()", data);
+}
+
+void KsCDInterface::stop()
+{
+ QByteArray data;
+ kapp->dcopClient()->send(mAppId, "CDPlayer", "stop()", data);
+}
+
+void KsCDInterface::next()
+{
+ QByteArray data;
+ kapp->dcopClient()->send(mAppId, "CDPlayer", "next()", data);
+}
+
+void KsCDInterface::prev()
+{
+ QByteArray data;
+ kapp->dcopClient()->send(mAppId, "CDPlayer", "previous()", data);
+}
+
+void KsCDInterface::volumeUp()
+{
+ QByteArray data;
+ kapp->dcopClient()->send(mAppId, "CDPlayer", "volumeUp()", data);
+}
+
+void KsCDInterface::volumeDown()
+{
+ QByteArray data;
+ kapp->dcopClient()->send(mAppId, "CDPlayer", "volumeDown()", data);
+}
+
+const QString KsCDInterface::getTrackTitle() const
+{
+ QString title, artist, album, result;
+ QByteArray data, replyData;
+ QCString replyType;
+
+ // Get track title from KsCD...
+ if (kapp->dcopClient()->call(mAppId, "CDPlayer", "currentTrackTitle()", data,
+ replyType, replyData))
+ {
+ QDataStream reply(replyData, IO_ReadOnly);
+ if (replyType == "QString")
+ {
+ reply >> title;
+ }
+ }
+
+ // Album...
+ if (kapp->dcopClient()->call(mAppId, "CDPlayer", "currentAlbum()", data,
+ replyType, replyData))
+ {
+ QDataStream reply(replyData, IO_ReadOnly);
+ if (replyType == "QString")
+ {
+ reply >> album;
+ }
+ }
+
+ // Artist...
+ if (kapp->dcopClient()->call(mAppId, "CDPlayer", "currentArtist()", data,
+ replyType, replyData))
+ {
+ QDataStream reply(replyData, IO_ReadOnly);
+ if (replyType == "QString")
+ {
+ reply >> artist;
+ }
+ }
+
+ // And compose them into one string that will be displayed...
+ if(album.isEmpty())
+ {
+ if(artist.isEmpty())
+ {
+ result = title;
+ }
+ else // artist is non-empty
+ {
+ if(title.isEmpty())
+ {
+ result = artist;
+ }
+ else
+ {
+ result = i18n("artist - trackname", "%1 - %2").arg(artist, title);
+ }
+ }
+ }
+ else // album is non-empty
+ {
+ if(artist.isEmpty())
+ {
+ if(title.isEmpty())
+ {
+ result = album;
+ }
+ else
+ {
+ result = i18n("(album) - trackname", "(%1) - %2").arg(artist, title);
+ }
+ }
+ else // artist is non-empty
+ {
+ if(title.isEmpty())
+ {
+ result = i18n("artistname (albumname)", "%1 (%2)").arg(artist, album);
+ }
+ else
+ {
+ result = i18n("artistname (albumname) - trackname", "%1 (%2) - %3").arg(artist, album, title);
+ }
+ }
+ }
+
+ return result;
+}
+
+bool KsCDInterface::findRunningKsCD()
+{
+ QCStringList allApps = kapp->dcopClient()->registeredApplications();
+ QValueList<QCString>::const_iterator iterator;
+
+ for (iterator = allApps.constBegin(); iterator != allApps.constEnd(); ++iterator)
+ {
+ if ((*iterator) == "kscd")
+ {
+ mAppId = *iterator;
+ return true;
+ }
+ }
+ return false;
+}
+
+int KsCDInterface::playingStatus()
+{
+ QByteArray data, replyData;
+ QCString replyType;
+
+ if (kapp->dcopClient()->call(mAppId, "CDPlayer", "getStatus()", data, replyType,
+ replyData))
+ {
+ int status = 0;
+ QDataStream reply(replyData, IO_ReadOnly);
+ if (replyType == "int")
+ reply >> status;
+
+ switch (status)
+ {
+ case 2:
+ return Playing;
+ case 4:
+ return Paused;
+ default:
+ return Stopped;
+ }
+ }
+ return Stopped;
+}
diff --git a/kicker-applets/mediacontrol/kscdInterface.h b/kicker-applets/mediacontrol/kscdInterface.h
new file mode 100644
index 0000000..0817b1e
--- /dev/null
+++ b/kicker-applets/mediacontrol/kscdInterface.h
@@ -0,0 +1,68 @@
+/***************************************************************************
+ Interface to access KsCD
+ -------------------
+ begin : Sat Dec 04 12:48:00 CET 2004
+ copyright : (C) 2004 by Michal Startek
+ adapted from JuK interface which is (C) 2001-2002 by Stefan Gehn
+ email : michal.startek@op.pl
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef KSCDINTERFACE_H
+#define KSCDINTERFACE_H
+
+#include "playerInterface.h"
+
+#include <kapplication.h>
+#include <dcopclient.h>
+
+#include <qtimer.h>
+
+class KsCDInterface : public PlayerInterface
+{
+ Q_OBJECT
+ public:
+ KsCDInterface();
+ ~KsCDInterface();
+
+ public slots:
+ void updateSlider();
+ void sliderStartDrag();
+ void sliderStopDrag();
+ void jumpToTime( int sec );
+ void playpause();
+ void stop();
+ void next();
+ void prev();
+ void volumeUp();
+ void volumeDown();
+ void dragEnterEvent(QDragEnterEvent* event);
+ void dropEvent(QDropEvent* event);
+ const QString getTrackTitle() const;
+ int playingStatus();
+
+ private slots:
+ void myInit();
+ void appRegistered ( const QCString &appId );
+ void appRemoved ( const QCString &appId );
+
+ private:
+ QTimer *mKsCDTimer;
+ QCString mAppId;
+
+ /**
+ * Tries to find a DCOP registered instance of KsCD
+ * Stores the name of the first found instance in appId
+ * @returns true is instance is found, false otherwise
+ */
+ bool findRunningKsCD();
+};
+#endif
diff --git a/kicker-applets/mediacontrol/mcslider.cpp b/kicker-applets/mediacontrol/mcslider.cpp
new file mode 100644
index 0000000..642d2e2
--- /dev/null
+++ b/kicker-applets/mediacontrol/mcslider.cpp
@@ -0,0 +1,66 @@
+/***************************************************************************
+ mcslider.cpp - description
+ -------------------
+ begin : 20040410
+ copyright : (C) 2004 by Teemu Rytilahti
+ email : teemu.rytilahti@kde-fi.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <qpixmap.h>
+
+#include "mcslider.h"
+
+MCSlider::MCSlider( Orientation orientation, QWidget *parent, const char *name )
+ : QSlider( orientation, parent, name )
+{
+ setBackgroundOrigin(WidgetOrigin);
+ setBackground();
+}
+
+MCSlider::~MCSlider()
+{
+}
+
+// This is needed because KStyle draws slider background incorrectly.
+
+void MCSlider::setBackground()
+{
+ unsetPalette();
+
+ if (parentWidget()->paletteBackgroundPixmap())
+ {
+ QPixmap pm(width(), height());
+ pm.fill(parentWidget(), pos());
+ setPaletteBackgroundPixmap(pm);
+ }
+}
+
+void MCSlider::wheelEvent(QWheelEvent *e)
+{
+ if (e->orientation() == Horizontal)
+ return;
+
+ if (e->state() == ShiftButton)
+ {
+ if (e->delta() > 0)
+ emit volumeUp();
+ else
+ emit volumeDown();
+ e->accept();
+ }
+ else
+ {
+ QSlider::wheelEvent(e);
+ }
+}
+
+#include "mcslider.moc"
diff --git a/kicker-applets/mediacontrol/mcslider.h b/kicker-applets/mediacontrol/mcslider.h
new file mode 100644
index 0000000..9b11893
--- /dev/null
+++ b/kicker-applets/mediacontrol/mcslider.h
@@ -0,0 +1,37 @@
+/***************************************************************************
+ mcslider.h - description
+ -------------------
+ begin : 20040410
+ copyright : (C) 2004 by Teemu Rytilahti
+ email : teemu.rytilahti@kde-fi.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef MCSLIDER_H
+#define MCSLIDER_H
+
+#include <qslider.h>
+
+class MCSlider : public QSlider
+{
+ Q_OBJECT
+
+ public:
+ MCSlider( Orientation orientation, QWidget *parent, const char *name = 0 );
+ ~MCSlider();
+ void setBackground();
+ private:
+ virtual void wheelEvent(QWheelEvent *e);
+ signals:
+ void volumeUp();
+ void volumeDown();
+};
+#endif
diff --git a/kicker-applets/mediacontrol/mediacontrol.cpp b/kicker-applets/mediacontrol/mediacontrol.cpp
new file mode 100644
index 0000000..e69e0e0
--- /dev/null
+++ b/kicker-applets/mediacontrol/mediacontrol.cpp
@@ -0,0 +1,614 @@
+/***************************************************************************
+ main file of mediacontrol applet
+ -------------------
+ begin : Tue Apr 25 11:53:11 CEST 2000
+ copyright : (C) 2000-2005 by Stefan Gehn
+ email : metz {AT} gehn {DOT} net
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "mediacontrol.h"
+#include "mediacontrol.moc"
+
+#include "mediacontrolconfig.h"
+#include "configfrontend.h"
+
+
+#include "noatunInterface.h"
+#include "xmmsInterface.h"
+#include "jukInterface.h"
+#include "amarokInterface.h"
+#include "mpdInterface.h"
+#include "kscdInterface.h"
+
+#include "mcslider.h"
+
+#include <qfile.h>
+#include <qdragobject.h>
+#include <qtooltip.h>
+#include <qstyle.h>
+#include <qslider.h>
+#include <qpainter.h>
+#include <qiconset.h>
+#include <kpopupmenu.h>
+
+#include <kapplication.h>
+#include <kipc.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <knotifyclient.h>
+#include <kbugreport.h>
+#include <dcopclient.h>
+
+const int MC_BUTTONSIZE = 20; // TODO: Might become dynamical for bigger panels
+const int NO_BUTTONS = 4;
+
+extern "C"
+{
+ KDE_EXPORT KPanelApplet *init( QWidget *parent, const QString &configFile)
+ {
+ KGlobal::locale()->insertCatalogue("mediacontrol");
+ return new MediaControl(configFile, KPanelApplet::Normal,
+ KPanelApplet::About | KPanelApplet::Preferences |
+ KPanelApplet::ReportBug, parent, "mediacontrol");
+ }
+}
+
+// =============================================================================
+
+class MediaControlToolTip : public QToolTip
+{
+ public:
+ MediaControlToolTip(QWidget *widget, PlayerInterface *pl_obj) :
+ QToolTip(widget), mWidget(widget), mPlayer(pl_obj) {}
+
+ protected:
+ virtual void maybeTip(const QPoint &pt)
+ {
+ QRect rc( mWidget->rect());
+ if (rc.contains(pt))
+ {
+ tip ( rc, mPlayer->getTrackTitle() );
+ }
+ }
+ private:
+ QWidget *mWidget;
+ PlayerInterface *mPlayer;
+};
+
+// =============================================================================
+
+MediaControl::MediaControl(const QString &configFile, Type t, int actions,
+ QWidget *parent, const char *name)
+ : DCOPObject("MediaControl"),
+ KPanelApplet(configFile, t, actions, parent, name),
+ mInstance(new KInstance("mediacontrol")),
+ mAboutData(new KAboutData("mediacontrol",
+ I18N_NOOP("MediaControl"),
+ MEDIACONTROL_VERSION,
+ I18N_NOOP("A small control-applet for various media players"),
+ KAboutData::License_GPL_V2,
+ "(c) 2001-2004 Stefan Gehn",
+ 0,
+ "http://metz.gehn.net"))
+{
+ setBackgroundOrigin(AncestorOrigin);
+ _player = 0L;
+ _prefsDialog = 0L;
+
+ _configFrontend = new ConfigFrontend(config());
+ // My own dcopclient
+ _dcopClient = new DCOPClient();
+ _dcopClient->registerAs("mediacontrol", false);
+
+ mAboutData->addAuthor("Stefan Gehn", I18N_NOOP("Main Developer"),
+ "metz@gehn.net", "http://metz.gehn.net");
+ mAboutData->addAuthor("Robbie Ward", I18N_NOOP("Initial About-Dialog"),
+ "wardy@robbieward.co.uk", "http://www.robbieward.co.uk");
+
+ mAboutData->addCredit("Sascha Hoffman", I18N_NOOP("Button-Pixmaps"),
+ "tisch.sush@gmx.de", 0);
+ mAboutData->addCredit("Christian Hoffman", I18N_NOOP("Button-Pixmaps"),
+ "tisch.crix@gmx.de", "http://www.crixensgfxcorner.de.vu/");
+ mAboutData->addCredit("Ulrik Mikaelsson", I18N_NOOP("Fix for Noatun-Support"),
+ "rawler@rsn.bth.se", 0);
+ mAboutData->addCredit("Anthony J Moulen", I18N_NOOP("Fix for Vertical Slider"),
+ "ajmoulen@moulen.org", 0);
+ mAboutData->addCredit("Teemu Rytilahti", I18N_NOOP("Volume Control Implementation"),
+ "teemu.rytilahti@kde-fi.org", 0);
+ mAboutData->addCredit("Jan Spitalnik", I18N_NOOP("Fix for JuK-Support"),
+ "honza@spitalnik.net", 0);
+ mAboutData->addCredit("William Robinson", I18N_NOOP("mpd-Support"),
+ "airbaggins@yahoo.co.uk", 0);
+
+ setAcceptDrops(true);
+
+ prev_button = new TrayButton (this, "PREVIOUS");
+ playpause_button = new TrayButton (this, "PLAYPAUSE");
+ stop_button = new TrayButton (this, "STOP");
+ next_button = new TrayButton (this, "NEXT");
+ time_slider = new MCSlider (QSlider::Horizontal, this, "time_slider" );
+ time_slider->setRange(0,0);
+ time_slider->setValue(0);
+ time_slider->setTracking( false );
+ time_slider->installEventFilter(this);
+
+ // request notification of changes in icon style
+ kapp->addKipcEventMask(KIPC::IconChanged);
+ connect(kapp, SIGNAL(iconChanged(int)), this, SLOT(slotIconChanged()));
+
+ reparseConfig();
+
+ rmbMenu = new KPopupMenu(this, "RMBMenu");
+ rmbMenu->insertTitle(i18n("MediaControl"), 0, 0);
+ rmbMenu->insertItem(SmallIcon("configure"), i18n("Configure MediaControl..."),
+ this, SLOT(preferences()));
+ rmbMenu->insertItem(i18n("About MediaControl"), this, SLOT(about()));
+}
+
+MediaControl::~MediaControl()
+{
+ delete _player;
+ delete _configFrontend;
+ delete _dcopClient;
+ KGlobal::locale()->removeCatalogue("mediacontrol");
+}
+
+// Drag-n-Drop stuff ===========================================================
+
+void MediaControl::dragEnterEvent(QDragEnterEvent* event)
+{
+ _player->dragEnterEvent(event); // Just pass dnd to the playerInterface
+}
+
+void MediaControl::dropEvent(QDropEvent* event)
+{
+ _player->dropEvent(event); // Just pass dnd to the playerInterface
+}
+
+// =============================================================================
+
+
+void MediaControl::setSliderPosition(int len ,int time)
+{
+ time_slider->blockSignals(true);
+ if(orientation() == Vertical)
+ time = len - time;
+
+ if (mLastLen != len)
+ time_slider->setRange(0,len);
+ mLastLen = len;
+
+ if (mLastTime != time)
+ time_slider->setValue(time);
+ mLastTime = time;
+
+ time_slider->blockSignals(false);
+}
+
+void MediaControl::enableAll()
+{
+ prev_button->setDisabled(false);
+ playpause_button->setDisabled(false);
+ QToolTip::remove(playpause_button);
+ stop_button->setDisabled(false);
+ next_button->setDisabled(false);
+ time_slider->setDisabled(false);
+}
+
+void MediaControl::disableAll()
+{
+ prev_button->setDisabled(true);
+ playpause_button->setDisabled(false);
+ QToolTip::add(playpause_button, i18n("Start the player"));
+ stop_button->setDisabled(true);
+ next_button->setDisabled(true);
+ time_slider->setDisabled(true);
+ if(_configFrontend->useCustomTheme()) {
+ QString skindir = locate("data", "mediacontrol/"+_configFrontend->theme()+"/");
+ playpause_button->setIconSet(SmallIconSet(locate("data",skindir+"play.png")));
+ }
+ else
+ playpause_button->setIconSet(SmallIconSet("player_play"));
+}
+
+void MediaControl::slotPlayingStatusChanged(int status)
+{
+ if (mLastStatus == status)
+ return;
+
+ mLastStatus = status;
+ QString skindir = locate("data", "mediacontrol/"+_configFrontend->theme()+"/");
+
+ switch (status)
+ {
+ case (PlayerInterface::Stopped):
+ case (PlayerInterface::Paused):
+ if(_configFrontend->useCustomTheme())
+ playpause_button->setIconSet(SmallIconSet(locate("data",skindir+"play.png")));
+ else
+ playpause_button->setIconSet(SmallIconSet("player_play"));
+ break;
+ case (PlayerInterface::Playing):
+ if(_configFrontend->useCustomTheme())
+ playpause_button->setIconSet(SmallIconSet(locate("data",skindir+"pause.png")));
+ else
+ playpause_button->setIconSet(SmallIconSet("player_pause"));
+ break;
+ }
+}
+
+void MediaControl::slotIconChanged()
+{
+ if(!_configFrontend->useCustomTheme())
+ {
+ prev_button->setIconSet(SmallIconSet("player_start"));
+ if (_player->playingStatus() == PlayerInterface::Playing)
+ playpause_button->setIconSet(SmallIconSet("player_pause"));
+ else
+ playpause_button->setIconSet(SmallIconSet("player_play"));
+ stop_button->setIconSet(SmallIconSet("player_stop"));
+ next_button->setIconSet(SmallIconSet("player_end"));
+ }
+}
+
+// Dialogs =====================================================================
+
+void MediaControl::preferences()
+{
+ if ( _prefsDialog )
+ {
+ _prefsDialog->raise();
+ }
+ else
+ {
+ _prefsDialog = new MediaControlConfig ( _configFrontend );
+ connect ( _prefsDialog, SIGNAL(closing()),
+ this, SLOT(slotClosePrefsDialog()) );
+ connect ( _prefsDialog, SIGNAL(destroyed()),
+ this, SLOT(slotPrefsDialogClosing()) );
+ connect ( _prefsDialog, SIGNAL(configChanged()),
+ this, SLOT(slotConfigChanged()) );
+ }
+}
+
+void MediaControl::slotConfigChanged()
+{
+ reparseConfig();
+}
+
+void MediaControl::slotClosePrefsDialog()
+{
+ delete _prefsDialog;
+}
+
+void MediaControl::slotPrefsDialogClosing()
+{
+ if ( _prefsDialog )
+ _prefsDialog = 0L;
+}
+
+
+void MediaControl::about()
+{
+ KAboutApplication aboutDlg(mAboutData);
+ aboutDlg.exec();
+}
+
+
+void MediaControl::reportBug()
+{
+ KBugReport bugReport(this, true, mAboutData);
+ bugReport.exec();
+}
+
+
+// Fixing the orientation problem in qslider.
+void MediaControl::adjustTime(int time)
+{
+ if(orientation() == Vertical)
+ emit(newJumpToTime(mLastLen - time));
+ else
+ emit(newJumpToTime(time));
+}
+
+// Config Stuff ================================================================
+
+void MediaControl::reparseConfig()
+{
+// kdDebug(90200) << "reparseConfig();" << endl;
+ _configFrontend->reparseConfiguration();
+
+ if (_player != 0L) // make sure there is no player-object
+ {
+ _player->disconnect(); // disconnect from all things
+
+ time_slider->disconnect();
+ prev_button->disconnect();
+ playpause_button->disconnect();
+ stop_button->disconnect();
+ next_button->disconnect();
+
+ delete slider_tooltip; // tooltip depends on _player : delete it before _player gets deleted
+ slider_tooltip = 0L;
+
+ delete _player;
+ _player = 0L;
+ }
+
+ mLastLen = -1;
+ mLastTime = -1;
+ mLastStatus = -1;
+
+ QString playerString = _configFrontend->player();
+
+
+#ifdef HAVE_XMMS
+ if (playerString == "XMMS")
+ {
+ _player = new XmmsInterface ();
+ time_slider->setSteps((_configFrontend->mouseWheelSpeed()*1000),
+ (_configFrontend->mouseWheelSpeed()*1000));
+ }
+ else
+#endif
+ if (playerString == "JuK")
+ {
+ _player = new JuKInterface();
+ time_slider->setSteps((_configFrontend->mouseWheelSpeed()),
+ (_configFrontend->mouseWheelSpeed()));
+ }
+ else if (playerString == "Amarok")
+ {
+ _player = new AmarokInterface();
+ time_slider->setSteps((_configFrontend->mouseWheelSpeed()),
+ (_configFrontend->mouseWheelSpeed()));
+ }
+ else if (playerString == "KsCD")
+ {
+ _player = new KsCDInterface();
+ time_slider->setSteps((_configFrontend->mouseWheelSpeed()),
+ (_configFrontend->mouseWheelSpeed()));
+ }
+ else if (playerString == "mpd")
+ {
+ _player = new MpdInterface();
+ time_slider->setSteps((_configFrontend->mouseWheelSpeed()),
+ (_configFrontend->mouseWheelSpeed()));
+ }
+ else // Fallback is Noatun
+ {
+ _player = new NoatunInterface();
+ time_slider->setSteps((_configFrontend->mouseWheelSpeed()),
+ (_configFrontend->mouseWheelSpeed()));
+ }
+
+ // this signal gets emitted by a playerInterface when the player's playtime changed
+ connect(_player, SIGNAL(newSliderPosition(int,int)),
+ this, SLOT(setSliderPosition(int,int)));
+
+ connect(_player, SIGNAL(playerStarted()), SLOT(enableAll()));
+ connect(_player, SIGNAL(playerStopped()), SLOT(disableAll()));
+ connect(_player, SIGNAL(playingStatusChanged(int)), SLOT(slotPlayingStatusChanged(int)));
+
+ // do we use our icons or the default ones from KDE?
+ if(_configFrontend->useCustomTheme())
+ {
+ // load theme
+ QString skindir = locate("data", "mediacontrol/"+_configFrontend->theme()+"/");
+
+ // the user has to take care if all pixmaps are there, we only check for one of them
+ if (QFile(skindir+"play.png").exists())
+ {
+ prev_button->setIconSet(SmallIconSet(locate("data",skindir+"prev.png")));
+ if (_player->playingStatus() == PlayerInterface::Playing)
+ playpause_button->setIconSet(SmallIconSet(locate("data",skindir+"play.png")));
+ else
+ playpause_button->setIconSet(SmallIconSet(locate("data",skindir+"pause.png")));
+ stop_button->setIconSet(SmallIconSet(locate("data",skindir+"stop.png")));
+ next_button->setIconSet(SmallIconSet(locate("data",skindir+"next.png")));
+ }
+ else // icon-theme is invalid or not there
+ {
+ KNotifyClient::event(winId(), KNotifyClient::warning,
+ i18n("There was trouble loading theme %1. Please choose" \
+ " a different theme.").arg(skindir));
+
+ // default to kde-icons, they have to be installed :)
+ slotIconChanged();
+
+ // and open prefs-dialog
+ preferences();
+ }
+ }
+ else // KDE default-icons, assuming that these icons exist!
+ {
+ // sets icons from kde
+ slotIconChanged();
+ }
+
+ slider_tooltip = new MediaControlToolTip(time_slider, _player);
+
+ connect(prev_button, SIGNAL(clicked()), _player, SLOT(prev()));
+ connect(playpause_button, SIGNAL(clicked()), _player, SLOT(playpause()));
+ connect(stop_button, SIGNAL(clicked()), _player, SLOT(stop()));
+ connect(next_button, SIGNAL(clicked()), _player, SLOT(next()));
+
+ connect(time_slider, SIGNAL(sliderPressed()), _player, SLOT(sliderStartDrag()));
+ connect(time_slider, SIGNAL(sliderReleased()), _player, SLOT(sliderStopDrag()));
+ connect(time_slider, SIGNAL(valueChanged(int)), this, SLOT(adjustTime(int)));
+ connect(time_slider, SIGNAL(volumeUp()), _player, SLOT(volumeUp()));
+ connect(time_slider, SIGNAL(volumeDown()), _player, SLOT(volumeDown()));
+ connect(this, SIGNAL(newJumpToTime(int)), _player, SLOT(jumpToTime(int)));
+}
+
+// Widget Placement ===================================================================
+
+// kicker wants to know what width we need for a given height
+// (this is called when being a HORIZONTAL panel)
+int MediaControl::widthForHeight(int height) const
+{
+// kdDebug(90200) << "kicker height: " << height << endl;
+// kdDebug(90200) << "slider needs: " << time_slider->minimumSizeHint().height() << endl;
+
+ // slider height + button height
+ if ( height >= (time_slider->minimumSizeHint().height()+MC_BUTTONSIZE) )
+ { // slider UNDER buttons
+ // (5 * button width + spaces between them);
+ return (4*MC_BUTTONSIZE+10);
+ }
+ else
+ { // slider ASIDE buttons
+ // (5 * button width + spaces between them) * 2 [size of slider = size of all buttons]
+ return ((4*MC_BUTTONSIZE+10)*2);
+ }
+}
+
+// kicker wants to know what height we need for a given width
+// (this is called when being a VERTICAL panel)
+int MediaControl::heightForWidth(int width) const
+{
+// kdDebug(90200) << "kicker width: " << width << endl;
+
+ // slider height + button height
+ if ( width >= (time_slider->minimumSizeHint().width()+MC_BUTTONSIZE) )
+ { // slider ASIDE icons
+ // (5 * button width + spaces between them);
+ return (4*MC_BUTTONSIZE+10);
+ }
+ else
+ { // slider UNDER buttons
+ // (5 * button width + spaces between them) * 2
+ // because the size of the slider = the size of all buttons
+ return ((4*MC_BUTTONSIZE+10)*2);
+ }
+}
+
+void MediaControl::mousePressEvent(QMouseEvent* e)
+{
+ if (e->button() == QMouseEvent::RightButton)
+ rmbMenu->popup(e->globalPos());
+}
+
+bool MediaControl::eventFilter(QObject *, QEvent *e)
+{
+ if (e->type() == QEvent::MouseButtonPress)
+ {
+ QMouseEvent *me = static_cast<QMouseEvent *>(e);
+ if (me->button() == QMouseEvent::RightButton)
+ {
+ rmbMenu->popup(me->globalPos());
+ return true;
+ }
+ }
+ return false;
+}
+
+void MediaControl::paletteChange( const QPalette& )
+{
+ time_slider->setBackground();
+}
+
+void MediaControl::moveEvent( QMoveEvent* )
+{
+ time_slider->setBackground();
+}
+
+// Danger: Weird Code ahead! ;))
+void MediaControl::resizeEvent( QResizeEvent* )
+{
+// kdDebug(90200) << "resizeEvent()" << endl;
+ int w = width();
+ int h = height();
+ if ( orientation() == Vertical )
+ { // ====== VERTICAL =================================================
+ time_slider->setOrientation(QSlider::Vertical);
+ int slider_width = time_slider->minimumSizeHint().width();
+ // some styles need more space for sliders than avilable in very small panels :(
+ if ( slider_width > w ) slider_width = w;
+
+ // that width would be needed to put the slider aside the buttons
+ if ( w >= (slider_width+MC_BUTTONSIZE) )
+ { // Slider ASIDE icons
+ int applet_space = (w - (slider_width+MC_BUTTONSIZE) ) / 2;
+ if ( applet_space < 0 )
+ applet_space = 0;
+
+ prev_button->setGeometry ( applet_space, 1, MC_BUTTONSIZE, MC_BUTTONSIZE );
+ playpause_button->setGeometry ( applet_space, 3+1*MC_BUTTONSIZE, MC_BUTTONSIZE, MC_BUTTONSIZE );
+ stop_button->setGeometry ( applet_space, 5+2*MC_BUTTONSIZE, MC_BUTTONSIZE, MC_BUTTONSIZE );
+ next_button->setGeometry ( applet_space, 7+3*MC_BUTTONSIZE, MC_BUTTONSIZE, MC_BUTTONSIZE );
+ time_slider->setGeometry ( applet_space+MC_BUTTONSIZE, 1, slider_width, NO_BUTTONS*MC_BUTTONSIZE+8 );
+ }
+ else
+ { // Slider UNDER Icons
+ int slider_space = (w - slider_width)/2;
+ int button_space = (w - MC_BUTTONSIZE)/2;
+
+ prev_button->setGeometry ( button_space, 1 , MC_BUTTONSIZE, MC_BUTTONSIZE );
+ playpause_button->setGeometry ( button_space, 3+1*MC_BUTTONSIZE, MC_BUTTONSIZE, MC_BUTTONSIZE );
+ stop_button->setGeometry ( button_space, 5+2*MC_BUTTONSIZE, MC_BUTTONSIZE, MC_BUTTONSIZE );
+ next_button->setGeometry ( button_space, 7+3*MC_BUTTONSIZE, MC_BUTTONSIZE, MC_BUTTONSIZE );
+ time_slider->setGeometry ( slider_space, 9+4*MC_BUTTONSIZE, slider_width, NO_BUTTONS*MC_BUTTONSIZE+8 );
+ }
+ }
+ else // ====== HORIZONTAL ===============================================
+ {
+ time_slider->setOrientation(QSlider::Horizontal);
+ int slider_height = time_slider->minimumSizeHint().height();
+ // some styles need more space for sliders than avilable in very small panels :(
+ if ( slider_height > h ) slider_height = h;
+
+ // that h would be needed to put the slider under the buttons
+ if ( h >= (slider_height+MC_BUTTONSIZE) )
+ { // Slider UNDER icons
+ int applet_space = (h-(slider_height+MC_BUTTONSIZE))/2;
+ if ( applet_space < 0 )
+ applet_space = 0;
+
+ prev_button->setGeometry ( 1 , applet_space, MC_BUTTONSIZE, MC_BUTTONSIZE );
+ playpause_button->setGeometry ( 3+MC_BUTTONSIZE, applet_space, MC_BUTTONSIZE, MC_BUTTONSIZE );
+ stop_button->setGeometry ( 5+2*MC_BUTTONSIZE, applet_space, MC_BUTTONSIZE, MC_BUTTONSIZE );
+ next_button->setGeometry ( 7+3*MC_BUTTONSIZE, applet_space, MC_BUTTONSIZE, MC_BUTTONSIZE );
+ time_slider->setGeometry ( 1, applet_space + MC_BUTTONSIZE, NO_BUTTONS*MC_BUTTONSIZE+8, slider_height );
+ }
+ else
+ { // Slider ASIDE Icons
+ int slider_space = (h - slider_height)/2;
+ int button_space = (h - MC_BUTTONSIZE)/2;
+
+ prev_button->setGeometry ( 1 , button_space, MC_BUTTONSIZE, MC_BUTTONSIZE );
+ playpause_button->setGeometry ( 3+1*MC_BUTTONSIZE, button_space, MC_BUTTONSIZE, MC_BUTTONSIZE );
+ stop_button->setGeometry ( 5+2*MC_BUTTONSIZE, button_space, MC_BUTTONSIZE, MC_BUTTONSIZE );
+ next_button->setGeometry ( 7+3*MC_BUTTONSIZE, button_space, MC_BUTTONSIZE, MC_BUTTONSIZE );
+ time_slider->setGeometry ( 9+4*MC_BUTTONSIZE, slider_space, NO_BUTTONS*MC_BUTTONSIZE+8, slider_height );
+ }
+ }
+}
+
+// Our Button ========================================================================
+
+TrayButton::TrayButton(QWidget* parent, const char* name)
+ : SimpleButton (parent, name)
+{
+ setBackgroundMode(PaletteBackground);
+ setBackgroundOrigin(AncestorOrigin);
+}
+
+void TrayButton::setIconSet(const QIconSet &iconSet)
+{
+ setPixmap(iconSet.pixmap(QIconSet::Automatic, QIconSet::Normal, QIconSet::On));
+}
+
diff --git a/kicker-applets/mediacontrol/mediacontrol.desktop b/kicker-applets/mediacontrol/mediacontrol.desktop
new file mode 100644
index 0000000..b7ed81d
--- /dev/null
+++ b/kicker-applets/mediacontrol/mediacontrol.desktop
@@ -0,0 +1,121 @@
+[Desktop Entry]
+Type=Plugin
+Name=Media Control
+Name[ar]=التحكم بلوسائط
+Name[bg]=Медия контрол
+Name[ca]=Control multimèdia
+Name[cs]=Ovládání médií
+Name[da]=Mediekontrol
+Name[de]=Medienkontrolle
+Name[el]=Έλεγχος μέσων
+Name[eo]=Mediostirilo
+Name[es]=Control de medios
+Name[et]=Meediakontroll
+Name[eu]=Multimedia kontrola
+Name[fa]=کنترل رسانه
+Name[fi]=Medianhallinta
+Name[fr]=Télécommande multimédia
+Name[gl]=Controlo Multimédia
+Name[he]=בקרת מדיה
+Name[hr]=Upravljanje medijima
+Name[hu]=Médiavezérlő
+Name[is]=Margmiðlunarstjórn
+Name[it]=Controllo multimediale
+Name[ja]=メディアコントロール
+Name[ka]=მედიის მმართველი
+Name[kk]=Ойнатқышты басқару
+Name[km]=វត្ថុ​បញ្ជា​មេឌៀ​
+Name[lt]=Media valdymas
+Name[mk]=Контрола на мултимедија
+Name[nb]=Mediastyring
+Name[nds]=Medienkuntrull
+Name[ne]=मिडिया नियन्त्रण
+Name[nn]=Mediekontroll
+Name[pa]=ਮੀਡਿਆ ਕੰਟਰੋਲ
+Name[pl]=Zarządzanie mediami
+Name[pt]=Controlo Multimédia
+Name[pt_BR]=Controle de Mídia
+Name[ru]=Управление мультимедиа
+Name[sk]=Ovládanie médií
+Name[sl]=Nadzor predvajalnikov
+Name[sr]=Контрола медија
+Name[sr@Latn]=Kontrola medija
+Name[sv]=Mediakontroll
+Name[tr]=Medya Kontrolü
+Name[uk]=Керування медіа
+Name[uz]=Media-pleyer boshqaruvi
+Name[uz@cyrillic]=Медиа-плейер бошқаруви
+Name[vi]=Điều khiển nhạc/ảnh
+Name[zh_CN]=媒体控制
+Name[zh_TW]=媒體控制
+Comment=Applet to control mediaplayers
+Comment[af]=Miniprogram na kontrole media spelers
+Comment[ar]=بريمج للتحكم بمشغلات الوسائط
+Comment[az]=Konsol medya çalğıcıları appleti
+Comment[bg]=Лесно и универсално управление на плеъри за мултимедийни файлове
+Comment[bs]=Applet za kontrolu mediaplayera
+Comment[ca]=Applet controlador dels reproductors multimèdia
+Comment[cs]=Applet pro ovládání přehrávačů médií
+Comment[cy]=Rhaglennig i reoli chwaraewyr cyfryngau
+Comment[da]=Program til at kontrollere medieafspillere
+Comment[de]=Programm zur Steuerung von Medienabspielern
+Comment[el]=Μικροεφαρμογή για τον έλεγχο αναπαραγωγέων μέσων
+Comment[eo]=Aplikaĵo por stiri medioludilojn
+Comment[es]=Aplicación integrada para controlar el reproductor de medios
+Comment[et]=Meediafailide mängijate juhtimise aplett
+Comment[eu]=Multimedia erreproduzigailuak kontrolatzeko appleta
+Comment[fa]=برنامکی برای کنترل پخش‌کننده‌های رسانه
+Comment[fi]=Mediasoittimien hallintasovelma
+Comment[fo]=Smáforrit at stýra mediuspælarum við
+Comment[fr]=Applet pour commander les lecteurs multimédia
+Comment[fy]=Applet om mediaspilers te bestjoeren
+Comment[ga]=Feidhmchláirín chun seinnteoirí meán a rialú
+Comment[gl]=Unha applet para controlar os reprodutores multimédia
+Comment[he]=יישומן לשליטה בנגני מדיה
+Comment[hi]=मीडिया प्लेयर्स को नियंत्रित करने का ऐपलेट
+Comment[hr]=Aplet za upravljanje multimedijskim programima
+Comment[hu]=Médialejátszók vezérlésére szolgáló kisalkalmazás
+Comment[is]=Íforrit til að stjórna margmiðlunarspilurum
+Comment[it]=Applet per controllare i lettori multimediali
+Comment[ja]=メディアプレーヤを操作するアプレット
+Comment[ka]=მედია დამკვრელის მართვის აპლეტი
+Comment[kk]=Мультимедиа ойнатқыштарды басқару апплеті
+Comment[km]=អាប់ភ្លេត​ដើម្បី​ត្រួតពិនិត្យ​​កម្មវិធី​ចាក់​មេឌៀ
+Comment[lt]=Media grotuvų valdymo įskiepis
+Comment[lv]=Aplets mēdijuatskaņotāju vadībai
+Comment[mk]=Аплет за контрола на медијаплеери
+Comment[ms]=Aplet untuk kawal pemain media
+Comment[mt]=Applet biex tikkontrolla players ta' media
+Comment[nb]=Miniprogram for å styre multimediaspillere
+Comment[nds]=Lüttprogramm för't Stüern vun Medienafspelers
+Comment[ne]=मिडिया प्लेएर नियन्त्रण गर्ने एप्लेट
+Comment[nl]=Applet om mediaspelers te besturen
+Comment[nn]=Applet for kontroll av mediespelarar
+Comment[pa]=ਮੀਡਿਆ ਪਲੇਅਰ ਕੰਟਰੋਲ ਲਈ ਐਪਲਿਟ
+Comment[pl]=Programik do zarządzania mediami
+Comment[pt]=Uma 'applet' para controlar os reprodutores multimédia
+Comment[pt_BR]=Mini-aplicativo para controlar tocadores de mídia
+Comment[ro]=Miniaplicaţie pentru controlul redării multimedia
+Comment[ru]=Аплет для управления медиаплеерами
+Comment[sk]=Applet pre ovládanie prehrávačov médií
+Comment[sl]=Vstavek za nadzor večpredstavnih predvajalnikov
+Comment[sr]=Аплет за контролисање медија плејера
+Comment[sr@Latn]=Aplet za kontrolisanje medija plejera
+Comment[sv]=Miniprogram för att kontrollera mediaspelare
+Comment[ta]=ஊடக வாசிப்பான்களை கட்டுப்படுத்துவதற்கு சிறுநிரல்
+Comment[tg]=Аплет барои идоракунии медиаплеерҳо
+Comment[th]=แอพเพล็ตควบคุมโปรแกรมเล่นสื่อ
+Comment[tr]=Ortam yürütücülerini kontrol etmek için bir programcık
+Comment[uk]=Аплет для керування програвачами мультимедіа
+Comment[uz]=Media-pleyerlarni boshqarish uchun applet
+Comment[uz@cyrillic]=Медиа-плейерларни бошқариш учун апплет
+Comment[ven]=Apulete yau langula tshitambi tsha media
+Comment[vi]=Tiểu dụng điều khiển bộ phát nhạc/ảnh
+Comment[xh]=Applet ukulawula usasazo lwabadlali
+Comment[zh_CN]=控制媒体播放器的小程序
+Comment[zh_TW]=控制媒體播放器的小程式
+Comment[zu]=i Applet ukulawula abadlali bolawulo laphakathi
+X-KDE-Library=mediacontrol_panelapplet
+X-KDE-UniqueApplet=true
+Icon=multimedia
+X-KDE-ParentApp=kicker
diff --git a/kicker-applets/mediacontrol/mediacontrol.h b/kicker-applets/mediacontrol/mediacontrol.h
new file mode 100644
index 0000000..f5a6e5e
--- /dev/null
+++ b/kicker-applets/mediacontrol/mediacontrol.h
@@ -0,0 +1,122 @@
+/***************************************************************************
+ main file of mediacontrol applet
+ -------------------
+ begin : Tue Apr 25 11:53:11 CEST 2000
+ copyright : (C) 2000-2005 by Stefan Gehn
+ email : metz {AT} gehn {DOT} net
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef MEDIACONTROL_H
+#define MEDIACONTROL_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <klocale.h>
+#include <kpanelapplet.h>
+#include <kdebug.h>
+#include <kstandarddirs.h>
+#include <kaboutdata.h>
+#include <kaboutapplication.h>
+
+#include <qpalette.h>
+
+// used everywhere :)
+#include <qstring.h>
+
+#include "playerInterface.h"
+#include "configfrontend.h"
+#include "mediacontroliface.h"
+#include "simplebutton.h"
+
+#define MEDIACONTROL_VERSION "0.4"
+
+class MCSlider;
+class KPopupMenu;
+class KInstance;
+class MediaControlConfig;
+class KAboutData;
+class MediaControlToolTip;
+
+// =============================================================================
+
+class TrayButton : public SimpleButton
+{
+ Q_OBJECT
+
+ public:
+ TrayButton(QWidget* parent, const char* name);
+ virtual ~TrayButton() {}
+ void setIconSet(const QIconSet &iconSet);
+};
+
+// =============================================================================
+
+class MediaControl : public KPanelApplet, virtual public MediaControlIface
+{
+ Q_OBJECT
+
+ public:
+ MediaControl(const QString&, Type, int ,QWidget * = 0, const char * = 0);
+ virtual ~MediaControl();
+
+ int widthForHeight(int height) const;
+ int heightForWidth(int width) const;
+ void dragEnterEvent(QDragEnterEvent* event);
+ void dropEvent(QDropEvent* event);
+ virtual void reparseConfig();
+
+ public slots:
+ void about();
+ void preferences();
+ void reportBug();
+
+ private:
+ KInstance *mInstance;
+ KAboutData *mAboutData;
+ DCOPClient *_dcopClient;
+ PlayerInterface *_player;
+ ConfigFrontend *_configFrontend;
+ MediaControlConfig *_prefsDialog;
+ TrayButton *prev_button; // GoTo Previous Playlist-Item
+ TrayButton *playpause_button; // Start/Pause playing
+ TrayButton *stop_button; // Stop the music
+ TrayButton *next_button; // GoTo Next Playlist-Item
+ MCSlider *time_slider;
+ int mLastLen, mLastTime, mLastStatus;
+ KPopupMenu *rmbMenu;
+
+ virtual void mousePressEvent(QMouseEvent* e);
+ virtual void moveEvent(QMoveEvent*);
+ virtual void paletteChange(const QPalette&);
+ virtual void resizeEvent(QResizeEvent*);
+ virtual bool eventFilter(QObject *watched, QEvent *e);
+
+ friend class MediaControlToolTip;
+ MediaControlToolTip *slider_tooltip;
+
+ private slots:
+ void setSliderPosition(int len, int time);
+ void slotIconChanged();
+ void disableAll();
+ void enableAll();
+ void slotClosePrefsDialog();
+ void slotPrefsDialogClosing();
+ void slotConfigChanged();
+ void adjustTime(int);
+ void slotPlayingStatusChanged(int status);
+
+ signals:
+ void newJumpToTime(int);
+};
+#endif
diff --git a/kicker-applets/mediacontrol/mediacontrolconfig.cpp b/kicker-applets/mediacontrol/mediacontrolconfig.cpp
new file mode 100644
index 0000000..b146ff1
--- /dev/null
+++ b/kicker-applets/mediacontrol/mediacontrolconfig.cpp
@@ -0,0 +1,197 @@
+/***************************************************************************
+ mediacontrol configuration dialog
+ -------------------
+ begin : forgot :/
+ copyright : (C) 2000-2005 by Stefan Gehn
+ email : metz {AT} gehn {DOT} net
+
+ code-skeleton taken from knewsticker which is
+ Copyright (c) Frerich Raabe <raabe@kde.org>
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "mediacontrolconfig.h"
+#include "mediacontrolconfigwidget.h"
+
+#include <qdir.h>
+#include <qcheckbox.h>
+#include <qlistbox.h>
+#include <qtoolbutton.h>
+#include <qlayout.h>
+#include <qgroupbox.h>
+
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kconfig.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <klistbox.h>
+#include <klocale.h>
+#include <knuminput.h>
+#include <kstandarddirs.h>
+
+MediaControlConfig::MediaControlConfig( ConfigFrontend *cfg, QWidget *parent, const char* name)
+: KDialogBase( parent, name, false, i18n("MediaControl"), Ok | Apply | Cancel, Ok, false )
+{
+ _configFrontend = cfg;
+ if (!_configFrontend) // emergency!!!
+ return;
+
+ _child = new MediaControlConfigWidget(this);
+ setMainWidget ( _child );
+
+#ifdef HAVE_XMMS
+ _child->playerListBox->insertItem("XMMS");
+#endif
+ _child->playerListBox->insertItem("Noatun");
+ _child->playerListBox->insertItem("Amarok");
+ _child->playerListBox->insertItem("JuK");
+ _child->playerListBox->insertItem("mpd");
+ _child->playerListBox->insertItem("KsCD");
+
+ _child->themeListBox->clear();
+ // fill with available skins
+ KGlobal::dirs()->addResourceType("themes", KStandardDirs::kde_default("data") + "mediacontrol");
+ QStringList list = KGlobal::dirs()->resourceDirs("themes");
+ for (QStringList::ConstIterator it = list.constBegin(); it != list.constEnd(); ++it)
+ readSkinDir(*it);
+
+ connect(_child->mWheelScrollAmount, SIGNAL(valueChanged(int)), SLOT(slotConfigChanged()));
+ connect(_child->playerListBox, SIGNAL(selectionChanged()), SLOT(slotConfigChanged()));
+ connect(_child->themeListBox, SIGNAL(selectionChanged()), SLOT(slotConfigChanged()));
+ connect(_child->themeListBox, SIGNAL(selectionChanged(QListBoxItem *)), SLOT(slotChangePreview(QListBoxItem *)));
+ connect(_child->mUseThemes, SIGNAL(toggled(bool)), SLOT(slotConfigChanged()) );
+ connect(_child->mUseThemes, SIGNAL(toggled(bool)), SLOT(slotUseThemesToggled(bool)) );
+
+ load();
+ show();
+
+ enableButtonApply ( false ); // apply id disabled until something changed
+}
+
+void MediaControlConfig::readSkinDir( const QString &dir )
+{
+ QDir directory( dir );
+ if (!directory.exists())
+ return;
+
+ const QFileInfoList *list = directory.entryInfoList();
+ QFileInfoListIterator it(*list);
+
+ while ( it.current() )
+ {
+ // append directory-name to our theme-listbox
+ if ( QFile(it.current()->absFilePath()+"/play.png").exists() )
+ _child->themeListBox->insertItem ( it.current()->baseName(), -1 );
+ ++it;
+ }
+}
+
+// ============================================================================
+
+void MediaControlConfig::load()
+{
+ // find the playerstring from config in the playerlist and select it if found
+ QListBoxItem *item = 0;
+
+ item = _child->playerListBox->findItem( _configFrontend->player() );
+ if ( item )
+ _child->playerListBox->setCurrentItem ( item );
+ else
+ _child->playerListBox->setCurrentItem( 0 );
+
+ // reset item to a proper state
+ item=0;
+
+ _child->mWheelScrollAmount->setValue( _configFrontend->mouseWheelSpeed() );
+
+ // Select the used Theme
+ item = _child->themeListBox->findItem( _configFrontend->theme() );
+ if ( item )
+ _child->themeListBox->setCurrentItem( item );
+ else
+ _child->themeListBox->setCurrentItem( 0 );
+
+
+ bool ison = _configFrontend->useCustomTheme();
+ _child->mUseThemes->setChecked( ison );
+ slotUseThemesToggled( ison );
+}
+
+void MediaControlConfig::save()
+{
+// kdDebug(90200) << "MediaControlConfig::save()" << endl;
+ for ( int it=0 ; it <= _child->playerListBox->numRows(); ++it )
+ {
+ if ( _child->playerListBox->isSelected(it) )
+ {
+ _configFrontend->setPlayer ( _child->playerListBox->text(it) );
+ }
+ }
+
+ _configFrontend->setMouseWheelSpeed ( _child->mWheelScrollAmount->value() );
+
+ for ( int it=0 ; it <= _child->themeListBox->numRows(); ++it )
+ {
+ if ( _child->themeListBox->isSelected(it) )
+ {
+ _configFrontend->setTheme ( _child->themeListBox->text(it) );
+ }
+ }
+
+ _configFrontend->setUseCustomTheme( _child->mUseThemes->isChecked() );
+
+ emit configChanged();
+}
+
+void MediaControlConfig::slotApply()
+{
+ save();
+ enableButtonApply(false);
+}
+
+void MediaControlConfig::slotOk()
+{
+ save();
+ emit closing();
+}
+
+void MediaControlConfig::slotCancel()
+{
+ emit closing();
+}
+
+void MediaControlConfig::slotConfigChanged()
+{
+ enableButtonApply ( true );
+}
+
+void MediaControlConfig::slotChangePreview(QListBoxItem *item)
+{
+ QString skindir = item->text();
+ _child->previewPrev->setIconSet(SmallIconSet(locate("themes",skindir+"/prev.png")));
+ _child->previewPlay->setIconSet(SmallIconSet(locate("themes",skindir+"/play.png")));
+ _child->previewPause->setIconSet(SmallIconSet(locate("themes",skindir+"/pause.png")));
+ _child->previewStop->setIconSet(SmallIconSet(locate("themes",skindir+"/stop.png")));
+ _child->previewNext->setIconSet(SmallIconSet(locate("themes",skindir+"/next.png")));
+}
+
+void MediaControlConfig::slotUseThemesToggled(bool on)
+{
+ _child->themeListBox->setEnabled(on);
+ _child->previewGroupBox->setEnabled(on);
+}
+
+#include "mediacontrolconfig.moc"
diff --git a/kicker-applets/mediacontrol/mediacontrolconfig.h b/kicker-applets/mediacontrol/mediacontrolconfig.h
new file mode 100644
index 0000000..5869722
--- /dev/null
+++ b/kicker-applets/mediacontrol/mediacontrolconfig.h
@@ -0,0 +1,54 @@
+/***************************************************************************
+ mediacontrol configuration dialog
+ -------------------
+ begin : forgot :/
+ copyright : (C) 2000-2005 by Stefan Gehn
+ email : metz {AT} gehn {DOT} net
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef MEDIACONTROLCONFIG_H
+#define MEDIACONTROLCONFIG_H
+
+#include "configfrontend.h"
+#include <kdialogbase.h>
+
+class MediaControlConfigWidget;
+class ConfigFrontend;
+class KConfig;
+
+class MediaControlConfig: public KDialogBase
+{
+Q_OBJECT
+public:
+ MediaControlConfig(ConfigFrontend *cfg, QWidget *parent = 0, const char* name = "MediaControlConfig");
+
+ void readSkinDir(const QString &dir);
+ void load();
+ void save();
+
+signals:
+ void closing();
+ void configChanged();
+
+protected slots:
+ void slotConfigChanged();
+ void slotChangePreview(QListBoxItem *item);
+ void slotUseThemesToggled(bool);
+ virtual void slotApply();
+ virtual void slotOk();
+ virtual void slotCancel();
+
+private:
+ ConfigFrontend *_configFrontend;
+ MediaControlConfigWidget *_child;
+};
+#endif // MEDIACONTROLCONFIG_H
diff --git a/kicker-applets/mediacontrol/mediacontrolconfigwidget.ui b/kicker-applets/mediacontrol/mediacontrolconfigwidget.ui
new file mode 100644
index 0000000..9f5c662
--- /dev/null
+++ b/kicker-applets/mediacontrol/mediacontrolconfigwidget.ui
@@ -0,0 +1,374 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>MediaControlConfigWidget</class>
+<comment>Preferences-Dialog for MediaControl </comment>
+<author>Stefan Gehn &lt;metz@gehn.net&gt;</author>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>MediaControlConfigWidget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>318</width>
+ <height>245</height>
+ </rect>
+ </property>
+ <property name="layoutMargin" stdset="0">
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <property name="toolTip" stdset="0">
+ <string></string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string></string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <widget class="QTabWidget">
+ <property name="name">
+ <cstring>tabWidget</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tabGeneral</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;General</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox" row="0" column="0">
+ <property name="name">
+ <cstring>gbMediaPlayer</cstring>
+ </property>
+ <property name="title">
+ <string>Media-Player</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KListBox" row="0" column="0">
+ <property name="name">
+ <cstring>playerListBox</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Select the multimedia player you are using from this list.</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>Layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>lmousewheelscrollingamount</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Wheel scroll seconds:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>mWheelScrollAmount</cstring>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>mWheelScrollAmount</cstring>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Sets the number of lines a mousewheel will scroll in the current file.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>themes</cstring>
+ </property>
+ <attribute name="title">
+ <string>&amp;Themes</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>mUseThemes</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Use themes</string>
+ </property>
+ </widget>
+ <widget class="KListBox">
+ <item>
+ <property name="text">
+ <string>default</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>themeListBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>previewGroupBox</cstring>
+ </property>
+ <property name="title">
+ <string>Preview</string>
+ </property>
+ <property name="layoutMargin" stdset="0">
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Shows you how the selected theme will look</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>8</number>
+ </property>
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <widget class="QToolButton" row="0" column="0">
+ <property name="name">
+ <cstring>previewPrev</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>18</width>
+ <height>18</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>18</width>
+ <height>18</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>&lt;</string>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="0" column="1">
+ <property name="name">
+ <cstring>previewPlay</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>18</width>
+ <height>18</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>18</width>
+ <height>18</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>&gt;</string>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="0" column="2">
+ <property name="name">
+ <cstring>previewPause</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>18</width>
+ <height>18</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>18</width>
+ <height>18</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>o</string>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="0" column="3">
+ <property name="name">
+ <cstring>previewStop</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>18</width>
+ <height>18</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>18</width>
+ <height>18</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>O</string>
+ </property>
+ </widget>
+ <widget class="QToolButton" row="0" column="4">
+ <property name="name">
+ <cstring>previewNext</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>18</width>
+ <height>18</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>18</width>
+ <height>18</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>&gt;</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ </widget>
+ </hbox>
+</widget>
+<customwidgets>
+</customwidgets>
+<includes>
+ <include location="local" impldecl="in implementation"></include>
+ <include location="local" impldecl="in declaration"></include>
+ <include location="global" impldecl="in declaration">knuminput.h</include>
+ <include location="global" impldecl="in declaration">klistview.h</include>
+ <include location="global" impldecl="in declaration">klistbox.h</include>
+</includes>
+<signals>
+ <signal>toggled(bool)</signal>
+</signals>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klistbox.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>klistbox.h</includehint>
+</includehints>
+</UI>
diff --git a/kicker-applets/mediacontrol/mediacontroliface.h b/kicker-applets/mediacontrol/mediacontroliface.h
new file mode 100644
index 0000000..5a47fb3
--- /dev/null
+++ b/kicker-applets/mediacontrol/mediacontroliface.h
@@ -0,0 +1,31 @@
+/***************************************************************************
+ dcopinterface for mediacontrol
+ mainly used to be informed about new settings
+ -------------------
+ begin : Mon Jan 15 21:09:00 MEZ 2001
+ copyright : (C) 2001 by Stefan Gehn
+ email : metz {AT} gehn {DOT} net
+ ***************************************************************************/
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef MEDIACONTROLIFACE_H
+#define MEDIACONTROLIFACE_H
+
+#include <dcopobject.h>
+
+class MediaControlIface : virtual public DCOPObject
+{
+ K_DCOP
+
+ k_dcop:
+ virtual void reparseConfig() = 0;
+};
+
+#endif // MEDIACONTROLIFACE_H
diff --git a/kicker-applets/mediacontrol/mpdInterface.cpp b/kicker-applets/mediacontrol/mpdInterface.cpp
new file mode 100644
index 0000000..8027f82
--- /dev/null
+++ b/kicker-applets/mediacontrol/mpdInterface.cpp
@@ -0,0 +1,585 @@
+/***************************************************************************
+ Interface to access mpd
+ -------------------
+ begin : Tue Apr 19 18:31:00 BST 2005
+ copyright : (C) 2005 by William Robinson
+ email : airbaggins@yahoo.co.uk
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "mpdInterface.h"
+
+#include <cstring>
+
+#include <qregexp.h>
+
+#include <kmessagebox.h>
+#include <kdebug.h>
+#include <kurldrag.h>
+
+MpdInterface::MpdInterface()
+: PlayerInterface()
+, sock()
+, sock_mutex()
+, messagebox_mutex()
+, hostname("localhost")
+, port(6600)
+, slider_timer(0)
+, reconnect_timer(0)
+{
+ connect(&sock, SIGNAL(error(int)), this, SLOT(connectionError(int)));
+ connect(&sock, SIGNAL(error(int)), this, SLOT(stopSliderClock()));
+
+ connect(&sock, SIGNAL(connected()), this, SLOT(startSliderClock()));
+ connect(&sock, SIGNAL(connected()), this, SLOT(stopReconnectClock()));
+ connect(&sock, SIGNAL(connected()), this, SLOT(connected()));
+
+ connect(&sock, SIGNAL(connectionClosed()), this, SLOT(stopSliderClock()));
+ connect(&sock, SIGNAL(connectionClosed()), this, SLOT(startReconnectClock()));
+ connect(&sock, SIGNAL(connectionClosed()), this, SIGNAL(playerStopped()));
+
+ reconnect();
+}
+
+MpdInterface::~MpdInterface()
+{
+}
+
+void MpdInterface::startSliderClock()
+{
+ if (!slider_timer)
+ {
+ //kdDebug(90200) << "Starting slider clock\n";
+ slider_timer = startTimer(SLIDER_TIMER_INTERVAL);
+ }
+}
+
+void MpdInterface::stopSliderClock()
+{
+ if (slider_timer)
+ {
+ //kdDebug(90200) << "Stopping slider clock\n";
+ killTimer(slider_timer);
+ slider_timer=0;
+ }
+}
+void MpdInterface::startReconnectClock()
+{
+ if (!reconnect_timer)
+ {
+ //kdDebug(90200) << "Starting Reconnect clock\n";
+ reconnect_timer = startTimer(RECONNECT_TIMER_INTERVAL);
+ }
+}
+
+void MpdInterface::stopReconnectClock()
+{
+ if (reconnect_timer)
+ {
+ //kdDebug(90200) << "Stopping Reconnect clock\n";
+ killTimer(reconnect_timer);
+ reconnect_timer=0;
+ }
+}
+
+
+void MpdInterface::timerEvent(QTimerEvent* te)
+{
+ if (te->timerId() == slider_timer) updateSlider();
+ else if (te->timerId() == reconnect_timer) reconnect();
+}
+
+
+void MpdInterface::reconnect() const
+{
+ if (sock.state()==QSocket::Idle)
+ {
+ sock_mutex.tryLock();
+ //kdDebug(90200) << "Connecting to " << hostname.latin1() << ":" << port << "...\n";
+ sock.connectToHost(hostname,port);
+ }
+}
+
+void MpdInterface::connected()
+{
+ if (fetchOk()) // unlocks
+ {
+ //kdDebug(90200) << "Connected ok\n";
+ emit playerStarted();
+ emit playingStatusChanged(playingStatus());
+ }
+ else
+ {
+ //kdDebug(90200) << "Connection error\n";
+ emit playerStopped();
+ }
+}
+
+void MpdInterface::connectionError(int e)
+{
+ sock_mutex.unlock();
+ emit playerStopped();
+ QString message;
+ if (messagebox_mutex.tryLock())
+ {
+ switch (e)
+ {
+ case QSocket::ErrConnectionRefused:
+ message=i18n("Connection refused to %1:%2.\nIs mpd running?").arg(hostname).arg(port);
+ break;
+ case QSocket::ErrHostNotFound:
+ message=i18n("Host '%1' not found.").arg(hostname);
+ break;
+ case QSocket::ErrSocketRead:
+ message=i18n("Error reading socket.");
+ break;
+ default:
+ message=i18n("Connection error");
+ break;
+ }
+ // :TODO: KSimpleConfig to prompt for hostname/port values ?
+ if (KMessageBox::warningContinueCancel( 0, message,
+ i18n("MediaControl MPD Error"),
+ i18n("Reconnect"))==KMessageBox::Continue)
+ {
+ startReconnectClock();
+ }
+ else
+ {
+ stopReconnectClock();
+ }
+ messagebox_mutex.unlock();
+ }
+}
+
+bool MpdInterface::dispatch(const char* cmd) const
+{
+ if (sock.state()==QSocket::Connected && sock_mutex.tryLock())
+ {
+ long cmd_len=strlen(cmd);
+ //kdDebug(90200) << "sending: " << cmd;
+ long written=sock.writeBlock(cmd,cmd_len);
+ if (written==cmd_len)
+ {
+ //kdDebug(90200) << "All bytes written\n";
+ sock.flush();
+ return true;
+ }
+ else
+ {
+ //kdDebug(90200) << written << '/' << cmd_len << " bytes written\n";
+ }
+ sock.flush();
+ }
+ return false;
+}
+
+bool MpdInterface::fetchLine(QString& res) const
+{
+ QString errormessage;
+ while (sock.state()==QSocket::Connected)
+ {
+ if (!sock.canReadLine())
+ {
+ sock.waitForMore(20);
+ continue;
+ }
+ res=sock.readLine().stripWhiteSpace();
+ //kdDebug(90200) << "received: " << res.latin1() << "\n";
+ if (res.startsWith("OK"))
+ {
+ sock_mutex.unlock();
+ // if theres a message and we clear it and there's no other messagebox
+ if (!errormessage.isEmpty()
+ && dispatch("clearerror\n") && fetchOk()
+ && messagebox_mutex.tryLock())
+ {
+ KMessageBox::error(0,errormessage,i18n("MediaControl MPD Error"));
+ messagebox_mutex.unlock();
+ }
+ return false;
+ }
+ else if (res.startsWith("ACK"))
+ {
+ sock_mutex.unlock();
+ return false;
+ }
+ else if (res.startsWith("error: "))
+ {
+ errormessage=i18n(res.latin1());
+ }
+ else
+ {
+ return true;
+ }
+ }
+ sock_mutex.unlock();
+ return false;
+}
+
+bool MpdInterface::fetchOk() const
+{
+ QString res;
+ while (fetchLine(res)) { }
+ if (res.startsWith("OK"))
+ return true;
+ else
+ return false;
+}
+
+void MpdInterface::updateSlider()
+{
+ //kdDebug(90200) << "update slider\n";
+ if (!dispatch("status\n")) return;
+
+ QString res;
+ QRegExp time_re("time: (\\d+):(\\d+)");
+ while(fetchLine(res))
+ {
+ if (res.startsWith("state: "))
+ {
+ if (res.endsWith("play"))
+ {
+ emit playingStatusChanged(Playing);
+ }
+ else if (res.endsWith("pause"))
+ {
+ emit playingStatusChanged(Paused);
+ }
+ else
+ {
+ emit playingStatusChanged(Stopped);
+ }
+ }
+ else if (time_re.search(res)>=0)
+ {
+ QStringList timeinfo=time_re.capturedTexts();
+ timeinfo.pop_front();
+ int elapsed_seconds=timeinfo.first().toInt();
+ timeinfo.pop_front();
+ int total_seconds=timeinfo.first().toInt();
+ emit newSliderPosition(total_seconds,elapsed_seconds);
+ }
+ }
+}
+
+void MpdInterface::sliderStartDrag()
+{
+ stopSliderClock();
+}
+
+void MpdInterface::sliderStopDrag()
+{
+ startSliderClock();
+}
+
+void MpdInterface::jumpToTime(int sec)
+{
+ reconnect();
+ if (!dispatch("status\n")) return;
+
+ long songid=-1;
+
+ QString res;
+ QRegExp songid_re("songid: (\\d+)");
+ while(fetchLine(res))
+ {
+ if (songid_re.search(res)>=0)
+ {
+ QStringList songidinfo=songid_re.capturedTexts();
+ songidinfo.pop_front();
+ songid=songidinfo.first().toInt();
+ }
+ }
+
+ if (songid>-1)
+ {
+ if (dispatch(QString("seekid %1 %2\n").arg(songid).arg(sec).latin1()))
+ {
+ fetchOk(); // unlocks
+ }
+ }
+}
+
+void MpdInterface::playpause()
+{
+ reconnect();
+ if (playingStatus()==Stopped ? dispatch("play\n") : dispatch("pause\n"))
+ {
+ fetchOk();
+ }
+}
+
+void MpdInterface::stop()
+{
+ reconnect();
+ if (dispatch("stop\n")) fetchOk();
+}
+
+void MpdInterface::next()
+{
+ reconnect();
+ if (dispatch("next\n")) fetchOk();
+}
+
+void MpdInterface::prev()
+{
+ reconnect();
+ if (dispatch("previous\n")) fetchOk();
+}
+
+
+void MpdInterface::changeVolume(int delta)
+{
+ reconnect();
+
+ if (!dispatch("status\n")) return;
+
+ int volume=-1;
+
+ QString res;
+ QRegExp volume_re("volume: (\\d+)");
+ while(fetchLine(res))
+ {
+ if (volume_re.search(res)>=0)
+ {
+ QStringList info=volume_re.capturedTexts();
+ info.pop_front();
+ volume=info.first().toInt();
+ }
+ }
+
+ if (volume>-1)
+ {
+ volume+=delta;
+ if (volume<0) volume=0;
+ if (volume>100) volume=100;
+ if (dispatch(QString("setvol %1\n").arg(volume).latin1()))
+ {
+ fetchOk();
+ }
+ }
+}
+
+void MpdInterface::volumeUp()
+{
+ reconnect();
+ changeVolume(5);
+}
+
+void MpdInterface::volumeDown()
+{
+ reconnect();
+ changeVolume(-5);
+}
+
+void MpdInterface::dragEnterEvent(QDragEnterEvent* event)
+{
+ event->accept( KURLDrag::canDecode(event) );
+}
+
+void MpdInterface::dropEvent(QDropEvent* event)
+{
+ reconnect();
+
+ KURL::List list;
+ if (KURLDrag::decode(event, list))
+ {
+ if (list.count()==1) // just one file dropped
+ {
+ // check to see if its in the playlist already
+ if (dispatch("playlistid\n"))
+ {
+ long songid=-1;
+ QString file;
+ QString res;
+ while(fetchLine(res))
+ {
+ QRegExp file_re("file: (.+)");
+ QRegExp id_re("Id: (.+)");
+ if (file.isEmpty() && file_re.search(res)>=0)
+ {
+ QStringList info=file_re.capturedTexts();
+ info.pop_front();
+ // if the dropped file ends with the same name, record it
+ if (list.front().path().endsWith(info.first()))
+ {
+ file=info.first().toInt();
+ }
+ }
+ else if (!file.isEmpty() && id_re.search(res)>=0)
+ {
+ // when we have the file, pick up the id (file scomes first)
+ QStringList info=id_re.capturedTexts();
+ info.pop_front();
+ songid=info.first().toInt();
+ fetchOk(); // skip to the end
+ break;
+ }
+ }
+
+ // found song, so lets play it
+ if (songid>-1)
+ {
+ if (dispatch((QString("playid %1\n").arg(songid)).latin1()))
+ {
+ if (fetchOk()) list.pop_front();
+ return;
+ }
+ }
+ }
+ }
+
+ // now if we have got this far, just try to add any files
+ for (KURL::List::const_iterator i = list.constBegin(); i!=list.constEnd(); ++i)
+ {
+ if ((*i).isLocalFile())
+ {
+ QStringList path=QStringList::split("/",(*i).path());
+
+ while (!path.empty())
+ {
+ if (dispatch((QString("add \"")
+ +path.join("/").replace("\"","\\\"")
+ +QString("\"\n")).latin1()))
+ {
+ if (fetchOk()) break;
+ }
+ path.pop_front();
+ }
+ }
+ else
+ {
+ // :TODO: can handle http:// urls but maybe should check port or something
+ }
+ }
+ }
+}
+
+const QString MpdInterface::getTrackTitle() const
+{
+ QString result;
+
+ reconnect();
+
+ if (!dispatch("status\n")) return result;
+
+ long songid=-1;
+ QString res;
+ while(fetchLine(res))
+ {
+ QRegExp songid_re("songid: (\\d+)");
+ if (songid_re.search(res)>=0)
+ {
+ QStringList songidinfo=songid_re.capturedTexts();
+ songidinfo.pop_front();
+ songid=songidinfo.first().toInt();
+ }
+ }
+
+ if (!(songid>-1)) return result;
+
+ if (!dispatch(QString("playlistid %1\n").arg(songid).latin1()))
+ return result;
+
+ QString artist;
+ QString album;
+ QString title;
+ QString track;
+ QString file;
+ while(fetchLine(res))
+ {
+ QRegExp artist_re("Artist: (.+)");
+ QRegExp album_re("Album: (.+)");
+ QRegExp track_re("Album: (.+)");
+ QRegExp title_re("Title: (.+)");
+ QRegExp file_re("file: (.+)");
+ if (artist_re.search(res)>=0)
+ {
+ QStringList info=artist_re.capturedTexts();
+ info.pop_front();
+ artist=info.first();
+ }
+ else if (album_re.search(res)>=0)
+ {
+ QStringList info=album_re.capturedTexts();
+ info.pop_front();
+ album=info.first();
+ }
+ else if (title_re.search(res)>=0)
+ {
+ QStringList info=title_re.capturedTexts();
+ info.pop_front();
+ title=info.first();
+ }
+ else if (track_re.search(res)>=0)
+ {
+ QStringList info=track_re.capturedTexts();
+ info.pop_front();
+ track=info.first();
+ }
+ else if (file_re.search(res)>=0)
+ {
+ QStringList info=file_re.capturedTexts();
+ info.pop_front();
+ file=info.first();
+ }
+ }
+
+ if (!artist.isEmpty())
+ {
+ if (!title.isEmpty())
+ return artist.append(" - ").append(title);
+ else if (!album.isEmpty())
+ return artist.append(" - ").append(album);
+ }
+ else if (!title.isEmpty())
+ {
+ if (!album.isEmpty())
+ return album.append(" - ").append(title);
+ else
+ return title;
+ }
+ else if (!album.isEmpty())
+ {
+ if (!track.isEmpty())
+ return album.append(" - ").append(track);
+ else
+ return album;
+ }
+ return i18n("No tags: %1").arg(file);
+}
+
+int MpdInterface::playingStatus()
+{
+ //kdDebug(90200) << "looking up playing status\n";
+ if (!dispatch("status\n")) return Stopped;
+
+ PlayingStatus status=Stopped;
+ QString res;
+ while(fetchLine(res))
+ {
+ if (res.startsWith("state: "))
+ {
+ if (res.endsWith("play")) status=Playing;
+ else if (res.endsWith("pause")) status=Paused;
+ else status=Stopped;
+ }
+ }
+
+ return status;
+}
+
+#include "mpdInterface.moc"
diff --git a/kicker-applets/mediacontrol/mpdInterface.h b/kicker-applets/mediacontrol/mpdInterface.h
new file mode 100644
index 0000000..d891586
--- /dev/null
+++ b/kicker-applets/mediacontrol/mpdInterface.h
@@ -0,0 +1,100 @@
+/***************************************************************************
+ this is the class to access mpd from
+ -------------------
+ begin : Tue Apr 19 18:31:00 BST 2005
+ copyright : (C) 2005 by William Robinson
+ email : airbaggins@yahoo.co.uk
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifndef MPDINTERFACE_H
+#define MPDINTERFACE_H
+
+#include "playerInterface.h"
+#include <qtimer.h>
+#include <klocale.h>
+#include <qsocket.h>
+#include <qmutex.h>
+
+class MpdInterface
+: public PlayerInterface
+{
+ Q_OBJECT
+ public:
+ MpdInterface();
+ ~MpdInterface();
+
+ public slots:
+ virtual void updateSlider();
+ virtual void sliderStartDrag();
+ virtual void sliderStopDrag();
+ virtual void jumpToTime(int sec);
+ virtual void playpause();
+ virtual void stop();
+ virtual void next();
+ virtual void prev();
+ virtual void volumeUp();
+ virtual void volumeDown();
+ virtual void dragEnterEvent(QDragEnterEvent* event);
+ virtual void dropEvent(QDropEvent* event);
+ virtual const QString getTrackTitle() const;
+ virtual int playingStatus();
+
+ void changeVolume(int delta);
+
+ void connectionError(int e);
+ void connected();
+
+ void startSliderClock();
+ void stopSliderClock();
+
+ void startReconnectClock();
+ void stopReconnectClock();
+
+
+ protected:
+ virtual void timerEvent(QTimerEvent* te);
+
+ private:
+ mutable QSocket sock;
+ mutable QMutex sock_mutex;
+
+ mutable QMutex messagebox_mutex;
+
+ QString hostname;
+ int port;
+
+ static const int SLIDER_TIMER_INTERVAL = 500; // ms
+ int slider_timer;
+
+ static const int RECONNECT_TIMER_INTERVAL = 5000; // ms
+ int reconnect_timer;
+
+ /** starts connecting and returns, if not connected already. */
+ void reconnect() const;
+
+ /** this locks the sock sock_mutex. remember to unlock it. */
+ bool dispatch(const char* cmd) const;
+
+ /** fetches everything from the sock to the OK and unlocks the mutex.
+ returns true if OK, false on anything else. */
+ bool fetchOk() const;
+
+ /** fetches a line and returns true, or false if OK or ACK (end of
+ message). Will unlock the sock_mutex on the end of message. */
+ bool fetchLine(QString& res) const;
+};
+
+#endif // MPDINTERFACE_H
diff --git a/kicker-applets/mediacontrol/noatunInterface.cpp b/kicker-applets/mediacontrol/noatunInterface.cpp
new file mode 100644
index 0000000..f6cdfc8
--- /dev/null
+++ b/kicker-applets/mediacontrol/noatunInterface.cpp
@@ -0,0 +1,283 @@
+/***************************************************************************
+ Interface to access Noatun
+ -------------------
+ begin : Mon Jan 15 21:09:00 CEST 2001
+ copyright : (C) 2000-2002 by Stefan Gehn
+ email : metz {AT} gehn {DOT} net
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "noatunInterface.h"
+#include "noatunInterface.moc"
+
+#include <kapplication.h>
+#include <kdebug.h>
+#include <qstringlist.h>
+#include <qstrlist.h>
+#include <kurldrag.h>
+
+#define TIMER_FAST 250
+
+NoatunInterface::NoatunInterface() : PlayerInterface()
+{
+ mTimerValue = TIMER_FAST;
+ mNoatunTimer = new QTimer(this, "mNoatunTimer");
+
+ connect(mNoatunTimer, SIGNAL(timeout()), SLOT(updateSlider()));
+
+ connect(kapp->dcopClient(), SIGNAL(applicationRegistered(const QCString&)),
+ SLOT(appRegistered(const QCString&)) );
+
+ connect(kapp->dcopClient(), SIGNAL(applicationRemoved(const QCString&)),
+ SLOT(appRemoved(const QCString&)));
+
+ kapp->dcopClient()->setNotifications(true);
+ QTimer::singleShot(0, this, SLOT(myInit()));
+}
+
+NoatunInterface::~NoatunInterface()
+{
+ kapp->dcopClient()->setNotifications(false);
+}
+
+void NoatunInterface::myInit()
+{
+ // Start the timer if noatun is already running
+ // Needed if user adds applet while running noatun
+ if ( findRunningNoatun() )
+ {
+ emit playerStarted();
+ mNoatunTimer->start(mTimerValue);
+ }
+ else
+ {
+ emit playerStopped();
+ emit newSliderPosition(0,0);
+ }
+}
+
+void NoatunInterface::appRegistered(const QCString &appId)
+{
+ if (appId.contains("noatun",false))
+ {
+ mAppId = appId;
+ emit playerStarted();
+ mNoatunTimer->start(mTimerValue);
+ }
+}
+
+void NoatunInterface::appRemoved(const QCString &appId)
+{
+ if (appId.contains("noatun",false))
+ {
+ // is there still another noatun alive?
+ if (findRunningNoatun())
+ return;
+ mNoatunTimer->stop();
+ emit playerStopped();
+ emit newSliderPosition(0,0);
+ }
+}
+
+void NoatunInterface::updateSlider()
+{
+ // length/time in msecs, -1 means "no playobject in noatun"
+ int len, time;
+ QByteArray data, replyData;
+ QCString replyType;
+
+ if (!kapp->dcopClient()->call(mAppId, "Noatun", "length()", data, replyType, replyData, false, 200))
+ {
+ //kdDebug(90200) << "mediacontrol: DCOP communication Error" << endl;
+ // -2 is an internal errornumber, might be used later
+ len = -2;
+ }
+ else
+ {
+ QDataStream reply(replyData, IO_ReadOnly);
+ if (replyType == "int")
+ {
+ reply >> len;
+ }
+ else
+ {
+ //kdDebug(90200) << "mediacontrol: unexpected type of DCOP-reply" << endl;
+ // -3 is an internal errornumber, might be used later
+ len = -3;
+ }
+ }
+
+ data = 0;
+ replyData = 0;
+ replyType = 0;
+
+ if (!kapp->dcopClient()->call(mAppId, "Noatun", "position()", data,
+ replyType, replyData, false, 200))
+ {
+ //kdDebug(90200) << "mediacontrol: DCOP communication error" << endl;
+ time = -2;
+ }
+ else
+ {
+ QDataStream reply(replyData, IO_ReadOnly);
+ if (replyType == "int")
+ {
+ reply >> time;
+ }
+ else
+ {
+ //kdDebug(90200) << "mediacontrol: unexpected type of DCOP-reply" << endl;
+ time = -3;
+ }
+ }
+
+ if ((time < 0) || (len < 0)) // Noatun isn't playing and thus returns -1
+ {
+ len = 0;
+ time = 0;
+ }
+ emit newSliderPosition(len/1000,time/1000);
+ emit playingStatusChanged(playingStatus());
+}
+
+int NoatunInterface::playingStatus()
+{
+ QByteArray data, replyData;
+ QCString replyType;
+
+ if (!kapp->dcopClient()->call(mAppId, "Noatun", "state()", data, replyType,
+ replyData, false, 200))
+ {
+ return Stopped;
+ }
+ else
+ {
+ int status = 0;
+ QDataStream reply(replyData, IO_ReadOnly);
+ if (replyType == "int")
+ reply >> status;
+
+ if (status == 1)
+ return Paused;
+ else if (status == 2)
+ return Playing;
+ else
+ return Stopped;
+ }
+}
+
+
+// Drag-n-Drop stuff =================================================================
+
+void NoatunInterface::dragEnterEvent(QDragEnterEvent* event)
+{
+// kdDebug(90200) << "NoatunInterface::dragEnterEvent()" << endl;
+ event->accept(KURLDrag::canDecode(event));
+}
+
+void NoatunInterface::dropEvent(QDropEvent* event)
+{
+// kdDebug(90200) << "NoatunInterface::dropEvent()" << endl;
+ KURL::List list;
+ if (KURLDrag::decode(event, list))
+ {
+ QByteArray data;
+ QDataStream arg(data, IO_WriteOnly);
+ arg << list.toStringList() << false;
+ kapp->dcopClient()->send(mAppId, "Noatun", "addFile(QStringList,bool)", data);
+ }
+}
+
+// ====================================================================================
+
+void NoatunInterface::sliderStartDrag()
+{
+ mNoatunTimer->stop();
+}
+
+void NoatunInterface::sliderStopDrag()
+{
+ mNoatunTimer->start(mTimerValue);
+}
+
+void NoatunInterface::jumpToTime(int sec)
+{
+ QByteArray data;
+ QDataStream arg(data, IO_WriteOnly);
+ arg << (sec*1000); // noatun wants milliseconds
+ kapp->dcopClient()->send(mAppId, "Noatun", "skipTo(int)", data);
+}
+
+void NoatunInterface::playpause()
+{
+ if (!findRunningNoatun())
+ startPlayer("noatun");
+ kapp->dcopClient()->send(mAppId, "Noatun", "playpause()", QString::null);
+}
+
+void NoatunInterface::stop()
+{
+ kapp->dcopClient()->send(mAppId, "Noatun", "stop()", QString::null);
+}
+
+void NoatunInterface::next()
+{
+ // fastForward() is noatun from kde2
+ //kapp->dcopClient()->send("noatun", "Noatun", "fastForward()", QString::null);
+ kapp->dcopClient()->send(mAppId, "Noatun", "forward()", QString::null);
+}
+
+void NoatunInterface::prev()
+{
+ kapp->dcopClient()->send(mAppId, "Noatun", "back()", QString::null);
+}
+
+void NoatunInterface::volumeUp()
+{
+ kapp->dcopClient()->send(mAppId, "Noatun", "volumeDown()", QString::null);
+}
+
+void NoatunInterface::volumeDown()
+{
+ kapp->dcopClient()->send(mAppId, "Noatun", "volumeUp()", QString::null);
+}
+
+const QString NoatunInterface::getTrackTitle() const
+{
+ QString title("");
+ QByteArray data, replyData;
+ QCString replyType;
+ if (kapp->dcopClient()->call(mAppId, "Noatun", "title()", data, replyType,
+ replyData, false, 200))
+ {
+ QDataStream reply(replyData, IO_ReadOnly);
+ if (replyType == "QString")
+ reply >> title;
+ }
+ return title;
+}
+
+bool NoatunInterface::findRunningNoatun()
+{
+ // FIXME: what if we have a dcop app named, let's say, 'noatunfrontend'?
+ QCStringList allApps = kapp->dcopClient()->registeredApplications();
+ QValueList<QCString>::const_iterator iterator;
+
+ for (iterator = allApps.constBegin(); iterator != allApps.constEnd(); ++iterator)
+ {
+ if ((*iterator).contains("noatun", false))
+ {
+ mAppId = *iterator;
+ return true;
+ }
+ }
+ return false;
+}
diff --git a/kicker-applets/mediacontrol/noatunInterface.h b/kicker-applets/mediacontrol/noatunInterface.h
new file mode 100644
index 0000000..99191b5
--- /dev/null
+++ b/kicker-applets/mediacontrol/noatunInterface.h
@@ -0,0 +1,67 @@
+/***************************************************************************
+ Interface to access Noatun
+ -------------------
+ begin : Mon Jan 15 21:09:00 MEZ 2001
+ copyright : (C) 2001-2002 by Stefan Gehn
+ email : metz {AT} gehn {DOT} net
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef NOATUNINTERFACE_H
+#define NOATUNINTERFACE_H
+
+#include "playerInterface.h"
+
+#include <kapplication.h>
+#include <dcopclient.h>
+
+#include <qtimer.h>
+
+class NoatunInterface : public PlayerInterface
+{
+ Q_OBJECT
+ public:
+ NoatunInterface();
+ ~NoatunInterface();
+
+ public slots:
+ void updateSlider();
+ void sliderStartDrag();
+ void sliderStopDrag();
+ void jumpToTime(int sec);
+ void playpause();
+ void stop();
+ void next();
+ void prev();
+ void volumeUp();
+ void volumeDown();
+ void dragEnterEvent(QDragEnterEvent* event);
+ void dropEvent(QDropEvent* event);
+ const QString getTrackTitle() const;
+ void appRegistered(const QCString &appId);
+ void appRemoved(const QCString &appId);
+ int playingStatus();
+
+ void myInit(void);
+
+ private:
+ QTimer *mNoatunTimer;
+ int mTimerValue;
+ QCString mAppId;
+
+ /**
+ * Tries to find a DCOP registered instance of Noatun
+ * Stores the name of the first found instance in appId
+ * @returns true is instance is found, false otherwise
+ */
+ bool findRunningNoatun();
+};
+#endif
diff --git a/kicker-applets/mediacontrol/pics/Makefile.am b/kicker-applets/mediacontrol/pics/Makefile.am
new file mode 100644
index 0000000..85ecf9b
--- /dev/null
+++ b/kicker-applets/mediacontrol/pics/Makefile.am
@@ -0,0 +1,2 @@
+# Files to install
+SUBDIRS= blueish default fulldecent
diff --git a/kicker-applets/mediacontrol/pics/blueish/Makefile.am b/kicker-applets/mediacontrol/pics/blueish/Makefile.am
new file mode 100644
index 0000000..5f7d372
--- /dev/null
+++ b/kicker-applets/mediacontrol/pics/blueish/Makefile.am
@@ -0,0 +1,4 @@
+# Files to install
+pics_DATA = next.png pause.png play.png prev.png stop.png
+# This is where it will all be installed
+picsdir = $(kde_datadir)/mediacontrol/blueish
diff --git a/kicker-applets/mediacontrol/pics/blueish/next.png b/kicker-applets/mediacontrol/pics/blueish/next.png
new file mode 100644
index 0000000..260a033
--- /dev/null
+++ b/kicker-applets/mediacontrol/pics/blueish/next.png
Binary files differ
diff --git a/kicker-applets/mediacontrol/pics/blueish/pause.png b/kicker-applets/mediacontrol/pics/blueish/pause.png
new file mode 100644
index 0000000..4c62dae
--- /dev/null
+++ b/kicker-applets/mediacontrol/pics/blueish/pause.png
Binary files differ
diff --git a/kicker-applets/mediacontrol/pics/blueish/play.png b/kicker-applets/mediacontrol/pics/blueish/play.png
new file mode 100644
index 0000000..6e85050
--- /dev/null
+++ b/kicker-applets/mediacontrol/pics/blueish/play.png
Binary files differ
diff --git a/kicker-applets/mediacontrol/pics/blueish/prev.png b/kicker-applets/mediacontrol/pics/blueish/prev.png
new file mode 100644
index 0000000..d4d8640
--- /dev/null
+++ b/kicker-applets/mediacontrol/pics/blueish/prev.png
Binary files differ
diff --git a/kicker-applets/mediacontrol/pics/blueish/stop.png b/kicker-applets/mediacontrol/pics/blueish/stop.png
new file mode 100644
index 0000000..05b1d33
--- /dev/null
+++ b/kicker-applets/mediacontrol/pics/blueish/stop.png
Binary files differ
diff --git a/kicker-applets/mediacontrol/pics/default/Makefile.am b/kicker-applets/mediacontrol/pics/default/Makefile.am
new file mode 100644
index 0000000..0ab094e
--- /dev/null
+++ b/kicker-applets/mediacontrol/pics/default/Makefile.am
@@ -0,0 +1,4 @@
+# Files to install
+pics_DATA = next.png pause.png play.png prev.png stop.png
+# This is where it will all be installed
+picsdir = $(kde_datadir)/mediacontrol/default
diff --git a/kicker-applets/mediacontrol/pics/default/next.png b/kicker-applets/mediacontrol/pics/default/next.png
new file mode 100644
index 0000000..7c47f76
--- /dev/null
+++ b/kicker-applets/mediacontrol/pics/default/next.png
Binary files differ
diff --git a/kicker-applets/mediacontrol/pics/default/pause.png b/kicker-applets/mediacontrol/pics/default/pause.png
new file mode 100644
index 0000000..6f51172
--- /dev/null
+++ b/kicker-applets/mediacontrol/pics/default/pause.png
Binary files differ
diff --git a/kicker-applets/mediacontrol/pics/default/play.png b/kicker-applets/mediacontrol/pics/default/play.png
new file mode 100644
index 0000000..789065f
--- /dev/null
+++ b/kicker-applets/mediacontrol/pics/default/play.png
Binary files differ
diff --git a/kicker-applets/mediacontrol/pics/default/prev.png b/kicker-applets/mediacontrol/pics/default/prev.png
new file mode 100644
index 0000000..addcfc9
--- /dev/null
+++ b/kicker-applets/mediacontrol/pics/default/prev.png
Binary files differ
diff --git a/kicker-applets/mediacontrol/pics/default/stop.png b/kicker-applets/mediacontrol/pics/default/stop.png
new file mode 100644
index 0000000..e2bf48d
--- /dev/null
+++ b/kicker-applets/mediacontrol/pics/default/stop.png
Binary files differ
diff --git a/kicker-applets/mediacontrol/pics/fulldecent/Makefile.am b/kicker-applets/mediacontrol/pics/fulldecent/Makefile.am
new file mode 100644
index 0000000..6892b15
--- /dev/null
+++ b/kicker-applets/mediacontrol/pics/fulldecent/Makefile.am
@@ -0,0 +1,4 @@
+# Files to install
+pics_DATA = next.png pause.png play.png prev.png stop.png
+# This is where it will all be installed
+picsdir = $(kde_datadir)/mediacontrol/fulldecent
diff --git a/kicker-applets/mediacontrol/pics/fulldecent/README b/kicker-applets/mediacontrol/pics/fulldecent/README
new file mode 100644
index 0000000..17fadd0
--- /dev/null
+++ b/kicker-applets/mediacontrol/pics/fulldecent/README
@@ -0,0 +1,12 @@
+#
+# "Sketchy" mediacontrol theme
+# (c) 2003 Will Entriken "Full Decent"
+#
+
+This theme is was drawn freehand with GIMP, the original layered gimp file
+is included as an XCF file for your modifying pleasure.
+
+The artwork is released under the terms of the GNU GPL version 2.
+The license is available at http://www.gnu.org
+
+Hope you enjoy! \ No newline at end of file
diff --git a/kicker-applets/mediacontrol/pics/fulldecent/next.png b/kicker-applets/mediacontrol/pics/fulldecent/next.png
new file mode 100644
index 0000000..e833248
--- /dev/null
+++ b/kicker-applets/mediacontrol/pics/fulldecent/next.png
Binary files differ
diff --git a/kicker-applets/mediacontrol/pics/fulldecent/pause.png b/kicker-applets/mediacontrol/pics/fulldecent/pause.png
new file mode 100644
index 0000000..2fb8572
--- /dev/null
+++ b/kicker-applets/mediacontrol/pics/fulldecent/pause.png
Binary files differ
diff --git a/kicker-applets/mediacontrol/pics/fulldecent/play.png b/kicker-applets/mediacontrol/pics/fulldecent/play.png
new file mode 100644
index 0000000..836c46e
--- /dev/null
+++ b/kicker-applets/mediacontrol/pics/fulldecent/play.png
Binary files differ
diff --git a/kicker-applets/mediacontrol/pics/fulldecent/prev.png b/kicker-applets/mediacontrol/pics/fulldecent/prev.png
new file mode 100644
index 0000000..7e24e76
--- /dev/null
+++ b/kicker-applets/mediacontrol/pics/fulldecent/prev.png
Binary files differ
diff --git a/kicker-applets/mediacontrol/pics/fulldecent/source.xcf b/kicker-applets/mediacontrol/pics/fulldecent/source.xcf
new file mode 100644
index 0000000..712236a
--- /dev/null
+++ b/kicker-applets/mediacontrol/pics/fulldecent/source.xcf
Binary files differ
diff --git a/kicker-applets/mediacontrol/pics/fulldecent/stop.png b/kicker-applets/mediacontrol/pics/fulldecent/stop.png
new file mode 100644
index 0000000..dc26b5f
--- /dev/null
+++ b/kicker-applets/mediacontrol/pics/fulldecent/stop.png
Binary files differ
diff --git a/kicker-applets/mediacontrol/playerInterface.cpp b/kicker-applets/mediacontrol/playerInterface.cpp
new file mode 100644
index 0000000..cc388c0
--- /dev/null
+++ b/kicker-applets/mediacontrol/playerInterface.cpp
@@ -0,0 +1,34 @@
+/***************************************************************************
+ this is the abstract class to access a player from
+ -------------------
+ begin : Mon Jan 15 21:09:00 CEST 2001
+ copyright : (C) 2001-2002 by Stefan Gehn
+ email : metz {AT} gehn {DOT} net
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "playerInterface.h"
+#include "playerInterface.moc"
+#include <kapplication.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+
+PlayerInterface::PlayerInterface() { } // Constructor
+PlayerInterface::~PlayerInterface() { } // Destructor
+
+void PlayerInterface::startPlayer(const QString &desktopname)
+{
+ if (KApplication::startServiceByDesktopName(desktopname, QStringList(),
+ 0, 0, 0, "", false) > 0)
+ {
+ KMessageBox::error(0, i18n("Could not start media player."));
+ }
+}
diff --git a/kicker-applets/mediacontrol/playerInterface.h b/kicker-applets/mediacontrol/playerInterface.h
new file mode 100644
index 0000000..aa4701e
--- /dev/null
+++ b/kicker-applets/mediacontrol/playerInterface.h
@@ -0,0 +1,57 @@
+/***************************************************************************
+ this is the abstract class to access a player from
+ -------------------
+ begin : Mon Jan 15 21:09:00 MEZ 2001
+ copyright : (C) 2001 by Stefan Gehn
+ email : metz {AT} gehn {DOT} net
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef PLAYERINTERFACE_H
+#define PLAYERINTERFACE_H
+
+#include <qobject.h>
+#include <qdragobject.h>
+
+class PlayerInterface : public QObject
+{
+ Q_OBJECT
+ public:
+ PlayerInterface();
+ virtual ~PlayerInterface();
+
+ enum PlayingStatus { Stopped=0, Playing, Paused };
+
+ public slots:
+ virtual void updateSlider()=0; // gets called on timer-timeout
+ virtual void sliderStartDrag()=0;
+ virtual void sliderStopDrag()=0;
+ virtual void jumpToTime( int msec )=0;
+ virtual void playpause()=0;
+ virtual void stop()=0;
+ virtual void next()=0;
+ virtual void prev()=0;
+ virtual void volumeUp()=0;
+ virtual void volumeDown()=0;
+ virtual void dragEnterEvent(QDragEnterEvent* event)=0;
+ virtual void dropEvent(QDropEvent* event)=0;
+ virtual const QString getTrackTitle() const=0;
+ virtual int playingStatus()=0;
+
+ void startPlayer(const QString &desktopname);
+
+ signals:
+ void newSliderPosition(int, int);
+ void playingStatusChanged(int);
+ void playerStarted();
+ void playerStopped();
+};
+#endif
diff --git a/kicker-applets/mediacontrol/simplebutton.cpp b/kicker-applets/mediacontrol/simplebutton.cpp
new file mode 100644
index 0000000..9daa926
--- /dev/null
+++ b/kicker-applets/mediacontrol/simplebutton.cpp
@@ -0,0 +1,256 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003-2004 Nadeem Hasan <nhasan@kde.org>
+ Copyright (C) 2004-2005 Aaron J. Seigo <aseigo@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "simplebutton.h"
+
+#include <qpainter.h>
+#include <qstyle.h>
+
+#include <kapplication.h>
+#include <kcursor.h>
+#include <kdialog.h>
+#include <kglobalsettings.h>
+#include <kiconeffect.h>
+#include <kicontheme.h>
+#include <kipc.h>
+#include <kstandarddirs.h>
+
+SimpleButton::SimpleButton(QWidget *parent, const char *name)
+ : QButton(parent, name),
+ m_highlight(false),
+ m_orientation(Qt::Horizontal)
+{
+ setBackgroundOrigin( AncestorOrigin );
+
+ connect( kapp, SIGNAL( settingsChanged( int ) ),
+ SLOT( slotSettingsChanged( int ) ) );
+ connect( kapp, SIGNAL( iconChanged( int ) ),
+ SLOT( slotIconChanged( int ) ) );
+
+ kapp->addKipcEventMask( KIPC::SettingsChanged );
+ kapp->addKipcEventMask( KIPC::IconChanged );
+
+ slotSettingsChanged( KApplication::SETTINGS_MOUSE );
+}
+
+void SimpleButton::setPixmap(const QPixmap &pix)
+{
+ QButton::setPixmap(pix);
+ generateIcons();
+ update();
+}
+
+void SimpleButton::setOrientation(Qt::Orientation orientation)
+{
+ m_orientation = orientation;
+ update();
+}
+
+QSize SimpleButton::sizeHint() const
+{
+ const QPixmap* pm = pixmap();
+
+ if (!pm)
+ return QButton::sizeHint();
+ else
+ return QSize(pm->width() + KDialog::spacingHint(), pm->height() + KDialog::spacingHint());
+}
+
+QSize SimpleButton::minimumSizeHint() const
+{
+ const QPixmap* pm = pixmap();
+
+ if (!pm)
+ return QButton::minimumSizeHint();
+ else
+ return QSize(pm->width(), pm->height());
+}
+
+void SimpleButton::drawButton( QPainter *p )
+{
+ drawButtonLabel(p);
+}
+
+void SimpleButton::drawButtonLabel( QPainter *p )
+{
+ if (!pixmap())
+ {
+ return;
+ }
+
+ QPixmap pix = isEnabled() ? (m_highlight? m_activeIcon : m_normalIcon) : m_disabledIcon;
+
+ if (isOn() || isDown())
+ {
+ pix = pix.convertToImage().smoothScale(pix.width() - 2,
+ pix.height() - 2);
+ }
+
+ int h = height();
+ int w = width();
+ int ph = pix.height();
+ int pw = pix.width();
+ int margin = KDialog::spacingHint();
+ QPoint origin(margin / 2, margin / 2);
+
+ if (ph < (h - margin))
+ {
+ origin.setY((h - ph) / 2);
+ }
+
+ if (pw < (w - margin))
+ {
+ origin.setX((w - pw) / 2);
+ }
+
+ p->drawPixmap(origin, pix);
+}
+
+void SimpleButton::generateIcons()
+{
+ if (!pixmap())
+ {
+ return;
+ }
+
+ QImage image = pixmap()->convertToImage();
+ KIconEffect effect;
+
+ m_normalIcon = effect.apply(image, KIcon::Panel, KIcon::DefaultState);
+ m_activeIcon = effect.apply(image, KIcon::Panel, KIcon::ActiveState);
+ m_disabledIcon = effect.apply(image, KIcon::Panel, KIcon::DisabledState);
+
+ updateGeometry();
+}
+
+void SimpleButton::slotSettingsChanged(int category)
+{
+ if (category != KApplication::SETTINGS_MOUSE)
+ {
+ return;
+ }
+
+ bool changeCursor = KGlobalSettings::changeCursorOverIcon();
+
+ if (changeCursor)
+ {
+ setCursor(KCursor::handCursor());
+ }
+ else
+ {
+ unsetCursor();
+ }
+}
+
+void SimpleButton::slotIconChanged( int group )
+{
+ if (group != KIcon::Panel)
+ {
+ return;
+ }
+
+ generateIcons();
+ update();
+}
+
+void SimpleButton::enterEvent( QEvent *e )
+{
+ m_highlight = true;
+
+ repaint( false );
+ QButton::enterEvent( e );
+}
+
+void SimpleButton::leaveEvent( QEvent *e )
+{
+ m_highlight = false;
+
+ repaint( false );
+ QButton::enterEvent( e );
+}
+
+void SimpleButton::resizeEvent( QResizeEvent * )
+{
+ generateIcons();
+}
+
+
+SimpleArrowButton::SimpleArrowButton(QWidget *parent, Qt::ArrowType arrow, const char *name)
+ : SimpleButton(parent, name)
+{
+ setBackgroundOrigin(AncestorOrigin);
+ _arrow = arrow;
+ _inside = false;
+}
+
+QSize SimpleArrowButton::sizeHint() const
+{
+ return QSize( 12, 12 );
+}
+
+void SimpleArrowButton::setArrowType(Qt::ArrowType a)
+{
+ if (_arrow != a)
+ {
+ _arrow = a;
+ update();
+ }
+}
+
+Qt::ArrowType SimpleArrowButton::arrowType() const
+{
+ return _arrow;
+}
+
+void SimpleArrowButton::drawButton( QPainter *p )
+{
+ QRect r(1, 1, width() - 2, height() - 2);
+
+ QStyle::PrimitiveElement pe = QStyle::PE_ArrowLeft;
+ switch (_arrow)
+ {
+ case Qt::LeftArrow: pe = QStyle::PE_ArrowLeft; break;
+ case Qt::RightArrow: pe = QStyle::PE_ArrowRight; break;
+ case Qt::UpArrow: pe = QStyle::PE_ArrowUp; break;
+ case Qt::DownArrow: pe = QStyle::PE_ArrowDown; break;
+ }
+
+ int flags = QStyle::Style_Default | QStyle::Style_Enabled;
+ if (isDown() || isOn()) flags |= QStyle::Style_Down;
+ style().drawPrimitive(pe, p, r, colorGroup(), flags);
+}
+
+void SimpleArrowButton::enterEvent( QEvent *e )
+{
+ _inside = true;
+ SimpleButton::enterEvent( e );
+ update();
+}
+
+void SimpleArrowButton::leaveEvent( QEvent *e )
+{
+ _inside = false;
+ SimpleButton::enterEvent( e );
+ update();
+}
+
+#include "simplebutton.moc"
+
+// vim:ts=4:sw=4:et
diff --git a/kicker-applets/mediacontrol/simplebutton.h b/kicker-applets/mediacontrol/simplebutton.h
new file mode 100644
index 0000000..5423dff
--- /dev/null
+++ b/kicker-applets/mediacontrol/simplebutton.h
@@ -0,0 +1,89 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003-2004 Nadeem Hasan <nhasan@kde.org>
+ Copyright (C) 2004-2005 Aaron J. Seigo <aseigo@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SIMPLEBUTTON_H
+#define SIMPLEBUTTON_H
+
+#include <qbutton.h>
+#include <qpixmap.h>
+
+#include <kdemacros.h>
+
+class KDE_EXPORT SimpleButton : public QButton
+{
+ Q_OBJECT
+
+ public:
+ SimpleButton(QWidget *parent, const char *name = 0);
+ void setPixmap(const QPixmap &pix);
+ void setOrientation(Qt::Orientation orientaton);
+ QSize sizeHint() const;
+ QSize minimumSizeHint() const;
+
+ protected:
+ void drawButton( QPainter *p );
+ void drawButtonLabel( QPainter *p );
+ void generateIcons();
+
+ void enterEvent( QEvent *e );
+ void leaveEvent( QEvent *e );
+ void resizeEvent( QResizeEvent *e );
+
+ protected slots:
+ virtual void slotSettingsChanged( int category );
+ virtual void slotIconChanged( int group );
+
+ private:
+ bool m_highlight;
+ QPixmap m_normalIcon;
+ QPixmap m_activeIcon;
+ QPixmap m_disabledIcon;
+ Qt::Orientation m_orientation;
+ class SimpleButtonPrivate;
+ SimpleButtonPrivate* d;
+};
+
+class KDE_EXPORT SimpleArrowButton: public SimpleButton
+{
+ Q_OBJECT
+
+ public:
+ SimpleArrowButton(QWidget *parent = 0, Qt::ArrowType arrow = Qt::UpArrow, const char *name = 0);
+ virtual ~SimpleArrowButton() {};
+ QSize sizeHint() const;
+
+ protected:
+ virtual void enterEvent( QEvent *e );
+ virtual void leaveEvent( QEvent *e );
+ virtual void drawButton(QPainter *p);
+ Qt::ArrowType arrowType() const;
+
+ public slots:
+ void setArrowType(Qt::ArrowType a);
+
+ private:
+ Qt::ArrowType _arrow;
+ bool _inside;
+};
+
+
+#endif // HIDEBUTTON_H
+
+// vim:ts=4:sw=4:et
diff --git a/kicker-applets/mediacontrol/xmmsInterface.cpp b/kicker-applets/mediacontrol/xmmsInterface.cpp
new file mode 100644
index 0000000..e2512e5
--- /dev/null
+++ b/kicker-applets/mediacontrol/xmmsInterface.cpp
@@ -0,0 +1,183 @@
+/***************************************************************************
+ Interface to access XMMS
+ -------------------
+ begin : Tue Apr 25 11:53:11 CEST 2000
+ copyright : (C) 2000-2002 by Stefan Gehn
+ email : metz {AT} gehn {DOT} net
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_XMMS // only use if there is xmms installed on compiletime
+
+#include "xmmsInterface.h"
+#include "xmmsInterface.moc"
+#include <xmms/xmmsctrl.h>
+#include <kdebug.h>
+
+#define TIMER_SLOW 1000
+#define TIMER_FAST 100
+#define XMMS_SESSION 0
+
+XmmsInterface::XmmsInterface() : PlayerInterface()
+{
+ timervalue = TIMER_FAST;
+ bStartingXMMS = false;
+ xmms_timer = new QTimer ( this, "xmms_timer" );
+
+ QObject::connect( xmms_timer, SIGNAL(timeout()), SLOT(updateSlider()) );
+
+ // Better start the timer as late as possible in initialization
+ xmms_timer->start ( timervalue );
+}
+
+XmmsInterface::~XmmsInterface()
+{
+ delete xmms_timer;
+}
+
+void XmmsInterface::updateSlider ( void )
+{
+ if ( !xmms_remote_is_running(XMMS_SESSION) )
+ { // XMMS not running
+ if (timervalue == TIMER_FAST) // timer is running fast
+ {
+ emit playerStopped();
+ timervalue = TIMER_SLOW; // timer does not need to run fast if XMMS is not running
+ xmms_timer->changeInterval(timervalue);
+ emit newSliderPosition(0,0);
+ }
+ return; // as XMMS is not running we can leave now
+ }
+
+ // huh, XMMS is running :)
+ if (timervalue == TIMER_SLOW) // what? Still running slow?
+ {
+ emit playerStarted();
+ timervalue = TIMER_FAST; // boost the timer to have better reaction-times for the applet
+ xmms_timer->changeInterval(timervalue);
+ }
+
+ int len = xmms_remote_get_playlist_time ( XMMS_SESSION, xmms_remote_get_playlist_pos(XMMS_SESSION) );
+ int time = xmms_remote_get_output_time(XMMS_SESSION);
+
+ if (len < 0)
+ {
+ len = 0;
+ time = 0;
+ }
+
+ emit newSliderPosition(len,time);
+ emit playingStatusChanged(playingStatus());
+}
+
+
+// Drag-n-Drop stuff =================================================================
+
+void XmmsInterface::dragEnterEvent(QDragEnterEvent* event)
+{
+ event->accept( QTextDrag::canDecode(event) );
+}
+
+void XmmsInterface::dropEvent(QDropEvent* event)
+{
+ QString text;
+// kdDebug(90200) << "XmmsInterface::dropEvent()" << endl;
+ if ( QTextDrag::decode(event, text) )
+ {
+ xmms_remote_playlist_add_url_string(XMMS_SESSION,
+ (gchar *)text.local8Bit().data());
+ }
+}
+
+// ====================================================================================
+
+
+void XmmsInterface::sliderStartDrag()
+{
+ xmms_timer->stop();
+}
+
+void XmmsInterface::sliderStopDrag()
+{
+ xmms_timer->start( timervalue );
+}
+
+void XmmsInterface::jumpToTime( int msec )
+{
+ xmms_remote_jump_to_time(XMMS_SESSION, msec);
+}
+
+void XmmsInterface::playpause()
+{
+ if (!xmms_remote_is_running(XMMS_SESSION))
+ {
+ if (bStartingXMMS)
+ return;
+ startPlayer("xmms");
+ bStartingXMMS = true;
+ QTimer::singleShot(500, this, SLOT(playpause()));
+ }
+ else
+ {
+ bStartingXMMS = false;
+ xmms_remote_play_pause(XMMS_SESSION);
+ }
+}
+
+void XmmsInterface::stop()
+{
+ xmms_remote_stop(XMMS_SESSION);
+}
+
+void XmmsInterface::next()
+{
+ xmms_remote_playlist_next(XMMS_SESSION);
+}
+
+void XmmsInterface::prev()
+{
+ xmms_remote_playlist_prev(XMMS_SESSION);
+}
+
+void XmmsInterface::volumeUp()
+{
+ const int cur = xmms_remote_get_main_volume(XMMS_SESSION);
+ xmms_remote_set_main_volume(XMMS_SESSION, cur+1);
+}
+
+void XmmsInterface::volumeDown()
+{
+ const int cur = xmms_remote_get_main_volume(XMMS_SESSION);
+ xmms_remote_set_main_volume(XMMS_SESSION, cur-1);
+}
+
+int XmmsInterface::playingStatus()
+{
+ if (xmms_remote_is_paused(XMMS_SESSION))
+ return Paused;
+
+ if (xmms_remote_is_playing(XMMS_SESSION))
+ return Playing;
+
+ return Stopped;
+}
+
+const QString XmmsInterface::getTrackTitle() const
+{
+ return QString::fromLocal8Bit(
+ xmms_remote_get_playlist_title(XMMS_SESSION,
+ xmms_remote_get_playlist_pos(XMMS_SESSION)));
+}
+#endif // HAVE_XMMS
diff --git a/kicker-applets/mediacontrol/xmmsInterface.h b/kicker-applets/mediacontrol/xmmsInterface.h
new file mode 100644
index 0000000..ca514b2
--- /dev/null
+++ b/kicker-applets/mediacontrol/xmmsInterface.h
@@ -0,0 +1,59 @@
+/***************************************************************************
+ Interface to access XMMS
+ -------------------
+ begin : Tue Apr 25 11:53:11 CEST 2000
+ copyright : (C) 2000-2002 by Stefan Gehn
+ email : metz {AT} gehn {DOT} net
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_XMMS // only use if there's xmms installed on compiletime
+
+#ifndef XMMSINTERFACE_H
+#define XMMSINTERFACE_H
+
+#include "playerInterface.h"
+#include <qtimer.h>
+
+class XmmsInterface : public PlayerInterface
+{
+ Q_OBJECT
+ public:
+ XmmsInterface();
+ ~XmmsInterface();
+
+ public slots:
+ virtual void updateSlider();
+ virtual void sliderStartDrag();
+ virtual void sliderStopDrag();
+ virtual void jumpToTime(int msec);
+ virtual void playpause();
+ virtual void stop();
+ virtual void next();
+ virtual void prev();
+ virtual void volumeUp();
+ virtual void volumeDown();
+ virtual void dragEnterEvent(QDragEnterEvent* event);
+ virtual void dropEvent(QDropEvent* event);
+ virtual const QString getTrackTitle() const;
+ virtual int playingStatus();
+
+ private:
+ QTimer *xmms_timer;
+ int timervalue;
+ bool bStartingXMMS;
+};
+#endif // XMMSINTERFACE_H
+#endif // HAVE_XMMS
diff --git a/knewsticker-scripts/GENERAL b/knewsticker-scripts/GENERAL
new file mode 100644
index 0000000..df80c73
--- /dev/null
+++ b/knewsticker-scripts/GENERAL
@@ -0,0 +1,23 @@
+All scripts surrendered to the knewsticker scripts section which are
+distributed WITH KDE are subject to the licensing restrictions of the KDE
+project. Should you use any of those scripts in conjuction with any KDE
+product you are also subject to their licensing. If the script is used
+without a KDE affiliation , if not other stated within the script, or if no
+co author is present, those scripts are believed to be in the public domain.
+
+Please ensure, that you implement proper error handling within your scripts.
+The error handling is important for those, who might be using your script,
+but have no real understanding of the underlying structure. Since
+Knewsticker is a graphical application it relies on the error codes it gets
+from your script to display proper error messages to the end user.
+
+The current set of error messages and how to use them can be found in the
+documenation. You can find the documentation at:
+http://spoon.pkl.net/~backpane/knews/
+
+If you have questions concerning the precommands or if you want to have
+certain features implemented into Knewsticker, please contact the
+Knewsticker precommand scripts maintainer at dlanx@kde.org, who will talk to
+the Knewsticker author for you, or contact him directly at raabe@kde.org.
+
+Thank you.
diff --git a/knewsticker-scripts/Generic.Newsticker.Error b/knewsticker-scripts/Generic.Newsticker.Error
new file mode 100644
index 0000000..b6d1341
--- /dev/null
+++ b/knewsticker-scripts/Generic.Newsticker.Error
@@ -0,0 +1,134 @@
+This file is roughly based on your systems errno.h.
+Many perl errors can be exported as errors defined in errno.h by doing the
+ following:
+use Errno qw(EINTR EIO :POSIX);
+or simply use Errno.
+
+The semantics of this file are as follows:
+ A numerical error code followed by a human readable upper case short definition, which is followed by an
+explanation of the actual error code.
+We assume, that the interpreter you use returns an
+error code of 1 upon failing to execute your script and an error code of 0 if
+the execution is successful. This does NOT include any data passed from
+the script or any errors which might occur during runtime, it is simply a
+way for us to determine wheter your script started at all and if any more
+output should be expected.
+Some of the errors described below can be categorized, those categories range
+from warning over critical to fatal.
+An error which would terminate your script and therefore close the running
+process, would be considered as fatal.
+An error which would prevent your script from sending valid output, yet
+not terminate its process would be considered as critical. Any other
+error is considered as warning. A warning is always
+OPTIONAL, critical errors and fatal errors MUST be implemented
+
+Depending on which script language or programming language you use it is
+up to you, to determine wheter an error is fatal, critical or just a warning,
+some suggestions have been made in the list below.
+Generic and system error section:
+0 NOERR No error has been detected
+1 EPERM The operation is not permitted by the executing program.
+ Which means, that some fatal error occurred and
+ your script could not even be started.
+2 ENOENT A file or directory your script wanted to read or write
+ could not be found and the scripts operation was
+ hampered by that.
+5 EIO There has been an error while your script
+ attempted to read or write data
+7 E2BIG If your scripts accepts arguments at the command
+ line, this error means, that too many arguments
+ were entered. This error code is not in
+ effect yet.
+8 ENOEXEC If your script relies on system level programs and that
+ program could not be executed, use this
+ error code to report that to
+ knewsticker. This is an informational
+ error code and not necessarily a fatal
+ one
+13 EACCESS permission to a resource or file has been denied to
+ your script, which does not allow it to
+ properly function, this error is fatal
+ and should be followed at once by
+ and exit code of 1
+19 ENODEV A device you are trying to write to is not
+ available, as above this error code is
+ fatal, it should be followed by an exit
+ code of 1 to terminate your scripts
+ operation.
+28 ENOSPC There is no more space left on the device you are
+ trying to write a temporary file to.
+30 EROFS You are trying to write a temporary file to an
+ read only file system
+38 ENOSYS Your script tried to call a function which was not
+ implemented or it is trying to access an
+ external resource which does not exist.
+ You can also use this error code when
+ you are writing a perl script and the
+ modules functions you are trying to
+ access is not present.
+61 ENODATA Your script has not been able to retrieve any data.
+ Thus no XML can be returned. This error
+ is critical, yet not necessarily fatal.
+---------------------------------------------------------
+Network related errors.
+64 ENONET The machine you are using is not connected to a
+ network. This error is fatal
+71 EPROTO Your script tried to access a protocol which is not
+ implemented. This would mean, that you
+ are trying to use SNMP on a system that
+ does not understand it
+89 EDESTADDRREQ Your script requires for the user to enter a destination
+ address to retrieve data from.
+ This error is used when that has
+ not been done. It is
+ informational yet fatal
+ to the script
+94 ESOCKTNOSUPPORT Your script is trying to use a socket type not supported
+ by the system, for
+ example trying to open a
+ unix socket of a
+ system where this is not
+ supported
+101 ENETUNREACH The network you are trying to access is
+ unreachable
+102 ENETRESET The network you were trying to access dropped the
+ connection with a reset
+104 ECONNRESET The connection you had has been reset by your peer
+110 ETIMEDOUT The connection you were trying to establish timed out
+111 ECONNREFUSED The connection you were trying to established has been refused
+112 EHOSTDOWN The host you are trying to reach is down
+113 EHOSTUNREACH The host you are trying to reach is unreachable, no route
+ to host
+Please NOTE that above error codes ONLY correspond to the error numbers defined
+on Linux i386 machines if you wish to use the Perl method mentioned.
+The error codes which are mentioned above are _reserved_ for newsticker internal
+use and have not necessarily anything to do with the error codes returned by
+your system.
+
+----------------
+Since we are possibly dealing often with HTTP error codes this is a specialized
+section you may use to return errors based on that protocol.
+These error codes correspond to the actual HTTP error codes, thus enabling
+you to handle them easier when passing them on to Knewsticker.
+Client errors:
+400 EBADREQ Bad Request. Your script sent a bad request, not
+ understood by the server, which is
+ reporting this back to you.
+401 ENOAUTH No authorization has been issued for an area that needs
+ some form of authorization before it can
+ be accessed
+402 EMUSTPAY You cannot access the data without paying for it, this
+ is not a bogus error, it is defined as
+ such in the http protocol
+403 EFORBIDDEN You are forbidden to access the source you requested
+404 ENOTFOUND The data you tried to access could not be found.
+408 ETIMEOUT Your HTTP request timed out, this is an error which
+ reflects timeouts for the HTTP protocol
+ ONLY. Generic time outs are handled in
+ the above paragraph
+Server errors:
+500 ESERVERE A server error has been encountered.
+505 EHTTPNOSUP The HTTP protocol version you attempted to use was not
+ understood by the http server or source
+ you were trying to access
+-------------------
diff --git a/knewsticker-scripts/Makefile.am b/knewsticker-scripts/Makefile.am
new file mode 100644
index 0000000..7fb55f1
--- /dev/null
+++ b/knewsticker-scripts/Makefile.am
@@ -0,0 +1,7 @@
+scriptdir = $(kde_datadir)/knewsticker/scripts
+script_DATA = Generic.Newsticker.Error Readme.ErrorHandling \
+ fyensget.py \
+ stock.pl Readme.stock \
+ newsrss.pl Readme.newsrss \
+ bbc.pl \
+ sportscores.py
diff --git a/knewsticker-scripts/README.kataribe b/knewsticker-scripts/README.kataribe
new file mode 100644
index 0000000..eb3a281
--- /dev/null
+++ b/knewsticker-scripts/README.kataribe
@@ -0,0 +1,44 @@
+Kataribe Readme
+
+Kataribe is a more or less simple script to turn your Mbox into an RSS file,
+so that you may display the subject and from in your Knewsticker. This
+script uses a set of Perl modules to access the mail box. The standard mail
+box format which I assume is the classic UNIX Mbox format. The script is
+rather flexible though and if you wish to adjust the script to fit your
+mailbox's needs, please be my guest. You can find a list of classes, which
+are supported by the module here:
+http://search.cpan.org/search?mode=module&query=Mail%3A%3ABox
+
+The following list of modules must be installed in order for this script to
+work:
+
+Data::Dumper;
+Date::Format;
+Mail::Box;
+Mail::Box::Manager;
+MIME::Words
+
+Make sure, that you set the $limit variable in the top section of the
+script. Parsing a Mbox file is not highly efficient and parsing a huge Mbox
+file over and over can be very time consuming. This might cause the script
+to time out and not report any data back to KNewsticker. By default only the
+_newest_ ten messages are read and displayed as RSS.
+
+This script tries to be smart about the From header, yet might not always
+guess right. The script assumes to find a from in the form of:
+
+A name <a@email.de>
+
+It will try to display the A name part in Knewsticker along with the subject
+of the mail messages. If the script cannot find a name, it will try to use
+the email address instead.
+
+I realize, that there are still several issues, which could be adressed and
+the script surely is not 100% feature complete, but it is operational for
+those, who wish to have a quick overview about the new mail, which might
+have been dumped into their local account using fetchmail or any other
+delivering service.
+
+This IS a work in progress, it has been tested by the author but not by any
+other, so please make sure to do so and report back to bio@gmx.de. Thank
+you.
diff --git a/knewsticker-scripts/Readme.ErrorHandling b/knewsticker-scripts/Readme.ErrorHandling
new file mode 100644
index 0000000..f8d2999
--- /dev/null
+++ b/knewsticker-scripts/Readme.ErrorHandling
@@ -0,0 +1,19 @@
+Error Handling for Knewsticker Pre commands
+
+Error handling might not be a prerequisite for writing Knewsticker scripts,
+yet it would be nice if you tried to introduce some comprehensive error
+handling in your scripts. Knewsticker is a graphical application and as such
+the user is not able to read any error output your program might produce.
+Knewsticker knows a variety of error codes and each is handled in a
+different way. You may look those codes up in the table provided.
+
+Please make sure to return those error codes properly for the development
+language you are trying to use. If you are trying to use Perl, please make
+sure you understand an have read the top most part of the error handling
+document. It will explain to you, how it is fairly easy to catch errors and
+report them back to Knewsticker.
+
+If you are still unsure how to do it on a system level, simply implement
+your own error handling and make sure, that your return codes match the
+event(s) described in the error handling document you will find in CVS as
+well.
diff --git a/knewsticker-scripts/Readme.newsrss b/knewsticker-scripts/Readme.newsrss
new file mode 100644
index 0000000..bb434e0
--- /dev/null
+++ b/knewsticker-scripts/Readme.newsrss
@@ -0,0 +1,48 @@
+This Readme is meant to describe how you should go about using the news to
+RSS script. Please keep in mind, that all software retrieved from CVS is in
+a constant change; your script might work now, but it might not work a
+moment later.
+
+Even though the script can handle multiple newsgroups at once, Knewsticker
+has not been adjusted to handle such a behavior on its own, therefore please
+poll only one newsgroup per executed script.
+
+You need to customize each executed script to fit your needs, yet before you
+can do so, you must be sure, that the version of perl you are running is
+providing all the necessary modules for this script to function. You need to
+have the following modules installed:
+
+News::NNTPClient;
+MIME::Words
+
+If you are not sure wheter those are installed, simply execute the script at
+the command line and watch for possible errors. Right now the script has no
+error handling whatsoever, which might be corrected in future versions. You
+can either go and retrieve the modules from www.cpan.org and install them by
+hand or run the following command as root, while you are connected to the
+Internet:
+
+perl -MCPAN -e "install module::name"
+
+Executing this command at the prompt will automatically download and install
+the requested module, eventual dependencies will be resolved automatically.
+
+Once you have installed all the necessary tools, you can start customizing
+your script, this means, that you should open it with your favourite editor
+and read the comments above each variable you must set carefully.
+
+Most scripts are commented rather precisely, as it is the case with this
+one. Of course you may set which nntp host we are connecting to within the
+script, but if you have a host set in /etc/nntpserver the script will ALWAYS
+default to that server, this has been implemented for systems, where the
+administrator might not wish you to use a different nntp server. Of course
+it can be evaded, but we urge you to be polite and use what is offered to
+you by the system.
+
+Once you are sure you have set all the variables as requested in the scripts
+upper part, you may now store it anywhere on your hard disk. Make sure you
+have read knewstickers help on executing pre commands.
+
+Enjoy this script.
+
+anonymous coder.
diff --git a/knewsticker-scripts/Readme.stock b/knewsticker-scripts/Readme.stock
new file mode 100644
index 0000000..06b3d8d
--- /dev/null
+++ b/knewsticker-scripts/Readme.stock
@@ -0,0 +1,36 @@
+This Readme is meant to describe how you should go about using the
+Stockticker to RSS script. Please keep in mind, that all software retrieved
+from CVS is in a constant change; your script might work now, but it might
+not work a moment later.
+
+You need to customize each executed script to fit your needs, yet before you
+can do so, you must be sure, that the version of perl you are running is
+providing all the necessary modules for this script to function. You need to
+have the following module(s) installed:
+
+Finance::Quote
+
+If you are not sure wheter those are installed, simply execute the script at
+the command line and watch for possible errors. Right now the script has no
+error handling what so ever, which might be corrected in future versions.
+You can either go and retrieve the modules from www.cpan.org and install
+them by hand or run the following command as root, while you are connected
+to the Internet:
+
+perl -MCPAN -e "install module::name"
+
+Executing this command at the prompt will automatically download and install
+the requested module, eventual dependencies will be resolved automatically.
+
+Once you have installed all the necessary tools, you can start customizing
+your script, this means, that you should open it with your favourite editor
+and read the comments above each variable you must set carefully. Most
+scripts are commented rather precisely, as it is the case with this one.
+
+Once you are sure you have set all the variables as requested in the scripts
+upper part, you may now store it anywhere on your hard disk. Make sure you
+have read knewstickers help on executing pre commands.
+
+Enjoy this script and READ the commentary within it..
+
+anonymous coder.
diff --git a/knewsticker-scripts/bbc.pl b/knewsticker-scripts/bbc.pl
new file mode 100755
index 0000000..78cb4e3
--- /dev/null
+++ b/knewsticker-scripts/bbc.pl
@@ -0,0 +1,54 @@
+#!/usr/bin/perl
+=cut
+
+Copyright (c) 2001 Malte Starostik <malte@kde.org>
+
+Unlimited use, modification and distribution granted as long as the above
+copyright statement and this sentence remain intact.
+
+=cut
+
+use strict;
+use LWP::Simple;
+
+print <<'EOT';
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN"
+ "http://my.netscape.com/publish/formats/rss-0.91.dtd">
+<rss version="0.91">
+<channel>
+<title>BBC News Headlines</title>
+<description>News from the BBC</description>
+<language>en-gb</language>
+EOT
+
+my ($secnum, $section, $headline, $url);
+foreach (split /\r?\n/, get "http://tickers.bbc.co.uk/tickerdata/story2.dat")
+{
+ $secnum = $1, $section = '' if (/^STORY ([\d+])/ && $1 != $secnum);
+ if (/^HEADLINE (.+)/)
+ {
+ next if $1 =~ /Last update/;
+ $headline = $1;
+ $headline =~ s/&/&amp;/g;
+ $headline =~ s/</&lt;/g;
+ $headline =~ s/>/&gt;/g;
+ $headline =~ s/"/&quot;/g;
+ $section = $headline, $section =~ s/\s*\d+ (Ja|Fe|Ma|Ap|Ju|Au|Se|Oc|No|De)\S+ \d+$// unless $section;
+ }
+ if (/^URL (.+)/)
+ {
+ $url = $1, $url =~ s/&/&amp;/g;
+ print <<EOT
+<item>
+<title>$headline ($section)</title>
+<link>$url</link>
+</item>
+EOT
+ }
+}
+
+print <<'EOT';
+</channel>
+</rss>
+EOT
diff --git a/knewsticker-scripts/fyensget.py b/knewsticker-scripts/fyensget.py
new file mode 100755
index 0000000..3f60a0b
--- /dev/null
+++ b/knewsticker-scripts/fyensget.py
Binary files differ
diff --git a/knewsticker-scripts/kataribe.pl b/knewsticker-scripts/kataribe.pl
new file mode 100755
index 0000000..5cd483c
--- /dev/null
+++ b/knewsticker-scripts/kataribe.pl
@@ -0,0 +1,96 @@
+#!/usr/local/bin/perl -w
+use Data::Dumper;
+use Date::Format;
+use Mail::Box;
+use Mail::Box::Manager;
+use MIME::Words qw(:all);
+
+use constant TIMEZONE => 'MEST';
+#Set your mailbox's FULL path within the "" right here
+$mbox = "/var/mail/codexx";
+#Set the amount of emails you wish to read. If you set this
+# value to 5, the script will try to read the 5 most CURRENT
+# messages from your INBOX.
+# I advise you NOT to use more than 25 here, since parsing a huge
+# inbox can take a very long time!
+my $limit = 5;
+
+#STOPSTOPSTOPSTOPSTOPSTOP
+#if the maiblox file is not existant return ENOENT
+if (!-e $mbox) {
+exit 2;
+}
+#if we do not have access to read from that mailbox return EACCESS
+if (!-r $mbox) {
+exit 13;
+}
+
+
+
+my $mgr = Mail::Box::Manager->new;
+my $folder = $mgr->open(
+ folder => $mbox,
+ ) or exit 61; #if we cannot open the mailbox we will not be able to
+ #return any data, so exit with ENODATA
+
+$mgr->registerType(
+ mbox => 'Mail::Box::Mbox'
+ );
+
+my $number_of_emails = $folder->messages;
+if ($number_of_emails < $limit) {
+$boundary = ($number_of_emails+10)-$number_of_emails;
+}
+else {
+$boundary = 0;
+}
+
+
+print "<?xml version=\"1.0\"?>\n<\!DOCTYPE rss PUBLIC \"-//Netscape
+ Communications//DTD RSS 0.91//EN\"
+ \"http://my.netscape.com/publish/formats/rss-0.91.dtd\">\n<rss
+ version=\"0.91\">\n";
+print "<title> RSS file </title>\n<link>http://www.kde.org</link>\n<description>This
+is an automatically generated file using the NNTP to RSS generator for
+Knewsticker.</description>\n<language>en-us</language>\n";
+print "<channel>\n";
+
+my (@from, @time, @subject, @size, @from_email);
+
+foreach ($boundary .. $number_of_emails - 1) {
+
+ chomp($subject[$_] = $folder->message($_)->head->get('subject'));
+# $size[$_] = $folder->message($_)->size;
+# $size[$_] = $size[$_] / 1024;
+# $size[$_] = substr($size[$_],0,5) ."kb";
+ chomp($from[$_] = $folder->message($_)->head->get('from'));
+ $time[$_] = time2str('%a %b %e', $folder->message($_)->timestamp, TIMEZONE);
+
+ ($from_email[$_]) = ($from[$_] =~ /([^<]*)/);
+ ($from[$_]) = ($from[$_] =~ /<([^>]*?)>/);
+ defined($from_email[$_]) or $from_email[$_] = $from[$_];
+for ($subject[$_], $from[$_]) {
+
+ s{&}{&amp;}g;
+ s{\(}{&#40;}g;
+ s{\)}{&#41;}g;
+ #s{@}{&#64;}g;
+ s{<}{&lt;}g;
+ s{>}{&gt;}g;
+
+ };
+for ($subject[$_]) {
+decode_mimewords($_);
+}
+
+ print<<EOT;
+
+<item>
+<title> Mail from: $from_email[$_] concerning $subject[$_] sent at $time[$_]</title>
+<link>mailto://$from[$_]</link>
+<description></descrition>
+</item>
+EOT
+
+};
+print "</channel>\n</rss>\n";
diff --git a/knewsticker-scripts/newsrss.pl b/knewsticker-scripts/newsrss.pl
new file mode 100644
index 0000000..7bfade3
--- /dev/null
+++ b/knewsticker-scripts/newsrss.pl
@@ -0,0 +1,100 @@
+#!/usr/bin/perl -w
+
+# This file is not released under any specific License. All Licenses, which
+# might be requirered by knewsticker are explicitly accepted by the author
+# whenver this file comes with knewsticker.
+# Commonly this file simply underlies the regulations of international
+# copyright. This file is copyrighted by anonymous coder .< bio@gmx.net>, A lot
+# of help has been offered to me by malte, so thank him as well
+
+
+use News::NNTPClient;
+use POSIX qw(strftime);
+use MIME::Words qw(:all);
+
+# Enter your newsserver here, or set it in your /etc/nntpserver
+$host = "news.chello.at";
+
+#set EVERY group you wish to check here. Make sure you seperate them by one
+#whitespace only. At present Knewsticker only handles ONE group per file, so
+#please DO NOT SET MORE THAN 1 GROUP. It will break this scripts functionality
+@groups = qw(at.linux);
+
+#Specify here how many articles should be checked for EACH group you entered.
+#The default value is 10. which means the newest 10 subjects are displayed
+$get=10;
+
+# STOP do NOT continue unless you KNOW what you are doing
+# STOP STOP STOP STOP STOP STOP STOP STOP STOP
+for my $group (@groups) {
+$head ="<?xml version=\"1.0\"?>\n<\!DOCTYPE rss PUBLIC \"-//Netscape
+ Communications//DTD RSS 0.91//EN\"
+ \"http://my.netscape.com/publish/formats/rss-0.91.dtd\">\n<rss
+ version=\"0.91\">\n";
+$static="<title> " . $group . " RSS file
+ </title>\n<link>http://www.kde.org</link>\n<description>This
+is an automatically generated file using the NNTP to RSS generator for
+Knewsticker.</description>\n<language>en-us</language>\n";
+
+print $head;
+print "<channel>\n";
+print $static;
+$now_string = strftime "%a, %d %b %Y %H:%M:%S %z", localtime;
+print "<pubDate>" . $now_string . "</pubDate>\n";
+
+sub read_etc_nntpserver {
+my $rc;
+ open(FH, '</etc/nntpserver') || return undef;
+ $rc = scalar(<FH>);
+ close(FH);
+ $rc =~ s/\s*$//;
+ return $rc || undef;
+}
+$t = read_etc_nntpserver();
+if(!defined $t) {
+$t = $host;
+}
+
+$c = new News::NNTPClient($t);
+
+(undef, $last) = ($c->group($group));
+$thislast = ($last-$get);
+
+@b = map { $_ = decode_mimewords $_ } $c->xhdr("Subject", $thislast, $last);
+@c= map { s/&/&amp;/g; s/\(/&#40;/g; s/\)/&#41;/g; s/@/&#64;/g; s/</&lt;/g;
+ s/>/&gt;/g; $_ } @b;
+foreach (@c) { /(\d+)\s*(.*)\s*/ and $postings{$1} = {'subject' => $2}; }
+
+@b = map { $_ = decode_mimewords $_ } $c->xhdr("From", $thislast, $last);
+@c= map { s/&/&amp;/g; s/\(/&#40;/g; s/\)/&#41;/g; s/@/&#64;/g; s/</&lt;/g;
+ s/>/&gt;/g; $_ } @b;
+foreach (@c) { /(\d+)\s*(.*)\s*/ and $postings{$1}->{'from'} = $2; }
+
+@b = $c->xhdr("Message-ID", $thislast, $last);
+@c= map { s/&/&amp;/g; s/\(/&#40;/g; s/\)/&#41;/g; s/</&lt;/g; s/>/&gt;/g; $_ }
+ @b;
+foreach (@c) { /(\d+)\s*(.*)\s*/ and $postings{$1}->{'message-id'} = $2; }
+
+for ($i = $thislast; $i != $last+1; $i++) {
+@b = $c->body($i);
+@c= map { s/&/&amp;/g; s/\(/&#40;/g; s/\)/&#41;/g; s/</&lt;/g; s/>/&gt;/g; $_ }
+ @b;
+@d= (grep !/^$/, @c)[0..3];
+foreach (@d) { $postings{$i}->{'body'} .= $_ ; }
+
+}
+
+foreach my $id (sort keys %postings)
+{
+ print "<item>\n";
+ print "<title>" . $postings{$id}->{'subject'} .
+ "</title>\n";
+ print "<link>nntp://" . $t ."/" . $group ."/" .
+ $postings{$id}->{'message-id'} ."</link>\n";
+ print "<description> This article has been posted by " .
+$postings{$id}->{'from'} . " containing:\n " . $postings{$id}->{'body'}
+. "</description>\n</item>\n";
+}
+print "</channel>\n</rss>\n";
+%postings =();
+}
diff --git a/knewsticker-scripts/sportscores.py b/knewsticker-scripts/sportscores.py
new file mode 100755
index 0000000..ce9d04d
--- /dev/null
+++ b/knewsticker-scripts/sportscores.py
@@ -0,0 +1,241 @@
+#!/usr/bin/env python
+import string, urllib, sys
+
+if len(sys.argv) > 1:
+ sport = sys.argv[1]
+else:
+ sport = "NHL" # Must be one of NHL, NBA, MLB
+
+class SportsParser:
+ def __init__(self):
+ print "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>"
+ print "<rdf:RDF"
+ print "xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\""
+ print "xmlns=\"http://my.netscape.com/rdf/simple/0.9/\">"
+ print "<channel>"
+ print "<title>%s</title>" %self.title()
+ print "<description>%s</description>" %self.description()
+ print "<link>%s</link>" %self.link()
+ print "</channel>"
+ self.processScores(self.inputFile())
+ print "</rdf:RDF>"
+
+ def processScores(self, inputFile):
+ try:
+ input = urllib.urlopen(self.inputFile())
+ lines = input.readlines()
+ except:
+ sys.exit(5)
+
+ for line in lines:
+ if self.isScoreLine(line):
+ self.handleScoreLine(line)
+
+ def handleGame(self, headline, link):
+ print "<item>"
+ print "<title>%s</title>" %headline
+ print "<link>%s</link>" %link
+ print "</item>"
+
+class NHLParser(SportsParser):
+ def isScoreLine(self, line):
+ if line.startswith("nhl_scores_current[") or line.startswith("nhl_scores_previous["):
+ return 1
+ else:
+ return 0
+
+ def handleScoreLine(self, line):
+ __line = string.strip(line)
+ __line = string.split(__line, "|")
+ __date = __line[1]
+ __dayOfWeek = __line[3]
+ __teamA = __line[4]
+ __teamB = __line[5]
+ __teamAAbbr = __line[7]
+ __teamBAbbr = __line[8]
+ __gameState = __line[9]
+ __hour = int(__line[10])
+ __minutes = int(__line[11])
+ __timeZone = __line[12]
+ __scoreA = __line[13]
+ __scoreB = __line[15]
+ if __gameState == "pre-game":
+ self.handleGame("%s at %s (%i:%02i %s)" %(__teamAAbbr, __teamBAbbr, __hour, __minutes, __timeZone), self.link())
+ elif __gameState == "Final":
+ self.handleGame("%s %s %s %s (Final)" %(__teamBAbbr, __scoreB, __teamAAbbr, __scoreA), self.link())
+ # I'm tired of wget'ing the HTML file just to wait for an in-progress
+ # entry. Moo.
+
+ def inputFile(self):
+ return "http://sports.excite.com/nhl/index.html"
+
+ def title(self):
+ return "NHL Scores"
+
+ def description(self):
+ return "Official scores from the National Hockey League"
+
+ def link(self):
+ return "http://sports.excite.com/nhl"
+
+class NBAParser(SportsParser):
+ def isScoreLine(self, line):
+ if line.startswith("nba_scores_current[") or line.startswith("nba_scores_previous["):
+ return 1
+ else:
+ return 0
+
+ def period(self, period):
+ if period > 5:
+ return "%sOT" %(period - 4)
+ elif period == 5:
+ return "OT"
+ elif period == 4:
+ return "4th"
+ elif period == 3:
+ return "3rd"
+ elif period == 2:
+ return "2nd"
+ elif period == 1:
+ return "1st"
+
+ def handleScoreLine(self, line):
+ __line = string.strip(line)
+ __line = string.split(__line, "|")
+
+ date = __line[1]
+ dayOfWeek = __line[3]
+ homeTeam = __line[4]
+ awayTeam = __line[5]
+ homeTeamAbbrev = __line[7]
+ awayTeamAbbrev = __line[8]
+ hourUpdated = int(__line[10])
+ minuteUpdated = int(__line[11])
+ timeZoneUpdated = __line[12]
+ homeTeamScore = __line[13]
+ try:
+ period = int(__line[14])
+ except:
+ period = 0
+ awayTeamScore = __line[15]
+ minutesRemaining = __line[16]
+ secondsRemaining = __line[17]
+
+ headline = ""
+ if __line[9].count("pre") > 0:
+ # game hasn't started yet, print time it starts
+ headline = "%s at %s (%s:%02i %s)" %(awayTeamAbbrev, homeTeamAbbrev, hourUpdated, minuteUpdated, timeZoneUpdated)
+ elif __line[9].count("inal") > 0:
+ # game over
+ headline = "%s %s %s %s" %(awayTeamAbbrev, awayTeamScore, homeTeamAbbrev, homeTeamScore)
+ if period > 4:
+ headline += " (%s)" %self.period(period)
+ else:
+ headline += " (Final)"
+ else:
+ # game in progress
+ minutesRemaining = int(minutesRemaining)
+ secondsRemaining = int(secondsRemaining)
+ headline += " %s %s %s %s" %(awayTeamAbbrev, awayTeamScore, homeTeamAbbrev, homeTeamScore)
+ headline += " (%i:%02i %s)" %(minutesRemaining, secondsRemaining, self.period(period))
+
+ self.handleGame(headline, self.link())
+
+ def inputFile(self):
+ return "http://sports.excite.com/nba/index.html"
+
+ def title(self):
+ return "NBA Scores"
+
+ def description(self):
+ return "Official scores from the National Basketball Association"
+
+ def link(self):
+ return "http://sports.excite.com/nba"
+
+class MLBParser(SportsParser):
+ def isScoreLine(self, line):
+ if line.startswith("mlb_scores_current[") or line.startswith("mlb_scores_previous["):
+ return 1
+ else:
+ return 0
+
+ def inning(self, inning):
+ # I wonder if there's some nice i18n-friendly way to do this
+ if inning > 3:
+ return "%sth" %(inning)
+ elif inning == 3:
+ return "3rd"
+ elif inning == 2:
+ return "2nd"
+ elif inning == 1:
+ return "1st"
+
+ def handleScoreLine(self, line):
+ __line = string.strip(line)
+ __line = string.split(__line, "|")
+
+ date = __line[1]
+ dayOfWeek = __line[3]
+ homeTeam = __line[4]
+ awayTeam = __line[5]
+ homeTeamAbbrev = __line[7]
+ awayTeamAbbrev = __line[8]
+ try:
+ hourUpdated = int(__line[10])
+ except:
+ hourUpdated = 0
+ try:
+ minuteUpdated = int(__line[11])
+ except:
+ minuteUpdated = 0
+ timeZoneUpdated = __line[12]
+ homeTeamScore = __line[13]
+ try:
+ inning = int(__line[14])
+ except:
+ inning = 0
+ awayTeamScore = __line[15]
+ minutesRemaining = __line[16]
+ secondsRemaining = __line[17]
+
+ headline = ""
+ if __line[9].count("pre") > 0:
+ # game hasn't started yet, print time it starts
+ headline = "%s at %s (%s:%02i %s)" %(awayTeamAbbrev, homeTeamAbbrev, hourUpdated, minuteUpdated, timeZoneUpdated)
+ elif __line[9].count("inal") > 0:
+ # game over
+ headline = "%s %s %s %s" %(awayTeamAbbrev, awayTeamScore, homeTeamAbbrev, homeTeamScore)
+ if inning > 4:
+ headline += " (%s)" %self.inning(inning)
+ else:
+ headline += " (Final)"
+ else:
+ # Game in progress
+ # TODO: find out if it's the top or bottom of the inning
+ # Need to wget while a game's in progress to see.
+ headline += " %s %s %s %s" %(awayTeamAbbrev, awayTeamScore, homeTeamAbbrev, homeTeamScore)
+ headline += " (%s)" %(self.inning(inning))
+
+ self.handleGame(headline, self.link())
+
+ def inputFile(self):
+ return "http://sports.excite.com/mlb/index.html"
+
+ def title(self):
+ return "MLB Scores"
+
+ def description(self):
+ return "Official scores from Major League Baseball"
+
+ def link(self):
+ return "http://sports.excite.com/mlb"
+
+try:
+ parser = globals()["%sParser" %(sport)]()
+
+except:
+ print "Invalid sport type '%s' selected." %sport
+ sys.exit(2)
+
+sys.exit(0)
diff --git a/knewsticker-scripts/stock.pl b/knewsticker-scripts/stock.pl
new file mode 100755
index 0000000..9e07adf
--- /dev/null
+++ b/knewsticker-scripts/stock.pl
@@ -0,0 +1,276 @@
+#!/usr/bin/perl
+###############################################################################
+# getstockquote.pl - Retrieves stock data for given ticker symbol(s)
+#
+# Purpose: This script returns a nicely formatted HTML table containing stock
+# data for ticker symbols given as command line arguments. This
+# script can be used from a server-side exec (it's orginal use) or
+# via a call from a regular CGI script. It could also be called from
+# PHP, but I haven't tested this. The script prints its results on
+# STDOUT.
+# Usage: READ AT THE VERY END OF THIS COMMENT BLOCK
+# The "quote_source" value can can any of the following:
+# yahoo: NYSE quotes
+# yahoo_europe: Europe quotes
+# fidelity: Fidelity Investments Quotes
+# troweprice: Quotes from T. Rowe Price
+# vanguard: Quotes from Vanguard Group
+# asx: Australian quotes from ASX
+# tiaacref: Annuities from TIAA-CREF.
+# Requires: Script requires at least perl 5.005, patch 3.
+# Script must have the Finance::Quote module installed. This module
+# in turn requires the LWP modules (which in turn have their own
+# reqs). See CPAN for exact requirements for LWP:
+# http://www.perl.com/CPAN-local//modules/by-module/LWP/
+# Or you can simply type as root user
+# perl -MCPAN -e "install Finance::Quote"
+# All dependancies will be resolved automatically then
+# Origina Author: William Rhodes <wrhodes@27.org>
+# Copyright (C) 2000 William Rhodes <wrhodes@27.org>.
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# This program 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 the GNU General Public License for more
+# details.
+#
+# The information that you obtain with this script may be copyrighted by Yahoo!
+# Inc., and is governed by their usage license. See
+# http://www.yahoo.com/docs/info/gen_disclaimer.html for more information.
+#
+# The information that you obtain with this script may be copyrighted by the
+# ASX, and is governed by its usage license. See
+# http://www3.asx.com.au/Fdis.htm for more information.
+#
+# The information that you obtain with this script may be copyrighted by
+# TIAA-CREF, and is governed by its usage license.
+#
+# Other copyrights and conditions may apply to data fetched via this script.
+#
+# Submitting changes back to the author is not required but certainly
+# encouraged. Bug fixes are also greatly appreciated.
+#
+#
+# This script has been altered by an anonymous coder to fit the Knewsticker
+# needs.
+# Please set your stock symbols and the ticker you wish to retrieve them from
+# as follows:
+# Locate the Variable that is named 'my @tickers'
+# within the parenthesis put as the FIRST values you ticker, for example yahoo
+# or yahoo_europe or any of the others mentioned above
+# any subsequent value seperated by a whitespace is a ticker symbol
+# such as MSFT or IBM or LNUX
+# Make sure all data is set correctly then call this script from Knewsticker
+###############################################################################
+
+
+use Finance::Quote;
+use POSIX qw(strftime);
+# Set this to 1 if you wish to have VERY detailed stock quotes it is greatly
+# encouraged, that you only use this when you have 1 stock symbol and not more.
+my $verbose = 0;
+
+#Make sure you set the first value within the parenthesis to match the ticker
+#you wish to retrieve data from, such as yahoo or yahoo_europe. Each following
+#entry, seperated by a whitespace, represnts a stock symbol to the script
+my @tickers = qw(yahoo_europe IBM MSFT LNUX);
+
+#-------------------------------------------------------------------------------
+#STOP STOP STOP STOP only go on if you know what you are doing!!
+
+# Get rid of puncuation in @ARGV. This will filter out metacharacters and
+# such, which makes the script marginally more safe
+#
+foreach (@tickers) { s/[^a-zA-Z0-9\-=_\.\^]//; }
+
+# Check the input to make sure we can look stuff up
+#
+@tickers = CheckInput(@tickers);
+
+# Get a new Finance::Quote object
+#
+my $quote_src = $tickers[0];
+my $quote = Finance::Quote->new;
+# Override LWP's 120 second timeout, throw error if we time out
+# Set this pretty short if using as a server-side exec
+#
+exit 110 unless ($quote->timeout(10));
+
+
+# Load the quotes hash for getting data
+#
+my %quotes = $quote->$quote_src(@tickers);
+
+# Start our RSS table output; get the ticker data, print it out
+#
+$head ="<?xml version=\"1.0\"?>\n<\!DOCTYPE rss PUBLIC \"-//Netscape
+ Communications//DTD RSS 0.91//EN\"
+ \"http://my.netscape.com/publish/formats/rss-0.91.dtd\">\n<rss
+ version=\"0.91\">\n";
+
+$static="<title> " . $group . " RSS file
+ </title>\n<link>http://www.kde.org</link>\n<description>This
+is an automatically generated file using the STOCK to RSS generator for
+Knewsticker.</description>\n<language>en-us</language>\n";
+
+shift(@tickers);
+print $head;
+print "<channel>\n";
+print $static;
+$now_string = strftime "%a, %d %b %Y %H:%M:%S %z", localtime;
+print "<pubDate>" . $now_string . "</pubDate>\n";
+for (@tickers) { print PrintData($_); }
+print "</channel>\n</rss>\n";
+
+
+###############################################################################
+# SUBROUTINES
+###############################################################################
+
+# You have to specify a valid quote source and at least one ticker symbol
+# If this script was a stand-alone CGI, it probably ought to use CGI::CARP to
+# send errors to the browser.
+#
+sub CheckInput {
+ my @input = @_;
+ my ($src_name, $src_val, $src_err, $src_found);
+ my %ticker_src;
+
+ $ticker_src{yahoo} = "NYSE quotes";
+ $ticker_src{yahoo_europe} = "Europe quotes";
+ $ticker_src{fidelity} = "Fidelity Investments Quotes";
+ $ticker_src{troweprice} = "Quotes from T. Rowe Price";
+ $ticker_src{vanguard} = "Quotes from Vanguard Group";
+ $ticker_src{asx} = "Australian quotes from ASX";
+ $ticker_src{tiaacref} = "Annuities from TIAA-CREF";
+
+ # Check for font size option
+ #
+ if ($input[0] =~ /\-\-fontsize=[1-6]/) {
+ $input[0] =~ s/\-\-fontsize=(\d)//;
+ $font_size = $1;
+ shift(@input);
+ }
+
+ # Check for verbose, shift @input anyway
+ #
+ if ($input[0] =~ /\-\-verbose=yes/i) {
+ $verbose = 1;
+ shift(@input);
+ } elsif ($input[0] =~ /\-\-verbose=no/i) {
+ $verbose = 0;
+ shift(@input);
+ }
+
+ # No quote source or symbols
+ #
+ if (!$input[0]) {
+ $src_err .= "$0: Error: No quote source given. Quote source must be one
+ of the following:<br>\n";
+ while (($src_name, $src_val) = each(%ticker_src)) {
+ $src_err .= " $src_name - $src_val<br>\n";
+ }
+ ReturnError("$src_err\n");
+ } elsif (!$input[1]) {
+ ReturnError("$0: Error: No symbols given.");
+ }
+
+ # Check for invalid quote source
+ #
+ $src_found = 0;
+ foreach $src_name (keys %ticker_src) {
+ if ($src_name eq lc($input[0])) {
+ $src_found = 1;
+ }
+ }
+
+ # Throw an error unless we had a valid quote source
+ #
+ unless ($src_found) {
+ $src_err .= "$0: Error: Invalid quote source \"$input[0]\". ";
+ $src_err .= "Quote source must be one of the following:<br>\n";
+ while (($src_name, $src_val) = each(%ticker_src)) {
+ $src_err .= " $src_name - $src_val<br>\n";
+ }
+ ReturnError($src_err);
+ }
+
+ # So everything matched, send out args back
+ #
+ return(@input);
+
+} # End CheckInput
+
+
+# Return each ticker data in HTML table rows
+#
+sub PrintData {
+ my ($key, $value, $name, $output);
+ my %data;
+ my $ticker = shift || die "No ticker data given! $!\n";
+ if ($quote_src ne "tiaacref") {
+ $ticker = uc($ticker);
+ }
+
+ # Our hash of stuff that we want to return as table rows
+ # We have our default, and then add to it if $verbose is set
+ #
+ $data{a_Last_Price} = $quotes{"$ticker", "last"};
+ $data{b_High} = $quotes{"$ticker", "high"};
+ $data{c_Low} = $quotes{"$ticker", "low"};
+ $data{g_Open} = $quotes{"$ticker", "open"};
+ $data{h_Close} = $quotes{"$ticker", "close"};
+ if ($verbose) {
+ $data{d_Change} = $quotes{"$ticker", "change"};
+ $data{e_Last_Trade} = $quotes{"$ticker", "date"} . " at " .
+ $quotes{"$ticker", "time"};
+ $data{b_High} = $quotes{"$ticker", "high"};
+ $data{c_Low} = $quotes{"$ticker", "low"};
+ $data{f_Volume} = $quotes{"$ticker", "volume"} . " shares";
+ $data{i_Bid} = $quotes{"$ticker", "bid"};
+ $data{j_Ask} = $quotes{"$ticker", "ask"};
+
+ # Volume needs commas to look good
+ #
+ $data{f_Volume} = reverse($data{f_Volume});
+ $data{f_Volume} =~ s/(\d\d\d)(?=\d)(?!\d*\.)/$1,/g;
+ $data{f_Volume} = reverse($data{f_Volume});
+
+ }
+ $output = "<item>\n<title>\n $ticker Stock Symbol";
+ foreach $key (sort keys %data) {
+ $name = $key; # Need to save $key for hash lookups
+ $name =~ s/^[a-z]_//; # Get rid of sorting characters
+ $name =~ s/_/ /g; # Get rid of underscores
+ $data{$key} = "N/A" if ($data{$key} eq ""); # Don't show empty values
+
+ # We want at least two decimal places in some fields
+ #
+ if ($name =~ /Last|High|Low|Open|Close|Bid|Ask/i) {
+ $data{$key} =~ s/^(\d+$)$/$1\.00/;
+ $data{$key} =~ s/^(\d+\.\d)$/$1\0/;
+ }
+
+ $output .= " $name $data{$key} ";
+ }
+ $output .= "\n";
+ $output .="</title>\n<link>http://www.kde.org</link>\n</item>\n";
+ return($output);
+} # End GetData
+
+
+# Prints a usage and error message to STDOUT, exits with -1
+#
+sub ReturnError {
+ my $error = shift;
+ my $usage = "Usage:
+ Add the following options to \@tickers at the top of the script:<br>
+ [--fontsize=1..6] [--verbose=yes|no]
+ &lt;quote_source&gt; &lt;ticker1&gt; [ticker2] ...\n";
+ print $error . "<br>" . $usage;
+ exit;
+} # End ReturnError
diff --git a/konq-plugins/Makefile.am b/konq-plugins/Makefile.am
new file mode 100644
index 0000000..5949b5a
--- /dev/null
+++ b/konq-plugins/Makefile.am
@@ -0,0 +1,6 @@
+SUBDIRS = crashes khtmlsettingsplugin kimgalleryplugin dirfilter uachanger \
+ babelfish validators domtreeviewer webarchiver sidebar kuick \
+ imagerotation minitools microformat autorefresh fsview searchbar \
+ arkplugin akregator rellinks mediarealfolder
+
+
diff --git a/konq-plugins/README b/konq-plugins/README
new file mode 100644
index 0000000..5ab9b1b
--- /dev/null
+++ b/konq-plugins/README
@@ -0,0 +1,91 @@
+Konqueror Plugins
+=====================================================================
+This module contains plugins that interact with Konqueror.
+
+babelfish
+-------------------
+This works on KHTMLPart. It uses AltaVista's BabelFish site to
+translate the current page to whatever language you want (within
+reason).
+
+dirfilter
+-------------------
+This works on KonqDirPart. This allows you to filter the current
+directory in a variety of ways.
+
+domtreeviewer
+-------------------
+Displays the document object model (DOM) in a dialog box.
+
+htmlvalidator
+-------------------
+This works on KHTMLPart. It uses the w3c HTML validator to validate
+the current page. This is very handy when creating web pages.
+
+cssvalidator
+-------------------
+This works on KHTMLPart. It uses the w3c HTML validator to validate
+the current page. This is very handy when debugging Cascading Style Sheets.
+
+khtmlsettingsplugin
+-------------------
+This works on KHTMLPart. This allows you to enable or disable a bunch
+of HTML settings without going through the settings dialog.
+
+kimgalleryplugin
+-------------------
+This works on KonqDirPart. It creates an HTML page with thumbnails of
+all the images in the current directory.
+
+uachanger
+-------------------
+This works on KHTMLPart. It allows you to change the user agent
+without going through the settings dialog.
+
+kuick
+-------------------
+This works on KonqPopupMenuPlugin. It allows to select a bunch of files
+and copy and move them really quick.
+
+smbmounter
+-------------------
+This works on KonqDirPart. It works together with the smbro ioslave
+and provides two menus items to smbmount/umount the current samba share.
+
+autorefresh
+-------------------
+This works on any readonly part (though currently it only plugs into
+khtmlpart). It lets you tell konqueror to refresh a page automatically
+after a specific period. This is useful for things like news pages,
+and should be very nice for people using kiosk mode.
+
+sidebar
+------------------
+In this subdirectory you will find plugins for konqueror's extended sidebar
+
+sidebar/mediaplayer
+-------------------
+It's a small embedded mediaplayer, onto which you can drag songs or videos for preview
+
+fsview
+-------------------
+Graphical Disk Usage as konqueror plugin for inode/directory, for local files.
+
+arkplugin
+-------------------
+This lets you quickly archive or unarchive files from Konqueror, using Ark
+
+akregator
+-------------------
+This works on KHTMLPart and allows you to add feeds to Akregator directly from Konqueror.
+
+mediarealfolder
+-------------------
+This adds a service menu to konqueror allowing to open a medium mountpoint
+directly by right clicking on it.
+
+minitools
+-------------------
+This plugin adds implementation for so-called bookmarklets. Bookmarklets are little
+Javascript programs which can be saved and used like normal web page bookmarks. Therefore,
+they are simple "one-click" tools that can add substantial functionality to the browser.
diff --git a/konq-plugins/akregator/Makefile.am b/konq-plugins/akregator/Makefile.am
new file mode 100644
index 0000000..c6964d1
--- /dev/null
+++ b/konq-plugins/akregator/Makefile.am
@@ -0,0 +1,25 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = libakregatorkonqplugin.la libakregatorkonqfeedicon.la
+
+libakregatorkonqplugin_la_SOURCES = akregatorplugin.cpp pluginbase.cpp
+libakregatorkonqplugin_la_LIBADD = -lkonq $(LIB_KHTML)
+libakregatorkonqplugin_la_LDFLAGS = -module $(KDE_PLUGIN) -avoid-version -no-undefined $(all_libraries)
+
+libakregatorkonqfeedicon_la_SOURCES = konqfeedicon.cpp feeddetector.cpp pluginbase.cpp
+libakregatorkonqfeedicon_la_LIBADD = -lkonq $(LIB_KHTML)
+libakregatorkonqfeedicon_la_LDFLAGS = -module $(KDE_PLUGIN) -avoid-version -no-undefined $(all_libraries)
+
+konqplugindir = $(kde_servicesdir)
+konqplugin_DATA = akregator_konqplugin.desktop
+konqfeedicondir = $(kde_datadir)/khtml/kpartplugins
+konqfeedicon_DATA = akregator_konqfeedicon.desktop akregator_konqfeedicon.rc
+
+rssicondir = $(kde_datadir)/akregator/pics
+rssicon_DATA = rss.png
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/akregator_konqplugin.pot
diff --git a/konq-plugins/akregator/akregator_konqfeedicon.desktop b/konq-plugins/akregator/akregator_konqfeedicon.desktop
new file mode 100644
index 0000000..9f304f7
--- /dev/null
+++ b/konq-plugins/akregator/akregator_konqfeedicon.desktop
@@ -0,0 +1,116 @@
+[Desktop Entry]
+Name=Konq Feed Icon Plugin
+Name[bg]=Икона на новини
+Name[ca]=Icona de l'extensió d'enllaços del Konq
+Name[cs]=Modul pro zdroje
+Name[da]=Konq Kilde-ikon plugin
+Name[de]=RSS-Quellen-Symbol in Konqueror
+Name[el]=Πρόσθετο εικονιδίου ροής του Konq
+Name[eo]=Enhavpiktograma kromaĵo por Konkeranto
+Name[es]=Icono del complemento de fuentes para Konq
+Name[et]=Konquerori RSS-kanali ikooni plugin
+Name[eu]=Konq Feed ikono plugina
+Name[fa]=وصلۀ شمایل خوراندن Konq
+Name[fi]=Konq syöte kuvakesovelma
+Name[fr]=Module d'icône de flux pour Konqueror
+Name[fy]=Konq Feed-piktogram-plugin
+Name[ga]=Breiseán Deilbhín Fotha Konq
+Name[gl]=Plugin de Ícone RSS de Konqueror
+Name[hi]=कॉन्क. फ़ीड प्रतीक प्लगइन
+Name[hr]=Konq dodatak ikone tekućih novosti
+Name[hu]=Konqueror csatornaikon-modul
+Name[is]=Konq íforrit fyrir flæðismámyndir
+Name[it]=Plugin di visualizzazione icone per fonti
+Name[ja]=Konq フィードアイコン プラグイン
+Name[ka]=Konq არხის ხატულის მოდული
+Name[kk]=Konq ақпар таңбашасының плагин модулі
+Name[km]=កម្មវិធី​ជំនួយ​រូប​តំណាង​មតិព័ត៌មាន​របស់ Konq
+Name[lt]=Konq kanalų ženkliuko priedas
+Name[mk]=Приклучок за икона за довод за Konqueror
+Name[ms]=Plugin Ikon Suapan Konq
+Name[nb]=Programtillegg for Konq-ikon for nyhetskilde
+Name[nds]=Konqueror-Moduul för't RSS-Stroomlüttbild
+Name[ne]=कङ्क फिड प्रतिमा प्लगइन
+Name[nl]=Konq Feed-pictogram-plugin
+Name[nn]=Programtillegg for kjeldeikon i Konqueror
+Name[pa]=Konq ਫੀਡ ਆਈਕਾਨ ਪਲੱਗਇਨ
+Name[pl]=Wtyczka Konq z ikoną RSS
+Name[pt]='Plugin' de Ícone de Fonte do Konqueror
+Name[pt_BR]=Plug-in do Ícone de Fontes do Konq
+Name[ru]=Модуль лент новостей Konq
+Name[sk]=Modul ikony kŕmitka pre Konq
+Name[sl]=Vstavek za Konqueror z ikono vira
+Name[sr]=Прикључак Konqueror-а за икону довода
+Name[sr@Latn]=Priključak Konqueror-a za ikonu dovoda
+Name[sv]=Konqueror-insticksprogram med kanalikon
+Name[ta]=Konq பீட் சின்னச் சொருகுப்பொருள்
+Name[tr]=Konq Besleme Simge Eklentisi
+Name[uk]=Втулок піктограми подачі для Konqueoror
+Name[uz]=Konqueror yangiliklar tasmasi nishonchasi plagini
+Name[uz@cyrillic]=Konqueror янгиликлар тасмаси нишончаси плагини
+Name[vi]=Bổ sung biểu tượng nguồn tin Konq
+Name[zh_CN]=Konq 种子图标插件
+Name[zh_TW]=Konq Feed 圖示外掛程式
+Icon=akregator
+Comment=Displays feed icon in statusbar when the page has RSS feed
+Comment[bg]=Показване на иконата на новите, ако сайта има новини във формат RSS
+Comment[ca]=Mostra la icona d'enllaços a la barra d'estat quan la pàgina té enllaç RSS
+Comment[cs]=Zobrazí na panelu ikonku, pokud má stránka RSS
+Comment[da]=Viser kildeikon i statusfelt når siden har RSS-kilde
+Comment[de]=Zeigt das Quellen-Symbol in der Statusleiste, wenn die Seite eine RSS-Quelle hat
+Comment[el]=Εμφανίζει το εικονίδιο ροής στη γραμμή κατάστασης όταν η σελίδα έχει ροή RSS
+Comment[eo]=Montras enhavan piktogramon en statolistelo kiam la paĝo havas RSS enhavon
+Comment[es]=Muestra el icono de las fuentes en la barra de estado cuando la página tiene fuentes RSS
+Comment[et]=Näitab olekuribal kanaliikooni, kui saidil on RSS-kanal
+Comment[eu]=Orriak RSS iturbururik badu, egoera-barran ikonoa bistaratzen du
+Comment[fa]=هنگامی که صفحه خوراندن RSS را دارد، شمایل خوراندن را در میله وضعیت نمایش می‌دهد
+Comment[fi]=Näyttää syötekuvakkeen tilapalkissa jos sivulla on RSS-syöte
+Comment[fr]=Affiche une icône de flux RSS dans la barre d'état lorsque la page en possède
+Comment[fy]=Toant in feed-piktogram yn de statusbalke as der in RSS-feed op de side stiet
+Comment[ga]=Taispeáin deilbhín fotha sa bharra stádais nuair atá fotha RSS ar an leathanach
+Comment[gl]=Mostra o ícone de fonte na barra de estado cando a páxina ten unha fonte RSS
+Comment[hr]=Prikazivanje ikone tekućih novosti u traci stanja ako web-stranica ima RSS novosti
+Comment[hu]=Csatornaikont jelenít meg az állapotsorban, ha az oldalhoz RSS-csatorna tartozik
+Comment[is]=Sýna straumtáknmynd í stöðuslá þegar síða inniheldur RSS straum
+Comment[it]=Mostra l'icona nella barra di stato quando la pagina ha una fonte RSS
+Comment[ja]=RSS フィードを提供しているページでステータスバーにフィードアイコンを表示します
+Comment[ka]=სტატუსის ზოლზე აჩვენებს არხის ხატულას როდესაც გვერდს RSS არხი აქვს
+Comment[kk]=Бетте RSS ақпары бар болса күй-жай жолағында оның таңбашасын көрсету
+Comment[km]=បង្ហាញ​រូប​តំណាង​មតិ​ព័ត៌មាន​នៅ​ក្នុង​របារ​ស្ថានភាព ​នៅ​ពេល​ទំព័រ​មាន​មតិព័ត៌មាន RSS
+Comment[lt]=Rodo kanalo ikoną būsenos juostoje kai puslapis turi RSS kanalą
+Comment[mk]=Прикажува икона на доток во статусната линија кога страницата има RSS-доток
+Comment[ms]=Memaparkan ikon suapan dalam bar status apabila halaman mempunyai suapan RSS
+Comment[nb]=Viser ikon for nyhetskilde på statuslinja når nettstedet har en RSS-kilde
+Comment[nds]=Wiest dat RSS-Lüttbild op den Statusbalken, wenn de Siet en RSS-Narichtenstroom bargt.
+Comment[ne]=पृष्ठमा आरएसएस फिड हुदाँ स्थितिपट्टीमा फिड प्रतिमा प्रदर्शन गर्दछ
+Comment[nl]=Toont een feed-pictogram in de statusbalk als de pagina een RSS-feed bevat
+Comment[nn]=Viser eit kjeldeikon på statuslinja når sida har ei RSS-kjelde
+Comment[pl]=Wyświetla ikonę RSS w pasku stanu, jeśli strona zawiera źródło wiadomości RSS
+Comment[pt]=Mostra o ícone de fonte na barra de estado quando a página tem uma fonte RSS
+Comment[pt_BR]=Mostra um ícone na barra de status quando a página possui uma fonte de notícias RSS
+Comment[ru]=Показать в строке состояния значок ленты, если у страницы есть лента новостей
+Comment[sk]=Zobrazí ikonu kŕmitka v stavovom riadku keď strana obsahuje RSS kŕmitko
+Comment[sl]=Prikaže ikono vira v vrstici stanja, če ima stran vir RSS ali Atom
+Comment[sr]=Приказује икону довода у статусној траци када страна има RSS довод
+Comment[sr@Latn]=Prikazuje ikonu dovoda u statusnoj traci kada strana ima RSS dovod
+Comment[sv]=Visar kanalikon i statusraden när sidan har en RSS-kanal
+Comment[ta]=RSS ஃபீட் இருக்கும்போது நிலைப்பட்டியலில் ஃபீட் சின்னத்தை காட்டுகிறது
+Comment[tr]=Eğer sayfa RSS kaynaklı ise kaynak simgesini durum çubuğunda göster
+Comment[uk]=Показує піктограму подачі в рядку стану, коли сторінка має подачу RSS
+Comment[uz]=Sahifada RSS tasmasi mavjud boʻlsa, holat panelida RSS nishonchasini koʻrsatish
+Comment[uz@cyrillic]=Саҳифада RSS тасмаси мавжуд бўлса, ҳолат панелида RSS нишончасини кўрсатиш
+Comment[vi]=Hiển thị biểu tương nguồn tin trên thanh trạng thái khi trang Mạng có nguồn tin RSS
+Comment[zh_CN]=当页面有 RSS 种子的时候在状态栏显示种子图标
+Comment[zh_TW]=當網頁有 RSS feed 時,於狀態列顯示 feed 圖示
+Type=Service
+X-KDE-Library=libakregatorkonqfeedicon
+X-KDE-PluginInfo-Author=Teemu Rytilahti
+X-KDE-PluginInfo-Email=tpr@d5k.net
+X-KDE-PluginInfo-Name=konqfeedicon
+X-KDE-PluginInfo-Version=1.0.0
+X-KDE-PluginInfo-Website=http://akregator.sourceforge.net
+X-KDE-PluginInfo-Category=Statusbar
+X-KDE-PluginInfo-Depends=
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=true
+X-KDE-ParentApp=konqueror
diff --git a/konq-plugins/akregator/akregator_konqfeedicon.rc b/konq-plugins/akregator/akregator_konqfeedicon.rc
new file mode 100644
index 0000000..63f97fe
--- /dev/null
+++ b/konq-plugins/akregator/akregator_konqfeedicon.rc
@@ -0,0 +1,3 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="konqfeedicon" library="libakregatorkonqfeedicon" version="1">
+</kpartplugin>
diff --git a/konq-plugins/akregator/akregator_konqplugin.desktop b/konq-plugins/akregator/akregator_konqplugin.desktop
new file mode 100644
index 0000000..d033ce5
--- /dev/null
+++ b/konq-plugins/akregator/akregator_konqplugin.desktop
@@ -0,0 +1,54 @@
+[Desktop Entry]
+Type=Service
+Name=Add Feed to Akregator
+Name[bg]=Добавяне на източник към Akregator
+Name[ca]=Afegeix un enllaç a aKregator
+Name[cs]=Přidat zprávy do aKregatoru
+Name[da]=Tilføj kilde til Akregator
+Name[de]=Nachrichtenquelle zu Akregator hinzufügen
+Name[el]=Προσθήκη ροής στον aKregator
+Name[eo]=Aldonu enhavon al Akregatoro
+Name[es]=Añadir fuente a aKregator
+Name[et]=Lisa kanal Akregatorile
+Name[eu]=Akregator-era sarrera bat gehitzen du
+Name[fa]=افزودن خوراندن به Akregator
+Name[fi]=Lisää syöte aKregatoriin
+Name[fr]=Ajouter ce flux à Akregator
+Name[fy]=Feed oan Akregator taheakje
+Name[ga]=Cuir Fotha le Akregator
+Name[gl]=Engadir Fonte ao Akregator
+Name[hr]=Dodaj tekuće novosti u Akregator
+Name[hu]=Csatorna hozzáadása az Akregatorhoz
+Name[is]=Bæta straum við Akregator
+Name[it]=Aggiunge fonti ad aKregator
+Name[ja]=AKregator にフィードを追加
+Name[ka]=არხის Akregator-ისთვის დამატება
+Name[kk]=Ақпарды Akregator-ға қосу
+Name[km]=បន្ថែម​មតិព័ត៌មាន​ទៅ Akregator
+Name[lt]=Įdėti kanalą į Akregator
+Name[mk]=Додај доток кон Акрегатор
+Name[ms]=Tambah Suapan kepada Akregator
+Name[nb]=Legg til kilde til aKregator
+Name[nds]=Nachrichtenstroom na Akregator tofögen
+Name[ne]=एक्रिगेटरमा फिड थप्नुहोस्
+Name[nl]=Feed aan Akregator toevoegen
+Name[nn]=Legg til kjelde i Akregator
+Name[pl]=Dodaj źródło wiadomości do aKregatora
+Name[pt]=Adicionar Fonte ao Akregator
+Name[pt_BR]=Adicionar fonte de notícias ao aKregator
+Name[ru]=Добавить ленту новостей в Akregator
+Name[sk]=Pridať kŕmitko do Akregator
+Name[sl]=Dodaj vir v Akregator
+Name[sr]=Додај довод у Akregator
+Name[sr@Latn]=Dodaj dovod u Akregator
+Name[sv]=Lägg till en kanal till Akregator
+Name[ta]=aKregatorக்கு உள்ளீட்டை சேர்
+Name[tr]=Akregator'a Besleme Ekle
+Name[uk]=Додати подачу в Akregator
+Name[uz]=Akregator dasturiga yangiliklar tasmasini qoʻshish
+Name[uz@cyrillic]=Akregator дастурига янгиликлар тасмасини қўшиш
+Name[vi]=Thêm nguồn tin vào Akregator
+Name[zh_CN]=在 Akregator 中添加种子
+Name[zh_TW]=將 Feed 加入 Akregator
+X-KDE-Library=libakregatorkonqplugin
+ServiceTypes=KonqPopupMenu/Plugin,all/all
diff --git a/konq-plugins/akregator/akregatorplugin.cpp b/konq-plugins/akregator/akregatorplugin.cpp
new file mode 100644
index 0000000..a2a82f2
--- /dev/null
+++ b/konq-plugins/akregator/akregatorplugin.cpp
@@ -0,0 +1,135 @@
+/* This file is part of the KDE project
+
+ Copyright (C) 2004 Gary Cramblitt <garycramblitt@comcast.net>
+
+ Adapted from kdeutils/ark/konqplugin by
+ Georg Robbers <Georg.Robbers@urz.uni-hd.de>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; version 2
+ of the License.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "akregatorplugin.h"
+#include "pluginbase.h"
+
+#include <kapplication.h>
+#include <kmimetype.h>
+#include <kdebug.h>
+#include <kaction.h>
+#include <kinstance.h>
+#include <klocale.h>
+#include <konq_popupmenu.h>
+#include <kpopupmenu.h>
+#include <kgenericfactory.h>
+#include <kurl.h>
+#include <khtml_part.h>
+#include <khtmlview.h>
+#include <kmessagebox.h>
+
+#include <qdir.h>
+#include <qcstring.h>
+#include <qobject.h>
+#include <qstringlist.h>
+
+using namespace Akregator;
+
+typedef KGenericFactory<AkregatorMenu, KonqPopupMenu> AkregatorMenuFactory;
+K_EXPORT_COMPONENT_FACTORY( libakregatorkonqplugin, AkregatorMenuFactory("akregatorkonqplugin") )
+
+AkregatorMenu::AkregatorMenu( KonqPopupMenu * popupmenu, const char *name, const QStringList& /* list */ )
+ : KonqPopupMenuPlugin( popupmenu, name), PluginBase(), m_conf(0), m_part(0)
+{
+ kdDebug() << "AkregatorMenu::AkregatorMenu()" << endl;
+ if ( QCString( kapp->name() ) == "kdesktop" && !kapp->authorize("editable_desktop_icons" ) )
+ return;
+
+ // Do nothing if user has turned us off.
+ // TODO: Not yet implemented in aKregator settings.
+ /*m_conf = new KConfig( "akregatorrc" );
+ m_conf->setGroup( "AkregatorKonqPlugin" );
+ if ( !m_conf->readBoolEntry( "Enable", true ) )
+ return;
+ */
+
+ KHTMLView* view = 0L;
+
+ if (popupmenu && popupmenu->parent() && popupmenu->parent()->inherits("KHTMLView"))
+ view = static_cast<KHTMLView*>(popupmenu->parent());
+
+ if (view)
+ m_part = view->part();
+
+ KGlobal::locale()->insertCatalogue("akregator_konqplugin");
+ m_feedMimeTypes << "text/rss" << "text/rdf" << "text/xml";
+ // Get the list of URLs clicked on from Konqi.
+ //KFileItemList m_list = popupmenu->fileItemList();
+ // See if any are RSS feeds.
+
+ KFileItemList list = popupmenu->fileItemList();
+ KFileItem* it = list.first();
+ while (it != 0)
+ {
+ if (isFeedUrl(it))
+ {
+ kdDebug() << "AkregatorMenu: found feed URL " << it->url().prettyURL() << endl;
+ KAction *action = new KAction( i18n( "Add Feed to Akregator" ), "akregator", 0, this, SLOT( slotAddFeed() ), actionCollection(), "akregatorkonqplugin_mnu" );
+ addAction( action );
+ addSeparator();
+ m_feedURL = it->url().url();
+ break;
+ }
+
+ it = list.next();
+ }
+}
+
+AkregatorMenu::~AkregatorMenu()
+{
+ KGlobal::locale()->removeCatalogue("akregator_konqplugin");
+ delete m_conf;
+}
+
+bool AkregatorMenu::isFeedUrl(const QString &url)
+{
+ if (url.contains(".htm", false) != 0) return false;
+ if (url.contains("rss", false) != 0) return true;
+ if (url.contains("rdf", false) != 0) return true;
+ if (url.contains("xml", false) != 0) return true;
+ return false;
+}
+
+bool AkregatorMenu::isFeedUrl(const KFileItem * item)
+{
+ if ( m_feedMimeTypes.contains( item->mimetype() ) )
+ return true;
+ else
+ {
+ QString url = item->url().url();
+ // If URL ends in .htm or .html, it is not a feed url.
+ return isFeedUrl(url);
+ }
+ return false;
+}
+
+void AkregatorMenu::slotAddFeed()
+{
+ QString url = m_part ? fixRelativeURL(m_feedURL, m_part->baseURL()) : m_feedURL;
+ if(akregatorRunning())
+ addFeedsViaDCOP(QStringList(url));
+ else
+ addFeedViaCmdLine(url);
+}
+
+#include "akregatorplugin.moc"
diff --git a/konq-plugins/akregator/akregatorplugin.h b/konq-plugins/akregator/akregatorplugin.h
new file mode 100644
index 0000000..8074f2f
--- /dev/null
+++ b/konq-plugins/akregator/akregatorplugin.h
@@ -0,0 +1,60 @@
+/* This file is part of the KDE project
+
+ Copyright (C) 2003 Georg Robbers <Georg.Robbers@urz.uni-hd.de>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; version 2
+ of the License.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _AKREGATORPLUGIN_H_
+#define _AKREGATORPLUGIN_H_
+
+#include <konq_popupmenu.h>
+#include <kfileitem.h>
+#include <kconfig.h>
+
+#include "pluginbase.h"
+
+class KAction;
+class KHTMLPart;
+
+namespace Akregator
+{
+
+class AkregatorMenu : public KonqPopupMenuPlugin, PluginBase
+{
+ Q_OBJECT
+public:
+ AkregatorMenu( KonqPopupMenu *, const char *name, const QStringList &list );
+ virtual ~AkregatorMenu();
+
+public slots:
+ void slotAddFeed();
+
+protected:
+ bool isFeedUrl(const QString &s);
+ bool isFeedUrl(const KFileItem *item);
+
+private:
+ QStringList m_feedMimeTypes;
+ KConfig *m_conf;
+ KHTMLPart *m_part;
+ QString m_feedURL;
+};
+
+}
+
+#endif
+
diff --git a/konq-plugins/akregator/feeddetector.cpp b/konq-plugins/akregator/feeddetector.cpp
new file mode 100644
index 0000000..928a282
--- /dev/null
+++ b/konq-plugins/akregator/feeddetector.cpp
@@ -0,0 +1,147 @@
+/*
+ This file is part of Akregator.
+
+ Copyright (C) 2004 Teemu Rytilahti <tpr@d5k.net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+*/
+
+#include <qregexp.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qvaluelist.h>
+#include <kcharsets.h>
+
+#include "feeddetector.h"
+
+
+using namespace Akregator;
+
+FeedDetectorEntryList FeedDetector::extractFromLinkTags(const QString& s)
+{
+ //reduce all sequences of spaces, newlines etc. to one space:
+ QString str = s.simplifyWhiteSpace();
+
+ // extracts <link> tags
+ QRegExp reLinkTag("<[\\s]?LINK[^>]*REL[\\s]?=[\\s]?\\\"[\\s]?(ALTERNATE|SERVICE\\.FEED)[\\s]?\\\"[^>]*>", false);
+
+ // extracts the URL (href="url")
+ QRegExp reHref("HREF[\\s]?=[\\s]?\\\"([^\\\"]*)\\\"", false);
+ // extracts type attribute
+ QRegExp reType("TYPE[\\s]?=[\\s]?\\\"([^\\\"]*)\\\"", false);
+ // extracts the title (title="title")
+ QRegExp reTitle("TITLE[\\s]?=[\\s]?\\\"([^\\\"]*)\\\"", false);
+
+ int pos = 0;
+ int matchpos = 0;
+
+ // get all <link> tags
+ QStringList linkTags;
+ //int strlength = str.length();
+ while ( matchpos != -1 )
+ {
+ matchpos = reLinkTag.search(str, pos);
+ if (matchpos != -1)
+ {
+ linkTags.append( str.mid(matchpos, reLinkTag.matchedLength()) );
+ pos = matchpos + reLinkTag.matchedLength();
+ }
+ }
+
+ FeedDetectorEntryList list;
+
+ for ( QStringList::Iterator it = linkTags.begin(); it != linkTags.end(); ++it )
+ {
+ QString type;
+ int pos = reType.search(*it, 0);
+ if (pos != -1)
+ type = reType.cap(1).lower();
+
+ // we accept only type attributes indicating a feed
+ if ( type != "application/rss+xml" && type != "application/rdf+xml"
+ && type != "application/atom+xml" && type != "text/xml" )
+ continue;
+
+ QString title;
+ pos = reTitle.search(*it, 0);
+ if (pos != -1)
+ title = reTitle.cap(1);
+
+ title = KCharsets::resolveEntities(title);
+
+ QString url;
+ pos = reHref.search(*it, 0);
+ if (pos != -1)
+ url = reHref.cap(1);
+
+ url = KCharsets::resolveEntities(url);
+
+ // if feed has no title, use the url as preliminary title (until feed is parsed)
+ if ( title.isEmpty() )
+ title = url;
+
+ if ( !url.isEmpty() )
+ list.append(FeedDetectorEntry(url, title) );
+ }
+
+
+ return list;
+}
+
+QStringList FeedDetector::extractBruteForce(const QString& s)
+{
+ QString str = s.simplifyWhiteSpace();
+
+ QRegExp reAhrefTag("<[\\s]?A[^>]?HREF=[\\s]?\\\"[^\\\"]*\\\"[^>]*>", false);
+
+ // extracts the URL (href="url")
+ QRegExp reHref("HREF[\\s]?=[\\s]?\\\"([^\\\"]*)\\\"", false);
+
+ QRegExp rssrdfxml(".*(RSS|RDF|XML)", false);
+
+ int pos = 0;
+ int matchpos = 0;
+
+ // get all <a href> tags and capture url
+ QStringList list;
+ //int strlength = str.length();
+ while ( matchpos != -1 )
+ {
+ matchpos = reAhrefTag.search(str, pos);
+ if ( matchpos != -1 )
+ {
+ QString ahref = str.mid(matchpos, reAhrefTag.matchedLength());
+ int hrefpos = reHref.search(ahref, 0);
+ if ( hrefpos != -1 )
+ {
+ QString url = reHref.cap(1);
+
+ url = KCharsets::resolveEntities(url);
+
+ if ( rssrdfxml.exactMatch(url) )
+ list.append(url);
+ }
+
+ pos = matchpos + reAhrefTag.matchedLength();
+ }
+ }
+
+ return list;
+
+}
diff --git a/konq-plugins/akregator/feeddetector.h b/konq-plugins/akregator/feeddetector.h
new file mode 100644
index 0000000..b557e33
--- /dev/null
+++ b/konq-plugins/akregator/feeddetector.h
@@ -0,0 +1,77 @@
+/*
+ This file is part of Akregator.
+
+ Copyright (C) 2004 Teemu Rytilahti <tpr@d5k.net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+*/
+
+#ifndef AKREGATORFEEDDETECTOR_H
+#define AKREGATORFEEDDETECTOR_H
+
+#include <qstring.h>
+#include <qvaluelist.h>
+
+class QStringList;
+
+namespace Akregator
+{
+
+ class FeedDetectorEntry
+ {
+ public:
+ FeedDetectorEntry() {}
+ FeedDetectorEntry(const QString& url, const QString& title)
+ : m_url(url), m_title(title) {}
+
+ const QString& url() const { return m_url; }
+ const QString& title() const { return m_title; }
+
+ private:
+ const QString m_url;
+ const QString m_title;
+ };
+
+ typedef QValueList<FeedDetectorEntry> FeedDetectorEntryList;
+
+ /** a class providing functions to detect linked feeds in HTML sources */
+ class FeedDetector
+ {
+ public:
+ /** \brief searches an HTML page for feeds listed in @c <link> tags
+ @c <link> tags with @c rel attribute values @c alternate or
+ @c service.feed are considered as feeds
+ @param s the html source to scan (the actual source, no URI)
+ @return a list containing the detected feeds
+ */
+ static FeedDetectorEntryList extractFromLinkTags(const QString& s);
+
+ /** \brief searches an HTML page for slightly feed-like looking links and catches everything not running away quickly enough.
+ Extracts links from @c <a @c href> tags which end with @c xml, @c rss or @c rdf
+ @param s the html source to scan (the actual source, no URI)
+ @return a list containing the detected feeds
+ */
+ static QStringList extractBruteForce(const QString& s);
+
+ private:
+ FeedDetector() {}
+ };
+}
+
+#endif //AKREGATORFEEDDETECTOR_H
diff --git a/konq-plugins/akregator/konqfeedicon.cpp b/konq-plugins/akregator/konqfeedicon.cpp
new file mode 100644
index 0000000..436a4be
--- /dev/null
+++ b/konq-plugins/akregator/konqfeedicon.cpp
@@ -0,0 +1,222 @@
+/*
+ This file is part of Akregator.
+
+ Copyright (C) 2004 Teemu Rytilahti <tpr@d5k.net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+*/
+
+#include "konqfeedicon.h"
+#include "feeddetector.h"
+#include "pluginbase.h"
+
+#include <dcopref.h>
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kgenericfactory.h>
+#include <khtml_part.h>
+#include <kiconloader.h>
+#include <klibloader.h>
+#include <kmessagebox.h>
+#include <kparts/statusbarextension.h>
+#include <kprocess.h>
+#include <kstandarddirs.h>
+#include <kstatusbar.h>
+#include <kurllabel.h>
+#include <kurl.h>
+
+#include <qcursor.h>
+#include <qobjectlist.h>
+#include <qpixmap.h>
+#include <qstringlist.h>
+#include <qstylesheet.h>
+#include <qtimer.h>
+#include <qtooltip.h>
+
+using namespace Akregator;
+
+typedef KGenericFactory<KonqFeedIcon> KonqFeedIconFactory;
+K_EXPORT_COMPONENT_FACTORY(libakregatorkonqfeedicon,
+ KonqFeedIconFactory("akregatorkonqfeedicon"))
+
+KonqFeedIcon::KonqFeedIcon(QObject *parent, const char *name, const QStringList &)
+ : KParts::Plugin(parent, name), PluginBase(), m_part(0), m_feedIcon(0), m_statusBarEx(0), m_menu(0)
+{
+ KGlobal::locale()->insertCatalogue("akregator_konqplugin");
+
+ m_part = dynamic_cast<KHTMLPart*>(parent);
+ if(!m_part) { kdDebug() << "couldn't get part" << endl; return; }
+ // FIXME: need to do this because of a bug in khtmlpart, it's fixed now for 3.4 (and prolly backported for 3.3.3?)
+ //connect(m_part->view(), SIGNAL(finishedLayout()), this, SLOT(addFeedIcon()));
+ QTimer::singleShot(0, this, SLOT(waitPartToLoad()));
+}
+
+void KonqFeedIcon::waitPartToLoad()
+{
+ connect(m_part, SIGNAL(completed()), this, SLOT(addFeedIcon()));
+ connect(m_part, SIGNAL(completed(bool)), this, SLOT(addFeedIcon())); // to make pages with metarefresh to work
+ connect(m_part, SIGNAL(started(KIO::Job *)), this, SLOT(removeFeedIcon()));
+ addFeedIcon();
+}
+
+KonqFeedIcon::~KonqFeedIcon()
+{
+ KGlobal::locale()->removeCatalogue("akregator_konqplugin");
+ m_statusBarEx = KParts::StatusBarExtension::childObject(m_part);
+ if (m_statusBarEx)
+ {
+ m_statusBarEx->removeStatusBarItem(m_feedIcon);
+ // the feed icon is child of the statusbar extension, so if the statusbar is deleted,
+ // the icon was deleted by the status bar
+ delete m_feedIcon;
+ }
+ // the icon is deleted in every case
+ m_feedIcon = 0L;
+
+ delete m_menu;
+ m_menu = 0L;
+}
+
+bool KonqFeedIcon::feedFound()
+{
+ DOM::NodeList linkNodes = m_part->document().getElementsByTagName("link");
+
+ if (linkNodes.length() == 0)
+ return false;
+
+ unsigned int i;
+ QString doc = "";
+
+ for (i = 0; i < linkNodes.length(); i++)
+ {
+ DOM::Node node = linkNodes.item(i);
+ doc += "<link ";
+ for (unsigned int j = 0; j < node.attributes().length(); j++)
+ {
+ doc += node.attributes().item(j).nodeName().string() + "=\"";
+ doc += QStyleSheet::escape(node.attributes().item(j).nodeValue().string()).replace("\"", "&quot;");
+ doc += "\" ";
+ }
+ doc += "/>";
+ }
+
+ m_feedList = FeedDetector::extractFromLinkTags(doc);
+ return m_feedList.count() != 0;
+}
+
+void KonqFeedIcon::contextMenu()
+{
+ delete m_menu;
+ m_menu = new KPopupMenu(m_part->widget());
+ if(m_feedList.count() == 1) {
+ m_menu->insertTitle(m_feedList.first().title());
+ m_menu->insertItem(SmallIcon("bookmark_add"), i18n("Add Feed to Akregator"), this, SLOT(addFeeds()) );
+ }
+ else {
+ m_menu->insertTitle(i18n("Add Feeds to Akregator"));
+ connect(m_menu, SIGNAL(activated(int)), this, SLOT(addFeed(int)));
+ int id = 0;
+ for(FeedDetectorEntryList::Iterator it = m_feedList.begin(); it != m_feedList.end(); ++it) {
+ m_menu->insertItem(SmallIcon("bookmark_add"), (*it).title(), id);
+ id++;
+ }
+ //disconnect(m_menu, SIGNAL(activated(int)), this, SLOT(addFeed(int)));
+ m_menu->insertSeparator();
+ m_menu->insertItem(SmallIcon("bookmark_add"), i18n("Add All Found Feeds to Akregator"), this, SLOT(addFeeds()), 0, 50000 );
+ }
+ m_menu->popup(QCursor::pos());
+}
+
+void KonqFeedIcon::addFeedIcon()
+{
+ if(!feedFound() || m_feedIcon) {
+ return;
+ }
+
+ m_statusBarEx = KParts::StatusBarExtension::childObject(m_part);
+ if(!m_statusBarEx) return;
+
+ m_feedIcon = new KURLLabel(m_statusBarEx->statusBar());
+
+ // from khtmlpart's ualabel
+ m_feedIcon->setFixedHeight(instance()->iconLoader()->currentSize(KIcon::Small));
+ m_feedIcon->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
+ m_feedIcon->setUseCursor(false);
+ //FIXME hackish
+ m_feedIcon->setPixmap(QPixmap(locate("data", "akregator/pics/rss.png")));
+
+ QToolTip::remove(m_feedIcon);
+ QToolTip::add(m_feedIcon, i18n("Monitor this site for updates (using news feed)"));
+
+ m_statusBarEx->addStatusBarItem(m_feedIcon, 0, true);
+
+ connect(m_feedIcon, SIGNAL(leftClickedURL()), this, SLOT(contextMenu()));
+}
+
+void KonqFeedIcon::removeFeedIcon()
+{
+ m_feedList.clear();
+ if(m_feedIcon)
+ {
+ m_statusBarEx->removeStatusBarItem(m_feedIcon);
+ delete m_feedIcon;
+ m_feedIcon = 0L;
+ }
+
+ // Close the popup if it's open, otherwise we crash
+ delete m_menu;
+ m_menu = 0L;
+}
+
+void KonqFeedIcon::addFeed(int id)
+{
+ if(id == 50000) return;
+ if(akregatorRunning())
+ addFeedsViaDCOP(QStringList(fixRelativeURL(m_feedList[id].url(), m_part->baseURL())));
+ else
+ addFeedViaCmdLine(fixRelativeURL(m_feedList[id].url(), m_part->baseURL()));
+}
+
+// from akregatorplugin.cpp
+void KonqFeedIcon::addFeeds()
+{
+ if(akregatorRunning())
+ {
+ QStringList list;
+ for ( FeedDetectorEntryList::Iterator it = m_feedList.begin(); it != m_feedList.end(); ++it )
+ list.append(fixRelativeURL((*it).url(), m_part->baseURL()));
+ addFeedsViaDCOP(list);
+ }
+ else {
+ kdDebug() << "KonqFeedIcon::addFeeds(): use command line" << endl;
+ KProcess *proc = new KProcess;
+ *proc << "akregator" << "-g" << i18n("Imported Feeds");
+
+ for ( FeedDetectorEntryList::Iterator it = m_feedList.begin(); it != m_feedList.end(); ++it ) {
+ *proc << "-a" << fixRelativeURL((*it).url(), m_part->baseURL());
+ }
+
+ proc->start(KProcess::DontCare);
+ delete proc;
+
+ }
+}
+
+#include "konqfeedicon.moc"
+// vim: ts=4 sw=4 et
diff --git a/konq-plugins/akregator/konqfeedicon.h b/konq-plugins/akregator/konqfeedicon.h
new file mode 100644
index 0000000..ba3bb8c
--- /dev/null
+++ b/konq-plugins/akregator/konqfeedicon.h
@@ -0,0 +1,77 @@
+/*
+ This file is part of Akregator.
+
+ Copyright (C) 2004 Teemu Rytilahti <tpr@d5k.net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+*/
+
+#ifndef KONQFEEDICON_H
+#define KONQFEEDICON_H
+
+#include <qguardedptr.h>
+#include <kparts/plugin.h>
+#include <kpopupmenu.h>
+#include "feeddetector.h"
+#include "pluginbase.h"
+
+/**
+@author Teemu Rytilahti
+*/
+class KURLLabel;
+class KHTMLPart;
+class QStringList;
+
+namespace KParts {
+ class StatusBarExtension;
+}
+
+namespace Akregator {
+class KonqFeedIcon : public KParts::Plugin, PluginBase
+{
+ Q_OBJECT
+public:
+ KonqFeedIcon(QObject *parent, const char *name, const QStringList &);
+
+ ~KonqFeedIcon();
+
+private:
+ /**
+ * Tells you if there is feed(s) on the page.
+ * @return true when there is feed(s) available
+ */
+ bool feedFound();
+
+ QGuardedPtr<KHTMLPart> m_part;
+ KURLLabel *m_feedIcon;
+ KParts::StatusBarExtension *m_statusBarEx;
+ FeedDetectorEntryList m_feedList;
+ QGuardedPtr<KPopupMenu> m_menu;
+
+private slots:
+ void waitPartToLoad();
+ void contextMenu();
+ void addFeedIcon();
+ void removeFeedIcon();
+ void addFeeds();
+ void addFeed(int id);
+};
+
+}
+#endif
diff --git a/konq-plugins/akregator/pluginbase.cpp b/konq-plugins/akregator/pluginbase.cpp
new file mode 100644
index 0000000..4c6b5b1
--- /dev/null
+++ b/konq-plugins/akregator/pluginbase.cpp
@@ -0,0 +1,102 @@
+/*
+ This file is part of Akregator.
+
+ Copyright (C) 2004 Teemu Rytilahti <tpr@d5k.net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+*/
+
+#include <kurl.h>
+#include <kprocess.h>
+#include <dcopref.h>
+#include <khtml_part.h>
+#include <klocale.h>
+
+#include "feeddetector.h"
+#include "pluginbase.h"
+#include <qstringlist.h>
+
+#include <kdebug.h>
+
+using namespace Akregator;
+
+PluginBase::PluginBase()
+{}
+
+PluginBase::~PluginBase()
+{}
+
+bool PluginBase::akregatorRunning()
+{
+ DCOPRef akr("akregator", "akregator");
+ DCOPReply reply = akr.call("interfaces"); // FIXME hackish but works :) -tpr 20041203
+ return reply.isValid();
+}
+
+void PluginBase::addFeedsViaDCOP(const QStringList& urls)
+{
+ kdDebug() << "PluginBase::addFeedsViaDCOP" << endl;
+ DCOPRef akr("akregator", "AkregatorIface");
+ akr.send("addFeedsToGroup", urls, i18n("Imported Feeds") );
+ /*if(!reply.isValid()) {
+ KMessageBox::error( 0, i18n( "Akregator feed icon - DCOP Call failed" ),
+ i18n( "The DCOP call addFeedToGroup failed" ));
+}*/
+}
+
+void PluginBase::addFeedViaCmdLine(QString url)
+{
+ KProcess *proc = new KProcess;
+ *proc << "akregator" << "-g" << i18n("Imported Feeds");
+ *proc << "-a" << url;
+ proc->start(KProcess::DontCare);
+ delete proc;
+}
+
+// handle all the wild stuff that KURL doesn't handle
+QString PluginBase::fixRelativeURL(const QString &s, const KURL &baseurl)
+{
+ QString s2=s;
+ KURL u;
+ if (KURL::isRelativeURL(s2))
+ {
+ if (s2.startsWith("//"))
+ {
+ s2=s2.prepend(baseurl.protocol()+":");
+ u=s2;
+ }
+ else if (s2.startsWith("/"))
+ {
+ KURL b2(baseurl);
+ b2.setPath(QString()); // delete path and query, so that only protocol://host remains
+ b2.setQuery(QString());
+ u = KURL(b2, s2.remove(0,1)); // remove leading "/"
+ }
+ else
+ {
+ u = KURL(baseurl, s2);
+ }
+ }
+ else
+ u=s2;
+
+ u.cleanPath();
+ //kdDebug() << "AKREGATOR_PLUGIN_FIXURL: " << "url=" << s << " baseurl=" << baseurl.url() << " fixed=" << u.url() << endl;
+ return u.url();
+}
diff --git a/konq-plugins/akregator/pluginbase.h b/konq-plugins/akregator/pluginbase.h
new file mode 100644
index 0000000..8dcecf5
--- /dev/null
+++ b/konq-plugins/akregator/pluginbase.h
@@ -0,0 +1,60 @@
+/*
+ This file is part of Akregator.
+
+ Copyright (C) 2004 Teemu Rytilahti <tpr@d5k.net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+*/
+
+#ifndef PLUGINBASE_H
+#define PLUGINBASE_H
+
+class FeedDetectorEntry;
+class KHTMLPart;
+class QString;
+class QStringList;
+
+namespace Akregator
+{
+
+class PluginBase
+{
+ public:
+ PluginBase();
+ ~PluginBase();
+
+ public:
+ /**
+ * Tells you if aKregator is running.
+ * @return true when aKregator is running
+ */
+ bool akregatorRunning();
+ /**
+ * Adds feed to aKregator via DCOP.
+ */
+ void addFeedsViaDCOP(const QStringList& urls);
+ /**
+ * Adds feed to aKregator via command line.
+ */
+ void addFeedViaCmdLine(QString url);
+ QString fixRelativeURL(const QString &s, const KURL &baseurl);
+};
+
+}
+#endif
diff --git a/konq-plugins/akregator/rss.png b/konq-plugins/akregator/rss.png
new file mode 100644
index 0000000..3008a51
--- /dev/null
+++ b/konq-plugins/akregator/rss.png
Binary files differ
diff --git a/konq-plugins/akregator/rss.svgz b/konq-plugins/akregator/rss.svgz
new file mode 100644
index 0000000..498d5e3
--- /dev/null
+++ b/konq-plugins/akregator/rss.svgz
Binary files differ
diff --git a/konq-plugins/arkplugin/Makefile.am b/konq-plugins/arkplugin/Makefile.am
new file mode 100644
index 0000000..0f6ec44
--- /dev/null
+++ b/konq-plugins/arkplugin/Makefile.am
@@ -0,0 +1,18 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = libarkplugin.la
+
+libarkplugin_la_SOURCES = arkplugin.cpp
+libarkplugin_la_LIBADD = -lkonq
+libarkplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+pluginsdir = $(kde_servicesdir)
+plugins_DATA = ark_plugin.desktop
+
+appsdir = $(kde_appsdir)/.hidden
+apps_DATA = arkplugin.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/ark_plugin.pot
diff --git a/konq-plugins/arkplugin/ark_plugin.desktop b/konq-plugins/arkplugin/ark_plugin.desktop
new file mode 100644
index 0000000..b46694a
--- /dev/null
+++ b/konq-plugins/arkplugin/ark_plugin.desktop
@@ -0,0 +1,59 @@
+[Desktop Entry]
+Type=Service
+Name=Compress/Extract Files
+Name[bg]=Компресиране/извличане на файлове
+Name[bs]=Kompresuj/ekstraktuj datoteke
+Name[ca]=Comprimeix/extrau fitxers
+Name[cs]=Komprimovat/rozbalit soubory
+Name[da]=Komprimér/Udpak filer
+Name[de]=Dateien komprimieren/extrahieren
+Name[el]=Συμπίεση/Εξαγωγή αρχείων
+Name[eo]=Kunpremu/Elpaku dosierojn
+Name[es]=Comprimir/Extraer archivos
+Name[et]=Failide pakkimine/lahtipakkimine
+Name[eu]=Fitxategiak konprimitu/atera
+Name[fa]=فشرده‌سازی/استخراج پرونده‌ها
+Name[fi]=Pakkaa/Pura tiedostoja
+Name[fr]=Compacter / extraire des fichiers
+Name[fy]=Triemmen ynpakke/útpakke
+Name[ga]=Comhbhrúigh/Bain Comhaid Amach
+Name[gl]=Comprimir/Extrair Ficheiros
+Name[he]=דחוס/פרוס קבצים
+Name[hi]=फ़ाइलों को संपीडित करें/निकालें
+Name[hr]=Komprimiranje i rastvaranje tekstualnih datoteka
+Name[hu]=Tömörítés/kitömörítés
+Name[is]=Þjappa/taka út skrár
+Name[it]=Comprimi/estrai file
+Name[ja]=ファイルを圧縮/展開
+Name[ka]=ფაილების შეკუნშვა/ამოღება
+Name[kk]=Файлдарды сығу/тарқату
+Name[km]=បង្ហាប់/ស្រង់ចេញ​ឯកសារ
+Name[lt]=Suspausti/išspausti bylas
+Name[mk]=Компресија/отпакување датотеки
+Name[ms]=Mampat/Ekstrak Fail
+Name[nb]=Komprimer/pakk ut filer
+Name[nds]=Dateien komprimeren/utpacken
+Name[ne]=फाइल सङ्कुचन/निष्कर्षण
+Name[nl]=Bestanden inpakken/uitpakken
+Name[nn]=Komprimer/pakk ut filer
+Name[pa]=ਫਾਇਲਾਂ ਸਮੇਟੋ/ਖੋਲੋ
+Name[pl]=Kompresja/dekompresja plików
+Name[pt]=Comprimir/Extrair Ficheiros
+Name[pt_BR]=Compactar/Extrair Arquivos
+Name[ru]=Сжатие/распаковка файлов
+Name[sk]=Zabaliť/rozbaliť súbory
+Name[sl]=Stisni/Izvleci datoteke
+Name[sr]=Компресуј/извуци фајлове
+Name[sr@Latn]=Kompresuj/izvuci fajlove
+Name[sv]=Komprimera eller packa upp filer
+Name[ta]=கோப்பினை சுருக்கு/எடு
+Name[tg]=Фишурдан/кушодани файлҳо
+Name[tr]=Dosyaları Sıkıştır/Ayıkla
+Name[uk]=Стиснення/розпакування файлів
+Name[uz]=Fayllarni qisish/ajratish
+Name[uz@cyrillic]=Файлларни қисиш/ажратиш
+Name[vi]=Nén/Giải nén tập tin
+Name[zh_CN]=压缩/解压文件
+Name[zh_TW]=壓縮/解壓縮檔案
+X-KDE-Library=libarkplugin
+ServiceTypes=KonqPopupMenu/Plugin,all/all
diff --git a/konq-plugins/arkplugin/arkplugin.cpp b/konq-plugins/arkplugin/arkplugin.cpp
new file mode 100644
index 0000000..35e610e
--- /dev/null
+++ b/konq-plugins/arkplugin/arkplugin.cpp
@@ -0,0 +1,566 @@
+/* This file is part of the KDE project
+
+ Copyright (C) 2003 Georg Robbers <Georg.Robbers@urz.uni-hd.de>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; version 2
+ of the License.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "arkplugin.h"
+
+#include <kapplication.h>
+#include <kstandarddirs.h>
+#include <kmimetype.h>
+#include <kdebug.h>
+#include <kaction.h>
+#include <kinstance.h>
+#include <klocale.h>
+#include <konq_popupmenu.h>
+#include <kpopupmenu.h>
+#include <kgenericfactory.h>
+#include <kurl.h>
+#include <kio/netaccess.h>
+
+#include <qdir.h>
+#include <qcstring.h>
+#include <qsignalmapper.h>
+#include <qobject.h>
+
+typedef KGenericFactory<ArkMenu, KonqPopupMenu> ArkMenuFactory;
+K_EXPORT_COMPONENT_FACTORY( libarkplugin, ArkMenuFactory("arkplugin") )
+
+ArkMenu::ArkMenu( KonqPopupMenu * popupmenu, const char *name, const QStringList& /* list */ )
+ : KonqPopupMenuPlugin( popupmenu, name),
+ m_compAsMapper( 0 ), m_addToMapper( 0 ), m_conf( 0 )
+{
+ if ( ( QCString( kapp->name() ) == "kdesktop" && !kapp->authorize("editable_desktop_icons" ) )
+ || ( KStandardDirs::findExe( "ark" ).isNull() ) )
+ return;
+
+ m_conf = new KConfig( "arkrc" );
+ m_conf->setGroup( "ark" );
+
+ if ( !m_conf->readBoolEntry( "KonquerorIntegration", true ) )
+ return;
+
+ KGlobal::locale()->insertCatalogue("ark_plugin");
+
+ extMimeTypes();
+ KFileItemList itemList = popupmenu->fileItemList();
+ for ( KFileItem *item = itemList.first(); item; item = itemList.next() )
+ {
+ m_urlList.append( item->url() );
+ m_urlStringList.append( item->url().url() );
+ }
+ m_dir = popupmenu->url().url() + "/";
+ unsigned int itemCount = m_urlList.count();
+ KFileItemListIterator it( itemList );
+ KFileItem * item;
+ bool hasArchives = false;
+ bool hasOther = false;
+ while ( ( item = it.current() ) != 0 )
+ {
+ ++it;
+ if ( m_extractMimeTypes.contains( item->mimetype() ) )
+ {
+ hasArchives = true;
+ }
+ else
+ {
+ hasOther = true;
+ }
+
+ if ( hasArchives && hasOther )
+ break;
+ }
+
+ QString ext;
+ KActionMenu * actionMenu;
+ KAction * action;
+ if ( hasOther && itemList.first()->name()!="." && popupmenu->protocolInfo().supportsWriting() ) // don't try to compress if we right click on a folder without files selected
+ {
+ compMimeTypes();
+ actionMenu = new KActionMenu( i18n( "Compress" ), "ark", actionCollection(), "ark_compress_menu" );
+ m_ext = m_conf->readEntry( "LastExtension", ".tar.gz" );
+ if ( itemCount == 1 )
+ {
+ item = itemList.first();
+ m_name = itemList.first()->name();
+ action = new KAction( i18n( "Compress as %1" ).arg( m_name + m_ext ), 0, this,
+ SLOT( slotCompressAsDefault() ), actionCollection() );
+ }
+ else
+ {
+ action = new KAction( KMimeType::mimeType( m_conf->readEntry(
+ "LastMimeType", "application/x-tgz" ) )->comment(),
+ 0, this, SLOT( slotCompressAsDefault() ), actionCollection() );
+ }
+ actionMenu->insert( action );
+
+ m_compAsMenu = new KActionMenu( i18n( "Compress As" ), actionCollection(), "arkcmpasmnu" );
+ actionMenu->insert( m_compAsMenu );
+
+
+ m_addToMenu = new KActionMenu( i18n( "Add To" ), actionCollection(), "arkaddtomnu" );
+ if ( itemList.first()->url().isLocalFile() )
+ actionMenu->insert( m_addToMenu );
+
+ connect( m_compAsMenu->popupMenu(), SIGNAL( aboutToShow() ),
+ this, SLOT( slotPrepareCompAsMenu() ) );
+ connect( m_addToMenu->popupMenu(), SIGNAL( aboutToShow() ),
+ this, SLOT( slotPrepareAddToMenu() ) );
+
+
+ action = new KAction( i18n( "Add to Archive..." ), 0, this,
+ SLOT( slotAdd() ), actionCollection() );
+ actionMenu->insert( action );
+ addAction( actionMenu );
+ }
+
+ if ( !hasOther && hasArchives )
+ {
+ if ( popupmenu->protocolInfo().supportsWriting() )
+ {
+ actionMenu = new KActionMenu( i18n( "Extract" ), "ark", actionCollection(), "ark_extract_menu" );
+
+ action = new KAction( i18n( "Extract Here" ), 0, this,
+ SLOT( slotExtractHere() ), actionCollection() );
+ actionMenu->insert( action );
+ // stolen from arkwidget.cpp
+ if ( itemCount == 1 )
+ {
+ QString targetName = itemList.first()->name();
+ stripExtension( targetName );
+ action = new KAction( i18n( "Extract to %1" ).arg( targetName ), 0, this,
+ SLOT( slotExtractToSubfolders() ), actionCollection() );
+ }
+ else
+ {
+ action = new KAction( i18n( "Extract to Subfolders" ), 0, this,
+ SLOT( slotExtractToSubfolders() ), actionCollection() );
+ }
+ actionMenu->insert( action );
+ action = new KAction( i18n( "Extract To..." ), 0 , this,
+ SLOT( slotExtractTo() ), actionCollection() );
+ actionMenu->insert( action );
+ addAction( actionMenu );
+ }
+ else
+ {
+ action = new KAction( i18n( "Extract To..." ), "ark", 0, this, SLOT( slotExtractTo() ), actionCollection(), "ark_extract_menu" );
+ addAction( action );
+ }
+ }
+ addSeparator();
+}
+
+ArkMenu::~ArkMenu()
+{
+ delete m_conf;
+}
+
+void ArkMenu::slotPrepareCompAsMenu()
+{
+ disconnect( m_compAsMenu->popupMenu(), SIGNAL( aboutToShow() ),
+ this, SLOT( slotPrepareCompAsMenu() ) );
+
+ KAction * action;
+ m_compAsMapper = new QSignalMapper( this, "compAsMapper" );
+ QString ext;
+ QStringList newExt;
+ unsigned int counter = 0;
+ QCString actionName;
+ QStringList::Iterator eit;
+ QStringList::Iterator mit;
+ mit = m_archiveMimeTypes.begin();
+ for ( ; mit != m_archiveMimeTypes.end(); ++mit )
+ {
+ newExt = KMimeType::mimeType(*mit)->patterns();
+ eit = newExt.begin();
+ (*eit).remove( '*' );
+ if ( *eit == ".tar.bz" ) // tbz mimetype, has tar.bz as first entry :}
+ *eit = ".tar.bz2";
+ if ( m_urlList.count() == 1 )
+ {
+ action = new KAction( m_name + (*eit), 0, m_compAsMapper,
+ SLOT( map() ), actionCollection() );
+ }
+ else
+ {
+ ext = KMimeType::mimeType(*mit)->comment();
+ action = new KAction( ext, 0, m_compAsMapper,
+ SLOT( map() ), actionCollection() );
+ }
+
+ m_compAsMenu->insert( action );
+ m_compAsMapper->setMapping( action, counter );
+
+ ++counter;
+ ++eit;
+ while( eit != newExt.end() )
+ {
+ (*eit).remove( '*' );
+ ++eit;
+ ++counter;
+ }
+ m_extensionList += newExt;
+ }
+
+ connect( m_compAsMapper, SIGNAL( mapped( int ) ), SLOT( slotCompressAs( int ) ) );
+}
+
+void ArkMenu::slotPrepareAddToMenu()
+{
+ disconnect( m_addToMenu->popupMenu(), SIGNAL( aboutToShow() ),
+ this, SLOT( slotPrepareAddToMenu() ) );
+
+
+ if ( m_extensionList.isEmpty() ) // is filled in slotPrepareCompAsMenu
+ slotPrepareCompAsMenu();
+
+ unsigned int counter = 0;
+ KAction * action;
+ m_addToMapper = new QSignalMapper( this, "addToMapper" );
+ QCString actionName;
+ QStringList::Iterator mit;
+ KURL archive;
+ QDir dir( m_urlList.first().directory() );
+ QStringList entries = dir.entryList();
+ QStringList::Iterator uit = entries.begin();
+ for ( ; uit != entries.end(); ++uit )
+ {
+ for ( mit = m_extensionList.begin(); mit != m_extensionList.end(); ++mit )
+ if ( (*uit).endsWith(*mit) )
+ {
+ action = new KAction( *uit, 0, m_addToMapper,
+ SLOT( map() ), actionCollection() );
+ m_addToMenu->insert( action );
+ m_addToMapper->setMapping( action, counter );
+ archive.setPath( *uit );
+ m_archiveList << archive;
+ counter++;
+ break;
+ }
+ }
+ connect( m_addToMapper, SIGNAL( mapped( int ) ), SLOT( slotAddTo( int ) ) );
+}
+
+void ArkMenu::compMimeTypes()
+{
+ unsigned int itemCount = m_urlList.count();
+
+ bool havegz = false;
+ if ( !KStandardDirs::findExe( "gzip" ).isNull() && m_conf->readBoolEntry( "UseGz", true ) )
+ {
+ havegz = true;
+ //.gz can only compress one file, not multiple
+ if ( itemCount == 1 ) m_archiveMimeTypes << "application/x-gzip";
+ }
+
+ bool havebz2 = false;
+ if ( !KStandardDirs::findExe( "bzip2" ).isNull() && m_conf->readBoolEntry( "UseBzip2", true ) )
+ {
+ havebz2 = true;
+ //.bz2 can only compress one file, not multiple
+ if ( itemCount == 1 ) m_archiveMimeTypes << "application/x-bzip2";
+ }
+
+ bool havelzop = false;
+ if ( !KStandardDirs::findExe( "lzop" ).isNull() && m_conf->readBoolEntry( "UseLzop", false ) )
+ {
+ havelzop = true;
+ m_archiveMimeTypes << "application/x-lzop";
+ }
+
+ if ( !KStandardDirs::findExe( "tar" ).isNull() && m_conf->readBoolEntry( "UseTar", true ) )
+ {
+ m_archiveMimeTypes << "application/x-tar";
+ if ( havegz )
+ m_archiveMimeTypes << "application/x-tgz";
+ if ( havebz2 )
+ {
+ m_archiveMimeTypes << "application/x-tbz";
+ m_archiveMimeTypes << "application/x-tbz2";
+ }
+ if ( havelzop )
+ m_archiveMimeTypes << "application/x-tzo";
+ }
+
+ if ( !KStandardDirs::findExe( "lha" ).isNull() && m_conf->readBoolEntry( "UseLha", false ) )
+ m_archiveMimeTypes << "application/x-lha";
+
+ if ( !KStandardDirs::findExe( "zip" ).isNull() && m_conf->readBoolEntry( "UseZip", true ) )
+ {
+ m_archiveMimeTypes << "application/x-zip";
+
+ if ( m_conf->readBoolEntry( "UseJar", false ) )
+ m_archiveMimeTypes << "application/x-jar";
+ }
+
+ if ( !KStandardDirs::findExe( "rar" ).isNull() && m_conf->readBoolEntry( "UseRar", true ) )
+ m_archiveMimeTypes << "application/x-rar" << "application/x-rar-compressed";
+
+ if ( !KStandardDirs::findExe( "7z" ).isNull() && m_conf->readBoolEntry( "Use7z", true ) )
+ m_archiveMimeTypes << "application/x-7z";
+ else if ( !KStandardDirs::findExe( "7za" ).isNull() && m_conf->readBoolEntry( "Use7za", true ) )
+ m_archiveMimeTypes << "application/x-7z";
+ else if ( !KStandardDirs::findExe( "7zr" ).isNull() && m_conf->readBoolEntry( "Use7zr", true ) )
+ m_archiveMimeTypes << "application/x-7z";
+
+ if ( !KStandardDirs::findExe( "zoo" ).isNull() && m_conf->readBoolEntry( "UseZoo", false ) )
+ m_archiveMimeTypes << "application/x-zoo";
+
+ if ( !KStandardDirs::findExe( "compress" ).isNull() && m_conf->readBoolEntry( "UseCompress", false ) )
+ m_archiveMimeTypes << "application/x-compress";
+
+ if ( !KStandardDirs::findExe( "bzip" ).isNull() && m_conf->readBoolEntry( "UseBzip", false ) )
+ m_archiveMimeTypes << "application/x-bzip";
+
+ if ( !KStandardDirs::findExe( "ar" ).isNull() && m_conf->readBoolEntry( "UseAr", false ) )
+ m_archiveMimeTypes << "application/x-archive";
+}
+
+void ArkMenu::extMimeTypes()
+{
+ bool havegz = false;
+ if ( !KStandardDirs::findExe( "gunzip" ).isNull() )
+ {
+ havegz = true;
+ m_extractMimeTypes << "application/x-gzip";
+ m_extractMimeTypes << "application/x-gzpostscript";
+ }
+
+ bool havebz2 = false;
+ if ( !KStandardDirs::findExe( "bunzip2" ).isNull() )
+ {
+ havebz2 = true;
+ m_extractMimeTypes << "application/x-bzip2";
+ }
+
+ bool havelzop = false;
+ if ( !KStandardDirs::findExe( "lzop" ).isNull() )
+ {
+ havelzop = true;
+ m_extractMimeTypes << "application/x-lzop";
+ }
+
+ if ( !KStandardDirs::findExe( "tar" ).isNull() )
+ {
+ m_extractMimeTypes << "application/x-tar";
+ if ( havegz )
+ m_extractMimeTypes << "application/x-tgz";
+ if ( havebz2 )
+ {
+ m_extractMimeTypes << "application/x-tbz";
+ m_extractMimeTypes << "application/x-tbz2";
+ }
+ if ( havelzop )
+ m_extractMimeTypes << "application/x-tzo";
+ }
+
+ if ( !KStandardDirs::findExe( "lha" ).isNull() )
+ m_extractMimeTypes << "application/x-lha";
+
+ if ( !KStandardDirs::findExe( "zip" ).isNull() )
+ m_extractMimeTypes << "application/x-zip" << "application/x-jar";
+
+ if ( !KStandardDirs::findExe( "unrar" ).isNull() )
+ m_extractMimeTypes << "application/x-rar" << "application/x-rar-compressed";
+
+ if ( !KStandardDirs::findExe( "7z" ).isNull() || !KStandardDirs::findExe( "7za" ).isNull() || !KStandardDirs::findExe( "7zr" ).isNull() )
+ m_extractMimeTypes << "application/x-7z";
+
+ if ( !KStandardDirs::findExe( "zoo" ).isNull() )
+ m_extractMimeTypes << "application/x-zoo";
+
+ if ( !KStandardDirs::findExe( "uncompress" ).isNull() )
+ m_extractMimeTypes << "application/x-compress";
+
+ if ( !KStandardDirs::findExe( "bunzip" ).isNull() )
+ m_extractMimeTypes << "application/x-bzip";
+
+ if ( !KStandardDirs::findExe( "ar" ).isNull() )
+ m_extractMimeTypes << "application/x-archive";
+}
+
+void ArkMenu::stripExtension( QString & name )
+{
+ QStringList patternList = KMimeType::findByPath( name )->patterns();
+ QStringList::Iterator it = patternList.begin();
+ QString ext;
+ for ( ; it != patternList.end(); ++it )
+ {
+ ext = (*it).remove( '*' );
+ if ( name.endsWith( ext ) )
+ {
+ name = name.left( name.findRev( ext ) ) + '/';
+ break;
+ }
+ }
+}
+
+void ArkMenu::slotCompressAs( int pos )
+{
+ QCString name;
+ QString extension, mimeType;
+ KURL target;
+ QStringList filelist( m_urlStringList );
+
+ //if KMimeType returns .ZIP, .7Z or .RAR. convert them to lowercase
+ if ( m_extensionList[ pos ].contains ( ".ZIP" ) )
+ m_extensionList[ pos ] = ".zip";
+
+ if ( m_extensionList[ pos ].contains ( ".RAR" ) )
+ m_extensionList[ pos ] = ".rar";
+
+ if ( m_extensionList[ pos ].contains ( ".7Z" ) )
+ m_extensionList[ pos ] = ".7z";
+
+ if ( filelist.count() == 1)
+ target = filelist.first() + m_extensionList[ pos ];
+ else
+ {
+ target = m_dir + i18n("Archive") + m_extensionList[ pos ];
+ int i=1;
+ while ( KIO::NetAccess::exists(target, true, 0 ) )
+ {
+ target = m_dir + i18n("Archive %1").arg(i) + m_extensionList[ pos ];
+ i++;
+ }
+ }
+ compressAs( filelist, target );
+
+ extension = m_extensionList[ pos ];
+ m_conf->setGroup( "ArkPlugin" );
+ m_conf->writeEntry( "LastExtension", extension );
+
+ QStringList extensions;
+ QStringList::Iterator eit;
+ QStringList::Iterator mit = m_archiveMimeTypes.begin();
+ bool done = false;
+ for ( ; mit != m_archiveMimeTypes.end() && !done; ++mit )
+ {
+ extensions = KMimeType::mimeType(*mit)->patterns();
+ eit = extensions.begin();
+ for ( ; eit != extensions.end(); ++eit )
+ {
+ (*eit).remove( '*' );
+ if ( (*eit) == extension )
+ {
+ m_conf->writeEntry( "LastMimeType", *mit );
+ done = true;
+ break;
+ }
+ }
+ }
+ m_conf->sync();
+}
+
+void ArkMenu::slotCompressAsDefault()
+{
+ KURL name;
+
+ if ( m_urlStringList.count() == 1)
+ name = m_urlStringList.first() + m_ext;
+ else
+ {
+ name = m_dir + i18n("Archive") + m_ext;
+ int i=1;
+ while ( KIO::NetAccess::exists(name, true, 0 ) )
+ {
+ name = m_dir + i18n("Archive %1").arg(i) + m_ext;
+ i++;
+ }
+ }
+ compressAs( m_urlStringList, name );
+}
+
+// make work for URLs
+void ArkMenu::compressAs( const QStringList &name, const KURL & compressed )
+{
+ QStringList args;
+ args << "--add-to";
+ args += name;
+ args << compressed.url();
+ kapp->kdeinitExec( "ark", args );
+}
+
+void ArkMenu::slotAddTo( int pos )
+{
+ QStringList args( m_urlStringList );
+ args.prepend( "--add-to" );
+
+ KURL archive( m_urlStringList.first() );
+ archive.setPath( archive.directory( false ) );
+ archive.setFileName( m_archiveList[ pos ].fileName() );
+
+ args << archive.url();
+ kapp->kdeinitExec( "ark", args );
+}
+
+void ArkMenu::slotAdd()
+{
+ QStringList args( m_urlStringList );
+ args.prepend( "--add" );
+
+ kapp->kdeinitExec( "ark", args );
+}
+
+void ArkMenu::slotExtractHere()
+{
+ for ( QValueList<KURL>::ConstIterator it = m_urlList.constBegin();
+ it != m_urlList.constEnd();
+ ++it )
+ {
+ QStringList args;
+ KURL targetDirectory = ( *it ).url();
+ targetDirectory.setPath( targetDirectory.directory() );
+ args << "--extract-to" << targetDirectory.url() << ( *it ).url();
+ kapp->kdeinitExec( "ark", args );
+ }
+}
+
+void ArkMenu::slotExtractToSubfolders()
+{
+ for ( QStringList::ConstIterator it = m_urlStringList.constBegin();
+ it != m_urlStringList.constEnd();
+ ++it )
+ {
+ KURL targetDir;
+ QString dirName;
+ QStringList args;
+
+ targetDir = *it;
+ dirName = targetDir.path();
+ stripExtension( dirName );
+ targetDir.setPath( dirName );
+ args << "--extract-to" << targetDir.url() << *it;
+ kapp->kdeinitExec( "ark", args );
+ }
+}
+
+void ArkMenu::slotExtractTo()
+{
+ for ( QStringList::ConstIterator it = m_urlStringList.constBegin();
+ it != m_urlStringList.constEnd();
+ ++it )
+ {
+ QStringList args;
+ args << "--extract" << *it;
+ kapp->kdeinitExec( "ark", args );
+ }
+}
+
+#include "arkplugin.moc"
diff --git a/konq-plugins/arkplugin/arkplugin.desktop b/konq-plugins/arkplugin/arkplugin.desktop
new file mode 100644
index 0000000..7cb6d7a
--- /dev/null
+++ b/konq-plugins/arkplugin/arkplugin.desktop
@@ -0,0 +1,59 @@
+[Desktop Entry]
+Name=Compress/Extract Files with Ark
+Name[bg]=Компресиране/извличане на файлове с Ark
+Name[bs]=Kompresuj/ekstraktuj datoteke koristeći Ark
+Name[ca]=Comprimeix/extrau fitxers amb Ark
+Name[cs]=Komprimovat/rozbalit soubory pomocí Ark
+Name[da]=Komprimér/Udpak filer med Ark
+Name[de]=Dateien mit Ark komprimieren/extrahieren
+Name[el]=Συμπίεση/Εξαγωγή αρχείων με το Ark
+Name[eo]=Kunpremu/Elpaku dosierojn per Arĥivilo
+Name[es]=Comprimir/Extraer archivos con Ark
+Name[et]=Failide pakkimine/lahtipakkimine Arki abil
+Name[eu]=Fitxategiak konprimitu/atera Ark erabiliz
+Name[fa]=فشرده‌سازی/استخراج پرونده‌‌ها توسط Ark
+Name[fi]=Pakkaa/Pura tiedostoja Ark-ohjelmalla
+Name[fr]=Compacter / extraire des fichiers avec Ark
+Name[fy]=Triemmen ynpakke/útpakke mei Ark
+Name[ga]=Comhbhrúigh/Bain Comhaid Amach le Ark
+Name[gl]=Comprimir/Extrair Ficheiros con Ark
+Name[he]=דחוס/פרוס קבצים עם Ark
+Name[hi]=आर्क के द्वारा फ़ाइलों को संपीडित करें/निकालें
+Name[hr]=Komprimiranje i izvlačenje datoteka pomoću aplikacije Ark
+Name[hu]=Fájlok tömörítése és kibontása az Arkkal
+Name[is]=Þjappa/taka út skrár með Ark
+Name[it]=Comprimi/estrai file con Ark
+Name[ja]=Ark でファイルを圧縮/展開
+Name[ka]=ფაილების Ark-ით შეკუნშვა/ამოღება
+Name[kk]=Ark көмегімен файлдарды сығу/тарқату
+Name[km]=បង្ហាប់/ស្រង់ចេញ​ឯកសារ​ដោយ​ប្រើ Ark
+Name[lt]=Suspausti/išspausti bylas naudojant Ark
+Name[mk]=Компресија/отпакување датотеки со Арк
+Name[ms]=Mampat/Ekstrak Fail dengan Ark
+Name[nb]=Komprimer/pakk ut filer med Ark
+Name[nds]=Dateien mit Ark komprimeren/utpacken
+Name[ne]=आर्कबाट फाइल सङ्कुचन/निष्कर्षण गर्नुहोस्
+Name[nl]=Bestanden inpakken/uitpakken met Ark
+Name[nn]=Komprimer/pakk ut filer med Ark
+Name[pa]=ਆਕ ਨਾਲ ਫਾਇਲਾਂ ਸਮੇਟੋ/ਖੋਲੋ
+Name[pl]=Kompresja/dekompresja plików za pomocą Ark
+Name[pt]=Comprimir/Extrair Ficheiros com o Ark
+Name[pt_BR]=Compactar/Extrair arquivos com o Ark
+Name[ru]=Сжатие/распаковка файлов в Ark
+Name[sk]=Zabaliť/rozbaliť súbory pomocou Ark
+Name[sl]=Stisni/Izvleci datoteke z Arkom
+Name[sr]=Компресуј/извуци фајлове Ark-ом
+Name[sr@Latn]=Kompresuj/izvuci fajlove Ark-om
+Name[sv]=Komprimera eller packa upp filer med Ark
+Name[ta]=கோப்பினை Ark உடன் சுருக்கு/எடு
+Name[tg]=Фишурдан/кушодани файлҳо дар Ark
+Name[tr]=Dosyaları Ark ile Sıkıştır/Ayıkla
+Name[uk]=Стиснення/розпакування файлів в Ark
+Name[uz]=Fayllarni Ark dasturida qisish/ajratish
+Name[uz@cyrillic]=Файлларни Ark дастурида қисиш/ажратиш
+Name[vi]=Nén/Giải nén tập tin bằng Ark
+Name[zh_CN]=用 Ark 压缩/解压文件
+Name[zh_TW]=以 Ark 壓縮/解壓縮檔案
+Icon=ark
+X-KDE-ParentApp=konqueror
+#DocPath=konq-plugins/arkplugin/index.html
diff --git a/konq-plugins/arkplugin/arkplugin.h b/konq-plugins/arkplugin/arkplugin.h
new file mode 100644
index 0000000..8732294
--- /dev/null
+++ b/konq-plugins/arkplugin/arkplugin.h
@@ -0,0 +1,72 @@
+/* This file is part of the KDE project
+
+ Copyright (C) 2003 Georg Robbers <Georg.Robbers@urz.uni-hd.de>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; version 2
+ of the License.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _ARKPLUGIN_H_
+#define _ARKPLUGIN_H_
+
+#include <konq_popupmenu.h>
+#include <kfileitem.h>
+#include <kconfig.h>
+
+class KAction;
+class QSignalMapper;
+
+class ArkMenu : public KonqPopupMenuPlugin {
+ Q_OBJECT
+public:
+ ArkMenu( KonqPopupMenu *, const char *name, const QStringList & list );
+ virtual ~ArkMenu();
+
+public slots:
+ void slotCompressAsDefault();
+ void slotCompressAs( int pos );
+ void slotAddTo( int pos );
+ void slotAdd();
+ void slotExtractHere();
+ void slotExtractToSubfolders();
+ void slotExtractTo();
+ void slotPrepareCompAsMenu();
+ void slotPrepareAddToMenu();
+
+protected:
+ void extMimeTypes();
+ void compMimeTypes();
+ void compressAs( const QStringList &name, const KURL & compressed );
+
+ void stripExtension( QString & name );
+
+private:
+ QString m_name, m_ext;
+ QValueList<KURL> m_urlList;
+ QStringList m_urlStringList;
+ KURL::List m_archiveList;
+ QStringList m_archiveMimeTypes;
+ QStringList m_extractMimeTypes;
+ QStringList m_extensionList;
+ KActionMenu * m_compAsMenu;
+ KActionMenu * m_addToMenu;
+ QSignalMapper * m_compAsMapper;
+ QSignalMapper * m_addToMapper;
+ KConfig * m_conf;
+ QString m_dir; //contains the currect directory
+};
+
+#endif
+
diff --git a/konq-plugins/autorefresh/Makefile.am b/konq-plugins/autorefresh/Makefile.am
new file mode 100644
index 0000000..f97432b
--- /dev/null
+++ b/konq-plugins/autorefresh/Makefile.am
@@ -0,0 +1,21 @@
+kde_module_LTLIBRARIES = libautorefresh.la
+
+INCLUDES = $(all_includes)
+
+libautorefresh_la_METASOURCES = AUTO
+libautorefresh_la_SOURCES = autorefresh.cpp
+libautorefresh_la_LIBADD = $(LIB_KHTML)
+
+libautorefresh_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+
+KDE_ICON = autorefresh
+
+autorefreshdir = $(kde_datadir)/khtml/kpartplugins
+autorefresh_DATA = autorefresh.rc autorefresh.desktop
+
+messages: rc.cpp
+ LIST=`find . -name \*.h -o -name \*.hh -o -name \*.H -o -name \*.hxx -o -name \*.hpp -o -name \*.cpp -o -name \*.cc -o -name \*.cxx -o -name \*.ecpp -o -name \*.C`; \
+ if test -n "$$LIST"; then \
+ $(XGETTEXT) $$LIST -o $(podir)/autorefresh.pot; \
+ fi
+
diff --git a/konq-plugins/autorefresh/autorefresh.cpp b/konq-plugins/autorefresh/autorefresh.cpp
new file mode 100644
index 0000000..6d06ea0
--- /dev/null
+++ b/konq-plugins/autorefresh/autorefresh.cpp
@@ -0,0 +1,107 @@
+// -*- c++ -*-
+
+/*
+ * Copyright 2003 by Richard J. Moore, rich@kde.org
+ */
+
+
+#include <khtml_part.h> // this plugin applies to a khtml part
+#include <kdebug.h>
+#include "autorefresh.h"
+#include <kaction.h>
+#include <kinstance.h>
+#include <kiconloader.h>
+#include <qmessagebox.h>
+#include <klocale.h>
+#include <qtimer.h>
+#include <kgenericfactory.h>
+
+AutoRefresh::AutoRefresh( QObject* parent, const char* name, const QStringList & /*args*/ )
+ : Plugin( parent, name )
+{
+ timer = new QTimer( this );
+ connect( timer, SIGNAL( timeout() ), this, SLOT( slotRefresh() ) );
+
+ refresher = new KSelectAction( i18n("&Auto Refresh"),
+ "reload", 0,
+ this, SLOT(slotIntervalChanged()),
+ actionCollection(), "autorefresh" );
+ QStringList sl;
+ sl << i18n("None");
+ sl << i18n("Every 15 Seconds");
+ sl << i18n("Every 30 Seconds");
+ sl << i18n("Every Minute");
+ sl << i18n("Every 5 Minutes");
+ sl << i18n("Every 10 Minutes");
+ sl << i18n("Every 15 Minutes");
+ sl << i18n("Every 30 Minutes");
+ sl << i18n("Every 60 Minutes");
+
+ refresher->setItems( sl );
+ refresher->setCurrentItem( 0 );
+}
+
+AutoRefresh::~AutoRefresh()
+{
+}
+
+void AutoRefresh::slotIntervalChanged()
+{
+ int idx = refresher->currentItem();
+ int timeout = 0;
+ switch (idx) {
+ case 1:
+ timeout = ( 15*1000 );
+ break;
+ case 2:
+ timeout = ( 30*1000 );
+ break;
+ case 3:
+ timeout = ( 60*1000 );
+ break;
+ case 4:
+ timeout = ( 5*60*1000 );
+ break;
+ case 5:
+ timeout = ( 10*60*1000 );
+ break;
+ case 6:
+ timeout = ( 15*60*1000 );
+ break;
+ case 7:
+ timeout = ( 30*60*1000 );
+ break;
+ case 8:
+ timeout = ( 60*60*1000 );
+ break;
+ default:
+ break;
+ }
+
+ timer->stop();
+ if ( timeout )
+ timer->start( timeout );
+}
+
+void AutoRefresh::slotRefresh()
+{
+ if ( !parent()->inherits("KParts::ReadOnlyPart") ) {
+ QString title = i18n( "Cannot Refresh Source" );
+ QString text = i18n( "<qt>This plugin cannot auto-refresh the current part.</qt>" );
+
+ QMessageBox::warning( 0, title, text );
+ }
+ else
+ {
+ KParts::ReadOnlyPart *part = (KParts::ReadOnlyPart *) parent();
+
+ // Get URL
+ KURL url = part->url();
+ part->openURL( url );
+ }
+}
+
+K_EXPORT_COMPONENT_FACTORY( libautorefresh, KGenericFactory<AutoRefresh>( "autorefresh" ) )
+
+#include "autorefresh.moc"
+
diff --git a/konq-plugins/autorefresh/autorefresh.desktop b/konq-plugins/autorefresh/autorefresh.desktop
new file mode 100644
index 0000000..7df9332
--- /dev/null
+++ b/konq-plugins/autorefresh/autorefresh.desktop
@@ -0,0 +1,120 @@
+[Desktop Entry]
+X-KDE-Library=autorefresh
+X-KDE-PluginInfo-Author=Richard J. Moore
+X-KDE-PluginInfo-Email=rich@kde.org
+X-KDE-PluginInfo-Name=autorefresh
+X-KDE-PluginInfo-Version=3.3
+X-KDE-PluginInfo-Website=
+X-KDE-PluginInfo-Category=Tools
+X-KDE-PluginInfo-Depends=
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=false
+Name=Auto Refresh Plugin
+Name[bg]=Приставка за автоматично опресняване
+Name[ca]=Connector de refresc automàtic
+Name[cs]=Modul automatického obnovení
+Name[da]=Plugin til autogenopfriskning
+Name[de]=Aktualisierungsmodul
+Name[el]=Πρόσθετο αυτόματης ανανέωσης
+Name[eo]=Aŭtomata refreŝa kromaĵo
+Name[es]=Complemento para actualización automática
+Name[et]=Automaatse uuendamise plugin
+Name[eu]=Auto Refresh plugina
+Name[fa]=بازآوری خودکار وصله
+Name[fi]=Automaattivirkistyssovelma
+Name[fr]=Module d'auto-rafraîchissement
+Name[fy]=Autoferfarskplugin
+Name[gl]=Plugin de Actualización Automática
+Name[he]=תוסף רענון אוטומטי
+Name[hi]=स्वचालित ताज़ा करने का प्लगइन
+Name[hr]=Dodatak za automatsko osvježavanje
+Name[hu]=Automatikus frissítési bővítőmodul
+Name[is]=Sjálfvirkt uppfærsluíforrit
+Name[it]=Aggiornamento automatico
+Name[ja]=自動更新プラグイン
+Name[ka]=ავტო განახლების მოდული
+Name[kk]=Авто жаңарту плагин модулі
+Name[km]=ធ្វើ​ឲ្យ​កម្មវិធី​ជំនួយ​ស្រស់​ដោយ​ស្វ័យ​ប្រវត្តិ
+Name[lt]=Automatinio atnaujinimo priedas
+Name[mk]=Приклучок за автоматско освежување
+Name[ms]=Plugin Automuat Semula
+Name[nb]=Programtillegg for auto-oppfrisking
+Name[nds]=Moduul för't automaatsche Opfrischen
+Name[ne]=स्वत: ताजा पार्ने प्लगइन
+Name[nl]=Autoverversplugin
+Name[nn]=Programtillegg for automatisk oppfrisking
+Name[pa]=ਸਵੈਚਾਲਿਤ ਤਾਜ਼ਾ ਪਲੱਗਇਨ
+Name[pl]=Wtyczka automatycznego odświeżania
+Name[pt]='Plugin' de Actualização Automática
+Name[pt_BR]=Plug-in de atualização automática
+Name[ru]=Модуль автообновления
+Name[sk]=Modul automatického obnovenia
+Name[sl]=Vstavek za samodejno osveževanje
+Name[sr]=Прикључак за аутоматско освежавање
+Name[sr@Latn]=Priključak za automatsko osvežavanje
+Name[sv]=Insticksprogram för automatisk uppdatering
+Name[ta]=தானாகவே புதுப்பிக்கும் சொருகுப்பொருள்
+Name[tg]=Худкорона аз нав кардани модул
+Name[tr]=Otomatik Tazeleme Eklentisi
+Name[uk]=Втулок автоматичного перезавантаження
+Name[uz]=Avto-yangilash plagini
+Name[uz@cyrillic]=Авто-янгилаш плагини
+Name[vi]=Bổ sung tự động làm tươi
+Name[zh_CN]=自动刷新插件
+Name[zh_TW]=自動刷新外掛程式
+Comment=Auto Refresh plugin
+Comment[bg]=Приставка за автоматично опресняване
+Comment[ca]=Connector de refresc automàtic
+Comment[cs]=Modul automatického obnovení
+Comment[da]=Plugin til autogenopfriskning
+Comment[de]=Ein Modul zur automatischen Aktualisierung
+Comment[el]=Πρόσθετο αυτόματης ανανέωσης
+Comment[eo]=Aŭtomata refreŝa kromaĵo
+Comment[es]=Complemento para actualización automática
+Comment[et]=Automaatse uuendamise plugin
+Comment[eu]=Auto Refresh plugina
+Comment[fa]=بازآوری خودکار وصله
+Comment[fi]=Automaattivirkistyssovelma
+Comment[fr]=Module d'auto-rafraîchissement
+Comment[fy]=Autoferfarskplugin
+Comment[gl]=Plugin de actualización automática
+Comment[he]=תוסף רענון אוטומטי
+Comment[hi]=स्वचालित ताज़ा करने का प्लगइन
+Comment[hr]=Dodatak za automatsko osvježavanje
+Comment[hu]=Automatikus frissítési bővítőmodul
+Comment[is]=Sjálfvirkt uppfærsluíforrit
+Comment[it]=Plugin per l'aggiornamento automatico
+Comment[ja]=自動更新プラグイン
+Comment[ka]=ავტო განახლების მოდული
+Comment[kk]=Авто жаңарту плагин модулі
+Comment[km]=ធ្វើ​កម្មវិធី​ជំនួយ​ឲ្យ​ស្រស់​ដោយ​ស្វ័យប្រវត្តិ
+Comment[lt]=Automatinio atnaujinimo priedas
+Comment[mk]=Приклучок за автоматско освежување
+Comment[ms]=Plugin AutoMuat Semula
+Comment[nb]=Programtillegg for auto-oppfrisk
+Comment[nds]=Moduul för't automaatsche Opfrischen
+Comment[ne]=स्वत: ताजा पार्ने प्लगइन
+Comment[nl]=Autoverversplugin
+Comment[nn]=Programtillegg for automatisk oppfrisking
+Comment[pa]=ਸਵੈ-ਚਾਲਿਤ ਤਾਜ਼ਾ ਪਲੱਗਇਨ
+Comment[pl]=Wtyczka automatycznego odświeżania
+Comment[pt]='Plugin' de actualização automática
+Comment[pt_BR]=Plug-in de atualização automática
+Comment[ru]=Модуль автообновления
+Comment[sk]=Modul automatického obnovenia
+Comment[sl]=Vstavek za samodejno osveževanje
+Comment[sr]=Прикључак за аутоматско освежавање
+Comment[sr@Latn]=Priključak za automatsko osvežavanje
+Comment[sv]=Insticksprogram för automatisk uppdatering
+Comment[ta]=தானாகவே புதுப்பிக்கும் சொருகுப்பொருள்
+Comment[tg]=Худкорона аз нав кардани модул
+Comment[tr]=Otomatik Tazeleme Eklentisi
+Comment[uk]=Втулок автоматичного перезавантаження
+Comment[uz]=Veb-sahifani avto-yangilash vositasi
+Comment[uz@cyrillic]=Веб-саҳифани авто-янгилаш воситаси
+Comment[vi]=Bổ sung tự động làm tươi
+Comment[zh_CN]=自动刷新插件
+Comment[zh_TW]=自動刷新外掛程式
+Icon=reload
+X-KDE-ParentApp=konqueror
+
diff --git a/konq-plugins/autorefresh/autorefresh.h b/konq-plugins/autorefresh/autorefresh.h
new file mode 100644
index 0000000..370e42b
--- /dev/null
+++ b/konq-plugins/autorefresh/autorefresh.h
@@ -0,0 +1,55 @@
+// -*- c++ -*-
+
+/*
+ * Copyright 2003 by Richard J. Moore, rich@kde.org
+ */
+
+#ifndef __plugin_autorefresh_h
+#define __plugin_autorefresh_h
+
+#include <kparts/plugin.h>
+#include <klibloader.h>
+
+class KURL;
+class KInstance;
+class QTimer;
+
+/**
+ * A plugin is the way to add actions to an existing @ref KParts application,
+ * or to a @ref Part.
+ *
+ * The XML of those plugins looks exactly like of the shell or parts,
+ * with one small difference: The document tag should have an additional
+ * attribute, named "library", and contain the name of the library implementing
+ * the plugin.
+ *
+ * If you want this plugin to be used by a part, you need to
+ * install the rc file under the directory
+ * "data" (KDEDIR/share/apps usually)+"/instancename/kpartplugins/"
+ * where instancename is the name of the part's instance.
+ **/
+class AutoRefresh : public KParts::Plugin
+{
+ Q_OBJECT
+public:
+
+ /**
+ * Construct a new KParts plugin.
+ */
+ AutoRefresh( QObject* parent = 0, const char* name = 0, const QStringList &args = QStringList() );
+
+ /**
+ * Destructor.
+ */
+ virtual ~AutoRefresh();
+
+public slots:
+ void slotRefresh();
+ void slotIntervalChanged();
+
+private:
+ KSelectAction *refresher;
+ QTimer *timer;
+};
+
+#endif
diff --git a/konq-plugins/autorefresh/autorefresh.rc b/konq-plugins/autorefresh/autorefresh.rc
new file mode 100644
index 0000000..9226178
--- /dev/null
+++ b/konq-plugins/autorefresh/autorefresh.rc
@@ -0,0 +1,10 @@
+<!DOCTYPE kpartgui>
+ <kpartgui library="libautorefresh" name="autorefresh" version="0.1" >
+ <MenuBar>
+ <Menu name="tools">
+ <Text>&amp;Tools</Text>
+ <Action name="autorefresh"/>
+ </Menu>
+ </MenuBar>
+</kpartgui>
+
diff --git a/konq-plugins/autorefresh/lo16-app-autorefresh.png b/konq-plugins/autorefresh/lo16-app-autorefresh.png
new file mode 100644
index 0000000..e4c699a
--- /dev/null
+++ b/konq-plugins/autorefresh/lo16-app-autorefresh.png
Binary files differ
diff --git a/konq-plugins/babelfish/Makefile.am b/konq-plugins/babelfish/Makefile.am
new file mode 100644
index 0000000..3316d68
--- /dev/null
+++ b/konq-plugins/babelfish/Makefile.am
@@ -0,0 +1,26 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = libbabelfishplugin.la
+
+libbabelfishplugin_la_SOURCES = plugin_babelfish.cpp
+libbabelfishplugin_la_LIBADD = $(LIB_KPARTS) $(LIB_KHTML)
+libbabelfishplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) -no-undefined
+
+pluginsdir = $(kde_datadir)/khtml/kpartplugins
+plugins_DATA = plugin_babelfish.rc plugin_babelfish.desktop
+
+appsdir = $(kde_appsdir)/.hidden
+apps_DATA = plugin_babelfish.desktop
+
+install-data-local: $(srcdir)/../uninstall.desktop
+ $(mkinstalldirs) $(DESTDIR)$(pluginsdir)
+ $(INSTALL_DATA) $(srcdir)/../uninstall.desktop $(DESTDIR)$(pluginsdir)/babelfishplugin.desktop
+
+KDE_ICON = babelfish
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/babelfish.pot
+
+kde_conf_DATA = translaterc
diff --git a/konq-plugins/babelfish/cr16-action-babelfish.png b/konq-plugins/babelfish/cr16-action-babelfish.png
new file mode 100644
index 0000000..63ce64d
--- /dev/null
+++ b/konq-plugins/babelfish/cr16-action-babelfish.png
Binary files differ
diff --git a/konq-plugins/babelfish/cr22-action-babelfish.png b/konq-plugins/babelfish/cr22-action-babelfish.png
new file mode 100644
index 0000000..acb9a69
--- /dev/null
+++ b/konq-plugins/babelfish/cr22-action-babelfish.png
Binary files differ
diff --git a/konq-plugins/babelfish/plugin_babelfish.cpp b/konq-plugins/babelfish/plugin_babelfish.cpp
new file mode 100644
index 0000000..302b71a
--- /dev/null
+++ b/konq-plugins/babelfish/plugin_babelfish.cpp
@@ -0,0 +1,376 @@
+/* This file is part of the KDE Project
+ Copyright (C) 2001 Kurt Granroth <granroth@kde.org>
+ Original code: plugin code, connecting to Babelfish and support for selected text
+ Copyright (C) 2003 Rand2342 <rand2342@yahoo.com>
+ Submenus, KConfig file and support for other translation engines
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#include "plugin_babelfish.h"
+
+#include <kaction.h>
+#include <kinstance.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kgenericfactory.h>
+#include <kaboutdata.h>
+
+#include <khtml_part.h>
+
+typedef KGenericFactory<PluginBabelFish> BabelFishFactory;
+static const KAboutData aboutdata("babelfish", I18N_NOOP("Translate Web Page") , "1.0" );
+K_EXPORT_COMPONENT_FACTORY( libbabelfishplugin, BabelFishFactory( &aboutdata ) )
+
+PluginBabelFish::PluginBabelFish( QObject* parent, const char* name,
+ const QStringList & )
+ : Plugin( parent, name )
+{
+ setInstance(BabelFishFactory::instance());
+
+ m_menu = new KActionMenu( i18n("Translate Web &Page"), "babelfish",
+ actionCollection(), "translatewebpage" );
+ m_menu->setDelayed( false );
+
+ m_en = new KActionMenu( i18n("&English To"), "babelfish",
+ actionCollection(), "translatewebpage_en" );
+ m_fr = new KActionMenu( i18n("&French To"), "babelfish",
+ actionCollection(), "translatewebpage_fr" );
+ m_de = new KActionMenu( i18n("&German To"), "babelfish",
+ actionCollection(), "translatewebpage_de" );
+ m_es = new KActionMenu( i18n("&Spanish To"), "babelfish",
+ actionCollection(), "translatewebpage_es" );
+ m_pt = new KActionMenu( i18n("&Portuguese To"), "babelfish",
+ actionCollection(), "translatewebpage_pt" );
+ m_it = new KActionMenu( i18n("&Italian To"), "babelfish",
+ actionCollection(), "translatewebpage_it" );
+ m_nl = new KActionMenu( i18n("&Dutch To"), "babelfish",
+ actionCollection(), "translatewebpage_nl" );
+
+ m_en->insert( new KAction( i18n("&Chinese (Simplified)"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "en_zh") );
+ m_en->insert( new KAction( i18n("Chinese (&Traditional)"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "en_zhTW") );
+ m_en->insert( new KAction( i18n("&Dutch"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "en_nl") );
+ m_en->insert( new KAction( i18n("&French"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "en_fr") );
+ m_en->insert( new KAction( i18n("&German"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "en_de") );
+ m_en->insert( new KAction( i18n("&Italian"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "en_it") );
+ m_en->insert( new KAction( i18n("&Japanese"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "en_ja") );
+ m_en->insert( new KAction( i18n("&Korean"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "en_ko") );
+ m_en->insert( new KAction( i18n("&Norwegian"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "en_no") );
+ m_en->insert( new KAction( i18n("&Portuguese"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "en_pt") );
+ m_en->insert( new KAction( i18n("&Russian"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "en_ru") );
+ m_en->insert( new KAction( i18n("&Spanish"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "en_es") );
+ m_en->insert( new KAction( i18n("T&hai"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "en_th") );
+
+ m_fr->insert( new KAction( i18n("&Dutch"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "fr_nl") );
+ m_fr->insert( new KAction( i18n("&English"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "fr_en") );
+ m_fr->insert( new KAction( i18n("&German"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "fr_de") );
+ m_fr->insert( new KAction( i18n("&Italian"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "fr_it") );
+ m_fr->insert( new KAction( i18n("&Portuguese"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "fr_pt") );
+ m_fr->insert( new KAction( i18n("&Spanish"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "fr_es") );
+
+ m_de->insert( new KAction( i18n("&English"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "de_en") );
+ m_de->insert( new KAction( i18n("&French"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "de_fr") );
+
+ m_es->insert( new KAction( i18n("&English"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "es_en") );
+ m_es->insert( new KAction( i18n("&French"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "es_fr") );
+
+ m_pt->insert( new KAction( i18n("&English"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "pt_en") );
+ m_pt->insert( new KAction( i18n("&French"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "pt_fr") );
+
+ m_it->insert( new KAction( i18n("&English"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "it_en") );
+ m_it->insert( new KAction( i18n("&French"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "it_fr") );
+
+ m_nl->insert( new KAction( i18n("&English"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "nl_en") );
+ m_nl->insert( new KAction( i18n("&French"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "nl_fr") );
+
+ m_menu->insert( new KAction( i18n("&Chinese (Simplified) to English"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "zh_en") );
+ m_menu->insert( new KAction( i18n("Chinese (&Traditional) to English"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "zhTW_en") );
+ m_menu->insert( m_nl );
+ m_menu->insert( m_en );
+ m_menu->insert( m_fr );
+ m_menu->insert( m_de );
+ m_menu->insert( m_it );
+ m_menu->insert( new KAction( i18n("&Japanese to English"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "ja_en") );
+ m_menu->insert( new KAction( i18n("&Korean to English"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "ko_en") );
+ m_menu->insert( m_pt );
+ m_menu->insert( new KAction( i18n("&Russian to English"), 0,
+ this, SLOT(translateURL()),
+ actionCollection(), "ru_en") );
+ m_menu->insert( m_es );
+ m_menu->setEnabled( true );
+
+ // TODO: we could also support plain text viewers...
+ if ( parent && parent->inherits( "KHTMLPart" ) )
+ {
+ KParts::ReadOnlyPart* part = static_cast<KParts::ReadOnlyPart *>(parent);
+ connect( part, SIGNAL(started(KIO::Job*)), this,
+ SLOT(slotStarted(KIO::Job*)) );
+ }
+}
+
+PluginBabelFish::~PluginBabelFish()
+{
+ delete m_menu;
+}
+
+void PluginBabelFish::slotStarted( KIO::Job* )
+{
+ if ( parent()->inherits("KHTMLPart") &&
+ // Babelfish wants http URLs only. No https.
+ static_cast<KParts::ReadOnlyPart *>(parent())->url().protocol().lower() == "http" )
+ {
+ m_menu->setEnabled( true );
+ }
+ else
+ {
+ m_menu->setEnabled( false );
+ }
+}
+
+void PluginBabelFish::translateURL()
+{
+ // we need the sender() for the language name
+ if ( !sender() )
+ return;
+
+ // The parent is assumed to be a KHTMLPart
+ if ( !parent()->inherits("KHTMLPart") )
+ {
+ QString title = i18n( "Cannot Translate Source" );
+ QString text = i18n( "Only web pages can be translated using "
+ "this plugin." );
+
+ KMessageBox::sorry( 0L, text, title );
+ return;
+ }
+
+ // Select engine
+ KConfig cfg( "translaterc", true );
+ QString engine = cfg.readEntry( sender()->name(), "babelfish" );
+
+ // Get URL
+ KHTMLPart *part = dynamic_cast<KHTMLPart *>(parent());
+ if ( !part )
+ return;
+
+ // we check if we have text selected. if so, we translate that. If
+ // not, we translate the url
+ QString totrans;
+ if ( part->hasSelection() )
+ {
+ if( engine == "reverso" || engine == "tsail" )
+ {
+ KMessageBox::sorry( 0L,
+ i18n( "Only full webpages can be translated for this language pair." ),i18n( "Translation Error" ) );
+ return;
+ }
+ totrans = KURL::encode_string( part->selectedText() );
+ } else {
+ KURL url = part->url();
+ // Check syntax
+ if ( !url.isValid() )
+ {
+ QString title = i18n( "Malformed URL" );
+ QString text = i18n( "The URL you entered is not valid, please "
+ "correct it and try again." );
+ KMessageBox::sorry( 0L, text, title );
+ return;
+ }
+ totrans = KURL::encode_string( url.url() );
+ }
+
+ // Create URL
+ KURL result;
+ QString query;
+ if( engine == "freetranslation" ) {
+ query = "sequence=core&Submit=FREE Translation&language=";
+ if( sender()->name() == QString( "en_es" ) )
+ query += "English/Spanish";
+ else if( sender()->name() == QString( "en_de" ) )
+ query += "English/German";
+ else if( sender()->name() == QString( "en_it" ) )
+ query += "English/Italian";
+ else if( sender()->name() == QString( "en_nl" ) )
+ query += "English/Dutch";
+ else if( sender()->name() == QString( "en_pt" ) )
+ query += "English/Portuguese";
+ else if( sender()->name() == QString( "en_no" ) )
+ query += "English/Norwegian";
+ else if( sender()->name() == QString( "en_zh" ) )
+ query += "English/SimplifiedChinese";
+ else if( sender()->name() == QString( "en_zhTW" ) )
+ query += "English/TraditionalChinese";
+ else if( sender()->name() == QString( "es_en" ) )
+ query += "Spanish/English";
+ else if( sender()->name() == QString( "fr_en" ) )
+ query += "French/English";
+ else if( sender()->name() == QString( "de_en" ) )
+ query += "German/English";
+ else if( sender()->name() == QString( "it_en" ) )
+ query += "Italian/English";
+ else if( sender()->name() == QString( "nl_en" ) )
+ query += "Dutch/English";
+ else if( sender()->name() == QString( "pt_en" ) )
+ query += "Portuguese/English";
+ else // Should be en_fr
+ query += "English/French";
+ if ( part->hasSelection() )
+ {
+ result = KURL( "http://ets.freetranslation.com" );
+ query += "&mode=html&template=results_en-us.htm&srctext=";
+ } else {
+ result = KURL( "http://www.freetranslation.com/web.asp" );
+ query += "&url=";
+ }
+ query += totrans;
+ } else if( engine == "parsit" ) {
+ // Does only English -> Thai
+ result = KURL( "http://c3po.links.nectec.or.th/cgi-bin/Parsitcgi.exe" );
+ query = "mode=test&inputtype=";
+ if ( part->hasSelection() )
+ query += "text&TxtEng=";
+ else
+ query += "html&inputurl=";
+ query += totrans;
+ } else if( engine == "reverso" ) {
+ result = KURL( "http://www.reverso.net/url/frame.asp" );
+ query = "autotranslate=on&templates=0&x=0&y=0&directions=";
+ if( sender()->name() == QString( "de_fr" ) )
+ query += "524292";
+ else if( sender()->name() == QString( "fr_en" ) )
+ query += "65544";
+ else if( sender()->name() == QString( "fr_de" ) )
+ query += "262152";
+ else if( sender()->name() == QString( "de_en" ) )
+ query += "65540";
+ else if( sender()->name() == QString( "en_de" ) )
+ query += "262145";
+ else if( sender()->name() == QString( "en_es" ) )
+ query += "2097153";
+ else if( sender()->name() == QString( "es_en" ) )
+ query += "65568";
+ else if( sender()->name() == QString( "fr_es" ) )
+ query += "2097160";
+ else // "en_fr"
+ query += "524289";
+ query += "&url=";
+ query += totrans;
+ } else if( engine == "tsail" ) {
+ result = KURL( "http://www.t-mail.com/cgi-bin/tsail" );
+ query = "sail=full&lp=";
+ if( sender()->name() == QString( "zhTW_en" ) )
+ query += "tw-en";
+ else if( sender()->name() == QString( "en_zhTW" ) )
+ query += "en-tw";
+ else
+ {
+ query += sender()->name();
+ query[15] = '-';
+ }
+ query += totrans;
+ } else if( engine == "voila" ) {
+ result = KURL( "http://trans.voila.fr/voila" );
+ query = "systran_id=Voila-fr&systran_lp=";
+ query += sender()->name();
+ if ( part->hasSelection() )
+ query += "&systran_charset=utf-8&systran_text=";
+ else
+ query += "&systran_url=";
+ query += totrans;
+ } else {
+ // Using the altavista babelfish engine
+ result = KURL( "http://babelfish.altavista.com/babelfish/tr" );
+ query = "lp=";
+ query += sender()->name();
+ if ( part->hasSelection() )
+ query += "&text=";
+ else
+ query += "&url=";
+ query += totrans;
+ }
+
+ result.setQuery( query );
+
+ // Connect to the fish
+ emit part->browserExtension()->openURLRequest( result );
+}
+
+#include <plugin_babelfish.moc>
diff --git a/konq-plugins/babelfish/plugin_babelfish.desktop b/konq-plugins/babelfish/plugin_babelfish.desktop
new file mode 100644
index 0000000..b412eba
--- /dev/null
+++ b/konq-plugins/babelfish/plugin_babelfish.desktop
@@ -0,0 +1,126 @@
+[Desktop Entry]
+X-KDE-Library=babelfish
+X-KDE-PluginInfo-Author=Kurt Granroth, Rand2342
+X-KDE-PluginInfo-Email=granroth@kde.org, rand2342@yahoo.com
+X-KDE-PluginInfo-Name=babelfish
+X-KDE-PluginInfo-Version=3.3
+X-KDE-PluginInfo-Website=
+X-KDE-PluginInfo-Category=Tools
+X-KDE-PluginInfo-Depends=
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=true
+Name=Babel Plugin
+Name[bg]=Приставка за Babel
+Name[br]=Lugent Babel
+Name[bs]=Babel plugin
+Name[ca]=Connector per a Babel
+Name[cs]=Modul Babel
+Name[de]=Übersetzungsmodul
+Name[el]=Πρόσθετο Babel
+Name[eo]=Babela kromaĵo
+Name[es]=Complemento babel
+Name[et]=Tõlkeplugin
+Name[eu]=Babelen plugina
+Name[fa]=وصلۀ Babel
+Name[fi]=Babel sovelma
+Name[fr]=Module Babel
+Name[fy]=Babel-plugin
+Name[ga]=Breiseán Babel
+Name[gl]=Plugin Babel
+Name[he]=תוסף Babel
+Name[hi]=बेबेल प्लगइन
+Name[hr]=Babel dodatak
+Name[hu]=Babel bővítőmodul
+Name[is]=Babel íforrit
+Name[it]=Plugin per Babel
+Name[ja]=Babel プラグイン
+Name[ka]=Babel მოდული
+Name[kk]=Babel плагин модулі
+Name[km]=កម្មវិធី​ជំនួយ​របស់​ Babel
+Name[lt]=Babel priedas
+Name[mk]=Приклучок Babel
+Name[ms]=Plugin Babel
+Name[nb]=Babel programtillegg
+Name[nds]=Babel-Moduul
+Name[ne]=बाबेल प्लगइन
+Name[nl]=Babel-plugin
+Name[nn]=Programtillegg for Babel
+Name[pa]=ਬਬੀਲ ਪਲੱਗਇਨ
+Name[pl]=Wtyczka programu Babel
+Name[pt]='Plugin' Babel
+Name[pt_BR]=Plug-in Babel
+Name[ru]=Модуль машинного перевода
+Name[sk]=Modul Babel
+Name[sl]=Vstavek Babel
+Name[sr]=Вавилонски прикључак
+Name[sr@Latn]=Vavilonski priključak
+Name[sv]=Babel-insticksprogram
+Name[ta]=பாபேல் சொருகுப் பொருள்
+Name[tg]=Модули тарҷумакунадаи мошинӣ
+Name[tr]=Babel Eklentisi
+Name[uk]=Втулок машинного перекладу
+Name[vi]=Bổ sung Babel
+Name[zh_CN]=Babel 插件
+Name[zh_TW]=Babel外掛程式
+Comment=Babelfish plugin
+Comment[ar]=ملحق Babelfish
+Comment[az]=Babelfish əlavəsi
+Comment[bg]=Приставка за Babelfish
+Comment[br]=Lugent Babelfish
+Comment[ca]=Connector per a Babelfish
+Comment[cs]=Modul Babelfish
+Comment[cy]=Ategyn Babelfish
+Comment[da]=Babelfish-plugin
+Comment[de]=Ein Babelfish-Modul (Übersetzung)
+Comment[el]=Πρόσθετο Babelfish
+Comment[eo]=Babelfiŝo kromaĵo
+Comment[es]=Complemento babelfish
+Comment[et]=Babelfishi plugin
+Comment[eu]=Babelfishen plugina
+Comment[fa]=وصلۀ Babelfish
+Comment[fi]=Babelfish sovelma
+Comment[fo]=Babelsístingur
+Comment[fr]=Module Babelfish
+Comment[fy]=Babelfish-plugin
+Comment[ga]=Breiseán Babelfish
+Comment[gl]=Plugin de Babelfish
+Comment[he]=תוסף Babelfish
+Comment[hi]=बेबेलफिश प्लगइन
+Comment[hr]=Dodatak za Babelfish
+Comment[hu]=Babelfish-bővítőmodul
+Comment[is]=Babelfish íforrit
+Comment[it]=Plugin per Babelfish
+Comment[ja]=Babelfish プラグイン
+Comment[ka]=Babelfish მოდული
+Comment[kk]=Babelfish плагин модулі
+Comment[km]=កម្មវិធី​ជំនួយ​របស់ Babelfish
+Comment[lt]=Babelfish priedas
+Comment[mk]=Приклучок Babelfish
+Comment[ms]= Plug masuk Babelfish
+Comment[nb]=Programtillegg for Babelfish
+Comment[nds]=Babelfish-Moduul
+Comment[ne]=बाबेलफिड प्लगइन
+Comment[nl]=Babelfish-plugin
+Comment[nn]=Programtillegg for Babelfish
+Comment[pa]=ਬਬੀਲਫਿਸ਼ ਪਲੱਗਇਨ
+Comment[pl]=Wtyczka do programu Babelfish
+Comment[pt]='Plugin' do Babelfish
+Comment[pt_BR]=Plugin do Babelfish
+Comment[ro]=Modul Babelfish
+Comment[ru]=Модуль машинного интернет-перевода
+Comment[sk]=Modul Babelfish
+Comment[sl]=Vstavek za Babelfish
+Comment[sr]=Прикључак за Babelfish
+Comment[sr@Latn]=Priključak za Babelfish
+Comment[sv]=Babelfish-insticksprogram
+Comment[ta]=பேபல்பிஷ் சொருகுப்பொருள்
+Comment[tg]=Модули интернет-тарҷумаи мошинӣ
+Comment[tr]=Babelfish eklentisi
+Comment[uk]=Втулок Babelfish
+Comment[vi]=Bổ sung Babelfish
+Comment[xh]=Iplagi yangaphakathi yeBabelfish
+Comment[zh_CN]=Babelfish 插件
+Comment[zh_TW]=Babelfish 外掛程式
+Icon=babelfish
+X-KDE-ParentApp=konqueror
+DocPath=konq-plugins/babel/index.html
diff --git a/konq-plugins/babelfish/plugin_babelfish.h b/konq-plugins/babelfish/plugin_babelfish.h
new file mode 100644
index 0000000..d4e8b01
--- /dev/null
+++ b/konq-plugins/babelfish/plugin_babelfish.h
@@ -0,0 +1,52 @@
+/* This file is part of the KDE Project
+ Copyright (C) 2001 Kurt Granroth <granroth@kde.org>
+ Copyright (C) 2003 Rand2342 <rand2342@yahoo.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#ifndef __plugin_babelfish_h
+#define __plugin_babelfish_h
+
+#include <kparts/plugin.h>
+#include <klibloader.h>
+
+class KURL;
+namespace KIO { class Job; }
+
+class PluginBabelFish : public KParts::Plugin
+{
+ Q_OBJECT
+public:
+ PluginBabelFish( QObject* parent, const char* name,
+ const QStringList & );
+ virtual ~PluginBabelFish();
+
+public slots:
+ void translateURL();
+protected slots:
+ void slotStarted( KIO::Job* );
+
+private:
+ KActionMenu* m_menu;
+ KActionMenu* m_de;
+ KActionMenu* m_en;
+ KActionMenu* m_es;
+ KActionMenu* m_fr;
+ KActionMenu* m_it;
+ KActionMenu* m_nl;
+ KActionMenu* m_pt;
+};
+
+#endif
diff --git a/konq-plugins/babelfish/plugin_babelfish.rc b/konq-plugins/babelfish/plugin_babelfish.rc
new file mode 100644
index 0000000..0c1fdb4
--- /dev/null
+++ b/konq-plugins/babelfish/plugin_babelfish.rc
@@ -0,0 +1,11 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="babelfish" library="libbabelfishplugin">
+<MenuBar>
+ <Menu name="tools"><Text>&amp;Tools</Text>
+ <Action name="translatewebpage"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="extraToolBar"><text>Extra Toolbar</text>
+ <Action name="translatewebpage"/>
+</ToolBar>
+</kpartplugin>
diff --git a/konq-plugins/babelfish/translaterc b/konq-plugins/babelfish/translaterc
new file mode 100644
index 0000000..a47760d
--- /dev/null
+++ b/konq-plugins/babelfish/translaterc
@@ -0,0 +1,15 @@
+en_nl=freetranslation
+en_no=freetranslation
+en_ru=voila
+en_th=parsit
+en_zhTW=freetranslation
+es_fr=voila
+fr_it=voila
+fr_nl=voila
+fr_pt=voila
+fr_es=reverso
+it_fr=voila
+nl_en=freetranslation
+nl_fr=voila
+pt_fr=voila
+zhTW_en=tsail
diff --git a/konq-plugins/crashes/Makefile.am b/konq-plugins/crashes/Makefile.am
new file mode 100644
index 0000000..710ec6e
--- /dev/null
+++ b/konq-plugins/crashes/Makefile.am
@@ -0,0 +1,16 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = libcrashesplugin.la
+libcrashesplugin_la_SOURCES = crashesplugin.cpp
+libcrashesplugin_la_LIBADD = $(LIB_KHTML) -lkonq
+libcrashesplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+pluginsdir = $(kde_datadir)/khtml/kpartplugins
+plugins_DATA = crashesplugin.rc crashesplugin.desktop
+
+appsdir = $(kde_appsdir)/.hidden
+apps_DATA = crashesplugin.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/crashesplugin.pot
diff --git a/konq-plugins/crashes/crashesplugin.cpp b/konq-plugins/crashes/crashesplugin.cpp
new file mode 100644
index 0000000..8d01553
--- /dev/null
+++ b/konq-plugins/crashes/crashesplugin.cpp
@@ -0,0 +1,193 @@
+/*
+ Copyright (c) 2002-2003 Alexander Kellett <lypanov@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License (LGPL) as published by the Free Software Foundation;
+ either version 2 of the License, or (at your option) any later
+ version.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kdebug.h>
+#include <kaction.h>
+#include <kglobal.h>
+#include <kconfig.h>
+#include <kinstance.h>
+#include <khtml_part.h>
+#include <kgenericfactory.h>
+
+#include <krun.h>
+#include <kservice.h>
+
+#include <kpopupmenu.h>
+#include <kbookmarkimporter_crash.h>
+
+#include "crashesplugin.h"
+
+typedef KGenericFactory<CrashesPlugin> CrashesPluginFactory;
+K_EXPORT_COMPONENT_FACTORY( libcrashesplugin, CrashesPluginFactory( "crashesplugin" ) )
+
+CrashesPlugin::CrashesPlugin( QObject* parent, const char* name, const QStringList & )
+: KParts::Plugin( parent, name )
+{
+ m_part = (parent && parent->inherits( "KHTMLPart" )) ? static_cast<KHTMLPart*>(parent) : 0L;
+
+ m_pCrashesMenu = new KActionMenu( i18n("&Crashes"), "core",
+ actionCollection(), "crashes" );
+
+ m_pCrashesMenu->setDelayed( false );
+ m_pCrashesMenu->setEnabled( true );
+
+ connect( m_pCrashesMenu->popupMenu(), SIGNAL( aboutToShow() ),
+ this, SLOT( slotAboutToShow() ) );
+}
+
+CrashesPlugin::~CrashesPlugin()
+{
+}
+
+void CrashesPlugin::slotAboutToShow()
+{
+ m_pCrashesMenu->popupMenu()->clear();
+
+ KCrashBookmarkImporter importer(KCrashBookmarkImporter::crashBookmarksDir());
+
+ connect( &importer, SIGNAL( newBookmark( const QString &, const QCString &, const QString &) ),
+ SLOT( newBookmarkCallback( const QString &, const QCString &, const QString & ) ) );
+
+ connect( &importer, SIGNAL( endFolder() ), SLOT( endFolderCallback() ) );
+
+ int count = m_pCrashesMenu->popupMenu()->count();
+
+ m_crashesList.clear();
+ m_crashRangesList.clear();
+ importer.parseCrashBookmarks( false );
+
+ bool gotSep = true; // don't start with a sep
+ bool enable = true;
+ int firstItem = count; // item ids grow up from count
+ int crashGroup = INT_MAX; // group ids grow down from INT_MAX
+ if (m_crashesList.count() > 0) {
+ CrashesList::ConstIterator e = m_crashesList.begin();
+ for( ; e != m_crashesList.end(); ++e ) {
+ if ( ((*e).first == "-")
+ && ((*e).second == "-")
+ ) {
+ if (!gotSep) {
+ if (count - firstItem > 1)
+ {
+ m_crashRangesList.append( CrashRange(firstItem, count) );
+ m_pCrashesMenu->popupMenu()->insertItem(
+ i18n("All Pages of This Crash"), this,
+ SLOT(slotGroupSelected(int)),
+ 0, crashGroup--);
+ }
+ m_pCrashesMenu->popupMenu()->insertSeparator();
+ }
+ gotSep = true;
+ firstItem = ++count;
+ } else {
+ QString str = (*e).first;
+ if (str.length() > 48) {
+ str.truncate(48);
+ str.append("...");
+ }
+ m_pCrashesMenu->popupMenu()->insertItem(
+ str, this,
+ SLOT(slotItemSelected(int)),
+ 0, ++count );
+ gotSep = false;
+ }
+ }
+ if (count - firstItem > 1) {
+ m_crashRangesList.append( CrashRange(firstItem, count) );
+ m_pCrashesMenu->popupMenu()->insertItem(
+ i18n("All Pages of This Crash"), this,
+ SLOT(slotGroupSelected(int)),
+ 0, crashGroup--);
+ }
+ } else {
+ m_pCrashesMenu->popupMenu()->insertItem(
+ i18n("No Recovered Crashes"), this,
+ SLOT(slotItemSelected(int)),
+ 0, ++count );
+ gotSep = false;
+ enable = false;
+ }
+
+ if (!gotSep) {
+ // don't have an extra sep
+ m_pCrashesMenu->popupMenu()->insertSeparator();
+ }
+
+ int id =m_pCrashesMenu->popupMenu()->insertItem( i18n("&Clear List of Crashes"), this,
+ SLOT(slotClearCrashes()),
+ 0, ++count );
+ m_pCrashesMenu->popupMenu()->setItemEnabled( id, enable);
+}
+
+void CrashesPlugin::newBookmarkCallback( const QString & text, const QCString & url,
+ const QString & )
+{
+ m_crashesList.prepend(qMakePair(text,url));
+}
+
+void CrashesPlugin::endFolderCallback( )
+{
+ m_crashesList.prepend(qMakePair(QString("-"),QCString("-")));
+}
+
+void CrashesPlugin::slotClearCrashes() {
+ KCrashBookmarkImporter importer(KCrashBookmarkImporter::crashBookmarksDir());
+ importer.parseCrashBookmarks( true );
+ slotAboutToShow();
+}
+
+void CrashesPlugin::slotItemSelected( int id )
+{
+ if (m_crashesList.count() == 0)
+ return;
+ KURL url( m_crashesList[id-1].second );
+ if (m_part)
+ emit m_part->browserExtension()->openURLRequest( url );
+}
+
+void CrashesPlugin::slotGroupSelected( int range )
+{
+ if (!m_part)
+ return;
+
+ range = INT_MAX - range;
+
+ if (m_crashesList.count() == 0 || m_crashRangesList.count() == 0)
+ return;
+
+ CrashRange r = m_crashRangesList[range];
+ int from = r.first;
+ int i = from;
+
+ if (m_part) {
+ KParts::URLArgs urlargs;
+ urlargs.setNewTab( true );
+ do {
+ KURL url( m_crashesList[i].second );
+ // Open first one in current tab
+ if (i == from)
+ emit m_part->browserExtension()->openURLRequest( url );
+ else
+ emit m_part->browserExtension()->createNewWindow( url, urlargs );
+ } while (++i < r.second);
+ }
+}
+
+#include "crashesplugin.moc"
diff --git a/konq-plugins/crashes/crashesplugin.desktop b/konq-plugins/crashes/crashesplugin.desktop
new file mode 100644
index 0000000..c806383
--- /dev/null
+++ b/konq-plugins/crashes/crashesplugin.desktop
@@ -0,0 +1,124 @@
+[Desktop Entry]
+X-KDE-Library=Crashes
+X-KDE-PluginInfo-Author=Alexander Kellett
+X-KDE-PluginInfo-Email=lypanov@kde.org
+X-KDE-PluginInfo-Name=Crashes
+X-KDE-PluginInfo-Version=3.3
+X-KDE-PluginInfo-Website=
+X-KDE-PluginInfo-Category=Tools
+X-KDE-PluginInfo-Depends=
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=false
+Name=Crashes Monitor
+Name[bg]=Монитор на блокирали процеси
+Name[bs]=Praćenje krahova
+Name[ca]=Monitor de petades
+Name[cs]=Monitor pádů
+Name[da]=Sammenbrudsovervågning
+Name[de]=Absturzmonitor
+Name[el]=Επόπτης καταρρεύσεων
+Name[eo]=Kraŝa observilo
+Name[es]=Monitor de bloqueos
+Name[et]=Krahhide monitor
+Name[eu]=Kaskraduren monitorea
+Name[fa]=نمایشگر فروپاشیها
+Name[fi]=Kaatumisenvalvonta
+Name[fr]=Indicateur de plantages
+Name[fy]=Fêstrinnersmonitor
+Name[gl]=Monitor de Colgues
+Name[he]=צג התרסקויות
+Name[hi]=क्रैशेस मॉनीटर
+Name[hr]=Nadzor padova
+Name[hu]=Programhiba-figyelő
+Name[is]=Hruns-eftirlit
+Name[it]=Monitor dei crash
+Name[ja]=クラッシュモニタ
+Name[ka]=ავარიების მონიტორი
+Name[kk]=Жаңылыстарды қадағалау
+Name[km]=កម្មវិធី​ត្រួត​ពិនិត្យ​ការ​គាំង
+Name[lt]=Lūžimų stebėjimo priemonė
+Name[mk]=Набљудувач на паѓања
+Name[ms]=Monitor Rosak
+Name[nb]=Krasjovervåker
+Name[nds]=Afstörten-Kieker
+Name[ne]=क्र्यास मनिटर
+Name[nl]=Crash monitor
+Name[nn]=Krasjovervaking
+Name[pa]=ਨਸ਼ਟ ਨਿਗਰਾਨ
+Name[pl]=Monitor awarii programu
+Name[pt]=Monitor de Estoiros
+Name[pt_BR]=Monitor de Travamentos
+Name[ru]=Монитор сбоев
+Name[sk]=Monitor pádov
+Name[sl]=Nadzornik zrušenj
+Name[sr]=Надгледање падова
+Name[sr@Latn]=Nadgledanje padova
+Name[sv]=Kraschövervakare
+Name[ta]=திரை செயல் இழந்தது
+Name[tg]=Нуқсонҳои монитор
+Name[tr]=Monitörü Bozar
+Name[uk]=Монітор аварій
+Name[vi]=Bộ theo dõi sụp đổ
+Name[zh_CN]=崩溃监视器
+Name[zh_TW]=當機監視器
+Comment=Crashes monitor
+Comment[af]=Verongeluk monitor
+Comment[ar]=مراقب الإنهيارات
+Comment[az]=İflas izləyici
+Comment[bg]=Монитор на блокирали процеси в KDE
+Comment[bs]=Praćenje krahova
+Comment[ca]=Monitor de petades
+Comment[cs]=Monitor pádů
+Comment[cy]=Gwarchodydd chwalfeydd
+Comment[da]=Sammenbrudsovervåger
+Comment[de]=Absturzmonitor
+Comment[el]=Επόπτης καταρρεύσεων
+Comment[eo]=Kraŝa observilo
+Comment[es]=Monitor de bloqueos
+Comment[et]=Krahhide monitor
+Comment[eu]=Monitorea kraskarazten du
+Comment[fa]=نمایشگر فروپاشیها
+Comment[fi]=Kaatumistenvalvonta
+Comment[fr]=Gestion des plantages logiciels
+Comment[fy]=Fêstrinnersmonitor
+Comment[gl]=Monitorea os petes das aplicacións
+Comment[he]=צג התרסקויות
+Comment[hi]=क्रैश मॉनीटर
+Comment[hr]=Nadzor padova
+Comment[hu]=Programhiba-monitor
+Comment[is]=Hruns-eftirlit
+Comment[it]=Monitorizza i crash
+Comment[ja]=クラッシュモニタ
+Comment[ka]=ავარიების მონიტორი
+Comment[kk]=Жаңылыстарды қадағалау
+Comment[km]=កម្មវិធី​ត្រួត​ពិនិត្យ​ការ​គាំង
+Comment[lt]=Lūžimų stebėtojas
+Comment[mk]=Набљудувач на паѓања
+Comment[ms]=Monitor rosak
+Comment[nb]=Overvåker krasj
+Comment[nds]=Afstörten-Kieker
+Comment[ne]=मनिटर क्र्यास गर्छ
+Comment[nl]=Vastlopers-monitor
+Comment[nn]=Overvakar krasj
+Comment[pa]=ਕਰੈਂਸ਼ ਨਿਗਰਾਨ
+Comment[pl]=Monitor awarii programu
+Comment[pt]=Monitor de estoiros
+Comment[pt_BR]=Monitor de sistema
+Comment[ro]=Program de monitorizare a prăbuşirii programelor
+Comment[ru]=Монитор сбоев
+Comment[sk]=Monitor pádov
+Comment[sl]=Nadzornik zrušenj
+Comment[sr]=Надгледање падова
+Comment[sr@Latn]=Nadgledanje padova
+Comment[sv]=Övervakar programkrascher
+Comment[ta]=திரை செயல் இழந்தது
+Comment[tg]=Нуқсонҳои монитор
+Comment[tr]=Monitörü bozar
+Comment[uk]=Монітор аварій
+Comment[vi]=Bộ theo dõi sụp đổ
+Comment[xh]=Ingqubana necebo lokubonisa
+Comment[zh_CN]=崩溃监视器
+Comment[zh_TW]=當機監視器
+X-KDE-ParentApp=konqueror
+Icon=core
+DocPath=konq-plugins/crashes/index.html
diff --git a/konq-plugins/crashes/crashesplugin.h b/konq-plugins/crashes/crashesplugin.h
new file mode 100644
index 0000000..cff0831
--- /dev/null
+++ b/konq-plugins/crashes/crashesplugin.h
@@ -0,0 +1,70 @@
+/*
+ Copyright (c) 2002-2003 Alexander Kellett <lypanov@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License (LGPL) as published by the Free Software Foundation;
+ either version 2 of the License, or (at your option) any later
+ version.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef __CRASHES_PLUGIN_H
+#define __CRASHES_PLUGIN_H
+
+#include <qmap.h>
+#include <qvaluelist.h>
+#include <qstringlist.h>
+
+#include <kurl.h>
+#include <klibloader.h>
+#include <kparts/plugin.h>
+
+class KHTMLPart;
+class KActionMenu;
+
+class CrashesPlugin : public KParts::Plugin
+{
+ Q_OBJECT
+
+public:
+ CrashesPlugin( QObject* parent, const char* name,
+ const QStringList & );
+ ~CrashesPlugin();
+
+protected slots:
+ void slotAboutToShow();
+ void slotClearCrashes();
+ void slotItemSelected(int);
+ void slotGroupSelected(int);
+ void newBookmarkCallback( const QString &, const QCString &, const QString & );
+ void endFolderCallback( );
+
+private:
+ int m_selectedItem;
+
+ KHTMLPart* m_part;
+ KActionMenu* m_pCrashesMenu;
+
+ typedef QPair<QString,QCString> Crash;
+ typedef QValueList<Crash> CrashesList;
+
+ CrashesList m_crashesList;
+
+ typedef QPair<int, int> CrashRange;
+ typedef QValueList<CrashRange> CrashRangesList;
+
+ CrashRangesList m_crashRangesList;
+
+};
+
+#endif
diff --git a/konq-plugins/crashes/crashesplugin.rc b/konq-plugins/crashes/crashesplugin.rc
new file mode 100644
index 0000000..35fc070
--- /dev/null
+++ b/konq-plugins/crashes/crashesplugin.rc
@@ -0,0 +1,11 @@
+<!DOCTYPE kpartplugin>
+<kpartplugin name="Crashes" library="libcrashesplugin">
+<MenuBar>
+ <Menu name="tools"><Text>&amp;Tools</Text>
+ <Action name="crashes"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="extraToolBar"><text>Extra Toolbar</text>
+ <Action name="crashes"/>
+</ToolBar>
+</kpartplugin>
diff --git a/konq-plugins/dirfilter/Makefile.am b/konq-plugins/dirfilter/Makefile.am
new file mode 100644
index 0000000..fe81189
--- /dev/null
+++ b/konq-plugins/dirfilter/Makefile.am
@@ -0,0 +1,19 @@
+kde_module_LTLIBRARIES = libdirfilterplugin.la
+
+AM_CPPFLAGS = $(all_includes)
+METASOURCES = AUTO
+
+libdirfilterplugin_la_SOURCES = dirfilterplugin.cpp
+libdirfilterplugin_la_LIBADD = -lkonq
+libdirfilterplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+iconviewdir = $(kde_datadir)/konqiconview/kpartplugins
+iconview_DATA = dirfilterplugin.rc dirfilterplugin.desktop
+listviewdir = $(kde_datadir)/konqlistview/kpartplugins
+listview_DATA = dirfilterplugin.rc dirfilterplugin.desktop
+
+appsdir = $(kde_appsdir)/.hidden
+apps_DATA = dirfilterplugin.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/dirfilterplugin.pot
diff --git a/konq-plugins/dirfilter/dirfilterplugin.cpp b/konq-plugins/dirfilter/dirfilterplugin.cpp
new file mode 100644
index 0000000..0966f19
--- /dev/null
+++ b/konq-plugins/dirfilter/dirfilterplugin.cpp
@@ -0,0 +1,492 @@
+/*
+ Copyright (C) 2000, 2001, 2002 Dawit Alemayehu <adawit@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <unistd.h>
+#include <sys/types.h>
+
+#include <qtimer.h>
+#include <qapplication.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qhbox.h>
+#include <qwhatsthis.h>
+#include <qiconview.h>
+#include <klistview.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kinstance.h>
+
+#include <kaction.h>
+#include <kpopupmenu.h>
+#include <kmessagebox.h>
+#include <kiconloader.h>
+
+#include <kdirlister.h>
+#include <klistviewsearchline.h>
+#include <kiconviewsearchline.h>
+#include <konq_dirpart.h>
+#include <konq_propsview.h>
+#include <kstaticdeleter.h>
+#include <kgenericfactory.h>
+#include <kparts/browserextension.h>
+
+#include "dirfilterplugin.h"
+
+SessionManager* SessionManager::m_self = 0;
+static KStaticDeleter<SessionManager> dirfiltersd;
+
+SessionManager *SessionManager::self ()
+{
+ if (!m_self)
+ m_self = dirfiltersd.setObject(m_self, new SessionManager);
+
+ return m_self;
+}
+
+SessionManager::SessionManager()
+{
+ m_bSettingsLoaded = false;
+ loadSettings ();
+}
+
+SessionManager::~SessionManager()
+{
+ saveSettings();
+ m_self = 0;
+}
+
+QString SessionManager::generateKey (const KURL& url) const
+{
+ QString key;
+
+ key = url.protocol ();
+ key += ':';
+
+ if (!url.host ().isEmpty ())
+ {
+ key += url.host ();
+ key += ':';
+ }
+
+ key += url.path ();
+ key += ':';
+ key += QString::number (m_pid);
+
+ return key;
+}
+
+QStringList SessionManager::restoreMimeFilters (const KURL& url) const
+{
+ QString key(generateKey(url));
+ return m_filters[key];
+}
+
+QString SessionManager::restoreTypedFilter (const KURL& url) const
+{
+ QString key(generateKey(url));
+ return m_typedFilter[key];
+}
+
+void SessionManager::save (const KURL& url, const QStringList& filters)
+{
+ QString key = generateKey(url);
+ m_filters[key] = filters;
+}
+
+void SessionManager::save (const KURL& url, const QString& typedFilter)
+{
+ QString key = generateKey(url);
+ m_typedFilter[key] = typedFilter;
+}
+
+void SessionManager::saveSettings()
+{
+ KConfig cfg ("dirfilterrc", false, false);
+ cfg.setGroup ("General");
+
+ cfg.writeEntry ("ShowCount", showCount);
+ cfg.writeEntry ("UseMultipleFilters", useMultipleFilters);
+ cfg.sync();
+}
+
+void SessionManager::loadSettings()
+{
+ if (m_bSettingsLoaded)
+ return;
+
+ KConfig cfg ("dirfilterrc", false, false);
+ cfg.setGroup ("General");
+
+ showCount = cfg.readBoolEntry ("ShowCount", false);
+ useMultipleFilters = cfg.readBoolEntry ("UseMultipleFilters", true);
+ m_pid = getpid ();
+ m_bSettingsLoaded = true;
+}
+
+
+
+DirFilterPlugin::DirFilterPlugin (QObject* parent, const char* name,
+ const QStringList&)
+ :KParts::Plugin (parent, name),
+ m_pFilterMenu(0),
+ m_searchWidget(0)
+{
+ m_part = ::qt_cast<KonqDirPart*>(parent);
+
+ if ( !m_part || !m_part->scrollWidget() )
+ return;
+
+ m_pFilterMenu = new KActionMenu (i18n("View F&ilter"), "filter",
+ actionCollection(), "filterdir");
+ m_pFilterMenu->setDelayed (false);
+ m_pFilterMenu->setWhatsThis(i18n("Allow to filter the currently displayed items by filetype."));
+
+ connect (m_pFilterMenu->popupMenu(), SIGNAL (aboutToShow()),
+ SLOT (slotShowPopup()));
+
+ connect (m_part, SIGNAL (itemRemoved(const KFileItem*)),
+ SLOT( slotItemRemoved (const KFileItem*)));
+ connect (m_part, SIGNAL (itemsAdded(const KFileItemList&)),
+ SLOT (slotItemsAdded(const KFileItemList&)));
+ connect (m_part, SIGNAL (itemsFilteredByMime(const KFileItemList&)),
+ SLOT (slotItemsAdded(const KFileItemList&)));
+ connect (m_part, SIGNAL(aboutToOpenURL()), SLOT(slotOpenURL()));
+
+ // add a searchline filter for konqis icons/list views
+ QHBox *hbox = new QHBox(m_part->widget());
+ hbox->hide();
+
+ KAction *clear = new KAction(i18n("Clear Filter Field"),
+ QApplication::reverseLayout() ? "clear_left" : "locationbar_erase",
+ 0, 0, 0, actionCollection(), "clear_filter");
+
+ clear->setWhatsThis(i18n("Clear filter field<p>Clears the content of the filter field."));
+
+ if ( ::qt_cast<KListView*>(m_part->scrollWidget()) )
+ {
+ m_searchWidget = new KListViewSearchLine(hbox);
+ static_cast<KListViewSearchLine*>(m_searchWidget)->setListView(static_cast<KListView*>(m_part->scrollWidget()));
+ }
+ else if ( ::qt_cast<QIconView*>(m_part->scrollWidget()) )
+ {
+ m_searchWidget = new KIconViewSearchLine(hbox);
+ static_cast<KIconViewSearchLine*>(m_searchWidget)->setIconView(static_cast<QIconView*>(m_part->scrollWidget()));
+ }
+
+
+ if ( m_searchWidget )
+ {
+ QWhatsThis::add(m_searchWidget, i18n("Enter here a text which an item in the view must contain anywhere to be shown."));
+ connect(clear, SIGNAL(activated()), m_searchWidget, SLOT(clear()));
+ }
+
+ KWidgetAction *filterAction = new KWidgetAction(hbox, i18n("Filter Field"),
+ 0, 0, 0, actionCollection(), "toolbar_filter_field");
+ filterAction->setShortcutConfigurable(false);
+}
+
+DirFilterPlugin::~DirFilterPlugin()
+{
+ delete m_pFilterMenu;
+}
+
+void DirFilterPlugin::slotOpenURL ()
+{
+ KURL url = m_part->url();
+
+ //kdDebug(90190) << "DirFilterPlugin: New URL : " << url.url() << endl;
+ //kdDebug(90190) << "DirFilterPlugin: Current URL: " << m_pURL.url() << endl;
+
+ if (m_pURL != url)
+ {
+ //Clears the hidden list which is by now outdated...
+ if (m_searchWidget)
+ {
+ SessionManager::self()->save(m_pURL, m_searchWidget->text());
+ m_searchWidget->clear();
+
+ QString typedFilter(SessionManager::self()->restoreTypedFilter(url));
+ m_searchWidget->completionObject()->addItem(typedFilter);
+ m_searchWidget->setText(typedFilter);
+ }
+
+ m_pURL = url;
+ m_pMimeInfo.clear();
+ m_part->setMimeFilter (SessionManager::self()->restoreMimeFilters(url));
+ }
+}
+
+void DirFilterPlugin::slotShowPopup()
+{
+ if (!m_part)
+ {
+ m_pFilterMenu->setEnabled (false);
+ return;
+ }
+
+ int id = 0;
+ uint enableReset = 0;
+
+ QString label;
+ QStringList inodes;
+
+ m_pFilterMenu->popupMenu()->clear();
+ m_pFilterMenu->popupMenu()->insertTitle (i18n("Only Show Items of Type"));
+
+ MimeInfoIterator it = m_pMimeInfo.begin();
+ const MimeInfoIterator end = m_pMimeInfo.end();
+ for (; it != end ; ++it)
+ {
+ if (it.key().startsWith("inode"))
+ {
+ inodes << it.key();
+ continue;
+ }
+
+ if (!SessionManager::self()->showCount)
+ label = it.data().mimeComment;
+ else
+ {
+ label = it.data().mimeComment;
+ label += " (";
+ label += QString::number (it.data().filenames.size ());
+ label += ")";
+ }
+
+ m_pMimeInfo[it.key()].id = m_pFilterMenu->popupMenu()->insertItem (
+ SmallIconSet(it.data().iconName), label,
+ this, SLOT(slotItemSelected(int)), 0, ++id);
+
+ if (it.data().useAsFilter)
+ {
+ m_pFilterMenu->popupMenu()->setItemChecked (id, true);
+ enableReset++;
+ }
+ }
+
+ // Add all the items that have mime-type of "inode/*" here...
+ if (!inodes.isEmpty())
+ {
+ m_pFilterMenu->popupMenu()->insertSeparator ();
+
+ QStringList::Iterator it = inodes.begin();
+ QStringList::Iterator end = inodes.end();
+
+ for (; it != end; ++it)
+ {
+ if (!SessionManager::self()->showCount)
+ label = m_pMimeInfo[(*it)].mimeComment;
+ else
+ {
+ label = m_pMimeInfo[(*it)].mimeComment;
+ label += " (";
+ label += QString::number (m_pMimeInfo[(*it)].filenames.size ());
+ label += ")";
+ }
+
+ m_pMimeInfo[(*it)].id = m_pFilterMenu->popupMenu()->insertItem (
+ SmallIconSet(m_pMimeInfo[(*it)].iconName), label,
+ this, SLOT(slotItemSelected(int)), 0, ++id);
+
+ if (m_pMimeInfo[(*it)].useAsFilter)
+ {
+ m_pFilterMenu->popupMenu()->setItemChecked (id, true);
+ enableReset ++;
+ }
+ }
+ }
+
+ m_pFilterMenu->popupMenu()->insertSeparator ();
+ id = m_pFilterMenu->popupMenu()->insertItem (i18n("Use Multiple Filters"),
+ this, SLOT(slotMultipleFilters()));
+ m_pFilterMenu->popupMenu()->setItemEnabled (id, enableReset <= 1);
+ m_pFilterMenu->popupMenu()->setItemChecked (id, SessionManager::self()->useMultipleFilters);
+
+ id = m_pFilterMenu->popupMenu()->insertItem (i18n("Show Count"), this,
+ SLOT(slotShowCount()));
+ m_pFilterMenu->popupMenu()->setItemChecked (id, SessionManager::self()->showCount);
+
+ id = m_pFilterMenu->popupMenu()->insertItem (i18n("Reset"), this,
+ SLOT(slotReset()));
+
+ m_pFilterMenu->popupMenu()->setItemEnabled (id, enableReset);
+}
+
+void DirFilterPlugin::slotItemSelected (int id)
+{
+ if (!m_part)
+ return;
+
+ MimeInfoIterator it = m_pMimeInfo.begin();
+ while (it != m_pMimeInfo.end () && id != it.data().id)
+ it++;
+
+ if (it != m_pMimeInfo.end())
+ {
+ QStringList filters;
+
+ if (it.data().useAsFilter)
+ {
+ it.data().useAsFilter = false;
+ filters = m_part->mimeFilter ();
+ if (filters.remove (it.key()))
+ m_part->setMimeFilter (filters);
+ }
+ else
+ {
+ m_pMimeInfo[it.key()].useAsFilter = true;
+
+ if (SessionManager::self()->useMultipleFilters)
+ {
+ filters = m_part->mimeFilter ();
+ filters << it.key();
+ }
+ else
+ {
+ filters << it.key();
+
+ MimeInfoIterator item = m_pMimeInfo.begin();
+ while ( item != m_pMimeInfo.end() )
+ {
+ if ( item != it )
+ item.data().useAsFilter = false;
+ item++;
+ }
+ }
+
+ m_part->setMimeFilter (filters);
+ }
+
+ KURL url = m_part->url();
+ m_part->openURL (url);
+ SessionManager::self()->save (url, filters);
+ }
+}
+
+void DirFilterPlugin::slotItemsAdded (const KFileItemList& list)
+{
+ KURL url = m_part->url();
+
+ if (list.count() == 0 || !m_part || !m_part->nameFilter().isEmpty())
+ {
+ m_pFilterMenu->setEnabled (m_part->nameFilter().isEmpty());
+ return;
+ }
+
+ // Make sure the filter menu is enabled once a named
+ // filter is removed.
+ if (!m_pFilterMenu->isEnabled())
+ m_pFilterMenu->setEnabled (true);
+
+ for (KFileItemListIterator it (list); it.current (); ++it)
+ {
+ QString name = it.current()->name();
+ KMimeType::Ptr mime = it.current()->mimeTypePtr(); // don't resolve mimetype if unknown
+ if (!mime)
+ continue;
+ QString mimeType = mime->name();
+
+ if (!m_pMimeInfo.contains (mimeType))
+ {
+ MimeInfo& mimeInfo = m_pMimeInfo[mimeType];
+ QStringList filters = m_part->mimeFilter ();
+ mimeInfo.useAsFilter = (!filters.isEmpty () &&
+ filters.contains (mimeType));
+ mimeInfo.mimeComment = mime->comment();
+ mimeInfo.iconName = mime->icon(KURL(), false);
+ mimeInfo.filenames.insert(name, false);
+ }
+ else
+ {
+ m_pMimeInfo[mimeType].filenames.insert(name, false);
+ }
+ }
+}
+
+void DirFilterPlugin::slotItemRemoved (const KFileItem* item)
+{
+ if (!item || !m_part)
+ return;
+
+ QString mimeType = item->mimetype().stripWhiteSpace();
+
+ if (m_pMimeInfo.contains (mimeType))
+ {
+ MimeInfo info = m_pMimeInfo [mimeType];
+
+ if (info.filenames.size () > 1)
+ m_pMimeInfo [mimeType].filenames.remove (item->name ());
+ else
+ {
+ if (info.useAsFilter)
+ {
+ QStringList filters = m_part->mimeFilter ();
+ filters.remove (mimeType);
+ m_part->setMimeFilter (filters);
+ SessionManager::self()->save (m_part->url(), filters);
+ QTimer::singleShot( 0, this, SLOT(slotTimeout()) );
+ }
+ m_pMimeInfo.remove (mimeType);
+ }
+ }
+}
+
+void DirFilterPlugin::slotReset()
+{
+ if (!m_part)
+ return;
+
+ MimeInfoIterator it = m_pMimeInfo.begin();
+ for (; it != m_pMimeInfo.end(); ++it)
+ it.data().useAsFilter = false;
+
+ QStringList filters;
+ KURL url = m_part->url();
+
+ m_part->setMimeFilter (filters);
+ SessionManager::self()->save (url, filters);
+ m_part->openURL (url);
+}
+
+void DirFilterPlugin::slotShowCount()
+{
+ if (SessionManager::self()->showCount)
+ SessionManager::self()->showCount = false;
+ else
+ SessionManager::self()->showCount = true;
+}
+
+void DirFilterPlugin::slotMultipleFilters()
+{
+ if (SessionManager::self()->useMultipleFilters)
+ SessionManager::self()->useMultipleFilters = false;
+ else
+ SessionManager::self()->useMultipleFilters = true;
+}
+
+void DirFilterPlugin::slotTimeout()
+{
+ if (m_part)
+ m_part->openURL (m_part->url());
+}
+
+typedef KGenericFactory<DirFilterPlugin> DirFilterFactory;
+K_EXPORT_COMPONENT_FACTORY (libdirfilterplugin, DirFilterFactory("dirfilterplugin"))
+
+#include "dirfilterplugin.moc"
diff --git a/konq-plugins/dirfilter/dirfilterplugin.desktop b/konq-plugins/dirfilter/dirfilterplugin.desktop
new file mode 100644
index 0000000..31dfcf0
--- /dev/null
+++ b/konq-plugins/dirfilter/dirfilterplugin.desktop
@@ -0,0 +1,125 @@
+[Desktop Entry]
+Type=Service
+X-KDE-PluginInfo-Author=Dawit Alemayehu,Martin Koller
+X-KDE-PluginInfo-Email=adawit@kde.org,m.koller@surfeu.at
+X-KDE-PluginInfo-Name=DirFilter
+X-KDE-PluginInfo-Version=3.4
+X-KDE-PluginInfo-Website=
+X-KDE-PluginInfo-Category=Tools
+X-KDE-PluginInfo-Depends=
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=true
+Name=Directory Filter Plugin
+Name[bg]=Приставка за филтриране на директории
+Name[br]=Lugent sil ar renkelloù
+Name[bs]=Plugin za filtriranje direktorija
+Name[ca]=Connector filtre del directori
+Name[cs]=Modul pro filtrování adresářů
+Name[da]=Mappefilter-plugin
+Name[de]=Ordnerfilter-Modul
+Name[el]=Πρόσθετο φίλτρου καταλόγων
+Name[eo]=Dosierujfiltrila kromaĵo
+Name[es]=Complemento de filtrado de carpetas
+Name[et]=Kataloogifiltri plugin
+Name[eu]=Direktorioen iragazki plugina
+Name[fa]=وصلۀ پالایۀ فهرست راهنما
+Name[fi]=Hakemistosuodinsovelma
+Name[fr]=Module de filtrage de dossiers
+Name[fy]=Mappenfilterplugin
+Name[gl]=Plugin de Filtraxe de Cartafoles
+Name[he]=תוסף מסנן ספריות
+Name[hi]=डिरेक्ट्री फ़िल्टर प्लगइन
+Name[hr]=Dodatak filtra mapa
+Name[hu]=Könyvtárszűrő bővítőmodul
+Name[is]=Íforrit sem síar möppur
+Name[it]=Plugin per il filtro delle directory
+Name[ja]=ディレクトリ フィルタ プラグイン
+Name[ka]=დირექტორიის ფილტრის მოდული
+Name[kk]=Каталог сүзгісі
+Name[km]=កម្មវិធី​ជំនួយ​តម្រង​ថត
+Name[lt]=Aplanko filtro priedas
+Name[mk]=Приклучок за филтирање папки
+Name[ms]=Plugin Penapis Direktori
+Name[nb]=Programtillegg til mappefilter
+Name[nds]=Ornerfilter-Moduul
+Name[ne]=डाइरेक्टरी फिल्टर प्लगइन
+Name[nl]=Mappenfilterplugin
+Name[nn]=Progamtillegg for katalogfilter
+Name[pa]=ਡਾਇਰੈਕਟਰੀ ਫਿਲਟਰ ਪਲੱਗਇਨ
+Name[pl]=Wtyczka filtrowania katalogów
+Name[pt]='Plugin' de Filtragem de Directorias
+Name[pt_BR]=Pasta do Plug-in de Filtro
+Name[ru]=Фильтр папок
+Name[sk]=Modul adresárového filtra
+Name[sl]=Vstavek za filtriranje imenikov
+Name[sr]=Прикључак за филтрирање директоријума
+Name[sr@Latn]=Priključak za filtriranje direktorijuma
+Name[sv]=Insticksprogram för katalogfilter
+Name[ta]=அகராதி வடிகட்டி சொருகுப் பொருள்
+Name[tg]=Филтри каталогҳо
+Name[tr]=Dizin Filtre Eklentisi
+Name[uk]=Втулок фільтра каталогів
+Name[vi]=Bổ sung lọc thư mục
+Name[zh_CN]=目录过滤器插件
+Name[zh_TW]=目錄過濾器外掛程式
+Comment=Directory filter plugin
+Comment[af]=Gids filter inplak
+Comment[ar]=ملحق تنقية المجلدات
+Comment[az]=Qovluq filtr əlavəsi
+Comment[bg]=Приставка за филтриране на директории
+Comment[br]=Lugent sil ar renkelloù
+Comment[bs]=Plugin za filtriranje direktorija
+Comment[ca]=Connector filtre del directori
+Comment[cs]=Modul pro filtrování adresářů
+Comment[cy]=Ategyn hidl cyfeiriadur
+Comment[da]=Mappefilter-plugin
+Comment[de]=Ein Modul zum Filtern von Ordnerinhalten
+Comment[el]=Πρόσθετο φίλτρου καταλόγου
+Comment[eo]=Dosierujfiltrila kromaĵo
+Comment[es]=Complemento de filtrado de carpetas
+Comment[et]=Kataloogifiltri plugin
+Comment[eu]=Direktorioen iragazki plugina
+Comment[fa]=وصلۀ پالایۀ فهرست راهنما
+Comment[fi]=Hakemistosuodinsovelma
+Comment[fr]=Module de filtrage de dossiers
+Comment[fy]=Mappenfilterplugin
+Comment[gl]=Plugin de filtraxe de cartafoles
+Comment[he]=תוסף מסנן ספריות
+Comment[hi]=डिरेक्ट्री फ़िल्टर प्लगइन
+Comment[hr]=Dodatak filtra mapa
+Comment[hu]=Könyvtárszűrő modul
+Comment[is]=Íforrit sem síar möppur
+Comment[it]=Plugin per il filtro delle directory
+Comment[ja]=ディレクトリフィルタプラグイン
+Comment[ka]=დირექტორიის ფილტრის მოდული
+Comment[kk]=Каталог сүзгі плагин модулі
+Comment[km]=កម្មវិធី​ជំនួយ​តម្រង​ថត
+Comment[lt]=Aplanko filtro priedas
+Comment[mk]=Приклучок за филтирање папки
+Comment[nb]=Programtillegg til mappefilter
+Comment[nds]=Ornerfilter-Moduul
+Comment[ne]=डाइरेक्टरी फिल्टर प्लगइन
+Comment[nl]=Mappenfilterplugin
+Comment[nn]=Progamtillegg for katalogfilter
+Comment[pa]=ਡਾਇਰੈਕਟਰੀ ਫਿਲਟਰ ਪਲੱਗਇਨ
+Comment[pl]=Wtyczka filtrowania katalogów
+Comment[pt]='Plugin' de filtragem de directorias
+Comment[pt_BR]=Pasta de plug-in de filtragem
+Comment[ro]=Modul de filtrare a directoarelor de afişat
+Comment[ru]=Модуль фильтра папок
+Comment[sk]=Modul adresárového filtra
+Comment[sl]=Vstavek za filtriranje imenikov
+Comment[sr]=Прикључак за филтрирање директоријума
+Comment[sr@Latn]=Priključak za filtriranje direktorijuma
+Comment[sv]=Insticksprogram för katalogfilter
+Comment[ta]= அகராதி வடிகட்டி சொருகுப்பொருள்
+Comment[tg]=Модули филтри каталогҳо
+Comment[tr]=Dizin filtre eklentisi
+Comment[uk]=Втулок фільтра каталогів
+Comment[vi]=Bổ sung lọc thư mục
+Comment[xh]=Isilawulo secebo lokucoca ulwelo seplagi yangaphakathi
+Comment[zh_CN]=目录过滤器插件
+Comment[zh_TW]=目錄過濾器外掛程式
+Icon=filter
+X-KDE-ParentApp=konqueror
+DocPath=konq-plugins/dirfilter/index.html
diff --git a/konq-plugins/dirfilter/dirfilterplugin.h b/konq-plugins/dirfilter/dirfilterplugin.h
new file mode 100644
index 0000000..f1c5b44
--- /dev/null
+++ b/konq-plugins/dirfilter/dirfilterplugin.h
@@ -0,0 +1,132 @@
+/*
+ Copyright (C) 2000, 2001, 2002 Dawit Alemayehu <adawit@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef __DIR_FILTER_PLUGIN_H
+#define __DIR_FILTER_PLUGIN_H
+
+#include <qmap.h>
+#include <qstringlist.h>
+
+
+#include <kurl.h>
+#include <kfileitem.h>
+#include <klibloader.h>
+#include <kparts/plugin.h>
+
+class KActionMenu;
+class KonqDirPart;
+class KLineEdit;
+
+
+namespace KParts
+{
+ struct URLArgs;
+}
+
+namespace KIO
+{
+ class Job;
+}
+
+class SessionManager
+{
+public:
+
+ ~SessionManager ();
+ static SessionManager* self ();
+ QStringList restoreMimeFilters (const KURL& url) const;
+ QString restoreTypedFilter(const KURL& url) const;
+ void save (const KURL& url, const QStringList& filters);
+ void save (const KURL& url, const QString& typedFilter);
+
+ bool showCount;
+ bool useMultipleFilters;
+
+protected:
+
+ QString generateKey (const KURL& url) const;
+ void loadSettings ();
+ void saveSettings ();
+
+private:
+
+ SessionManager ();
+
+private:
+
+ int m_pid;
+ bool m_bSettingsLoaded;
+ static SessionManager* m_self;
+ QMap<QString,QStringList> m_filters;
+ QMap<QString,QString> m_typedFilter;
+};
+
+
+class DirFilterPlugin : public KParts::Plugin
+{
+ Q_OBJECT
+
+public:
+
+ DirFilterPlugin (QObject* parent, const char* name, const QStringList &);
+ ~DirFilterPlugin ();
+
+protected:
+
+ struct MimeInfo
+ {
+ MimeInfo()
+ {
+ id = 0;
+ useAsFilter = false;
+ }
+
+ int id;
+ bool useAsFilter;
+
+ QString mimeType;
+ QString iconName;
+ QString mimeComment;
+
+ QMap<QString, bool> filenames;
+ };
+
+ void loadSettings();
+ void saveSettings();
+
+private slots:
+ void slotReset();
+ void slotTimeout();
+ void slotOpenURL();
+ void slotShowPopup();
+ void slotShowCount();
+ void slotMultipleFilters();
+ void slotItemSelected(int);
+ void slotItemRemoved(const KFileItem *);
+ void slotItemsAdded(const KFileItemList &);
+
+private:
+ KURL m_pURL;
+ KonqDirPart* m_part;
+ KActionMenu* m_pFilterMenu;
+
+ KLineEdit *m_searchWidget;
+ QMap<QString,MimeInfo> m_pMimeInfo;
+ typedef QMap<QString,MimeInfo>::Iterator MimeInfoIterator;
+};
+#endif
diff --git a/konq-plugins/dirfilter/dirfilterplugin.rc b/konq-plugins/dirfilter/dirfilterplugin.rc
new file mode 100644
index 0000000..80f60eb
--- /dev/null
+++ b/konq-plugins/dirfilter/dirfilterplugin.rc
@@ -0,0 +1,13 @@
+<!DOCTYPE kpartplugin>
+<kpartplugin name="DirFilter" library="libdirfilterplugin" version = "4">
+<MenuBar>
+ <Menu name="tools"><Text>&amp;Tools</Text>
+ <Action name="filterdir"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="extraToolBar"><text>Extra Toolbar</text>
+ <Action name="filterdir"/>
+</ToolBar>
+<ToolBar fullWidth="true" name="locationToolBar" newline="true"><text>Filter Toolbar</text>
+</ToolBar>
+</kpartplugin>
diff --git a/konq-plugins/domtreeviewer/Makefile.am b/konq-plugins/domtreeviewer/Makefile.am
new file mode 100644
index 0000000..3dcfcc9
--- /dev/null
+++ b/konq-plugins/domtreeviewer/Makefile.am
@@ -0,0 +1,44 @@
+INCLUDES = $(all_includes)
+
+# Needed to catch DOM exceptions
+KDE_CXXFLAGS = $(USE_EXCEPTIONS)
+# -DKListView=DOMListView
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = libdomtreeviewerplugin.la
+
+libdomtreeviewerplugin_la_SOURCES = plugin_domtreeviewer.cpp \
+ domtreeview.cpp \
+ domlistviewitem.cpp \
+ domtreewindow.cpp \
+ domtreecommands.cpp \
+ signalreceiver.cpp \
+ domtreeviewbase.ui \
+ attributeeditdialog.ui \
+ elementeditdialog.ui \
+ texteditdialog.ui \
+ messagedialog.ui
+# klistview.cpp \
+#
+libdomtreeviewerplugin_la_LIBADD = $(LIB_KPARTS) $(LIB_KHTML)
+libdomtreeviewerplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+pluginsdir = $(kde_datadir)/khtml/kpartplugins
+plugins_DATA = plugin_domtreeviewer.rc plugin_domtreeviewer.desktop
+
+appsdir = $(kde_appsdir)/.hidden
+apps_DATA = plugin_domtreeviewer.desktop
+
+install-data-local: $(srcdir)/../uninstall.desktop
+ $(mkinstalldirs) $(DESTDIR)$(pluginsdir)
+ $(INSTALL_DATA) $(srcdir)/../uninstall.desktop $(DESTDIR)$(pluginsdir)/domtreeviewerplugin.desktop
+
+METASOURCES = AUTO
+KDE_ICON = domtreeviewer
+
+pluginsdatadir = $(kde_datadir)/domtreeviewer
+pluginsdata_DATA = domtreeviewerui.rc
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/domtreeviewer.pot
+
diff --git a/konq-plugins/domtreeviewer/attributeeditdialog.ui b/konq-plugins/domtreeviewer/attributeeditdialog.ui
new file mode 100644
index 0000000..c77f92d
--- /dev/null
+++ b/konq-plugins/domtreeviewer/attributeeditdialog.ui
@@ -0,0 +1,174 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>AttributeEditDialog</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>AttributeEditDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>412</width>
+ <height>254</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Edit Attribute</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Attribute &amp;name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>attrName</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>attrName</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Attribute &amp;value:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>attrValue</cstring>
+ </property>
+ </widget>
+ <widget class="KTextEdit">
+ <property name="name">
+ <cstring>attrValue</cstring>
+ </property>
+ <property name="acceptDrops">
+ <bool>true</bool>
+ </property>
+ <property name="textFormat">
+ <enum>PlainText</enum>
+ </property>
+ <property name="tabChangesFocus">
+ <bool>true</bool>
+ </property>
+ <property name="autoFormatting">
+ <set>AutoNone</set>
+ </property>
+ </widget>
+ <widget class="Line">
+ <property name="name">
+ <cstring>line1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okBtn</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="flat">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>121</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelBtn</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>okBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>AttributeEditDialog</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>cancelBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>AttributeEditDialog</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>attrValue</sender>
+ <signal>returnPressed()</signal>
+ <receiver>AttributeEditDialog</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>attrName</sender>
+ <signal>returnPressed()</signal>
+ <receiver>AttributeEditDialog</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klineedit.h</includehint>
+ <includehint>ktextedit.h</includehint>
+</includehints>
+</UI>
diff --git a/konq-plugins/domtreeviewer/cr16-action-domtreeviewer.png b/konq-plugins/domtreeviewer/cr16-action-domtreeviewer.png
new file mode 100644
index 0000000..d9c99cb
--- /dev/null
+++ b/konq-plugins/domtreeviewer/cr16-action-domtreeviewer.png
Binary files differ
diff --git a/konq-plugins/domtreeviewer/cr22-action-domtreeviewer.png b/konq-plugins/domtreeviewer/cr22-action-domtreeviewer.png
new file mode 100644
index 0000000..0690b3d
--- /dev/null
+++ b/konq-plugins/domtreeviewer/cr22-action-domtreeviewer.png
Binary files differ
diff --git a/konq-plugins/domtreeviewer/domlistviewitem.cpp b/konq-plugins/domtreeviewer/domlistviewitem.cpp
new file mode 100644
index 0000000..c24df96
--- /dev/null
+++ b/konq-plugins/domtreeviewer/domlistviewitem.cpp
@@ -0,0 +1,73 @@
+/***************************************************************************
+ domlistviewitem.cpp
+ -------------------
+
+ author : Andreas Schlapbach
+ email : schlpbch@iam.unibe.ch
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "domlistviewitem.h"
+
+#include <qpainter.h>
+#include <qlistview.h>
+#include <qapplication.h>
+
+#include <kglobalsettings.h>
+
+DOMListViewItem::DOMListViewItem( const DOM::Node &node, QListView *parent )
+ : QListViewItem( parent ), m_node(node)
+{
+ init();
+}
+
+DOMListViewItem::DOMListViewItem( const DOM::Node &node, QListView *parent, QListViewItem *after)
+ : QListViewItem( parent, after ), m_node(node)
+{
+ init();
+}
+
+DOMListViewItem::DOMListViewItem( const DOM::Node &node, QListViewItem *parent )
+ : QListViewItem( parent ), m_node(node)
+{
+ init();
+}
+
+DOMListViewItem::DOMListViewItem( const DOM::Node &node, QListViewItem *parent, QListViewItem *after)
+ : QListViewItem( parent, after ), m_node(node)
+{
+ init();
+}
+
+DOMListViewItem::~DOMListViewItem()
+{
+ //NOP
+}
+
+void DOMListViewItem::init()
+{
+ m_color = QApplication::palette().color( QPalette::Active, QColorGroup::Text );
+ m_font = KGlobalSettings::generalFont();
+ clos = false;
+}
+
+void DOMListViewItem::paintCell( QPainter *p, const QColorGroup &cg, int column, int width, int alignment )
+{
+ QColorGroup _cg( cg );
+ QColor c = _cg.text();
+
+ p->setFont(m_font);
+ _cg.setColor( QColorGroup::Text, m_color );
+ QListViewItem::paintCell( p, _cg, column, width, alignment );
+ _cg.setColor( QColorGroup::Text, c );
+}
+
+
diff --git a/konq-plugins/domtreeviewer/domlistviewitem.h b/konq-plugins/domtreeviewer/domlistviewitem.h
new file mode 100644
index 0000000..22f34b2
--- /dev/null
+++ b/konq-plugins/domtreeviewer/domlistviewitem.h
@@ -0,0 +1,57 @@
+/***************************************************************************
+ domlistviewitem.h
+ -------------------
+
+ author : Andreas Schlapbach
+ email : schlpbch@iam.unibe.ch
+ ***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef DOMLISTVIEWITEMS_H
+#define DOMLISTVIEWITEMS_H
+
+#include <dom/dom_node.h>
+
+#include <qlistview.h>
+#include <qcolor.h>
+#include <qfont.h>
+
+class DOMListViewItem : public QListViewItem
+{
+
+ public:
+ DOMListViewItem( const DOM::Node &, QListView *parent );
+ DOMListViewItem( const DOM::Node &, QListView *parent, QListViewItem *after );
+ DOMListViewItem( const DOM::Node &, QListViewItem *parent );
+ DOMListViewItem( const DOM::Node &, QListViewItem *parent, QListViewItem *after );
+ virtual ~DOMListViewItem();
+
+ virtual void paintCell( QPainter *p, const QColorGroup &cg,
+ int column, int width, int alignment );
+
+ void setColor( const QColor &color) { m_color = color; }
+
+ void setFont( const QFont &font) { m_font = font;}
+ void setItalic( bool b) {m_font.setItalic(b);}
+ void setBold( bool b) {m_font.setBold(b);}
+ void setUnderline(bool b) {m_font.setUnderline(b);}
+
+ bool isClosing() const { return clos; }
+ void setClosing(bool s) { clos = s; }
+
+ DOM::Node node() const { return m_node; }
+
+ private:
+ void init();
+ QColor m_color;
+ QFont m_font;
+ DOM::Node m_node;
+ bool clos;
+};
+#endif
diff --git a/konq-plugins/domtreeviewer/domtreecommands.cpp b/konq-plugins/domtreeviewer/domtreecommands.cpp
new file mode 100644
index 0000000..1f91cf1
--- /dev/null
+++ b/konq-plugins/domtreeviewer/domtreecommands.cpp
@@ -0,0 +1,562 @@
+/* This file is part of the KDE project
+ *
+ * Copyright (C) 2005 Leo Savernik <l.savernik@aon.at>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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 the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "domtreecommands.h"
+
+#include <dom/dom_doc.h>
+#include <dom/dom_exception.h>
+
+#include <klocale.h>
+
+#include <qmap.h>
+
+using namespace domtreeviewer;
+
+static const char * const dom_error_msgs[] = {
+ I18N_NOOP("No error"),
+ I18N_NOOP("Index size exceeded"),
+ I18N_NOOP("DOMString size exceeded"),
+ I18N_NOOP("Hierarchy request error"),
+ I18N_NOOP("Wrong document"),
+ I18N_NOOP("Invalid character"),
+ I18N_NOOP("No data allowed"),
+ I18N_NOOP("No modification allowed"),
+ I18N_NOOP("Not found"),
+ I18N_NOOP("Not supported"),
+ I18N_NOOP("Attribute in use"),
+ I18N_NOOP("Invalid state"),
+ I18N_NOOP("Syntax error"),
+ I18N_NOOP("Invalid modification"),
+ I18N_NOOP("Namespace error"),
+ I18N_NOOP("Invalid access")
+};
+
+// == global functions ==============================================
+
+QString domtreeviewer::domErrorMessage(int dom_err)
+{
+ if ((unsigned)dom_err > sizeof dom_error_msgs/sizeof dom_error_msgs[0])
+ return i18n("Unknown Exception %1").arg(dom_err);
+ else
+ return i18n(dom_error_msgs[dom_err]);
+}
+
+// == ManipulationCommandSignalEmitter ==============================
+
+static ManipulationCommandSignalEmitter *_mcse;
+
+ManipulationCommandSignalEmitter::ManipulationCommandSignalEmitter()
+{}
+ManipulationCommandSignalEmitter::~ManipulationCommandSignalEmitter()
+{}
+
+namespace domtreeviewer {
+
+ManipulationCommandSignalEmitter* ManipulationCommand::mcse()
+{
+ if (!_mcse) _mcse = new ManipulationCommandSignalEmitter;
+ return _mcse;
+}
+
+}
+
+// == ChangedNodeSet ================================================
+
+namespace domtreeviewer {
+
+// collection of nodes for which to emit the nodeChanged signal
+inline static bool operator <(const DOM::Node &n1, const DOM::Node &n2)
+{
+ return (long)n1.handle() - (long)n2.handle() < 0;
+}
+
+class ChangedNodeSet : public QMap<DOM::Node, bool>
+{
+};
+
+}
+
+// == ManipulationCommand ===========================================
+
+ManipulationCommand::ManipulationCommand() : _exception(0), changedNodes(0)
+ , _reapplied(false) , allow_signals(true)
+{
+}
+
+ManipulationCommand::~ManipulationCommand()
+{
+}
+
+void ManipulationCommand::connect(const char *signal, QObject *recv, const char *slot)
+{
+ QObject::connect(mcse(), signal, recv, slot);
+}
+
+void ManipulationCommand::handleException(DOM::DOMException &ex)
+{
+ _exception = ex;
+ QString msg = name() + ": " + domErrorMessage(ex.code);
+ emit mcse()->error(ex.code, msg);
+}
+
+void ManipulationCommand::checkAndEmitSignals()
+{
+ if (allow_signals) {
+ if (changedNodes) {
+ ChangedNodeSet::Iterator end = changedNodes->end();
+ for (ChangedNodeSet::Iterator it = changedNodes->begin(); it != end; ++it) {
+ emit mcse()->nodeChanged(it.key());
+ }
+ }
+
+ if (struc_changed) emit mcse()->structureChanged();
+ }
+ if (changedNodes) changedNodes->clear();
+}
+
+void ManipulationCommand::addChangedNode(const DOM::Node &node)
+{
+ if (!changedNodes) changedNodes = new ChangedNodeSet;
+ changedNodes->insert(node, true);
+}
+
+void ManipulationCommand::execute()
+{
+ if (!isValid()) return;
+
+ struc_changed = false;
+
+ try {
+ if (shouldReapply())
+ reapply();
+ else
+ apply();
+
+ checkAndEmitSignals();
+
+ } catch(DOM::DOMException &ex) {
+ handleException(ex);
+ }
+ _reapplied = true;
+}
+
+void ManipulationCommand::unexecute()
+{
+ if (!isValid()) return;
+
+ struc_changed = false;
+
+ try {
+ unapply();
+ checkAndEmitSignals();
+ } catch(DOM::DOMException &ex) {
+ handleException(ex);
+ }
+}
+
+void ManipulationCommand::reapply()
+{
+ apply();
+}
+
+// == MultiCommand ===========================================
+
+MultiCommand::MultiCommand(const QString &desc)
+: _name(desc)
+{
+ cmds.setAutoDelete(true);
+}
+
+MultiCommand::~MultiCommand()
+{
+}
+
+void MultiCommand::addCommand(ManipulationCommand *cmd)
+{
+ cmd->allow_signals = false;
+ cmds.append(cmd);
+}
+
+void MultiCommand::apply()
+{
+ // apply in forward order
+ for (QPtrListIterator<ManipulationCommand> it = cmds; *it; ++it) {
+ try {
+ if (shouldReapply()) (*it)->reapply();
+ else (*it)->apply();
+
+ struc_changed |= (*it)->struc_changed;
+ mergeChangedNodesFrom(*it);
+
+ } catch (DOM::DOMException &) {
+ // rollback
+ for (--it; *it; --it) {
+ try {
+ (*it)->unapply();
+ } catch(DOM::DOMException &) {
+ // ignore
+ }
+ }
+ throw;
+ }
+
+ }
+}
+
+void MultiCommand::unapply()
+{
+ // unapply in reverse order
+ QPtrListIterator<ManipulationCommand> it = cmds;
+ for (it.toLast(); *it; --it) {
+ try {
+ (*it)->unapply();
+
+ struc_changed |= (*it)->struc_changed;
+ mergeChangedNodesFrom(*it);
+
+ } catch (DOM::DOMException &) {
+ // rollback
+ for (++it; *it; ++it) {
+ try {
+ (*it)->reapply();
+ } catch(DOM::DOMException &) {
+ // ignore
+ }
+ }
+ throw;
+ }
+
+ }
+}
+
+void MultiCommand::mergeChangedNodesFrom(ManipulationCommand *cmd)
+{
+ if (!cmd->changedNodes) return;
+
+ ChangedNodeSet::ConstIterator end = cmd->changedNodes->end();
+ for (ChangedNodeSet::ConstIterator it = cmd->changedNodes->begin(); it != end; ++it) {
+ addChangedNode(it.key());
+ }
+
+ cmd->changedNodes->clear();
+}
+
+QString MultiCommand::name() const
+{
+ return _name;
+}
+
+// == AddAttributeCommand ===========================================
+
+AddAttributeCommand::AddAttributeCommand(const DOM::Element &element, const QString &attrName, const QString &attrValue)
+: _element(element), attrName(attrName), attrValue(attrValue)
+{
+ if (attrValue.isEmpty()) this->attrValue = "<dummy>";
+}
+
+AddAttributeCommand::~AddAttributeCommand()
+{
+}
+
+void AddAttributeCommand::apply()
+{
+ _element.setAttribute(attrName, attrValue);
+ addChangedNode(_element);
+}
+
+void AddAttributeCommand::unapply()
+{
+ _element.removeAttribute(attrName);
+ addChangedNode(_element);
+}
+
+QString AddAttributeCommand::name() const
+{
+ return i18n("Add attribute");
+}
+
+// == ChangeAttributeValueCommand ====================================
+
+ChangeAttributeValueCommand::ChangeAttributeValueCommand(
+const DOM::Element &element, const QString &attr, const QString &value)
+: _element(element), _attr(attr), new_value(value)
+{
+}
+
+ChangeAttributeValueCommand::~ChangeAttributeValueCommand()
+{
+}
+
+void ChangeAttributeValueCommand::apply()
+{
+ if (!shouldReapply()) old_value = _element.getAttribute(_attr);
+ _element.setAttribute(_attr, new_value);
+ addChangedNode(_element);
+}
+
+void ChangeAttributeValueCommand::unapply()
+{
+ _element.setAttribute(_attr, old_value);
+ addChangedNode(_element);
+}
+
+QString ChangeAttributeValueCommand::name() const
+{
+ return i18n("Change attribute value");
+}
+
+// == RemoveAttributeCommand ========================================
+
+RemoveAttributeCommand::RemoveAttributeCommand(const DOM::Element &element, const QString &attrName)
+: _element(element), attrName(attrName)
+{
+}
+
+RemoveAttributeCommand::~RemoveAttributeCommand()
+{
+}
+
+void RemoveAttributeCommand::apply()
+{
+// kdDebug(90180) << k_funcinfo << _element.nodeName().string() << ": " << attrName.string() << endl;
+ if (!shouldReapply())
+ oldAttrValue = _element.getAttribute(attrName);
+ _element.removeAttribute(attrName);
+ addChangedNode(_element);
+}
+
+void RemoveAttributeCommand::unapply()
+{
+ _element.setAttribute(attrName, oldAttrValue);
+ addChangedNode(_element);
+}
+
+QString RemoveAttributeCommand::name() const
+{
+ return i18n("Remove attribute");
+}
+
+// == RenameAttributeCommand ========================================
+
+RenameAttributeCommand::RenameAttributeCommand(const DOM::Element &element, const QString &attrOldName, const QString &attrNewName)
+: _element(element), attrOldName(attrOldName), attrNewName(attrNewName)
+{
+}
+
+RenameAttributeCommand::~RenameAttributeCommand()
+{
+}
+
+void RenameAttributeCommand::apply()
+{
+ if (!shouldReapply())
+ attrValue = _element.getAttribute(attrOldName);
+ _element.removeAttribute(attrOldName);
+ _element.setAttribute(attrNewName, attrValue);
+ addChangedNode(_element);
+}
+
+void RenameAttributeCommand::unapply()
+{
+ _element.removeAttribute(attrNewName);
+ _element.setAttribute(attrOldName, attrValue);
+ addChangedNode(_element);
+}
+
+QString RenameAttributeCommand::name() const
+{
+ return i18n("Rename attribute");
+}
+
+// == ChangeCDataCommand ========================================
+
+ChangeCDataCommand::ChangeCDataCommand(const DOM::CharacterData &cdata, const QString &value)
+: cdata(cdata), value(value), has_newlines(false)
+{
+}
+
+ChangeCDataCommand::~ChangeCDataCommand()
+{
+}
+
+void ChangeCDataCommand::apply()
+{
+ if (!shouldReapply()) {
+ oldValue = cdata.data();
+ has_newlines =
+ QConstString(value.unicode(), value.length()).string().contains('\n')
+ || QConstString(oldValue.unicode(), oldValue.length()).string().contains('\n');
+ }
+ cdata.setData(value);
+ addChangedNode(cdata);
+ struc_changed = has_newlines;
+}
+
+void ChangeCDataCommand::unapply()
+{
+ cdata.setData(oldValue);
+ addChangedNode(cdata);
+ struc_changed = has_newlines;
+}
+
+QString ChangeCDataCommand::name() const
+{
+ return i18n("Change textual content");
+}
+
+// == ManipulateNodeCommand ===========================================
+
+ManipulateNodeCommand::ManipulateNodeCommand(const DOM::Node &node, const DOM::Node &parent, const DOM::Node &after)
+: _node(node), _parent(parent), _after(after)
+{
+}
+
+ManipulateNodeCommand::~ManipulateNodeCommand()
+{
+}
+
+void ManipulateNodeCommand::insert()
+{
+ _parent.insertBefore(_node, _after);
+}
+
+void ManipulateNodeCommand::remove()
+{
+ DOM::DocumentFragment frag = _node;
+
+ if (frag.isNull()) { // do a normal remove
+ _node = _parent.removeChild(_node);
+
+ } else { // remove fragment nodes and recreate fragment
+ DOM::DocumentFragment newfrag = _parent.ownerDocument().createDocumentFragment();
+
+ for (DOM::Node i = frag.firstChild(); !i.isNull(); i = i.nextSibling()) {
+ newfrag.appendChild(_parent.removeChild(i));
+ }
+
+ _node = newfrag;
+ }
+}
+
+// == InsertNodeCommand ===========================================
+
+InsertNodeCommand::InsertNodeCommand(const DOM::Node &node, const DOM::Node &parent, const DOM::Node &after)
+: ManipulateNodeCommand(node, parent, after)
+{
+}
+
+InsertNodeCommand::~InsertNodeCommand()
+{
+}
+
+void InsertNodeCommand::apply()
+{
+ insert();
+ struc_changed = true;
+}
+
+void InsertNodeCommand::unapply()
+{
+ remove();
+ struc_changed = true;
+}
+
+QString InsertNodeCommand::name() const
+{
+ return i18n("Insert node");
+}
+
+// == RemoveNodeCommand ===========================================
+
+RemoveNodeCommand::RemoveNodeCommand(const DOM::Node &node, const DOM::Node &parent, const DOM::Node &after)
+: ManipulateNodeCommand(node, parent, after)
+{
+}
+
+RemoveNodeCommand::~RemoveNodeCommand()
+{
+}
+
+void RemoveNodeCommand::apply()
+{
+ remove();
+ struc_changed = true;
+}
+
+void RemoveNodeCommand::unapply()
+{
+ insert();
+ struc_changed = true;
+}
+
+QString RemoveNodeCommand::name() const
+{
+ return i18n("Remove node");
+}
+
+// == MoveNodeCommand ===========================================
+
+MoveNodeCommand::MoveNodeCommand(const DOM::Node &node, const DOM::Node &parent, const DOM::Node &after)
+: _node(node), new_parent(parent), new_after(after)
+{
+ old_parent = node.parentNode();
+ old_after = node.nextSibling();
+}
+
+MoveNodeCommand::~MoveNodeCommand()
+{
+}
+
+void MoveNodeCommand::apply()
+{
+ old_parent.removeChild(_node);
+ try {
+ new_parent.insertBefore(_node, new_after);
+ } catch (DOM::DOMException &) {
+ try { // rollback
+ old_parent.insertBefore(_node, old_after);
+ } catch (DOM::DOMException &) {}
+ throw;
+ }
+ struc_changed = true;
+}
+
+void MoveNodeCommand::unapply()
+{
+ new_parent.removeChild(_node);
+ try {
+ old_parent.insertBefore(_node, old_after);
+ } catch (DOM::DOMException &) {
+ try { // rollback
+ new_parent.insertBefore(_node, new_after);
+ } catch (DOM::DOMException &) {}
+ throw;
+ }
+ struc_changed = true;
+}
+
+QString MoveNodeCommand::name() const
+{
+ return i18n("Move node");
+}
+
+#include "domtreecommands.moc"
+
+#undef MCSE
diff --git a/konq-plugins/domtreeviewer/domtreecommands.h b/konq-plugins/domtreeviewer/domtreecommands.h
new file mode 100644
index 0000000..bf893dc
--- /dev/null
+++ b/konq-plugins/domtreeviewer/domtreecommands.h
@@ -0,0 +1,375 @@
+/* This file is part of the KDE project
+ *
+ * Copyright (C) 2005 Leo Savernik <l.savernik@aon.at>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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 the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef domtreecommands_H
+#define domtreecommands_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <dom/dom_element.h>
+#include <dom/dom_exception.h>
+#include <dom/dom_string.h>
+#include <dom/dom_text.h>
+
+#include <kcommand.h>
+
+#include <qobject.h>
+#include <qptrlist.h>
+
+class DOMTreeView;
+class KPrinter;
+class KURL;
+
+namespace domtreeviewer {
+
+class ManipulationCommandSignalEmitter;
+class ChangedNodeSet;
+
+/** returns a localized string for the given dom exception code */
+QString domErrorMessage(int exception_code);
+
+/**
+ * Internal class for emitting signals.
+ * @internal
+ */
+class ManipulationCommandSignalEmitter : public QObject
+{
+ Q_OBJECT
+
+ ManipulationCommandSignalEmitter();
+ virtual ~ManipulationCommandSignalEmitter();
+
+#undef signals
+#define signals public
+signals:
+#undef signals
+#define signals protected
+ /** emitted if the DOM structure has been changed */
+ void structureChanged();
+ /** emitted if a DOM node has been changed */
+ void nodeChanged(const DOM::Node &changedNode);
+ /** emitted if an error occurred
+ * @param err_id DOM error id
+ * @param msg error message
+ */
+ void error(int err_id, const QString &msg);
+
+private: // make moc not complain
+ friend class ManipulationCommand;
+};
+
+/**
+ * Base class of all dom tree manipulation commands.
+ * @author Leo Savernik
+ */
+class ManipulationCommand : public KCommand
+{
+public:
+ ManipulationCommand();
+ virtual ~ManipulationCommand();
+
+ /** returns whether this command is still valid and can be executed */
+ bool isValid() const { return !_exception.code; }
+ /** returns the last occurred DOM exception */
+ DOM::DOMException exception() const { return _exception; }
+ /** returns true when the next issue of execute will reapply the command */
+ bool shouldReapply() const { return _reapplied; }
+ /** returns true if the command may emit signals */
+ bool allowSignals() const { return allow_signals; }
+
+ /** connects the given signal to a slot */
+ static void connect(const char *signal, QObject *recv, const char *slot);
+
+ /** does grunt work and calls apply()/reapply() */
+ virtual void execute();
+ /** does grunt work and calls unapply() */
+ virtual void unexecute();
+
+protected:
+ virtual void apply() = 0;
+ virtual void reapply();
+ virtual void unapply() = 0;
+
+ void handleException(DOM::DOMException &);
+ void checkAndEmitSignals();
+ void addChangedNode(const DOM::Node &);
+
+ static ManipulationCommandSignalEmitter *mcse();
+
+protected:
+ DOM::DOMException _exception;
+ ChangedNodeSet *changedNodes;
+ bool _reapplied:1;
+ bool struc_changed:1;
+
+private:
+ bool allow_signals:1;
+
+ friend class MultiCommand;
+};
+
+/**
+ * Combines multiple commands into a single command.
+ *
+ * Does basically the same as KMacroCommand, but inherits from
+ * ManipulationCommand, and supports rollback.
+ */
+class MultiCommand : public ManipulationCommand
+{
+public:
+ MultiCommand(const QString &name);
+ virtual ~MultiCommand();
+
+ /** Adds a new command. Will take ownership of \c cmd */
+ void addCommand(ManipulationCommand *cmd);
+
+ virtual QString name() const;
+
+protected:
+ virtual void apply();
+ virtual void unapply();
+
+ void mergeChangedNodesFrom(ManipulationCommand *cmd);
+
+protected:
+ QPtrList<ManipulationCommand> cmds;
+ QString _name;
+};
+
+/**
+ * Adds an attribute to a node.
+ * @author Leo Savernik
+ */
+class AddAttributeCommand : public ManipulationCommand
+{
+public:
+ AddAttributeCommand(const DOM::Element &element, const QString &attrName, const QString &attrValue);
+ virtual ~AddAttributeCommand();
+
+ virtual QString name() const;
+
+protected:
+ virtual void apply();
+ virtual void unapply();
+
+protected:
+ DOM::Element _element;
+ DOM::DOMString attrName;
+ DOM::DOMString attrValue;
+};
+
+/**
+ * Manipulates an attribute's value.
+ * @author Leo Savernik
+ */
+class ChangeAttributeValueCommand : public ManipulationCommand
+{
+public:
+ ChangeAttributeValueCommand(const DOM::Element &element, const QString &attr, const QString &value);
+ virtual ~ChangeAttributeValueCommand();
+
+ virtual QString name() const;
+
+protected:
+ virtual void apply();
+ virtual void unapply();
+
+protected:
+ DOM::Element _element;
+ DOM::DOMString _attr;
+ DOM::DOMString old_value;
+ DOM::DOMString new_value;
+};
+
+/**
+ * Removes an attribute from a node.
+ * @author Leo Savernik
+ */
+class RemoveAttributeCommand : public ManipulationCommand
+{
+public:
+ RemoveAttributeCommand(const DOM::Element &element, const QString &attrName);
+ virtual ~RemoveAttributeCommand();
+
+ virtual QString name() const;
+
+protected:
+ virtual void apply();
+ virtual void unapply();
+
+protected:
+ DOM::Element _element;
+ DOM::DOMString attrName;
+ DOM::DOMString oldAttrValue;
+};
+
+/**
+ * Renames an attribute.
+ * @author Leo Savernik
+ */
+class RenameAttributeCommand : public ManipulationCommand
+{
+public:
+ RenameAttributeCommand(const DOM::Element &element, const QString &attrOldName, const QString &attrNewName);
+ virtual ~RenameAttributeCommand();
+
+ virtual QString name() const;
+
+protected:
+ virtual void apply();
+ virtual void unapply();
+
+protected:
+ DOM::Element _element;
+ DOM::DOMString attrOldName;
+ DOM::DOMString attrNewName;
+ DOM::DOMString attrValue;
+};
+
+/**
+ * Changes the value of a CData-node.
+ * @author Leo Savernik
+ */
+class ChangeCDataCommand : public ManipulationCommand
+{
+public:
+ ChangeCDataCommand(const DOM::CharacterData &, const QString &value);
+ virtual ~ChangeCDataCommand();
+
+ virtual QString name() const;
+
+protected:
+ virtual void apply();
+ virtual void unapply();
+
+protected:
+ DOM::CharacterData cdata;
+ DOM::DOMString value;
+ DOM::DOMString oldValue;
+ bool has_newlines;
+};
+
+/**
+ * Handles insertion and deletion primitives of nodes.
+ * @author Leo Savernik
+ */
+class ManipulateNodeCommand : public ManipulationCommand
+{
+public:
+ /**
+ * Prepare command, where \c node is to be contained in \c parent, just
+ * before \c after. If \c after is 0, it is appended at the end.
+ */
+ ManipulateNodeCommand(const DOM::Node &node, const DOM::Node &parent, const DOM::Node &after);
+ virtual ~ManipulateNodeCommand();
+
+protected:
+ void insert();
+ void remove();
+
+protected:
+ DOM::Node _node;
+ DOM::Node _parent;
+ DOM::Node _after;
+};
+
+/**
+ * Inserts a node into the tree.
+ *
+ * The handed in node may be a full tree, even a document fragment.
+ *
+ * @author Leo Savernik
+ */
+class InsertNodeCommand : public ManipulateNodeCommand
+{
+public:
+ /**
+ * Prepare insertion command, inserting \c node into \c parent, just
+ * before \c after. If \c after is 0, append it to the list of children.
+ */
+ InsertNodeCommand(const DOM::Node &node, const DOM::Node &parent, const DOM::Node &after);
+ virtual ~InsertNodeCommand();
+
+ virtual QString name() const;
+
+protected:
+ virtual void apply();
+ virtual void unapply();
+
+protected:
+};
+
+/**
+ * Removes a node from the tree.
+ *
+ * The handed in node may be a full tree, even a document fragment.
+ *
+ * @author Leo Savernik
+ */
+class RemoveNodeCommand : public ManipulateNodeCommand
+{
+public:
+ /**
+ * Prepare insertion command, inserting \c node into \c parent, just
+ * before \c after. If \c after is 0, append it to the list of children.
+ */
+ RemoveNodeCommand(const DOM::Node &node, const DOM::Node &parent, const DOM::Node &after);
+ virtual ~RemoveNodeCommand();
+
+ virtual QString name() const;
+
+protected:
+ virtual void apply();
+ virtual void unapply();
+
+protected:
+};
+
+/**
+ * Moves a node.
+ * @author Leo Savernik
+ */
+class MoveNodeCommand : public ManipulationCommand
+{
+public:
+ /**
+ * Move \c node from current position into \c parent, just before \c after.
+ * Appends if \c after is 0.
+ */
+ MoveNodeCommand(const DOM::Node &node, const DOM::Node &parent, const DOM::Node &after);
+ virtual ~MoveNodeCommand();
+
+ virtual QString name() const;
+
+protected:
+ virtual void apply();
+ virtual void unapply();
+
+protected:
+ DOM::Node _node;
+ DOM::Node old_parent, old_after;
+ DOM::Node new_parent, new_after;
+};
+
+} // namespace domtreeviewer
+
+#endif // domtreewindow_H
diff --git a/konq-plugins/domtreeviewer/domtreeview.cpp b/konq-plugins/domtreeviewer/domtreeview.cpp
new file mode 100644
index 0000000..167d85a
--- /dev/null
+++ b/konq-plugins/domtreeviewer/domtreeview.cpp
@@ -0,0 +1,1226 @@
+/***************************************************************************
+ domtreeview.cpp
+ -------------------
+
+ copyright : (C) 2001 - The Kafka Team/Andreas Schlapbach
+ (C) 2005 - Leo Savernik
+ email : kde-kafka@master.kde.org
+ schlpbch@iam.unibe.ch
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "domtreeview.h"
+#include "domlistviewitem.h"
+#include "domtreewindow.h"
+#include "domtreecommands.h"
+
+#include "attributeeditdialog.h"
+#include "elementeditdialog.h"
+#include "texteditdialog.h"
+
+#include "signalreceiver.h"
+
+#include <assert.h>
+
+#include <qapplication.h>
+#include <qcheckbox.h>
+#include <qevent.h>
+#include <qfont.h>
+#include <qfile.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpopupmenu.h>
+#include <qtextstream.h>
+#include <qtimer.h>
+#include <qwidgetstack.h>
+
+#include <dom/dom_core.h>
+#include <dom/html_base.h>
+
+#include <kaction.h>
+#include <kdebug.h>
+#include <kcombobox.h>
+#include <kdialog.h>
+#include <keditcl.h>
+#include <kfiledialog.h>
+#include <kglobalsettings.h>
+#include <khtml_part.h>
+#include <klineedit.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kpushbutton.h>
+#include <kshortcut.h>
+#include <kstdguiitem.h>
+#include <ktextedit.h>
+
+using namespace domtreeviewer;
+
+DOMTreeView::DOMTreeView(QWidget *parent, const char* name, bool /*allowSaving*/)
+ : DOMTreeViewBase(parent, name), m_expansionDepth(5), m_maxDepth(0),
+ m_bPure(true), m_bShowAttributes(true), m_bHighlightHTML(true),
+ m_findDialog(0), focused_child(0)
+{
+ part = 0;
+
+ const QFont font(KGlobalSettings::generalFont());
+ m_listView->setFont( font );
+ m_listView->setSorting(-1);
+ m_rootListView = m_listView;
+
+ m_pureCheckBox->setChecked(m_bPure);
+ connect(m_pureCheckBox, SIGNAL(toggled(bool)), this, SLOT(slotPureToggled(bool)));
+
+ m_showAttributesCheckBox->setChecked(m_bShowAttributes);
+ connect(m_showAttributesCheckBox, SIGNAL(toggled(bool)), this,
+ SLOT(slotShowAttributesToggled(bool)));
+
+ m_highlightHTMLCheckBox->setChecked(m_bHighlightHTML);
+ connect(m_highlightHTMLCheckBox, SIGNAL(toggled(bool)), this,
+ SLOT(slotHighlightHTMLToggled(bool)));
+
+ connect(m_listView, SIGNAL(clicked(QListViewItem *)), this,
+ SLOT(slotItemClicked(QListViewItem *)));
+ connect(m_listView, SIGNAL(contextMenuRequested(QListViewItem *, const QPoint &, int)),
+ SLOT(showDOMTreeContextMenu(QListViewItem *, const QPoint &, int)));
+ connect(m_listView, SIGNAL(moved(QPtrList<QListViewItem> &, QPtrList<QListViewItem> &, QPtrList<QListViewItem> &)),
+ SLOT(slotMovedItems(QPtrList<QListViewItem> &, QPtrList<QListViewItem> &, QPtrList<QListViewItem> &)));
+
+ // set up message line
+ messageLinePane->hide();
+ connect(messageHideBtn, SIGNAL(clicked()), SLOT(hideMessageLine()));
+ connect(messageListBtn, SIGNAL(clicked()), mainWindow(), SLOT(showMessageLog()));
+
+ installEventFilter(m_listView);
+
+ ManipulationCommand::connect(SIGNAL(nodeChanged(const DOM::Node &)), this, SLOT(slotRefreshNode(const DOM::Node &)));
+ ManipulationCommand::connect(SIGNAL(structureChanged()), this, SLOT(refresh()));
+
+ initDOMNodeInfo();
+
+ installEventFilter(this);
+}
+
+DOMTreeView::~DOMTreeView()
+{
+ delete m_findDialog;
+ disconnectFromActivePart();
+}
+
+void DOMTreeView::setHtmlPart(KHTMLPart *_part)
+{
+ KHTMLPart *oldPart = part;
+ part = _part;
+
+ if (oldPart) {
+ // nothing here yet
+ }
+
+ parentWidget()->setCaption( part ? i18n( "DOM Tree for %1" ).arg(part->url().prettyURL()) : i18n("DOM Tree") );
+
+ QTimer::singleShot(0, this, SLOT(slotSetHtmlPartDelayed()));
+}
+
+DOMTreeWindow *DOMTreeView::mainWindow() const
+{
+ return static_cast<DOMTreeWindow *>(parentWidget());
+}
+
+bool DOMTreeView::eventFilter(QObject *o, QEvent *e)
+{
+ if (e->type() == QEvent::AccelOverride) {
+ QKeyEvent *ke = static_cast<QKeyEvent *>(e);
+ kdDebug(90180) << " acceloverride " << ke->key() << " o " << o->name() << endl;
+
+ if (o == m_listView) { // DOM tree
+ KKey ks = mainWindow()->deleteNodeAction()->shortcut().seq(0).key(0);
+ if (ke->key() == ks.keyCodeQt())
+ return true;
+
+ } else if (o == nodeAttributes) {
+ KKey ks = mainWindow()->deleteAttributeAction()->shortcut().seq(0).key(0);
+ if (ke->key() == ks.keyCodeQt())
+ return true;
+
+ }
+
+ } else if (e->type() == QEvent::FocusIn) {
+
+ kdDebug(90180) << " focusin o " << o->name() << endl;
+ if (o != this) {
+ focused_child = o;
+ }
+
+ } else if (e->type() == QEvent::FocusOut) {
+
+ kdDebug(90180) << " focusout o " << o->name() << endl;
+ if (o != this) {
+ focused_child = 0;
+ }
+
+ }
+
+ return false;
+}
+
+void DOMTreeView::activateNode(const DOM::Node &node)
+{
+ slotShowNode(node);
+ initializeOptionsFromNode(node);
+}
+
+void DOMTreeView::slotShowNode(const DOM::Node &pNode)
+{
+
+ if (QListViewItem *item = m_itemdict[pNode.handle()]) {
+ m_listView->setCurrentItem(item);
+ m_listView->ensureItemVisible(item);
+ }
+}
+
+void DOMTreeView::slotShowTree(const DOM::Node &pNode)
+{
+ DOM::Node child;
+
+ m_listView->clear();
+ m_itemdict.clear();
+
+ try
+ {
+ child = pNode.firstChild();
+ }
+ catch (DOM::DOMException &)
+ {
+ return;
+ }
+
+ while(!child.isNull()) {
+ showRecursive(0, child, 0);
+ child = child.nextSibling();
+ }
+
+ m_maxDepth--;
+ //kdDebug(90180) << " Max Depth: " << m_maxDepth << endl;
+}
+
+void DOMTreeView::showRecursive(const DOM::Node &pNode, const DOM::Node &node, uint depth)
+{
+ DOMListViewItem *cur_item;
+ DOMListViewItem *parent_item = m_itemdict[pNode.handle()];
+
+ if (depth > m_maxDepth) {
+ m_maxDepth = depth;
+ }
+
+ if (depth == 0) {
+ cur_item = new DOMListViewItem(node, m_listView);
+ m_document = pNode.ownerDocument();
+ } else {
+ cur_item = new DOMListViewItem(node, parent_item);
+ }
+
+ //kdDebug(90180) << node.nodeName().string() << " [" << depth << "]" << endl;
+ addElement (node, cur_item, false);
+ cur_item->setOpen(depth < m_expansionDepth);
+
+ if(node.handle()) {
+ m_itemdict.insert(node.handle(), cur_item);
+ }
+
+ DOM::Node child = node.lastChild();
+ if (child.isNull()) {
+ DOM::HTMLFrameElement frame = node;
+ if (!frame.isNull()) child = frame.contentDocument().documentElement();
+ }
+ while(!child.isNull()) {
+ showRecursive(node, child, depth + 1);
+ child = child.previousSibling();
+ }
+
+ const DOM::Element element = node;
+ if (!m_bPure) {
+ if (!element.isNull() && !element.firstChild().isNull()) {
+ if(depth == 0) {
+ cur_item = new DOMListViewItem(node, m_listView, cur_item);
+ m_document = pNode.ownerDocument();
+ } else {
+ cur_item = new DOMListViewItem(node, parent_item, cur_item);
+ }
+ //kdDebug(90180) << "</" << node.nodeName().string() << ">" << endl;
+ addElement(element, cur_item, true);
+// cur_item->setOpen(depth < m_expansionDepth);
+ }
+ }
+}
+
+void DOMTreeView::addElement ( const DOM::Node &node, DOMListViewItem *cur_item, bool isLast)
+{
+ cur_item->setClosing(isLast);
+
+ const QString nodeName(node.nodeName().string());
+ QString text;
+ const DOM::Element element = node;
+ if (!element.isNull()) {
+ if (!m_bPure) {
+ if (isLast) {
+ text ="</";
+ } else {
+ text = "<";
+ }
+ text += nodeName;
+ } else {
+ text = nodeName;
+ }
+
+ if (m_bShowAttributes && !isLast) {
+ QString attributes;
+ DOM::Attr attr;
+ DOM::NamedNodeMap attrs = element.attributes();
+ unsigned long lmap = attrs.length();
+ for( unsigned int j=0; j<lmap; j++ ) {
+ attr = static_cast<DOM::Attr>(attrs.item(j));
+ attributes += " " + attr.name().string() + "=\"" + attr.value().string() + "\"";
+ }
+ if (!(attributes.isEmpty())) {
+ text += " ";
+ }
+ text += attributes.simplifyWhiteSpace();
+ }
+
+ if (!m_bPure) {
+ if(element.firstChild().isNull()) {
+ text += "/>";
+ } else {
+ text += ">";
+ }
+ }
+ cur_item->setText(0, text);
+ } else {
+ text = "`" + node.nodeValue().string() + "'";
+
+ // Hacks to deal with PRE
+ QTextStream ts( text, IO_ReadOnly );
+ while (!ts.eof()) {
+ const QString txt(ts.readLine());
+ const QFont font(KGlobalSettings::fixedFont());
+ cur_item->setFont( font );
+ cur_item->setText(0, txt);
+
+ if(node.handle()) {
+ m_itemdict.insert(node.handle(), cur_item);
+ }
+
+ DOMListViewItem *parent;
+ if (cur_item->parent()) {
+ parent = static_cast<DOMListViewItem *>(cur_item->parent());
+ } else {
+ parent = cur_item;
+ }
+ cur_item = new DOMListViewItem(node, parent, cur_item);
+ }
+ // This is one is too much
+ DOMListViewItem *notLastItem = static_cast<DOMListViewItem *>(cur_item->itemAbove());
+ delete cur_item;
+ cur_item = notLastItem;
+ }
+
+ if (m_bHighlightHTML && node.ownerDocument().isHTMLDocument()) {
+ highlightHTML(cur_item, nodeName);
+ }
+}
+
+void DOMTreeView::highlightHTML(DOMListViewItem *cur_item, const QString &nodeName)
+{
+ /* This is slow. I could make it O(1) be using the tokenizer of khtml but I don't
+ * think it's worth it.
+ */
+
+ QColor namedColor(palette().active().text());
+ QString tagName = nodeName.upper();
+ if ( tagName == "HTML" ) {
+ namedColor = "#0000ff";
+ cur_item->setBold(true);
+ } else if ( tagName == "HEAD" ) {
+ namedColor = "#0022ff";
+ cur_item->setBold(true);
+
+ } else if ( tagName == "TITLE" ) {
+ namedColor = "#2200ff";
+ } else if ( tagName == "SCRIPT" ) {
+ namedColor = "#4400ff";
+ } else if ( tagName == "NOSCRIPT" ) {
+ namedColor = "#0044ff";
+ } else if ( tagName == "STYLE" ) {
+ namedColor = "#0066ff";
+ } else if ( tagName == "LINK" ) {
+ namedColor = "#6600ff";
+ } else if ( tagName == "META" ) {
+ namedColor = "#0088ff";
+
+ } else if ( tagName == "BODY" ) {
+ namedColor = "#ff0000";
+ cur_item->setBold(true);
+ } else if ( tagName == "A") {
+ namedColor = "blue";
+ cur_item->setUnderline(true);
+ } else if ( tagName == "IMG") {
+ namedColor = "magenta";
+ cur_item->setUnderline(true);
+
+ } else if ( tagName == "DIV" ) {
+ namedColor = "#ff0044";
+ } else if ( tagName == "SPAN" ) {
+ namedColor = "#ff4400";
+ } else if ( tagName == "P" ) {
+ namedColor = "#ff0066";
+
+ } else if ( tagName == "DL" || tagName == "OL"|| tagName == "UL" || tagName == "TABLE" ) {
+ namedColor = "#880088";
+ } else if ( tagName == "LI" ) {
+ namedColor = "#884488";
+ } else if ( tagName == "TBODY" ){
+ namedColor = "#888888";
+ } else if ( tagName == "TR" ) {
+ namedColor = "#882288";
+ } else if ( tagName == "TD" ) {
+ namedColor = "#886688";
+
+ } else if ((tagName == "H1")||(tagName == "H2")||(tagName == "H3") ||
+ (tagName == "H4")||(tagName == "H5")||(tagName == "H6")) {
+ namedColor = "#008800";
+ } else if (tagName == "HR" ) {
+ namedColor = "#228822";
+
+ } else if ( tagName == "FRAME" || tagName == "IFRAME" ) {
+ namedColor = "#ff22ff";
+ } else if ( tagName == "FRAMESET" ) {
+ namedColor = "#dd22dd";
+
+ } else if ( tagName == "APPLET" || tagName == "OBJECT" ) {
+ namedColor = "#bb22bb";
+
+ } else if ( tagName == "BASEFONT" || tagName == "FONT" ) {
+ namedColor = "#097200";
+
+ } else if ( tagName == "B" || tagName == "STRONG" ) {
+ cur_item->setBold(true);
+ } else if ( tagName == "I" || tagName == "EM" ) {
+ cur_item->setItalic(true);
+ } else if ( tagName == "U") {
+ cur_item->setUnderline(true);
+ }
+
+ cur_item->setColor(namedColor);
+}
+
+void DOMTreeView::slotItemClicked(QListViewItem *cur_item)
+{
+ DOMListViewItem *cur = static_cast<DOMListViewItem *>(cur_item);
+ if (!cur) return;
+
+ DOM::Node handle = cur->node();
+ if (!handle.isNull()) {
+ part->setActiveNode(handle);
+ }
+}
+
+void DOMTreeView::slotFindClicked()
+{
+ if (m_findDialog == 0) {
+ m_findDialog = new KEdFind(this);
+ connect(m_findDialog, SIGNAL(search()), this, SLOT(slotSearch()));
+ }
+ m_findDialog->show();
+}
+
+void DOMTreeView::slotRefreshNode(const DOM::Node &pNode)
+{
+ DOMListViewItem *cur = static_cast<DOMListViewItem *>(m_itemdict[pNode.handle()]);
+ if (!cur) return;
+
+ addElement(pNode, cur, false);
+}
+
+void DOMTreeView::slotPrepareMove()
+{
+ DOMListViewItem *item = static_cast<DOMListViewItem *>(m_listView->currentItem());
+
+ if (!item)
+ current_node = DOM::Node();
+ else
+ current_node = item->node();
+}
+
+void DOMTreeView::slotMovedItems(QPtrList<QListViewItem> &items, QPtrList<QListViewItem> &/*afterFirst*/, QPtrList<QListViewItem> &afterNow)
+{
+ MultiCommand *cmd = new MultiCommand(i18n("Move Nodes"));
+ _refreshed = false;
+
+ QPtrList<QListViewItem>::Iterator it = items.begin();
+ QPtrList<QListViewItem>::Iterator anit = afterNow.begin();
+ for (; it != items.end(); ++it, ++anit) {
+ DOMListViewItem *item = static_cast<DOMListViewItem *>(*it);
+ DOMListViewItem *anitem = static_cast<DOMListViewItem *>(*anit);
+ DOM::Node parent = static_cast<DOMListViewItem *>(item->parent())->node();
+ Q_ASSERT(!parent.isNull());
+
+// kdDebug(90180) << " afternow " << anitem << " node " << (anitem ? anitem->node().nodeName().string() : QString()) << "=" << (anitem ? anitem->node().nodeValue().string() : QString()) << endl;
+
+ cmd->addCommand(new MoveNodeCommand(item->node(), parent,
+ anitem ? anitem->node().nextSibling() : parent.firstChild())
+ );
+ }
+
+ mainWindow()->executeAndAddCommand(cmd);
+
+ // refresh *anyways*, otherwise consistency is disturbed
+ if (!_refreshed) refresh();
+
+ slotShowNode(current_node);
+}
+
+void DOMTreeView::slotSearch()
+{
+ assert(m_findDialog);
+ const QString& searchText = m_findDialog->getText();
+ bool caseSensitive = m_findDialog->case_sensitive();
+
+ searchRecursive(static_cast<DOMListViewItem*>(m_rootListView->firstChild()),
+ searchText, caseSensitive);
+
+ m_findDialog->hide();
+}
+
+void DOMTreeView::searchRecursive(DOMListViewItem* cur_item, const QString& searchText,
+ bool caseSensitive)
+{
+ const QString text(cur_item->text(0));
+ if (text.contains(searchText, caseSensitive) > 0) {
+ cur_item->setUnderline(true);
+ cur_item->setItalic(true);
+ m_listView->setCurrentItem(cur_item);
+ m_listView->ensureItemVisible(cur_item);
+ } else {
+ cur_item->setOpen(false);
+ }
+
+ DOMListViewItem* child = static_cast<DOMListViewItem *>(cur_item->firstChild());
+ while( child ) {
+ searchRecursive(child, searchText, caseSensitive);
+ child = static_cast<DOMListViewItem *>(child->nextSibling());
+ }
+}
+
+#if 0
+void DOMTreeView::slotSaveClicked()
+{
+ //kdDebug(90180) << "void KfingerCSSWidget::slotSaveAs()" << endl;
+ KURL url = KFileDialog::getSaveFileName( part->url().url(), "*.html",
+ this, i18n("Save DOM Tree as HTML") );
+ if (!(url.isEmpty()) && url.isValid()) {
+ QFile file(url.path());
+
+ if (file.exists()) {
+ const QString title = i18n( "File Exists" );
+ const QString text = i18n( "Do you really want to overwrite: \n%1?" ).arg(url.url());
+ if (KMessageBox::Continue != KMessageBox::warningContinueCancel(this, text, title, i18n("Overwrite") ) ) {
+ return;
+ }
+ }
+
+ if (file.open(IO_WriteOnly) ) {
+ kdDebug(90180) << "Opened File: " << url.url() << endl;
+ m_textStream = new QTextStream(&file); //(stdOut)
+ saveTreeAsHTML(part->document());
+ file.close();
+ kdDebug(90180) << "File closed " << endl;
+ delete m_textStream;
+ } else {
+ const QString title = i18n( "Unable to Open File" );
+ const QString text = i18n( "Unable to open \n %1 \n for writing" ).arg(url.path());
+ KMessageBox::sorry( this, text, title );
+ }
+ } else {
+ const QString title = i18n( "Invalid URL" );
+ const QString text = i18n( "This URL \n %1 \n is not valid." ).arg(url.url());
+ KMessageBox::sorry( this, text, title );
+ }
+}
+
+void DOMTreeView::saveTreeAsHTML(const DOM::Node &pNode)
+{
+ assert(m_textStream);
+
+ // Add a doctype
+
+ (*m_textStream) <<"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">" << endl;
+ if(pNode.ownerDocument().isNull()) {
+ saveRecursive(pNode, 0);
+ } else {
+ saveRecursive(pNode.ownerDocument(), 0);
+ }
+}
+
+void DOMTreeView::saveRecursive(const DOM::Node &pNode, int indent)
+{
+ const QString nodeName(pNode.nodeName().string());
+ QString text;
+ QString strIndent;
+ strIndent.fill(' ', indent);
+ const DOM::Element element = static_cast<const DOM::Element>(pNode);
+
+ text = strIndent;
+
+ if ( !element.isNull() ) {
+ if (nodeName.at(0)=='-') {
+ /* Don't save khtml internal tags '-konq..'
+ * Approximating it with <DIV>
+ */
+ text += "<DIV> <!-- -KONG_BLOCK -->";
+ } else {
+ text += "<" + nodeName;
+
+ QString attributes;
+ DOM::Attr attr;
+ const DOM::NamedNodeMap attrs = element.attributes();
+ unsigned long lmap = attrs.length();
+ for( uint j=0; j<lmap; j++ ) {
+ attr = static_cast<DOM::Attr>(attrs.item(j));
+ attributes += " " + attr.name().string() + "=\"" + attr.value().string() + "\"";
+ }
+ if (!(attributes.isEmpty())){
+ text += " ";
+ }
+
+ text += attributes.simplifyWhiteSpace();
+
+ if(element.firstChild().isNull()) {
+ text += "/>";
+ } else {
+ text += ">";
+ }
+ }
+ } else {
+ text = strIndent + pNode.nodeValue().string();
+ }
+
+ kdDebug(90180) << text << endl;
+ if (!(text.isEmpty())) {
+ (*m_textStream) << text << endl;
+ }
+
+ DOM::Node child = pNode.firstChild();
+ while(!child.isNull()) {
+ saveRecursive(child, indent+2);
+ child = child.nextSibling();
+ }
+
+ if (!(element.isNull()) && (!(element.firstChild().isNull()))) {
+ if (nodeName.at(0)=='-') {
+ text = strIndent + "</DIV> <!-- -KONG_BLOCK -->";
+ } else {
+ text = strIndent + "</" + pNode.nodeName().string() + ">";
+ }
+ kdDebug(90180) << text << endl;
+ (*m_textStream) << text << endl;
+ }
+}
+#endif
+
+void DOMTreeView::updateIncrDecreaseButton()
+{
+#if 0
+ m_decreaseButton->setEnabled((m_expansionDepth > 0));
+ m_increaseButton->setEnabled((m_expansionDepth < m_maxDepth));
+#endif
+}
+
+void DOMTreeView::refresh()
+{
+ if (!part) return;
+ scroll_ofs_x = m_listView->contentsX();
+ scroll_ofs_y = m_listView->contentsY();
+
+ m_listView->setUpdatesEnabled(false);
+ slotShowTree(part->document());
+
+ QTimer::singleShot(0, this, SLOT(slotRestoreScrollOffset()));
+ _refreshed = true;
+}
+
+void DOMTreeView::increaseExpansionDepth()
+{
+ if (!part) return;
+ if (m_expansionDepth < m_maxDepth) {
+ ++m_expansionDepth;
+ adjustDepth();
+ updateIncrDecreaseButton();
+ } else {
+ QApplication::beep();
+ }
+}
+
+void DOMTreeView::decreaseExpansionDepth()
+{
+ if (!part) return;
+ if (m_expansionDepth > 0) {
+ --m_expansionDepth;
+ adjustDepth();
+ updateIncrDecreaseButton();
+ } else {
+ QApplication::beep();
+ }
+}
+
+void DOMTreeView::adjustDepth()
+{
+ // get current item in a hypersmart way
+ DOMListViewItem *cur_node_item = m_itemdict[infoNode.handle()];
+ if (!cur_node_item)
+ cur_node_item = static_cast<DOMListViewItem *>(m_listView->currentItem());
+
+ adjustDepthRecursively(m_rootListView->firstChild(), 0);
+
+ // make current item visible again if possible
+ if (cur_node_item)
+ m_listView->ensureVisible(0, cur_node_item->itemPos());
+
+}
+
+void DOMTreeView::adjustDepthRecursively(QListViewItem *cur_item, uint currDepth)
+{
+ if (!(cur_item == 0)) {
+ while( cur_item ) {
+ cur_item->setOpen( (m_expansionDepth > currDepth) );
+ adjustDepthRecursively(cur_item->firstChild(), currDepth+1);
+ cur_item = cur_item->nextSibling();
+ }
+ }
+}
+
+void DOMTreeView::setMessage(const QString &msg)
+{
+ messageLine->setText(msg);
+ messageLinePane->show();
+}
+
+void DOMTreeView::hideMessageLine()
+{
+ messageLinePane->hide();
+}
+
+void DOMTreeView::moveToParent()
+{
+ // This is a hypersmart algorithm.
+ // If infoNode is defined, go to the parent of infoNode, otherwise, go
+ // to the parent of the tree view's current item.
+ // Hope this isn't too smart.
+
+ DOM::Node cur = infoNode;
+ if (cur.isNull()) cur = static_cast<DOMListViewItem *>(m_listView->currentItem())->node();
+
+ if (cur.isNull()) return;
+
+ cur = cur.parentNode();
+ activateNode(cur);
+}
+
+void DOMTreeView::showDOMTreeContextMenu(QListViewItem */*lvi*/, const QPoint &pos, int /*col*/)
+{
+ QPopupMenu *ctx = mainWindow()->domTreeViewContextMenu();
+ Q_ASSERT(ctx);
+ ctx->popup(pos);
+}
+
+void DOMTreeView::slotPureToggled(bool b)
+{
+ m_bPure = b;
+ refresh();
+}
+
+void DOMTreeView::slotShowAttributesToggled(bool b)
+{
+ m_bShowAttributes = b;
+ refresh();
+}
+
+void DOMTreeView::slotHighlightHTMLToggled(bool b)
+{
+ m_bHighlightHTML = b;
+ refresh();
+}
+
+void DOMTreeView::deleteNodes()
+{
+// kdDebug(90180) << k_funcinfo << endl;
+
+ DOM::Node last;
+ MultiCommand *cmd = new MultiCommand(i18n("Delete Nodes"));
+ QListViewItemIterator it(m_listView, QListViewItemIterator::Selected);
+ for (; *it; ++it) {
+ DOMListViewItem *item = static_cast<DOMListViewItem *>(*it);
+// kdDebug(90180) << " item->node " << item->node().nodeName().string() << " clos " << item->isClosing() << endl;
+ if (item->isClosing()) continue;
+
+ // don't regard node more than once
+ if (item->node() == last) continue;
+
+ // check for selected parent
+ bool has_selected_parent = false;
+ for (QListViewItem *p = item->parent(); p; p = p->parent()) {
+ if (p->isSelected()) { has_selected_parent = true; break; }
+ }
+ if (has_selected_parent) continue;
+
+// kdDebug(90180) << " item->node " << item->node().nodeName().string() << ": schedule for removal" << endl;
+ // remove this node if it isn't already recursively removed by its parent
+ cmd->addCommand(new RemoveNodeCommand(item->node(), item->node().parentNode(), item->node().nextSibling()));
+ last = item->node();
+ }
+ mainWindow()->executeAndAddCommand(cmd);
+}
+
+void DOMTreeView::disconnectFromTornDownPart()
+{
+ if (!part) return;
+
+ m_listView->clear();
+ initializeOptionsFromNode(DOM::Node());
+
+ // remove all references to nodes
+ infoNode = DOM::Node(); // ### have this handled by dedicated info node panel method
+ current_node = DOM::Node();
+ active_node_rule = DOM::CSSRule();
+ stylesheet = DOM::CSSStyleSheet();
+}
+
+void DOMTreeView::connectToPart()
+{
+ if (part) {
+ connect(part, SIGNAL(nodeActivated(const DOM::Node &)), this,
+ SLOT(activateNode(const DOM::Node &)));
+ connect(part, SIGNAL(completed()), this, SLOT(refresh()));
+
+ // insert a style rule to indicate activated nodes
+ try {
+kdDebug(90180) << "(1) part.document: " << part->document().handle() << endl;
+ stylesheet = part->document().implementation().createCSSStyleSheet("-domtreeviewer-style", "screen");
+kdDebug(90180) << "(2)" << endl;
+ stylesheet.insertRule(":focus { outline: medium #f00 solid }", 0);
+ // ### for testing only
+// stylesheet.insertRule("body { background: #f0f !important }", 1);
+kdDebug(90180) << "(3)" << endl;
+ active_node_rule = stylesheet.cssRules().item(0);
+kdDebug(90180) << "(4)" << endl;
+ part->document().addStyleSheet(stylesheet);
+kdDebug(90180) << "(5)" << endl;
+ } catch (DOM::CSSException &ex) {
+ kdDebug(90180) << "CSS Exception " << ex.code << endl;
+ } catch (DOM::DOMException &ex) {
+ kdDebug(90180) << "DOM Exception " << ex.code << endl;
+ }
+ }
+
+ slotShowTree(part ? (DOM::Node)part->document() : DOM::Node());
+ updateIncrDecreaseButton();
+}
+
+void DOMTreeView::disconnectFromActivePart()
+{
+ if (!part) return;
+
+ // remove style sheet
+ try {
+ part->document().removeStyleSheet(stylesheet);
+ } catch (DOM::CSSException &ex) {
+ kdDebug(90180) << "CSS Exception " << ex.code << endl;
+ } catch (DOM::DOMException &ex) {
+ kdDebug(90180) << "DOM Exception " << ex.code << endl;
+ }
+
+}
+
+void DOMTreeView::slotSetHtmlPartDelayed()
+{
+ connectToPart();
+ emit htmlPartChanged(part);
+}
+
+void DOMTreeView::slotRestoreScrollOffset()
+{
+ m_listView->setUpdatesEnabled(true);
+ m_listView->setContentsPos(scroll_ofs_x, scroll_ofs_y);
+}
+
+void DOMTreeView::slotAddElementDlg()
+{
+ DOMListViewItem *item = static_cast<DOMListViewItem *>(m_listView->currentItem());
+ if (!item) return;
+
+ QString qname;
+ QString namespc;
+ SignalReceiver addBefore;
+
+ {
+ ElementEditDialog dlg(this, "ElementEditDialog", true);
+ connect(dlg.insBeforeBtn, SIGNAL(clicked()), &addBefore, SLOT(slot()));
+
+ // ### activate when namespaces are supported
+ dlg.elemNamespace->setEnabled(false);
+
+ if (dlg.exec() != QDialog::Accepted) return;
+
+ qname = dlg.elemName->text();
+ namespc = dlg.elemNamespace->currentText();
+ }
+
+ DOM::Node curNode = item->node();
+
+ try {
+ DOM::Node parent = addBefore() ? curNode.parentNode() : curNode;
+ DOM::Node after = addBefore() ? curNode : 0;
+
+ // ### take namespace into account
+ DOM::Node newNode = curNode.ownerDocument().createElement(qname);
+
+ ManipulationCommand *cmd = new InsertNodeCommand(newNode, parent, after);
+ mainWindow()->executeAndAddCommand(cmd);
+
+ if (cmd->isValid()) activateNode(newNode);
+
+ } catch (DOM::DOMException &ex) {
+ mainWindow()->addMessage(ex.code, domErrorMessage(ex.code));
+ }
+}
+
+void DOMTreeView::slotAddTextDlg()
+{
+ DOMListViewItem *item = static_cast<DOMListViewItem *>(m_listView->currentItem());
+ if (!item) return;
+
+ QString text;
+ SignalReceiver addBefore;
+
+ {
+ TextEditDialog dlg(this, "TextEditDialog", true);
+ connect(dlg.insBeforeBtn, SIGNAL(clicked()), &addBefore, SLOT(slot()));
+
+ if (dlg.exec() != QDialog::Accepted) return;
+
+ text = dlg.textPane->text();
+ }
+
+ DOM::Node curNode = item->node();
+
+ try {
+ DOM::Node parent = addBefore() ? curNode.parentNode() : curNode;
+ DOM::Node after = addBefore() ? curNode : 0;
+
+ DOM::Node newNode = curNode.ownerDocument().createTextNode(text);
+
+ ManipulationCommand *cmd = new InsertNodeCommand(newNode, parent, after);
+ mainWindow()->executeAndAddCommand(cmd);
+
+ if (cmd->isValid()) activateNode(newNode);
+
+ } catch (DOM::DOMException &ex) {
+ mainWindow()->addMessage(ex.code, domErrorMessage(ex.code));
+ }
+}
+
+// == DOM Node info panel =============================================
+
+static QString *clickToAdd;
+
+/**
+ * List view item for attribute list.
+ */
+class AttributeListItem : public QListViewItem
+{
+ typedef QListViewItem super;
+
+ bool _new;
+
+public:
+ AttributeListItem(QListView *parent, QListViewItem *prev)
+ : super(parent, prev), _new(true)
+ {
+ }
+
+ AttributeListItem(const QString &attrName, const QString &attrValue,
+ QListView *parent, QListViewItem *prev)
+ : super(parent, prev), _new(false)
+ {
+ setText(0, attrName);
+ setText(1, attrValue);
+ }
+
+ bool isNew() const { return _new; }
+ void setNew(bool s) { _new = s; }
+
+ virtual int compare(QListViewItem *item, int column, bool ascend) const
+ {
+ return _new ? 1 : super::compare(item, column, ascend);
+ }
+
+protected:
+ virtual void paintCell( QPainter *p, const QColorGroup &cg,
+ int column, int width, int alignment )
+ {
+ bool updates_enabled = listView()->isUpdatesEnabled();
+ listView()->setUpdatesEnabled(false);
+
+ QColor c = cg.text();
+ bool text_changed = false;
+ QString oldText;
+
+ if (_new) {
+ c = QApplication::palette().color( QPalette::Disabled, QColorGroup::Text );
+
+ if (!clickToAdd) clickToAdd = new QString(i18n("<Click to add>"));
+ oldText = text(column);
+ text_changed = true;
+ if (column == 0) setText(0, *clickToAdd); else setText(1, QString());
+ }
+
+ QColorGroup _cg( cg );
+ _cg.setColor( QColorGroup::Text, c );
+ super::paintCell( p, _cg, column, width, alignment );
+
+ if (text_changed) setText(column, oldText);
+ listView()->setUpdatesEnabled(updates_enabled);
+ }
+
+};
+
+void DOMTreeView::initDOMNodeInfo()
+{
+ connect(m_listView, SIGNAL(clicked(QListViewItem *)),
+ SLOT(initializeOptionsFromListItem(QListViewItem *)));
+
+ connect(nodeAttributes, SIGNAL(itemRenamed(QListViewItem *, const QString &, int)),
+ SLOT(slotItemRenamed(QListViewItem *, const QString &, int)));
+ connect(nodeAttributes, SIGNAL(executed(QListViewItem *, const QPoint &, int)),
+ SLOT(slotEditAttribute(QListViewItem *, const QPoint &, int)));
+ connect(nodeAttributes, SIGNAL(contextMenuRequested(QListViewItem *, const QPoint &, int)),
+ SLOT(showInfoPanelContextMenu(QListViewItem *, const QPoint &, int)));
+
+ connect(applyContent, SIGNAL(clicked()), SLOT(slotApplyContent()));
+
+ ManipulationCommand::connect(SIGNAL(nodeChanged(const DOM::Node &)), this, SLOT(initializeOptionsFromNode(const DOM::Node &)));
+
+ nodeAttributes->setRenameable(0, true);
+ nodeAttributes->setRenameable(1, true);
+
+ nodeInfoStack->raiseWidget(EmptyPanel);
+
+ installEventFilter(nodeAttributes);
+}
+
+void DOMTreeView::initializeOptionsFromNode(const DOM::Node &node)
+{
+ infoNode = node;
+
+ nodeName->clear();
+ nodeType->clear();
+ nodeNamespace->clear();
+ nodeValue->clear();
+
+ if (node.isNull()) {
+ nodeInfoStack->raiseWidget(EmptyPanel);
+ return;
+ }
+
+ nodeName->setText(node.nodeName().string());
+ nodeType->setText(QString::number(node.nodeType()));
+ nodeNamespace->setText(node.namespaceURI().string());
+// nodeValue->setText(node.value().string());
+
+ DOM::Element element = node;
+ if (!element.isNull()) {
+ initializeOptionsFromElement(element);
+ return;
+ }
+
+ DOM::CharacterData cdata = node;
+ if (!cdata.isNull()) {
+ initializeOptionsFromCData(cdata);
+ return;
+ }
+
+ // Fallback
+ nodeInfoStack->raiseWidget(EmptyPanel);
+}
+
+void DOMTreeView::initializeOptionsFromListItem(QListViewItem *item)
+{
+ const DOMListViewItem *cur_item = static_cast<const DOMListViewItem *>(item);
+
+// kdDebug(90180) << "cur_item: " << cur_item << endl;
+ initializeOptionsFromNode(cur_item ? cur_item->node() : DOM::Node());
+}
+
+void DOMTreeView::initializeOptionsFromElement(const DOM::Element &element)
+{
+ QListViewItem *last = 0;
+ nodeAttributes->clear();
+
+ DOM::NamedNodeMap attrs = element.attributes();
+ unsigned long lmap = attrs.length();
+ for (unsigned int j = 0; j < lmap; j++) {
+ DOM::Attr attr = attrs.item(j);
+// kdDebug(90180) << attr.name().string() << "=" << attr.value().string() << endl;
+ QListViewItem *item = new AttributeListItem(attr.name().string(),
+ attr.value().string(), nodeAttributes, last);
+ last = item;
+ }
+
+ // append new item
+ last = new AttributeListItem(nodeAttributes, last);
+
+ nodeInfoStack->raiseWidget(ElementPanel);
+}
+
+void DOMTreeView::initializeOptionsFromCData(const DOM::CharacterData &cdata)
+{
+ contentEditor->setText(cdata.data().string());
+
+ DOM::Text text = cdata;
+ contentEditor->setEnabled(!text.isNull());
+
+ nodeInfoStack->raiseWidget(CDataPanel);
+}
+
+void DOMTreeView::slotItemRenamed(QListViewItem *lvi, const QString &str, int col)
+{
+ AttributeListItem *item = static_cast<AttributeListItem *>(lvi);
+
+ DOM::Element element = infoNode;
+ if (element.isNull()) return; // Should never happen
+
+ switch (col) {
+ case 0: {
+ ManipulationCommand *cmd;
+// kdDebug(90180) << k_funcinfo << "col 0: " << element.nodeName() << " isNew: " << item->isNew() << endl;
+ if (item->isNew()) {
+ cmd = new AddAttributeCommand(element, str, item->text(1));
+ item->setNew(false);
+ } else
+ cmd = new RenameAttributeCommand(element, item->text(0), str);
+
+ mainWindow()->executeAndAddCommand(cmd);
+ break;
+ }
+ case 1: {
+ if (item->isNew()) { lvi->setText(1, QString()); break; }
+
+ ChangeAttributeValueCommand *cmd = new ChangeAttributeValueCommand(
+ element, item->text(0), str);
+ mainWindow()->executeAndAddCommand(cmd);
+ break;
+ }
+ }
+}
+
+void DOMTreeView::slotEditAttribute(QListViewItem *lvi, const QPoint &, int col)
+{
+ if (!lvi) return;
+
+ QString attrName = lvi->text(0);
+ QString attrValue = lvi->text(1);
+ int res = 0;
+
+ {
+ AttributeEditDialog dlg(this, "AttributeEditDialog", true);
+ dlg.attrName->setText(attrName);
+ dlg.attrValue->setText(attrValue);
+
+ if (col == 0) {
+ dlg.attrName->setFocus();
+ dlg.attrName->selectAll();
+ } else {
+ dlg.attrValue->setFocus();
+ dlg.attrValue->selectAll();
+ }
+
+ res = dlg.exec();
+
+ attrName = dlg.attrName->text();
+ attrValue = dlg.attrValue->text();
+ }
+
+// kdDebug(90180) << "name=" << attrName << " value=" << attrValue << endl;
+
+ if (res == QDialog::Accepted) do {
+ if (attrName.isEmpty()) break;
+
+ if (lvi->text(0) != attrName) {
+ // hack: set value to assign attribute/value pair in one go
+ lvi->setText(1, attrValue);
+
+ slotItemRenamed(lvi, attrName, 0);
+ // Reget, item may have been changed
+ lvi = nodeAttributes->findItem(attrName, 0);
+ }
+
+ if (lvi && lvi->text(1) != attrValue)
+ slotItemRenamed(lvi, attrValue, 1);
+
+ } while(false) /*end if*/;
+}
+
+
+void DOMTreeView::slotApplyContent()
+{
+ DOM::CharacterData cdata = infoNode;
+
+ if (cdata.isNull()) return;
+
+ ManipulationCommand *cmd = new ChangeCDataCommand(cdata, contentEditor->text());
+ mainWindow()->executeAndAddCommand(cmd);
+}
+
+void DOMTreeView::showInfoPanelContextMenu(QListViewItem */*lvi*/, const QPoint &pos, int /*col*/)
+{
+ QPopupMenu *ctx = mainWindow()->infoPanelAttrContextMenu();
+ Q_ASSERT(ctx);
+ ctx->popup(pos);
+}
+
+void DOMTreeView::copyAttributes()
+{
+ // TODO implement me
+}
+
+void DOMTreeView::cutAttributes()
+{
+ // TODO implement me
+}
+
+void DOMTreeView::pasteAttributes()
+{
+ // TODO implement me
+}
+
+void DOMTreeView::deleteAttributes()
+{
+ MultiCommand *cmd = new MultiCommand(i18n("Delete Attributes"));
+ QListViewItemIterator it(nodeAttributes, QListViewItemIterator::Selected);
+ for (; *it; ++it) {
+ AttributeListItem *item = static_cast<AttributeListItem *>(*it);
+ if (item->isNew()) continue;
+
+ cmd->addCommand(new RemoveAttributeCommand(infoNode, item->text(0)));
+ }
+ mainWindow()->executeAndAddCommand(cmd);
+}
+
+#include "domtreeview.moc"
diff --git a/konq-plugins/domtreeviewer/domtreeview.h b/konq-plugins/domtreeviewer/domtreeview.h
new file mode 100644
index 0000000..0e9977d
--- /dev/null
+++ b/konq-plugins/domtreeviewer/domtreeview.h
@@ -0,0 +1,203 @@
+/***************************************************************************
+ domtreeview.h
+ -------------------
+
+ copyright : (C) 2001 - The Kafka Team/Andreas Schlapbach
+ (C) 2005 - Leo Savernik
+ email : kde-kafka@master.kde.org
+ schlpbch@iam.unibe.ch
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+/* $Id$ */
+
+#ifndef DOMTREEVIEW_H
+#define DOMTREEVIEW_H
+
+#include <qptrdict.h>
+#include <qptrlist.h>
+#include <dom/css_stylesheet.h>
+#include <dom/css_rule.h>
+#include <dom/dom_node.h>
+
+#include "domtreeviewbase.h"
+
+namespace DOM {
+ class Element;
+ class CharacterData;
+}
+
+class DOMListViewItem;
+class DOMTreeWindow;
+
+class QListViewItem;
+
+class KPushButton;
+class KEdFind;
+class KHTMLPart;
+
+class DOMTreeView : public DOMTreeViewBase
+{
+ Q_OBJECT
+
+ public:
+ DOMTreeView(QWidget *parent, const char* name, bool allowSaving = true);
+ ~DOMTreeView();
+
+ KHTMLPart *htmlPart() const { return part; }
+ void setHtmlPart(KHTMLPart *);
+
+ /** returns the main window */
+ DOMTreeWindow *mainWindow() const;
+
+ protected:
+ /*
+ void saveTreeAsHTML(const DOM::Node &pNode);
+ */
+ virtual bool eventFilter(QObject *o, QEvent *e);
+
+ signals:
+ /** emitted when the part has been changed. */
+ void htmlPartChanged(KHTMLPart *part);
+
+ public slots:
+ void refresh();
+ void increaseExpansionDepth();
+ void decreaseExpansionDepth();
+ void setMessage(const QString &msg);
+ void hideMessageLine();
+
+ void moveToParent();
+
+ void activateNode(const DOM::Node &node);
+ void deleteNodes();
+
+ /**
+ * Takes measures to disconnect this instance from the current html
+ * part as long as it is active.
+ */
+ void disconnectFromActivePart();
+
+ /**
+ * Takes measures to disconnect this instance from the current html
+ * part when it is being torn down.
+ */
+ void disconnectFromTornDownPart();
+
+ /**
+ * Connects to the current html part.
+ */
+ void connectToPart();
+
+ void slotFindClicked();
+ void slotAddElementDlg();
+ void slotAddTextDlg();
+
+ protected slots:
+ void slotShowNode(const DOM::Node &pNode);
+ void slotShowTree(const DOM::Node &pNode);
+ void slotItemClicked(QListViewItem *);
+ void slotRefreshNode(const DOM::Node &pNode);
+ void slotMovedItems(QPtrList<QListViewItem> &items, QPtrList<QListViewItem> &afterFirst, QPtrList<QListViewItem> &afterNow);
+ void slotPrepareMove();
+ void slotSearch();
+
+ // void slotSaveClicked();
+
+ void slotPureToggled(bool);
+ void slotShowAttributesToggled(bool);
+ void slotHighlightHTMLToggled(bool);
+
+ void showDOMTreeContextMenu(QListViewItem *, const QPoint &, int);
+
+ void slotSetHtmlPartDelayed();
+ void slotRestoreScrollOffset();
+
+ private:
+ QPtrDict<DOMListViewItem> m_itemdict;
+ DOM::Node m_document;
+
+ uint m_expansionDepth, m_maxDepth;
+ bool m_bPure, m_bShowAttributes, m_bHighlightHTML;
+
+ private:
+ void showRecursive(const DOM::Node &pNode, const DOM::Node &node,
+ uint depth);
+
+ // void saveRecursive(const DOM::Node &node, int ident);
+
+ void searchRecursive(DOMListViewItem *cur_item,
+ const QString &searchText,
+ bool caseSensitive);
+
+ void adjustDepth();
+ void adjustDepthRecursively(QListViewItem *cur_item, uint currDepth);
+ void highlightHTML(DOMListViewItem *cur_item,
+ const QString &nodeName);
+
+ void addElement(const DOM::Node &node, DOMListViewItem *cur_item,
+ bool isLast);
+ void updateIncrDecreaseButton();
+
+ private:
+ KEdFind* m_findDialog;
+
+ KHTMLPart *part;
+ QTextStream* m_textStream;
+
+ const KListView* m_rootListView;
+
+ KPushButton* m_saveButton;
+ QObject *focused_child;
+ DOM::Node current_node;
+ DOM::CSSStyleSheet stylesheet;
+ DOM::CSSRule active_node_rule;
+
+ bool _refreshed;
+ int scroll_ofs_x, scroll_ofs_y;
+
+
+ // == DOM Node Info panel ======================================
+
+ public:
+ // Keep in sync with the widget stack children
+ enum InfoPanel { ElementPanel, CDataPanel, EmptyPanel };
+
+ public slots:
+ void initializeOptionsFromNode(const DOM::Node &);
+ void initializeOptionsFromListItem(QListViewItem *);
+
+ void copyAttributes();
+ void cutAttributes();
+ void pasteAttributes();
+ void deleteAttributes();
+
+ private:
+ void initDOMNodeInfo();
+
+ void initializeOptionsFromElement(const DOM::Element &);
+ void initializeOptionsFromCData(const DOM::CharacterData &);
+
+ private slots:
+ void slotItemRenamed(QListViewItem *, const QString &str, int col);
+ void slotEditAttribute(QListViewItem *, const QPoint &, int col);
+ void slotApplyContent();
+
+ void showInfoPanelContextMenu(QListViewItem *, const QPoint &, int);
+
+ private:
+ DOM::Node infoNode; // node these infos apply to
+
+ // == End DOM Node Info panel ==================================
+
+};
+
+#endif
diff --git a/konq-plugins/domtreeviewer/domtreeviewbase.ui b/konq-plugins/domtreeviewer/domtreeviewbase.ui
new file mode 100644
index 0000000..984e435
--- /dev/null
+++ b/konq-plugins/domtreeviewer/domtreeviewbase.ui
@@ -0,0 +1,525 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DOMTreeViewBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>DOMTreeViewBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>508</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>600</width>
+ <height>380</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>DOM Tree Viewer</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QFrame">
+ <property name="name">
+ <cstring>messageLinePane</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>170</red>
+ <green>0</green>
+ <blue>127</blue>
+ </color>
+ </property>
+ <property name="frameShape">
+ <enum>Panel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>1</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>messageLine</cstring>
+ </property>
+ <property name="paletteForegroundColor">
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>127</blue>
+ </color>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>170</red>
+ <green>0</green>
+ <blue>127</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="frame">
+ <bool>false</bool>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>messageListBtn</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>10</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>&amp;List</string>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>10</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>messageHideBtn</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>10</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>H&amp;ide</string>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KListView">
+ <column>
+ <property name="text">
+ <string>DOM Tree</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>m_listView</cstring>
+ </property>
+ <property name="acceptDrops">
+ <bool>true</bool>
+ </property>
+ <property name="selectionMode" stdset="0">
+ <enum>Extended</enum>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>true</bool>
+ </property>
+ <property name="dragEnabled">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>300</width>
+ <height>400</height>
+ </size>
+ </property>
+ <property name="title">
+ <string>DOM Node Info</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel1_2_3</cstring>
+ </property>
+ <property name="text">
+ <string>Node &amp;value:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>nodeValue</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel1_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Node &amp;type:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>nodeType</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Namespace &amp;URI:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>nodeNamespace</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Node &amp;name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>nodeName</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>nodeNamespace</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="lineWidth">
+ <number>0</number>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="3" column="1">
+ <property name="name">
+ <cstring>nodeValue</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="lineWidth">
+ <number>0</number>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>nodeType</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="lineWidth">
+ <number>0</number>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="KLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>nodeName</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="lineWidth">
+ <number>0</number>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidgetStack">
+ <property name="name">
+ <cstring>nodeInfoStack</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>ElementInfo</cstring>
+ </property>
+ <attribute name="id">
+ <number>0</number>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <widget class="KListView">
+ <column>
+ <property name="text">
+ <string>Name</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Value</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>nodeAttributes</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>StrongFocus</enum>
+ </property>
+ <property name="selectionMode" stdset="0">
+ <enum>Extended</enum>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="showSortIndicator">
+ <bool>true</bool>
+ </property>
+ <property name="itemsMovable">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>CharacterData</cstring>
+ </property>
+ <attribute name="id">
+ <number>1</number>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <widget class="KTextEdit">
+ <property name="name">
+ <cstring>contentEditor</cstring>
+ </property>
+ <property name="textFormat">
+ <enum>PlainText</enum>
+ </property>
+ <property name="tabChangesFocus">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>applyContent</cstring>
+ </property>
+ <property name="text">
+ <string>Appl&amp;y</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>81</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>Empty</cstring>
+ </property>
+ <attribute name="id">
+ <number>2</number>
+ </attribute>
+ </widget>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox2</cstring>
+ </property>
+ <property name="title">
+ <string>DOM Tree Options</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>m_pureCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Pure</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>m_showAttributesCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Show &amp;attributes</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>m_highlightHTMLCheckBox</cstring>
+ </property>
+ <property name="text">
+ <string>Highlight &amp;HTML</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<tabstops>
+ <tabstop>m_listView</tabstop>
+ <tabstop>nodeName</tabstop>
+ <tabstop>nodeNamespace</tabstop>
+ <tabstop>nodeType</tabstop>
+ <tabstop>nodeValue</tabstop>
+ <tabstop>contentEditor</tabstop>
+ <tabstop>applyContent</tabstop>
+ <tabstop>m_pureCheckBox</tabstop>
+ <tabstop>m_showAttributesCheckBox</tabstop>
+ <tabstop>m_highlightHTMLCheckBox</tabstop>
+ <tabstop>nodeAttributes</tabstop>
+</tabstops>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>klistview.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>klistview.h</includehint>
+ <includehint>ktextedit.h</includehint>
+</includehints>
+</UI>
diff --git a/konq-plugins/domtreeviewer/domtreeviewerui.rc b/konq-plugins/domtreeviewer/domtreeviewerui.rc
new file mode 100644
index 0000000..7249b63
--- /dev/null
+++ b/konq-plugins/domtreeviewer/domtreeviewerui.rc
@@ -0,0 +1,45 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="domtreeviewer" version="1">
+<MenuBar>
+ <Menu name="file"><text>&amp;File</text>
+ </Menu>
+ <Menu name="edit"><text>&amp;Edit</text>
+ </Menu>
+ <Menu name="view"><text>&amp;View</text>
+ <WeakSeparator />
+ <Action name="tree_inc_level" />
+ <Action name="tree_dec_level" />
+ <Separator />
+ <Action name="show_msg_dlg" />
+ </Menu>
+ <Menu name="go"><text>&amp;Go</text>
+ <Action name="tree_up" />
+ </Menu>
+</MenuBar>
+<ToolBar name="mainToolBar"><text>Main Toolbar</text>
+</ToolBar>
+<ToolBar name="treeToolBar"><text>Tree Toolbar</text>
+ <Action name="tree_up" />
+ <Action name="view_redisplay" />
+ <Separator />
+ <Action name="tree_dec_level" />
+ <Action name="tree_inc_level" />
+</ToolBar>
+<Menu name="infopanelattr_context">
+ <Action name="edit_cut" />
+ <Action name="edit_copy" />
+ <Action name="edit_paste" />
+ <Separator />
+ <Action name="attr_delete" />
+</Menu>
+<Menu name="domtree_context">
+ <Action name="tree_add_element" />
+ <Action name="tree_add_text" />
+ <Separator />
+ <Action name="edit_cut" />
+ <Action name="edit_copy" />
+ <Action name="edit_paste" />
+ <Separator />
+ <Action name="tree_delete" />
+</Menu>
+</kpartgui>
diff --git a/konq-plugins/domtreeviewer/domtreewindow.cpp b/konq-plugins/domtreeviewer/domtreewindow.cpp
new file mode 100644
index 0000000..f8b9ed5
--- /dev/null
+++ b/konq-plugins/domtreeviewer/domtreewindow.cpp
@@ -0,0 +1,379 @@
+/* This file is part of the KDE project
+ *
+ * Copyright (C) 2005 Leo Savernik <l.savernik@aon.at>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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 the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "domtreewindow.h"
+#include "domtreeview.h"
+#include "domtreecommands.h"
+#include "messagedialog.h"
+#include "plugin_domtreeviewer.h"
+
+#include <kaccel.h>
+#include <kapplication.h>
+#include <kcommand.h>
+#include <kconfig.h>
+#include <kdeversion.h>
+#include <kglobal.h>
+#include <khtml_part.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kmenubar.h>
+#include <kstatusbar.h>
+#include <kstandarddirs.h>
+#include <ktextedit.h>
+#include <kurl.h>
+#include <kurldrag.h>
+#include <kurlrequesterdlg.h>
+
+#include <kparts/partmanager.h>
+#include <kparts/browserextension.h>
+
+#include <kedittoolbar.h>
+
+#include <kstdaccel.h>
+#include <kaction.h>
+#include <kstdaction.h>
+
+#include <qdatetime.h>
+#include <qtimer.h>
+
+using domtreeviewer::ManipulationCommand;
+
+DOMTreeWindow::DOMTreeWindow(PluginDomtreeviewer *plugin)
+ : KMainWindow( 0, "DOMTreeWindow" ),
+ m_plugin(plugin), m_view(new DOMTreeView(this, "DOMTreeView", false))
+{
+ part_manager = 0;
+
+ // set configuration object
+ _config = new KConfig("domtreeviewerrc");
+
+ // accept dnd
+ setAcceptDrops(true);
+
+ // tell the KMainWindow that this is indeed the main widget
+ setCentralWidget(m_view);
+
+ // message window dialog
+ msgdlg = new MessageDialog(0, "MessageDialog");
+ msgdlg->messagePane->setPaletteBackgroundColor(palette().active().base());
+// msgdlg->show();
+
+ // then, setup our actions
+ setupActions();
+
+ // Add typical actions and save size/toolbars/statusbar
+ setupGUI(ToolBar | Keys | StatusBar | Save | Create,
+ locate( "data", "domtreeviewer/domtreeviewerui.rc", instance()));
+
+ // allow the view to change the statusbar and caption
+#if 0
+ connect(m_view, SIGNAL(signalChangeStatusbar(const QString&)),
+ this, SLOT(changeStatusbar(const QString&)));
+ connect(m_view, SIGNAL(signalChangeCaption(const QString&)),
+ this, SLOT(changeCaption(const QString&)));
+#endif
+ connect(view(), SIGNAL(htmlPartChanged(KHTMLPart *)),
+ SLOT(slotHtmlPartChanged(KHTMLPart *)));
+
+ ManipulationCommand::connect(SIGNAL(error(int, const QString &)),
+ this, SLOT(addMessage(int, const QString &)));
+
+ infopanel_ctx = createInfoPanelAttrContextMenu();
+ domtree_ctx = createDOMTreeViewContextMenu();
+
+}
+
+DOMTreeWindow::~DOMTreeWindow()
+{
+ kdDebug(90180) << k_funcinfo << this << endl;
+ delete m_commandHistory;
+ delete msgdlg;
+ delete _config;
+}
+
+void DOMTreeWindow::executeAndAddCommand(ManipulationCommand *cmd)
+{
+ cmd->execute();
+ if (cmd->isValid()) {
+ m_commandHistory->addCommand(cmd, false);
+ view()->hideMessageLine();
+ }
+}
+
+void DOMTreeWindow::setupActions()
+{
+ KStdAction::close(this, SLOT(close()), actionCollection());
+
+ KStdAction::cut(this, SLOT(slotCut()), actionCollection())->setEnabled(false);
+ KStdAction::copy(this, SLOT(slotCopy()), actionCollection())->setEnabled(false);
+ KStdAction::paste(this, SLOT(slotPaste()), actionCollection())->setEnabled(false);
+
+ m_commandHistory = new KCommandHistory(actionCollection());
+
+ KStdAction::find(this, SLOT(slotFind()), actionCollection());
+
+ KStdAction::redisplay(m_view, SLOT(refresh()), actionCollection());
+
+ // toggle manipulation dialog
+ KAction *showMsgDlg = new KAction(i18n("Show Message Log"),
+ CTRL+Key_E, actionCollection(), "show_msg_dlg");
+ connect(showMsgDlg, SIGNAL(activated()), SLOT(showMessageLog()));
+
+// KAction *custom = new KAction(i18n("Cus&tom Menuitem"), 0,
+// this, SLOT(optionsPreferences()),
+// actionCollection(), "custom_action");
+
+ // actions for the dom tree list view toolbar
+ KStdAction::up(view(), SLOT(moveToParent()), actionCollection(), "tree_up");
+ KAction *tree_inc_level = new KAction(i18n("Expand"),
+ "1rightarrow", CTRL+Key_Greater, view(),
+ SLOT(increaseExpansionDepth()), actionCollection(),
+ "tree_inc_level");
+ tree_inc_level->setToolTip(i18n("Increase expansion level"));
+ KAction *tree_dec_level = new KAction(i18n("Collapse"),
+ "1leftarrow", CTRL+Key_Less, view(),
+ SLOT(decreaseExpansionDepth()), actionCollection(),
+ "tree_dec_level");
+ tree_dec_level->setToolTip(i18n("Decrease expansion level"));
+
+ // actions for the dom tree list view context menu
+
+ del_tree = new KAction(i18n("&Delete"), "editdelete",
+ Key_Delete, view(), SLOT(deleteNodes()),
+ actionCollection(), "tree_delete");
+ del_tree->setToolTip(i18n("Delete nodes"));
+ /*KAction *new_elem = */new KAction(i18n("New &Element ..."),
+ "bookmark", KShortcut(), view(),
+ SLOT(slotAddElementDlg()), actionCollection(),
+ "tree_add_element");
+ /*KAction *new_text = */new KAction(i18n("New &Text Node ..."),
+ "text", KShortcut(), view(), SLOT(slotAddTextDlg()),
+ actionCollection(), "tree_add_text");
+
+ // actions for the info panel attribute list context menu
+ del_attr = new KAction(i18n("&Delete"), "editdelete",
+ Key_Delete, view(), SLOT(deleteAttributes()),
+ actionCollection(), "attr_delete");
+ del_attr->setToolTip(i18n("Delete attributes"));
+
+}
+
+QPopupMenu *DOMTreeWindow::createInfoPanelAttrContextMenu()
+{
+ QWidget *w = factory()->container("infopanelattr_context", this);
+ Q_ASSERT(w);
+ return static_cast<QPopupMenu *>(w);
+}
+
+QPopupMenu *DOMTreeWindow::createDOMTreeViewContextMenu()
+{
+ QWidget *w = factory()->container("domtree_context", this);
+ Q_ASSERT(w);
+ return static_cast<QPopupMenu *>(w);
+}
+
+void DOMTreeWindow::saveProperties(KConfig *config)
+{
+ // the 'config' object points to the session managed
+ // config file. anything you write here will be available
+ // later when this app is restored
+
+#if 0
+ if (!m_view->currentURL().isNull()) {
+#if KDE_IS_VERSION(3,1,3)
+ config->writePathEntry("lastURL", m_view->currentURL());
+#else
+ config->writeEntry("lastURL", m_view->currentURL());
+#endif
+ }
+#endif
+}
+
+void DOMTreeWindow::readProperties(KConfig *config)
+{
+ // the 'config' object points to the session managed
+ // config file. this function is automatically called whenever
+ // the app is being restored. read in here whatever you wrote
+ // in 'saveProperties'
+
+#if 0
+ QString url = config->readPathEntry("lastURL");
+
+ if (!url.isEmpty())
+ m_view->openURL(KURL::fromPathOrURL(url));
+#endif
+}
+
+void DOMTreeWindow::dragEnterEvent(QDragEnterEvent *event)
+{
+ // accept uri drops only
+ event->accept(KURLDrag::canDecode(event));
+}
+
+void DOMTreeWindow::dropEvent(QDropEvent *event)
+{
+ // this is a very simplistic implementation of a drop event. we
+ // will only accept a dropped URL. the Qt dnd code can do *much*
+ // much more, so please read the docs there
+ KURL::List urls;
+
+ // see if we can decode a URI.. if not, just ignore it
+ if (KURLDrag::decode(event, urls) && !urls.isEmpty())
+ {
+ // okay, we have a URI.. process it
+ const KURL &url = urls.first();
+#if 0
+ // load in the file
+ load(url);
+#endif
+ }
+}
+
+void DOMTreeWindow::addMessage(int msg_id, const QString &msg)
+{
+ QDateTime t(QDateTime::currentDateTime());
+ QString fullmsg = t.toString();
+ fullmsg += ":";
+
+ if (msg_id != 0)
+ fullmsg += " (" + QString::number(msg_id) + ") ";
+ fullmsg += msg;
+
+ if (msgdlg) msgdlg->addMessage(fullmsg);
+ view()->setMessage(msg);
+ kdWarning() << fullmsg << endl;
+}
+void DOMTreeWindow::slotCut()
+{
+ // TODO implement
+}
+
+void DOMTreeWindow::slotCopy()
+{
+ // TODO implement
+}
+
+void DOMTreeWindow::slotPaste()
+{
+ // TODO implement
+}
+
+void DOMTreeWindow::slotFind()
+{
+ view()->slotFindClicked();
+}
+
+void DOMTreeWindow::showMessageLog()
+{
+ msgdlg->show();
+ msgdlg->raise();
+ msgdlg->setActiveWindow();
+}
+
+void DOMTreeWindow::optionsConfigureToolbars()
+{
+ // use the standard toolbar editor
+ saveMainWindowSettings( config(), autoSaveGroup() );
+ KEditToolbar dlg(actionCollection());
+ connect(&dlg, SIGNAL(newToolbarConfig()), this, SLOT(newToolbarConfig()));
+ dlg.exec();
+}
+
+void DOMTreeWindow::newToolbarConfig()
+{
+ // this slot is called when user clicks "Ok" or "Apply" in the toolbar editor.
+ // recreate our GUI, and re-apply the settings (e.g. "text under icons", etc.)
+ createGUI(locate( "data", "domtreeviewer/domtreeviewerui.rc", instance()));
+ applyMainWindowSettings( config(), autoSaveGroup() );
+}
+
+void DOMTreeWindow::optionsPreferences()
+{
+#if 0
+ // popup some sort of preference dialog, here
+ DOMTreeWindowPreferences dlg;
+ if (dlg.exec())
+ {
+ // redo your settings
+ }
+#endif
+}
+
+void DOMTreeWindow::changeStatusbar(const QString& text)
+{
+ // display the text on the statusbar
+ statusBar()->message(text);
+}
+
+void DOMTreeWindow::changeCaption(const QString& text)
+{
+ // display the text on the caption
+ setCaption(text);
+}
+
+void DOMTreeWindow::slotHtmlPartChanged(KHTMLPart *p)
+{
+ kdDebug(90180) << k_funcinfo << p << endl;
+
+ if (p) {
+ // set up manager connections
+ if ( part_manager )
+ disconnect(part_manager);
+
+ part_manager = p->manager();
+
+ connect(part_manager, SIGNAL(activePartChanged(KParts::Part *)),
+ SLOT(slotActivePartChanged(KParts::Part *)));
+ connect(part_manager, SIGNAL(partRemoved(KParts::Part *)),
+ SLOT(slotPartRemoved(KParts::Part *)));
+
+ // set up browser extension connections
+ connect(p, SIGNAL(docCreated()), SLOT(slotClosePart()));
+ }
+}
+
+void DOMTreeWindow::slotActivePartChanged(KParts::Part *p)
+{
+ kdDebug(90180) << k_funcinfo << p << endl;
+ Q_ASSERT(p != view()->htmlPart());
+
+ m_commandHistory->clear();
+ view()->disconnectFromTornDownPart();
+ view()->setHtmlPart(::qt_cast<KHTMLPart *>(p));
+}
+
+void DOMTreeWindow::slotPartRemoved(KParts::Part *p)
+{
+ kdDebug(90180) << k_funcinfo << p << endl;
+ if (p != view()->htmlPart()) return;
+
+ m_commandHistory->clear();
+ view()->disconnectFromTornDownPart();
+ view()->setHtmlPart(0);
+}
+
+void DOMTreeWindow::slotClosePart()
+{
+ kdDebug(90180) << k_funcinfo << endl;
+ view()->disconnectFromTornDownPart();
+ view()->connectToPart();
+}
+
+#include "domtreewindow.moc"
diff --git a/konq-plugins/domtreeviewer/domtreewindow.h b/konq-plugins/domtreeviewer/domtreewindow.h
new file mode 100644
index 0000000..f942798
--- /dev/null
+++ b/konq-plugins/domtreeviewer/domtreewindow.h
@@ -0,0 +1,194 @@
+/* This file is part of the KDE project
+ *
+ * Copyright (C) 2005 Leo Savernik <l.savernik@aon.at>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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 the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef domtreewindow_H
+#define domtreewindow_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kmainwindow.h>
+
+#include <qguardedptr.h>
+
+namespace domtreeviewer {
+ class ManipulationCommand;
+}
+
+namespace KParts {
+ class Part;
+ class PartManager;
+}
+
+class DOMTreeView;
+class PluginDomtreeviewer;
+
+class KAction;
+class KConfig;
+class KPrinter;
+class KURL;
+class KCommandHistory;
+class KHTMLPart;
+class MessageDialog;
+
+class QPopupMenu;
+
+/**
+ * This class serves as the main window for DOM Tree Viewer. It handles the
+ * menus, toolbars, and status bars.
+ *
+ * @short Main window class
+ * @author Leo Savernik
+ */
+class DOMTreeWindow : public KMainWindow
+{
+ Q_OBJECT
+public:
+ /**
+ * Default Constructor
+ */
+ DOMTreeWindow(PluginDomtreeviewer *plugin);
+
+ /**
+ * Default Destructor
+ */
+ virtual ~DOMTreeWindow();
+
+ /**
+ * returns the dom tree view
+ */
+ DOMTreeView *view() const { return m_view; }
+
+ /**
+ * returns the command history
+ */
+ KCommandHistory *commandHistory() const { return m_commandHistory; }
+
+ /**
+ * creates and returns the context menu for the list info panel
+ */
+ QPopupMenu *createInfoPanelAttrContextMenu();
+
+ /**
+ * returns the context menu for the list info panel
+ */
+ QPopupMenu *infoPanelAttrContextMenu() { return infopanel_ctx; }
+
+ /**
+ * creates and returns the context menu for the DOM tree view
+ */
+ QPopupMenu *createDOMTreeViewContextMenu();
+
+ /**
+ * returns the context menu for the DOM tree view
+ */
+ QPopupMenu *domTreeViewContextMenu() { return domtree_ctx; }
+
+ /**
+ * Executes the given command and adds it to the history.
+ *
+ * If the command could not be executed, it will not be added.
+ */
+ void executeAndAddCommand(domtreeviewer::ManipulationCommand *);
+
+ /**
+ * Returns the config object for this plugin.
+ */
+ KConfig *config() const { return _config; }
+
+ /** returns the attribute delete action */
+ KAction *deleteAttributeAction() const { return del_attr; }
+ /** returns the node delete action */
+ KAction *deleteNodeAction() const { return del_tree; }
+
+public slots:
+ /**
+ * Adds a log message
+ * @param id message id
+ * @param msg message text
+ */
+ void addMessage(int id, const QString &msg);
+
+ /**
+ * Displays the message log window.
+ */
+ void showMessageLog();
+
+protected:
+ /**
+ * Overridden virtuals for Qt drag 'n drop (XDND)
+ */
+ virtual void dragEnterEvent(QDragEnterEvent *event);
+ virtual void dropEvent(QDropEvent *event);
+protected:
+ /**
+ * This function is called when it is time for the app to save its
+ * properties for session management purposes.
+ */
+ void saveProperties(KConfig *);
+
+ /**
+ * This function is called when this app is restored. The KConfig
+ * object points to the session management config file that was saved
+ * with @ref saveProperties
+ */
+ void readProperties(KConfig *);
+
+
+private slots:
+ void slotCut();
+ void slotCopy();
+ void slotPaste();
+ //void slotUndo();
+ //void slotRedo();
+ void slotFind();
+ void optionsConfigureToolbars();
+ void optionsPreferences();
+ void newToolbarConfig();
+
+ void changeStatusbar(const QString& text);
+ void changeCaption(const QString& text);
+
+ void slotHtmlPartChanged(KHTMLPart *);
+ void slotActivePartChanged(KParts::Part *);
+ void slotPartRemoved(KParts::Part *);
+ void slotClosePart();
+
+private:
+ void setupAccel();
+ void setupActions();
+
+private:
+ PluginDomtreeviewer *m_plugin;
+ DOMTreeView *m_view;
+ MessageDialog *msgdlg;
+
+ KCommandHistory *m_commandHistory;
+ QPopupMenu *infopanel_ctx;
+ QPopupMenu *domtree_ctx;
+ KConfig *_config;
+
+ KAction *del_tree, *del_attr;
+
+ QGuardedPtr<KParts::PartManager> part_manager;
+};
+
+#endif // domtreewindow_H
diff --git a/konq-plugins/domtreeviewer/elementeditdialog.ui b/konq-plugins/domtreeviewer/elementeditdialog.ui
new file mode 100644
index 0000000..8705250
--- /dev/null
+++ b/konq-plugins/domtreeviewer/elementeditdialog.ui
@@ -0,0 +1,201 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>ElementEditDialog</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>ElementEditDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>469</width>
+ <height>113</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Edit Element</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Element &amp;name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>elemName</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>elemName</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Element &amp;namespace:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>elemNamespace</cstring>
+ </property>
+ </widget>
+ <widget class="KComboBox">
+ <property name="name">
+ <cstring>elemNamespace</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="editable">
+ <bool>true</bool>
+ </property>
+ <property name="autoCompletion">
+ <bool>true</bool>
+ </property>
+ <property name="duplicatesEnabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="Line">
+ <property name="name">
+ <cstring>line1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>insChildBtn</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Append as Child</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="flat">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>insBeforeBtn</cstring>
+ </property>
+ <property name="text">
+ <string>Insert &amp;Before Current</string>
+ </property>
+ <property name="flat">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>60</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelBtn</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>insChildBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>ElementEditDialog</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>cancelBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>ElementEditDialog</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>elemName</sender>
+ <signal>returnPressed()</signal>
+ <receiver>ElementEditDialog</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>insBeforeBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>ElementEditDialog</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klineedit.h</includehint>
+ <includehint>kcombobox.h</includehint>
+ <includehint>klineedit.h</includehint>
+</includehints>
+</UI>
diff --git a/konq-plugins/domtreeviewer/messagedialog.ui b/konq-plugins/domtreeviewer/messagedialog.ui
new file mode 100644
index 0000000..3ef4a75
--- /dev/null
+++ b/konq-plugins/domtreeviewer/messagedialog.ui
@@ -0,0 +1,117 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>MessageDialog</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>MessageDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>511</width>
+ <height>282</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Message Log</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KTextEdit">
+ <property name="name">
+ <cstring>messagePane</cstring>
+ </property>
+ <property name="textFormat">
+ <enum>LogText</enum>
+ </property>
+ <property name="wordWrap">
+ <enum>FixedColumnWidth</enum>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ <property name="undoRedoEnabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>btnClear</cstring>
+ </property>
+ <property name="text">
+ <string>C&amp;lear</string>
+ </property>
+ <property name="autoDefault">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>300</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>btnClose</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Close</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>btnClose</sender>
+ <signal>clicked()</signal>
+ <receiver>MessageDialog</receiver>
+ <slot>close()</slot>
+ </connection>
+ <connection>
+ <sender>btnClear</sender>
+ <signal>clicked()</signal>
+ <receiver>messagePane</receiver>
+ <slot>clear()</slot>
+ </connection>
+</connections>
+<includes>
+ <include location="local" impldecl="in implementation">messagedialog.ui.h</include>
+</includes>
+<slots>
+ <slot specifier="non virtual">addMessage( const QString &amp; msg )</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>ktextedit.h</includehint>
+</includehints>
+</UI>
diff --git a/konq-plugins/domtreeviewer/messagedialog.ui.h b/konq-plugins/domtreeviewer/messagedialog.ui.h
new file mode 100644
index 0000000..dcb6609
--- /dev/null
+++ b/konq-plugins/domtreeviewer/messagedialog.ui.h
@@ -0,0 +1,20 @@
+/****************************************************************************
+** ui.h extension file, included from the uic-generated form implementation.
+**
+** If you want to add, delete, or rename functions or slots, use
+** Qt Designer to update this file, preserving your code.
+**
+** You should not define a constructor or destructor in this file.
+** Instead, write your code in functions called init() and destroy().
+** These will automatically be called by the form's constructor and
+** destructor.
+*****************************************************************************/
+
+#include <kdebug.h>
+
+#include <qdatetime.h>
+
+void MessageDialog::addMessage( const QString &msg )
+{
+ messagePane->append(msg);
+}
diff --git a/konq-plugins/domtreeviewer/plugin_domtreeviewer.cpp b/konq-plugins/domtreeviewer/plugin_domtreeviewer.cpp
new file mode 100644
index 0000000..3555a84
--- /dev/null
+++ b/konq-plugins/domtreeviewer/plugin_domtreeviewer.cpp
@@ -0,0 +1,56 @@
+#include "plugin_domtreeviewer.h"
+#include "domtreewindow.h"
+#include "domtreeview.h"
+
+#include <kaction.h>
+#include <kinstance.h>
+#include <klibloader.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kgenericfactory.h>
+
+#include <khtml_part.h>
+
+typedef KGenericFactory<PluginDomtreeviewer> DomtreeviewerFactory;
+K_EXPORT_COMPONENT_FACTORY( libdomtreeviewerplugin, DomtreeviewerFactory( "domtreeviewer" ) )
+
+PluginDomtreeviewer::PluginDomtreeviewer( QObject* parent, const char* name,
+ const QStringList & )
+ : Plugin( parent, name ), m_dialog( 0 )
+{
+ (void) new KAction( i18n("Show &DOM Tree"),
+ "domtreeviewer", 0,
+ this, SLOT(slotShowDOMTree()),
+ actionCollection(), "viewdomtree" );
+}
+
+PluginDomtreeviewer::~PluginDomtreeviewer()
+{
+ kdDebug(90180) << k_funcinfo << endl;
+ delete m_dialog;
+}
+
+void PluginDomtreeviewer::slotShowDOMTree()
+{
+ if ( m_dialog )
+ {
+ delete m_dialog;
+ Q_ASSERT((DOMTreeWindow *)m_dialog == (DOMTreeWindow *)0);
+ }
+ if (KHTMLPart *part = ::qt_cast<KHTMLPart *>(parent()))
+ {
+ m_dialog = new DOMTreeWindow(this);
+ connect( m_dialog, SIGNAL( destroyed() ), this, SLOT( slotDestroyed() ) );
+ m_dialog->view()->setHtmlPart(part);
+ m_dialog->show();
+ }
+}
+
+void PluginDomtreeviewer::slotDestroyed()
+{
+ kdDebug(90180) << k_funcinfo << endl;
+ m_dialog = 0;
+}
+
+#include <plugin_domtreeviewer.moc>
diff --git a/konq-plugins/domtreeviewer/plugin_domtreeviewer.desktop b/konq-plugins/domtreeviewer/plugin_domtreeviewer.desktop
new file mode 100644
index 0000000..780947a
--- /dev/null
+++ b/konq-plugins/domtreeviewer/plugin_domtreeviewer.desktop
@@ -0,0 +1,128 @@
+[Desktop Entry]
+X-KDE-Library=domtreeviewer
+X-KDE-PluginInfo-Author=The Kafka Team, Andreas Schlapbach
+X-KDE-PluginInfo-Email=kde-kafka@master.kde.org, schlpbch@iam.unibe.ch
+X-KDE-PluginInfo-Name=domtreeviewer
+X-KDE-PluginInfo-Version=3.3
+X-KDE-PluginInfo-Website=
+X-KDE-PluginInfo-Category=Tools
+X-KDE-PluginInfo-Depends=
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=false
+Name=DOM Tree Viewer
+Name[bg]=Преглед на DOM
+Name[br]=Gweler ar wwezenn DOM
+Name[bs]=Preglednik DOM stabla
+Name[ca]=Visor de l'arbre DOM
+Name[cs]=Prohlížeč DOM stromu
+Name[da]=DOM-trævisning
+Name[de]=DOM-Baumansicht
+Name[el]=Προβολέας δέντρου DOM
+Name[eo]=DOM-a arba rigardilo
+Name[es]=Visor del árbol DOM
+Name[et]=DOM puu vaataja
+Name[eu]=DOM arbolaren ikustailea
+Name[fa]=مشاهده‌گر درخت DOM
+Name[fi]=DOM-puun näyttäjä
+Name[fr]=Visualiseur d'arborescence DOM
+Name[fy]=DOM tree-werjefteprogramma
+Name[ga]=Amharcán Crainn DOM
+Name[gl]=Visor da Árbore DOM
+Name[he]=מציג עץ DOM
+Name[hi]=डॉम ट्री प्रदर्शक
+Name[hr]=DOM preglednik stabla
+Name[hu]=A DOM-fastruktúra megjelenítése
+Name[is]=DOM Trjáasýn
+Name[it]=Visualizzatore DOM tree
+Name[ja]=DOM ツリービューア
+Name[ka]=DOM ხის მხილველი
+Name[kk]=DOM бұтақтары
+Name[km]=កម្មវិធី​មើល​មែកធាង DOM
+Name[lt]=DOM medžio žiūryklė
+Name[mk]=Прегледувач на DOM-стебло
+Name[ms]=Pelihat Pepohon DOM
+Name[nb]=DOM-trevisning
+Name[nds]=DOM-Boom-Kieker
+Name[ne]=डीओएम ट्री दर्शक
+Name[nl]=DOM tree-weergaveprogramma
+Name[nn]=DOM-trevising
+Name[pa]=DOM ਟਰੀ ਦਰਸ਼ਕ
+Name[pl]=Przeglądarka drzewa DOM
+Name[pt]=Visualizador da Árvore DOM
+Name[pt_BR]=Visão em Árvore DOM
+Name[ru]=Дерево DOM
+Name[sk]=Prehliadač pre strom DOM
+Name[sl]=Drevesni pogled DOM
+Name[sr]=Приказивач DOM стабла
+Name[sr@Latn]=Prikazivač DOM stabla
+Name[sv]=DOM-trädvisaren
+Name[ta]=DOM மரக் காட்சியமைப்பு
+Name[tg]=Дарахти DOM
+Name[tr]=DOM Ağaç Görünümü
+Name[uk]=Переглядач дерева DOM
+Name[vi]=Bộ xem cây DOM
+Name[zh_CN]=DOM 树形视图查看器
+Name[zh_TW]=DOM 樹檢視器
+Comment=DOM tree viewer
+Comment[af]=Dom boom aansig
+Comment[ar]=مستعرض شجرة DOM
+Comment[az]=DOM ağac nümayişçisi
+Comment[bg]=Преглед структурата на DOM
+Comment[br]=Gweler gwezenn DOM
+Comment[bs]=Preglednik DOM stabla
+Comment[ca]=Visor de l'arbre DOM
+Comment[cs]=Prohlížeč DOM stromu
+Comment[cy]=Gwelydd coeden DOM
+Comment[da]=DOM-trævisning
+Comment[de]=DOM-Baumansicht
+Comment[el]=Προβολέας δέντρου DOM
+Comment[eo]=DOM-a arba rigardilo
+Comment[es]=Visor del árbol DOM
+Comment[et]=DOM puu vaataja
+Comment[eu]=DOM arbolaren ikustailea
+Comment[fa]=مشاهده‌گر درخت DOM
+Comment[fi]=DOM-puun näyttäjä
+Comment[fr]=Afficheur d'arborescence de modèle orienté document
+Comment[fy]=DOM tree-werjefteprogramma
+Comment[ga]=Amharcán crainn DOM
+Comment[gl]=Visor da árbore DOM
+Comment[he]=מציג עץ DOM
+Comment[hi]=डॉम ट्री प्रदर्शक
+Comment[hr]=DOM preglednik stabla
+Comment[hu]=DOM-nézegető
+Comment[is]=DOM Trjáasýn
+Comment[it]=Visualizzatore DOM tree
+Comment[ja]=DOM ツリービューア
+Comment[ka]=DOM ხის მხილველი
+Comment[kk]=DOM бұтақтарын қарау құралы
+Comment[km]=កម្មវិធី​មើល​មែកធាង DOM
+Comment[lt]=DOM medžio žiūriklis
+Comment[mk]=Прегледувач на DOM-стебло
+Comment[ms]=Pelihat pepohon DOM
+Comment[nb]=DOM tre-fremviser
+Comment[nds]=DOM-Boom-Kieker
+Comment[ne]=डीओएम ट्री हेराई
+Comment[nl]=DOM tree-weergaveprogramma
+Comment[nn]=Framvising av DOM-tre
+Comment[pa]=DOM ਲੜੀ ਦਰਸ਼ਕ
+Comment[pl]=Widok drzewa DOM
+Comment[pt]=Visualizador da árvore DOM
+Comment[pt_BR]=Visão em Árvore DOM
+Comment[ro]=Afişează o structură arborescentă DOM a documentelor XML/HTML
+Comment[ru]=Модуль для просмотра дерева DOM
+Comment[sk]=DOM prehliadač
+Comment[sl]=Pregledovalnik dreves DOM
+Comment[sr]=Приказивач DOM стабла
+Comment[sr@Latn]=Prikazivač DOM stabla
+Comment[sv]=DOM-trädvisare
+Comment[ta]=DOM மரக்காட்சியாளர்
+Comment[tg]=Модул барои аз назар гузаронидани дарахти DOM
+Comment[tr]=DOM ağaç görünümü
+Comment[uk]=Переглядач дерева DOM
+Comment[vi]=Bộ xem cây DOM
+Comment[xh]=Umbukeli womthi weDOM
+Comment[zh_CN]=DOM 树形视图查看器
+Comment[zh_TW]=DOM 樹檢視器
+Icon=domtreeviewer
+X-KDE-ParentApp=konqueror
+DocPath=konq-plugins/domtreeviewer/index.html
diff --git a/konq-plugins/domtreeviewer/plugin_domtreeviewer.h b/konq-plugins/domtreeviewer/plugin_domtreeviewer.h
new file mode 100644
index 0000000..ba380a9
--- /dev/null
+++ b/konq-plugins/domtreeviewer/plugin_domtreeviewer.h
@@ -0,0 +1,27 @@
+/* $Id$ */
+
+#ifndef __plugin_domtreeviewer_h
+#define __plugin_domtreeviewer_h
+
+#include <kparts/plugin.h>
+// #include <klibloader.h>
+
+class DOMTreeWindow;
+class KURL;
+
+class PluginDomtreeviewer : public KParts::Plugin
+{
+ Q_OBJECT
+public:
+ PluginDomtreeviewer( QObject* parent, const char* name,
+ const QStringList & );
+ virtual ~PluginDomtreeviewer();
+
+public slots:
+ void slotShowDOMTree();
+ void slotDestroyed();
+private:
+ DOMTreeWindow* m_dialog;
+};
+
+#endif
diff --git a/konq-plugins/domtreeviewer/plugin_domtreeviewer.rc b/konq-plugins/domtreeviewer/plugin_domtreeviewer.rc
new file mode 100644
index 0000000..2216b99
--- /dev/null
+++ b/konq-plugins/domtreeviewer/plugin_domtreeviewer.rc
@@ -0,0 +1,11 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="domtreeviewer" library="libdomtreeviewerplugin">
+<MenuBar>
+ <Menu name="tools"><Text>&amp;Tools</Text>
+ <Action name="viewdomtree"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="extraToolBar"><text>Extra Toolbar</text>
+ <Action name="viewdomtree"/>
+</ToolBar>
+</kpartplugin>
diff --git a/konq-plugins/domtreeviewer/signalreceiver.cpp b/konq-plugins/domtreeviewer/signalreceiver.cpp
new file mode 100644
index 0000000..f928036
--- /dev/null
+++ b/konq-plugins/domtreeviewer/signalreceiver.cpp
@@ -0,0 +1,37 @@
+/* This file is part of the KDE project
+ *
+ * Copyright (C) 2005 Leo Savernik <l.savernik@aon.at>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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 the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "signalreceiver.h"
+
+SignalReceiver::SignalReceiver(QObject *parent, const char *name)
+: QObject(parent, name), rcvd(false)
+{
+}
+
+SignalReceiver::~SignalReceiver()
+{
+}
+
+void SignalReceiver::slot()
+{
+ rcvd = true;
+}
+
+#include "signalreceiver.moc"
diff --git a/konq-plugins/domtreeviewer/signalreceiver.h b/konq-plugins/domtreeviewer/signalreceiver.h
new file mode 100644
index 0000000..8c0f5d9
--- /dev/null
+++ b/konq-plugins/domtreeviewer/signalreceiver.h
@@ -0,0 +1,67 @@
+/* This file is part of the KDE project
+ *
+ * Copyright (C) 2005 Leo Savernik <l.savernik@aon.at>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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 the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef SIGNALCATCHER_H
+#define SIGNALCATCHER_H
+
+#include <qobject.h>
+
+/**
+ * \brief Class for receiving signals.
+ *
+ * This is a convenience class for receiving signals when it is not worth
+ * the effort, or overly complicated to introduce a dedicated slot.
+ *
+ * Use as follows:
+ * \code
+ * SignalReceiver sr;
+ * sr.connect(some_obj, SIGNAL(someSignal()), SLOT(slot()));
+ * <do something with some_obj> ...
+ * if (sr.receivedSignal()) { // yes, signal was received
+ * }
+ * \endcode
+ *
+ * It is not possible to discriminate between different signals. Hence,
+ * use different signal receiver instances for different signals.
+ * @autor Leo Savernik
+ */
+class SignalReceiver : public QObject
+{
+ Q_OBJECT
+
+public:
+ SignalReceiver(QObject *parent = 0, const char *name = 0);
+ virtual ~SignalReceiver();
+
+ /** returns true if any signal has been received */
+ bool signalReceived() const { return rcvd; }
+
+ /** returns true if any signal has been received */
+ bool operator ()() const { return rcvd; }
+
+public slots:
+ /** connect a signal to this slot to receive it */
+ void slot();
+
+private:
+ bool rcvd;
+};
+
+#endif // SIGNALCATCHER_H
diff --git a/konq-plugins/domtreeviewer/texteditdialog.ui b/konq-plugins/domtreeviewer/texteditdialog.ui
new file mode 100644
index 0000000..96980e2
--- /dev/null
+++ b/konq-plugins/domtreeviewer/texteditdialog.ui
@@ -0,0 +1,149 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>TextEditDialog</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>TextEditDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>469</width>
+ <height>211</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Edit Text</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Edit &amp;text for text node:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>textPane</cstring>
+ </property>
+ </widget>
+ <widget class="KTextEdit">
+ <property name="name">
+ <cstring>textPane</cstring>
+ </property>
+ <property name="acceptDrops">
+ <bool>true</bool>
+ </property>
+ <property name="textFormat">
+ <enum>PlainText</enum>
+ </property>
+ <property name="tabChangesFocus">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="Line">
+ <property name="name">
+ <cstring>line1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>insChildBtn</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Append as Child</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="flat">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>insBeforeBtn</cstring>
+ </property>
+ <property name="text">
+ <string>Insert &amp;Before Current</string>
+ </property>
+ <property name="flat">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>60</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelBtn</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>insChildBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>TextEditDialog</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>cancelBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>TextEditDialog</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>insBeforeBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>TextEditDialog</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>ktextedit.h</includehint>
+</includehints>
+</UI>
diff --git a/konq-plugins/fsview/Makefile.am b/konq-plugins/fsview/Makefile.am
new file mode 100644
index 0000000..a400096
--- /dev/null
+++ b/konq-plugins/fsview/Makefile.am
@@ -0,0 +1,51 @@
+INCLUDES= $(all_includes)
+METASOURCES = AUTO
+
+KDE_ICON = fsview
+
+EXTRA_DIST = main.cpp fsview.cpp fsview.h scan.cpp scan.h scantest.cpp \
+ inode.h inode.cpp \
+ fsview.desktop hi32-app-fsview.png
+
+#xdg_apps_DATA = fsview.desktop
+
+messages: rc.cpp
+ LIST=`find . -name \*.h -o -name \*.cpp`; \
+ if test -n "$$LIST"; then \
+ $(XGETTEXT) $$LIST -o $(podir)/fsview.pot; \
+ fi
+
+# Used both by application and KPart
+
+noinst_LTLIBRARIES = libfsview.la
+libfsview_la_SOURCES = treemap.cpp fsview.cpp scan.cpp inode.cpp
+
+# Application
+
+bin_PROGRAMS = fsview
+
+fsview_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+fsview_SOURCES = main.cpp
+fsview_LDADD = libfsview.la $(LIB_KIO) $(LIB_KDECORE) $(LIB_QT)
+
+check_PROGRAMS = scantest
+
+scantest_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+scantest_SOURCES = scantest.cpp
+scantest_LDADD = libfsview.la $(LIB_KIO) $(LIB_KDECORE) $(LIB_QT)
+
+# The KPart
+
+kde_module_LTLIBRARIES = libfsviewpart.la
+libfsviewpart_la_SOURCES = fsview_part.cpp
+libfsviewpart_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+libfsviewpart_la_LIBADD = libfsview.la $(LIB_KPARTS) $(LIB_KIO) -lkonq
+
+partdesktopdir = $(kde_servicesdir)
+partdesktop_DATA = fsview_part.desktop
+
+rcdir = $(kde_datadir)/fsview
+rc_DATA = fsview_part.rc
+
+appsdir = $(kde_appsdir)/.hidden
+apps_DATA = fsview.desktop
diff --git a/konq-plugins/fsview/README b/konq-plugins/fsview/README
new file mode 100644
index 0000000..faf1c44
--- /dev/null
+++ b/konq-plugins/fsview/README
@@ -0,0 +1,29 @@
+What's this?
+============
+
+Josef Weidendorfer
+Josef.Weidendorfer@gmx.de
+
+FSView is a tool for showing disc utilization in a graphical form, much
+like the UNIX command 'du'. The visualisation type choosen is a treemap.
+Treemaps allow for showing metrics of objects in nested structures, like
+sizes of files and directories on your hard disc, where the the size of
+directories is defined to be the sum of the size of its children.
+Each object is represented by a rectangle which area is proportional to
+its metric. The metric must have the property that the sum of the
+children's metric of some object is equal or smaller than the objects
+metric. This holds true for the file/directory sizes in the use case of
+FSView.
+
+It's provided both as a Konqueror KPart plugin for the mime type
+inode/directory, and a standalone executable.
+
+This was meant as a small test application and usage tutorial for
+the TreeMap widget developed within KCachegrind. As it's quite cool
+and small, it is now provided as a Konqueror addon in KDE.
+
+For a full featured graphical 'du', see KDirStat. It's quite similar
+to FSView, but allows for lot of cleanup actions.
+
+Happy space hunting,
+Josef
diff --git a/konq-plugins/fsview/fsview.cpp b/konq-plugins/fsview/fsview.cpp
new file mode 100644
index 0000000..b0c82d8
--- /dev/null
+++ b/konq-plugins/fsview/fsview.cpp
@@ -0,0 +1,540 @@
+/* This file is part of FSView.
+ Copyright (C) 2002, 2003 Josef Weidendorfer <Josef.Weidendorfer@gmx.de>
+
+ KCachegrind is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation, version 2.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+/*
+ * FSView specialisaton of TreeMap classes.
+ */
+
+
+#include <qdir.h>
+#include <qpopupmenu.h>
+#include <qtimer.h>
+
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kmimetype.h>
+#include <kurl.h>
+
+#include <kio/global.h>
+
+#include "fsview.h"
+
+
+// FSView
+
+QMap<QString, MetricEntry> FSView::_dirMetric;
+
+FSView::FSView(Inode* base, QWidget* parent, const char* name)
+ : TreeMapWidget(base, parent, name)
+{
+ setFieldType(0, i18n("Name"));
+ setFieldType(1, i18n("Size"));
+ setFieldType(2, i18n("File Count"));
+ setFieldType(3, i18n("Directory Count"));
+ setFieldType(4, i18n("Last Modified"));
+ setFieldType(5, i18n("Owner"));
+ setFieldType(6, i18n("Group"));
+ setFieldType(7, i18n("Mime Type"));
+
+ // defaults
+ setVisibleWidth(4, true);
+ setSplitMode(TreeMapItem::Rows);
+ setFieldForced(0, true); // show directory names
+ setFieldForced(1, true); // show directory sizes
+ setSelectionMode(TreeMapWidget::Extended);
+
+ _colorMode = Depth;
+ _pathDepth = 0;
+ _allowRefresh = true;
+
+ _progressPhase = 0;
+ _chunkData1 = 0;
+ _chunkData2 = 0;
+ _chunkData3 = 0;
+ _chunkSize1 = 0;
+ _chunkSize2 = 0;
+ _chunkSize3 = 0;
+ _progressSize = 0;
+ _progress = 0;
+ _dirsFinished = 0;
+ _lastDir = 0;
+
+ _config = new KConfig("fsviewrc");
+
+ // restore TreeMap visualization options of last execution
+ KConfigGroup tmconfig(_config, QCString("TreeMap"));
+ restoreOptions(&tmconfig);
+ QString str = tmconfig.readEntry("ColorMode");
+ if (!str.isEmpty()) setColorMode(str);
+
+ if (_dirMetric.count() == 0) {
+ // restore metric cache
+ KConfigGroup cconfig(_config, QCString("MetricCache"));
+ int ccount = cconfig.readNumEntry("Count", 0);
+ int i, f, d;
+ double s;
+ QString str;
+ for (i=1;i<=ccount;i++) {
+ str = QString("Dir%1").arg(i);
+ if (!cconfig.hasKey(str)) continue;
+ str = cconfig.readPathEntry(str);
+ s = cconfig.readDoubleNumEntry(QString("Size%1").arg(i), 0.0);
+ f = cconfig.readNumEntry(QString("Files%1").arg(i), 0);
+ d = cconfig.readNumEntry(QString("Dirs%1").arg(i), 0);
+ if (s==0.0 || f==0 || d==0) continue;
+ setDirMetric(str, s, f, d);
+ }
+ }
+
+ _sm.setListener(this);
+}
+
+FSView::~FSView()
+{
+ delete _config;
+}
+
+void FSView::stop()
+{
+ _sm.stopScan();
+}
+
+void FSView::setPath(QString p)
+{
+ Inode* b = (Inode*)base();
+ if (!b) return;
+
+ //kdDebug(90100) << "FSView::setPath " << p << endl;
+
+ // stop any previous updating
+ stop();
+
+ QFileInfo fi(p);
+ _path = fi.absFilePath();
+ if (!fi.isDir()) {
+ _path = fi.dirPath(true);
+ }
+ _pathDepth = _path.contains('/');
+
+ KURL u;
+ u.setPath(_path);
+ if (!kapp->authorizeURLAction("list", KURL(), u))
+ {
+ QString msg = KIO::buildErrorString(KIO::ERR_ACCESS_DENIED, u.prettyURL());
+ KMessageBox::queuedMessageBox(this, KMessageBox::Sorry, msg);
+ }
+
+ ScanDir* d = _sm.setTop(_path);
+
+ b->setPeer(d);
+
+ setCaption(QString("%1 - FSView").arg(_path));
+ requestUpdate(b);
+}
+
+KURL::List FSView::selectedUrls()
+{
+ TreeMapItemList s = selection();
+ TreeMapItem* i;
+ KURL::List urls;
+
+ for(i=s.first();i;i=s.next()) {
+ KURL u;
+ u.setPath( ((Inode*)i)->path() );
+ urls.append(u);
+ }
+ return urls;
+}
+
+bool FSView::getDirMetric(const QString& k,
+ double& s, unsigned int& f, unsigned int& d)
+{
+ QMap<QString, MetricEntry>::iterator it;
+
+ it = _dirMetric.find(k);
+ if (it == _dirMetric.end()) return false;
+
+ s = (*it).size;
+ f = (*it).fileCount;
+ d = (*it).dirCount;
+
+ if (0) kdDebug(90100) << "getDirMetric " << k << endl;
+ if (0) kdDebug(90100) << " - got size " << s << ", files " << f << endl;
+
+ return true;
+}
+
+void FSView::setDirMetric(const QString& k,
+ double s, unsigned int f, unsigned int d)
+{
+ if (0) kdDebug(90100) << "setDirMetric '" << k << "': size "
+ << s << ", files " << f << ", dirs " << d << endl;
+ _dirMetric.insert(k, MetricEntry(s, f, d));
+}
+
+void FSView::requestUpdate(Inode* i)
+{
+ if (0) kdDebug(90100) << "FSView::requestUpdate(" << i->path()
+ << ")" << endl;
+
+ ScanDir* peer = i->dirPeer();
+ if (!peer) return;
+
+ peer->clear();
+ i->clear();
+
+ if (!_sm.scanRunning()) {
+ QTimer::singleShot(0, this, SLOT(doUpdate()));
+ QTimer::singleShot(100, this, SLOT(doRedraw()));
+
+ /* start new progress chunk */
+ _progressPhase = 1;
+ _chunkData1 += 3;
+ _chunkData2 = _chunkData1 + 1;
+ _chunkData3 = _chunkData1 + 2;
+ _chunkSize1 = 0;
+ _chunkSize2 = 0;
+ _chunkSize3 = 0;
+ peer->setData(_chunkData1);
+
+ _progressSize = 0;
+ _progress = 0;
+ _dirsFinished = 0;
+ _lastDir = 0;
+ emit started();
+ }
+
+ _sm.startScan(peer);
+}
+
+void FSView::scanFinished(ScanDir* d)
+{
+ /* if finished directory was from last progress chunk, increment */
+ int data = d->data();
+ switch(_progressPhase) {
+ case 1:
+ if (data == _chunkData1) _chunkSize1--;
+ break;
+ case 2:
+ if (data == _chunkData1) _progress++;
+ if (data == _chunkData2) _chunkSize2--;
+ break;
+ case 3:
+ if ((data == _chunkData1) ||
+ (data == _chunkData2)) _progress++;
+ if (data == _chunkData3) _chunkSize3--;
+ break;
+ case 4:
+ if ((data == _chunkData1) ||
+ (data == _chunkData2) ||
+ (data == _chunkData3)) _progress++;
+ break;
+ default:
+ break;
+ }
+
+ _lastDir = d;
+ _dirsFinished++;
+
+ if (0) kdDebug(90100) << "FSFiew::scanFinished: " << d->path()
+ << ", Data " << data
+ << ", Progress " << _progress << "/"
+ << _progressSize << endl;
+}
+
+void FSView::selected(TreeMapItem* i)
+{
+ setPath(((Inode*)i)->path());
+}
+
+void FSView::contextMenu(TreeMapItem* i, const QPoint& p)
+{
+ QPopupMenu popup;
+
+ QPopupMenu* spopup = new QPopupMenu();
+ QPopupMenu* dpopup = new QPopupMenu();
+ QPopupMenu* apopup = new QPopupMenu();
+ QPopupMenu* fpopup = new QPopupMenu();
+
+ // choosing from the selection menu will give a selectionChanged() signal
+ addSelectionItems(spopup, 901, i);
+ popup.insertItem(i18n("Go To"), spopup, 900);
+
+ popup.insertItem(i18n("Go Up"), 2);
+ popup.insertSeparator();
+ popup.insertItem(i18n("Stop Refresh"), 3);
+ popup.setItemEnabled(3, _sm.scanRunning());
+ popup.insertItem(i18n("Refresh"), 5);
+ popup.setItemEnabled(5, !_sm.scanRunning());
+
+ if (i) popup.insertItem(i18n("Refresh '%1'").arg(i->text(0)), 4);
+ popup.insertSeparator();
+ addDepthStopItems(dpopup, 1001, i);
+ popup.insertItem(i18n("Stop at Depth"), dpopup, 1000);
+ addAreaStopItems(apopup, 1101, i);
+ popup.insertItem(i18n("Stop at Area"), apopup, 1100);
+ addFieldStopItems(fpopup, 1201, i);
+ popup.insertItem(i18n("Stop at Name"), fpopup, 1200);
+
+ popup.insertSeparator();
+
+ QPopupMenu* cpopup = new QPopupMenu();
+ addColorItems(cpopup, 1401);
+ popup.insertItem(i18n("Color Mode"), cpopup, 1400);
+ QPopupMenu* vpopup = new QPopupMenu();
+ addVisualizationItems(vpopup, 1301);
+ popup.insertItem(i18n("Visualization"), vpopup, 1300);
+
+ _allowRefresh = false;
+ int r = popup.exec(mapToGlobal(p));
+ _allowRefresh = true;
+
+ if (r==1)
+ selected(i);
+ else if (r==2) {
+ Inode* i = (Inode*) base();
+ if (i) setPath(i->path()+"/..");
+ }
+ else if (r==3)
+ stop();
+ else if (r==4) {
+ //((Inode*)i)->refresh();
+ requestUpdate( (Inode*)i );
+ }
+ else if (r==5) {
+ Inode* i = (Inode*) base();
+ if (i) requestUpdate(i);
+ }
+}
+
+void FSView::saveMetric(KConfigGroup* g)
+{
+ QMap<QString, MetricEntry>::iterator it;
+ int c = 1;
+ for (it=_dirMetric.begin();it!=_dirMetric.end();++it) {
+ g->writePathEntry(QString("Dir%1").arg(c), it.key());
+ g->writeEntry(QString("Size%1").arg(c), (*it).size);
+ g->writeEntry(QString("Files%1").arg(c), (*it).fileCount);
+ g->writeEntry(QString("Dirs%1").arg(c), (*it).dirCount);
+ c++;
+ }
+ g->writeEntry("Count", c-1);
+}
+
+void FSView::setColorMode(FSView::ColorMode cm)
+{
+ if (_colorMode == cm) return;
+
+ _colorMode = cm;
+ redraw();
+}
+
+bool FSView::setColorMode(QString mode)
+{
+ if (mode == "None") setColorMode(None);
+ else if (mode == "Depth") setColorMode(Depth);
+ else if (mode == "Name") setColorMode(Name);
+ else if (mode == "Owner") setColorMode(Owner);
+ else if (mode == "Group") setColorMode(Group);
+ else if (mode == "Mime") setColorMode(Mime);
+ else return false;
+
+ return true;
+}
+
+QString FSView::colorModeString() const
+{
+ QString mode;
+ switch(_colorMode) {
+ case None: mode = "None"; break;
+ case Depth: mode = "Depth"; break;
+ case Name: mode = "Name"; break;
+ case Owner: mode = "Owner"; break;
+ case Group: mode = "Group"; break;
+ case Mime: mode = "Mime"; break;
+ default: mode = "Unknown"; break;
+ }
+ return mode;
+}
+
+void FSView::addColorItems(QPopupMenu* popup, int id)
+{
+ _colorID = id;
+ popup->setCheckable(true);
+
+ connect(popup, SIGNAL(activated(int)),
+ this, SLOT(colorActivated(int)));
+
+ popup->insertItem(i18n("None"), id);
+ popup->insertItem(i18n("Depth"), id+1);
+ popup->insertItem(i18n("Name"), id+2);
+ popup->insertItem(i18n("Owner"), id+3);
+ popup->insertItem(i18n("Group"), id+4);
+ popup->insertItem(i18n("Mime Type"), id+5);
+
+ switch(colorMode()) {
+ case None: popup->setItemChecked(id,true); break;
+ case Depth: popup->setItemChecked(id+1,true); break;
+ case Name: popup->setItemChecked(id+2,true); break;
+ case Owner: popup->setItemChecked(id+3,true); break;
+ case Group: popup->setItemChecked(id+4,true); break;
+ case Mime: popup->setItemChecked(id+5,true); break;
+ default: break;
+ }
+}
+
+void FSView::colorActivated(int id)
+{
+ if (id == _colorID) setColorMode(None);
+ else if (id == _colorID+1) setColorMode(Depth);
+ else if (id == _colorID+2) setColorMode(Name);
+ else if (id == _colorID+3) setColorMode(Owner);
+ else if (id == _colorID+4) setColorMode(Group);
+ else if (id == _colorID+5) setColorMode(Mime);
+}
+
+void FSView::saveFSOptions()
+{
+ KConfigGroup tmconfig(_config, QCString("TreeMap"));
+ saveOptions(&tmconfig);
+ tmconfig.writeEntry("ColorMode", colorModeString());
+
+ KConfigGroup gconfig(_config, QCString("General"));
+ gconfig.writeEntry("Path", _path);
+
+ KConfigGroup cconfig(_config, QCString("MetricCache"));
+ saveMetric(&cconfig);
+}
+
+void FSView::quit()
+{
+ saveFSOptions();
+ KApplication::kApplication()->quit();
+}
+
+void FSView::doRedraw()
+{
+ // we update progress every 1/4 second, and redraw every second
+ static int redrawCounter = 0;
+
+ bool redo = _sm.scanRunning();
+ if (!redo) redrawCounter = 0;
+
+ if ((_progress>0) && (_progressSize>0) && _lastDir) {
+ int percent = _progress * 100 / _progressSize;
+ if (0) kdDebug(90100) << "FSView::progress "
+ << _progress << "/" << _progressSize
+ << "= " << percent << "%, "
+ << _dirsFinished << " dirs read, in "
+ << _lastDir->path() << endl;
+ emit progress(percent, _dirsFinished, _lastDir->path());
+ }
+
+
+ if (_allowRefresh && ((redrawCounter%4)==0)) {
+ if (0) kdDebug(90100) << "doRedraw " << _sm.scanLength() << endl;
+ redraw();
+ }
+ else
+ redo = true;
+
+ if (redo) {
+ QTimer::singleShot(500, this, SLOT(doRedraw()));
+ redrawCounter++;
+ }
+}
+
+
+void FSView::doUpdate()
+{
+ for(int i=0;i<5;i++) {
+ switch(_progressPhase) {
+ case 1:
+ _chunkSize1 += _sm.scan(_chunkData1);
+ if (_chunkSize1 > 100) {
+ _progressPhase = 2;
+
+ /* Go to maximally 33% by scaling with 3 */
+ _progressSize = 3 * _chunkSize1;
+
+ if (1) kdDebug(90100) << "Phase 2: CSize " << _chunkSize1 << endl;
+ }
+ break;
+
+ case 2:
+ /* progress phase 2 */
+ _chunkSize2 += _sm.scan(_chunkData2);
+ /* switch to Phase 3 if we reach 80 % of Phase 2 */
+ if (_progress * 3 > _progressSize * 8/10) {
+ _progressPhase = 3;
+
+ /* Goal: Keep percentage equal from phase 2 to 3 */
+ double percent = (double)_progress / _progressSize;
+ /* We scale by factor 2/3 aferwards */
+ percent = percent * 3/2;
+
+ int todo = _chunkSize2 + (_progressSize/3 - _progress);
+ _progressSize = (int) ((double)todo / (1.0 - percent));
+ _progress = _progressSize - todo;
+
+ /* Go to maximally 66% by scaling with 1.5 */
+ _progressSize = _progressSize *3/2;
+
+ if (1) kdDebug(90100) << "Phase 3: CSize " << _chunkSize2
+ << ", Todo " << todo
+ << ", Progress " << _progress
+ << "/" << _progressSize << endl;
+ }
+ break;
+
+ case 3:
+ /* progress phase 3 */
+ _chunkSize3 += _sm.scan(_chunkData3);
+ /* switch to Phase 4 if we reach 80 % of Phase 3 */
+ if (_progress * 3/2 > _progressSize * 8/10) {
+ _progressPhase = 4;
+
+ /* Goal: Keep percentage equal from phase 2 to 3 */
+ double percent = (double)_progress / _progressSize;
+ int todo = _chunkSize3 + (_progressSize*2/3 - _progress);
+ _progressSize = (int)((double)todo / (1.0 - percent) + .5);
+ _progress = _progressSize - todo;
+
+ if (1) kdDebug(90100) << "Phase 4: CSize " << _chunkSize3
+ << ", Todo " << todo
+ << ", Progress " << _progress
+ << "/" << _progressSize << endl;
+ }
+
+ default:
+ _sm.scan(-1);
+ break;
+ }
+ }
+
+ if (_sm.scanRunning())
+ QTimer::singleShot(0, this, SLOT(doUpdate()));
+ else
+ emit completed(_dirsFinished);
+}
+
+#include "fsview.moc"
diff --git a/konq-plugins/fsview/fsview.desktop b/konq-plugins/fsview/fsview.desktop
new file mode 100644
index 0000000..6f7f163
--- /dev/null
+++ b/konq-plugins/fsview/fsview.desktop
@@ -0,0 +1,120 @@
+# KDE Config File
+[Desktop Entry]
+Type=Application
+Exec=fsview -caption "%c" %i %m %u
+MimeType=inode/directory
+Icon=fsview
+DocPath=konq-plugins/fsview/index.html
+Terminal=false
+Name=File Size Viewer
+Name[bg]=Преглед на файловия размер
+Name[bs]=Preglednik veličine datoteka
+Name[ca]=Visor de mides de fitxers
+Name[cs]=Prohlížeč velikostí souborů
+Name[da]=Filstørrelses fremviser
+Name[de]=Dateigrößenbetrachter
+Name[el]=Προβολέας μεγέθους αρχείων
+Name[eo]=Dosiergrandeca rigardilo
+Name[es]=Visor del tamaño del archivo
+Name[et]=Failisuuruse näitaja
+Name[eu]=Fitxategi neurrien ikustailea
+Name[fa]=مشاهده‌گر اندازۀ پرونده
+Name[fi]=Tiedostokoon näyttäjä
+Name[fr]=Afficheur de taille de fichiers
+Name[fy]=werjefte ôfbyldingsgrutte
+Name[gl]=Visor do Tamaño de Ficheiros
+Name[he]=מציג גדלי קבצים
+Name[hi]=फ़ाइल आकार प्रदर्शक
+Name[hr]=Preglednik veličine datoteka
+Name[hu]=Fájlméret-megtekintő
+Name[is]=Skoða stærð skráa
+Name[it]=Visualizzatore della dimensione dei file
+Name[ja]=ファイルサイズビューア
+Name[ka]=ფაილის ზომის მხილველი
+Name[kk]=Файл көлемін қарау
+Name[km]=កម្មវិធី​មើល​ទំហំ​ឯកសារ
+Name[lt]=Bylų dydžio stebėjimo priemonė
+Name[mk]=Прегледувач на големина на датотеки
+Name[ms]=Pelihat Saiz Fail
+Name[nb]=Filstørrelseviser
+Name[nds]=Dateigrött-Kieker
+Name[ne]=फाइल साइज दर्शक
+Name[nl]=Afbeeldinggrootteweergave
+Name[nn]=Filstorleikvisar
+Name[pa]=ਫਾਇਲ ਅਕਾਰ ਦਰਸ਼ਕ
+Name[pl]=Przeglądarka rozmiaru plików
+Name[pt]=Visualizador do Tamanho de Ficheiros
+Name[pt_BR]=Visão do Tam. do arquivo
+Name[ru]=Размер файла
+Name[sk]=Prehliadač veľkosti súborov
+Name[sl]=Pregledovalnik velikosti datotek
+Name[sr]=Приказивач величине фајла
+Name[sr@Latn]=Prikazivač veličine fajla
+Name[sv]=Filstorleksvisning
+Name[ta]=கோப்பு அளவு காட்சியாளன்
+Name[tg]=Андозаи файл
+Name[tr]=Dosya Boyut Göstericisi
+Name[uk]=Переглядач розміру файлів
+Name[uz]=Fayl hajmini koʻruvchi
+Name[uz@cyrillic]=Файл ҳажмини кўрувчи
+Name[vi]=Bộ xem kích cỡ tập tin
+Name[zh_CN]=文件大小查看器
+Name[zh_TW]=檔案大小檢視器
+Comment=View your filesystem as a TreeMap
+Comment[ar]=عرض لنظام الملفات بنمط شجري
+Comment[bg]=Преглед на файловата система
+Comment[bs]=Prikazuje vaš datotečni sistem kao mapu stabla
+Comment[ca]=Visualitza el vostre sistema de fitxers com a un mapa arbrolat
+Comment[cs]=Zobrazení souborového systému ve stylu stromové mapy
+Comment[cy]=Gweld eich cysawd ffeiliau fel MapCoeden
+Comment[da]=Vis dit filsystem som et trækort
+Comment[de]=Dateisystem als Hierarchiestruktur betrachten
+Comment[el]=Προβολή του συστήματος αρχείων σας σαν δενδρική δομή
+Comment[eo]=Vidu vian dosiersistemon kiel ArbMapo
+Comment[es]=Ver su sistema de archivos en forma árbol
+Comment[et]=Võimalus vaadata failisüsteemi puukujulisena
+Comment[eu]=Ikusi zure fitxategi sistema arbola balitz lez
+Comment[fa]=سیستم پرونده‌تان را به عنوان یک TreeMap مشاهده کنید
+Comment[fi]=Katsele tiedostojärjestelmääsi puukarttana
+Comment[fr]=Afficher votre système de fichiers sous la forme d'une arborescence
+Comment[fy]=Besjoch jo triemsysteem as beamstruktuer
+Comment[gl]=Ver o sistema de ficheiros como unha árbore-mapa
+Comment[he]=תצוגת הקבצים שלך בתור עץ
+Comment[hi]=आपके फ़ाइल-सिस्टम को एक ट्री-मैप में दिखाए
+Comment[hr]=Prikazuje datotečni sustav u obliku stabla
+Comment[hu]=A fájlrendszer áttekintése fastruktúraként
+Comment[is]=Flakka um skráarkerfið í tráarham
+Comment[it]=Visualizza il tuo filesystem come una mappa ad albero
+Comment[ja]=ツリーマップでファイルシステムを表示
+Comment[ka]=ფაილური სისტემის ხის სახით ხილვა
+Comment[kk]=Файлдар жүйесінің бұтақтарын қарау
+Comment[km]=មើល​ប្រព័ន្ធ​ឯកសារ​របស់​អ្នក​​ជា​ផែនទី​មែកធាង
+Comment[lt]=Peržiūrėti bylų sistemą kaip medžio tipo žemėlapį
+Comment[mk]=Прегледајте го Вашиот датотечен систем како мапа на стебло
+Comment[ms]=Lihat sistem fail anda sebagai TreeMap
+Comment[nb]=Se filsystemet som et tre-kart
+Comment[nds]=Dien Dateisysteem as Boomkoort
+Comment[ne]=ट्री मानचित्रका रुपमा तपाईँको फाइल प्रणाली हेर्नुहोस्
+Comment[nl]=Bekijk uw bestandssysteem als boomstructuur
+Comment[nn]=Viser filsystemet som eit trekart
+Comment[pa]=ਆਪਣੇ ਫਾਇਲ ਸਿਸਟਮ ਨੂੰ ਲੜੀ-ਖਾਕੇ ਦੇ ਰੂਪ ਵਿੱਚ ਵੇਖੋ
+Comment[pl]=Przedstawia system plików jako drzewo
+Comment[pt]=Ver o sistema de ficheiros como uma árvore-mapa
+Comment[pt_BR]=Vê seu sistema de arquivos como um Mapa em Árvore
+Comment[ro]=Afişează sistemul de fişiere ca pe o hartă arborescentă
+Comment[ru]=Просмотр дерева папок
+Comment[sk]=Zobrazenie vášho systému súborov ako stromová mapa
+Comment[sl]=Prikaz datotečnega sistema kot drevesa
+Comment[sr]=Прикажите ваш систем фајлова као стаблолику мапу
+Comment[sr@Latn]=Prikažite vaš sistem fajlova kao stabloliku mapu
+Comment[sv]=Visa filsystemet som en trädkarta
+Comment[ta]=உங்கள் கோப்பு அமைப்பை மர வரைபடமாக பார்வையிடு
+Comment[tg]=Аз назар гузаронидани дарахти каталогҳо
+Comment[tr]=Dosya sistemini ağaç şeklinde görüntüle
+Comment[uk]=Перегляд вашої файлової системи як дерева
+Comment[vi]=Xem hệ thống tập tin dạng Sơ Đồ Cây
+Comment[zh_CN]=以树形图查看您的文件系统
+Comment[zh_TW]=將您的作業系統以樹狀圖檢視
+X-DCOP-ServiceType=Multi
+Categories=Qt;KDE;Utility;
+X-KDE-ParentApp=konqueror
diff --git a/konq-plugins/fsview/fsview.h b/konq-plugins/fsview/fsview.h
new file mode 100644
index 0000000..17d926f
--- /dev/null
+++ b/konq-plugins/fsview/fsview.h
@@ -0,0 +1,136 @@
+/* This file is part of FSView.
+ Copyright (C) 2002, 2003 Josef Weidendorfer <Josef.Weidendorfer@gmx.de>
+
+ KCachegrind is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation, version 2.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+/*
+ * FSView specialisaton of TreeMap classes.
+ */
+
+#ifndef FSVIEW_H
+#define FSVIEW_H
+
+#include <qmap.h>
+#include <qptrlist.h>
+#include <qfileinfo.h>
+#include <qstring.h>
+
+#include <kmimetype.h>
+
+#include "treemap.h"
+#include "inode.h"
+#include "scan.h"
+
+class KConfig;
+
+/* Cached Metric info config */
+class MetricEntry
+{
+ public:
+ MetricEntry()
+ { size = 0.0; fileCount = 0; dirCount = 0; }
+ MetricEntry(double s, unsigned int f, unsigned int d)
+ { size = s; fileCount = f; dirCount = d; }
+
+ double size;
+ unsigned int fileCount, dirCount;
+};
+
+/**
+ * The root object for the treemap.
+ *
+ * Does context menu handling and
+ * asynchronous file size update
+ */
+class FSView : public TreeMapWidget, public ScanListener
+{
+ Q_OBJECT
+
+public:
+ enum ColorMode { None = 0, Depth, Name, Owner, Group, Mime };
+
+ FSView(Inode*, QWidget* parent=0, const char* name=0);
+ ~FSView();
+
+ KConfig* config() { return _config; }
+
+ void setPath(QString);
+ QString path() { return _path; }
+ int pathDepth() { return _pathDepth; }
+
+ void setColorMode(FSView::ColorMode cm);
+ FSView::ColorMode colorMode() const { return _colorMode; }
+ // returns true if string was recognized
+ bool setColorMode(QString);
+ QString colorModeString() const;
+
+ void requestUpdate(Inode*);
+
+ /* Implementation of listener interface of ScanManager.
+ * Used to calculate progress info */
+ void scanFinished(ScanDir*);
+
+ void stop();
+
+ static bool getDirMetric(const QString&, double&, unsigned int&, unsigned int&);
+ static void setDirMetric(const QString&, double, unsigned int, unsigned int);
+ void saveMetric(KConfigGroup*);
+ void saveFSOptions();
+
+ // for color mode
+ void addColorItems(QPopupMenu*, int);
+
+ KURL::List selectedUrls();
+
+public slots:
+ void selected(TreeMapItem*);
+ void contextMenu(TreeMapItem*, const QPoint &);
+ void quit();
+ void doUpdate();
+ void doRedraw();
+ void colorActivated(int);
+
+ signals:
+ void started();
+ void progress(int percent, int dirs, const QString& lastDir);
+ void completed(int dirs);
+
+ private:
+ KConfig* _config;
+ ScanManager _sm;
+
+ // when a contextMenu is shown, we don't allow async. refreshs
+ bool _allowRefresh;
+ // a cache for directory sizes with long lasting updates
+ static QMap<QString, MetricEntry> _dirMetric;
+
+ // current root path
+ int _pathDepth;
+ QString _path;
+
+ // for progress info
+ int _progressPhase;
+ int _chunkData1, _chunkData2, _chunkData3;
+ int _chunkSize1, _chunkSize2, _chunkSize3;
+ int _progress, _progressSize, _dirsFinished;
+ ScanDir* _lastDir;
+
+ ColorMode _colorMode;
+ int _colorID;
+};
+
+#endif // FSVIEW_H
+
diff --git a/konq-plugins/fsview/fsview_part.cpp b/konq-plugins/fsview/fsview_part.cpp
new file mode 100644
index 0000000..745cb63
--- /dev/null
+++ b/konq-plugins/fsview/fsview_part.cpp
@@ -0,0 +1,413 @@
+/* This file is part of FSView.
+ Copyright (C) 2002, 2003 Josef Weidendorfer <Josef.Weidendorfer@gmx.de>
+
+ KCachegrind is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation, version 2.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+/*
+ * The KPart embedding the FSView widget
+ */
+
+#include <qclipboard.h>
+#include <qtimer.h>
+#include <qwhatsthis.h>
+
+#include <kinstance.h>
+#include <kfiledialog.h>
+#include <kfileitem.h>
+#include <kparts/genericfactory.h>
+#include <kapplication.h>
+#include <kaboutdata.h>
+#include <klocale.h>
+#include <kaction.h>
+#include <kpopupmenu.h>
+#include <kglobalsettings.h>
+#include <kprotocolinfo.h>
+#include <kio/job.h>
+#include <kmessagebox.h>
+
+// from kdebase/libkonq...
+#include <konq_operations.h>
+#include <konq_drag.h>
+
+#include "fsview_part.h"
+
+
+
+
+typedef KParts::GenericFactory<FSViewPart> FSViewPartFactory;
+K_EXPORT_COMPONENT_FACTORY( libfsviewpart, FSViewPartFactory )
+
+
+// FSJob, for progress
+
+FSJob::FSJob(FSView* v)
+ : KIO::Job(false)
+{
+ _view = v;
+ QObject::connect(v, SIGNAL(progress(int,int,const QString&)),
+ this, SLOT(progressSlot(int,int,const QString&)));
+}
+
+void FSJob::kill(bool quietly)
+{
+ _view->stop();
+
+ Job::kill(quietly);
+}
+
+void FSJob::progressSlot(int percent, int dirs, const QString& cDir)
+{
+ if (percent<100) {
+ emitPercent(percent, 100);
+ slotInfoMessage(this, i18n("Read 1 folder, in %1",
+ "Read %n folders, in %1",
+ dirs ).arg(cDir));
+ }
+ else
+ slotInfoMessage(this, i18n("1 folder", "%n folders", dirs));
+}
+
+
+// FSViewPart
+
+KAboutData* FSViewPart::createAboutData()
+{
+ KAboutData* aboutData;
+ aboutData = new KAboutData("fsview", I18N_NOOP("FSView"), "0.1.1",
+ I18N_NOOP("Filesystem Utilization Viewer"),
+ KAboutData::License_GPL,
+ I18N_NOOP("(c) 2003-2005, Josef Weidendorfer"));
+ return aboutData;
+}
+
+FSViewPart::FSViewPart(QWidget *parentWidget, const char *widgetName,
+ QObject *parent, const char *name,
+ const QStringList& /* args */)
+ : KParts::ReadOnlyPart(parent, name)
+{
+ // we need an instance
+ setInstance( FSViewPartFactory::instance() );
+
+ _view = new FSView(new Inode(), parentWidget, widgetName);
+ QWhatsThis::add(_view, i18n("<p>This is the FSView plugin, a graphical "
+ "browsing mode showing filesystem utilization "
+ "by using a tree map visualization.</p>"
+ "<p>Note that in this mode, automatic updating "
+ "when filesystem changes are made "
+ "is intentionally <b>not</b> done.</p>"
+ "<p>For details on usage and options available, "
+ "see the online help under "
+ "menu 'Help/FSView Manual'.</p>"));
+
+ _view->show();
+ setWidget(_view);
+
+ _ext = new FSViewBrowserExtension(this);
+ _job = 0;
+
+ _areaMenu = new KActionMenu (i18n("Stop at Area"),
+ actionCollection(), "treemap_areadir");
+ _depthMenu = new KActionMenu (i18n("Stop at Depth"),
+ actionCollection(), "treemap_depthdir");
+ _visMenu = new KActionMenu (i18n("Visualization"),
+ actionCollection(), "treemap_visdir");
+ _colorMenu = new KActionMenu (i18n("Color Mode"),
+ actionCollection(), "treemap_colordir");
+
+ KAction* action;
+ action = new KAction( i18n( "&FSView Manual" ), "fsview",
+ KShortcut(), this, SLOT(showHelp()),
+ actionCollection(), "help_fsview" );
+ action->setToolTip(i18n("Show FSView manual"));
+ action->setWhatsThis(i18n("Opens the help browser with the "
+ "FSView documentation"));
+
+ QObject::connect (_visMenu->popupMenu(), SIGNAL (aboutToShow()),
+ SLOT (slotShowVisMenu()));
+ QObject::connect (_areaMenu->popupMenu(), SIGNAL (aboutToShow()),
+ SLOT (slotShowAreaMenu()));
+ QObject::connect (_depthMenu->popupMenu(), SIGNAL (aboutToShow()),
+ SLOT (slotShowDepthMenu()));
+ QObject::connect (_colorMenu->popupMenu(), SIGNAL (aboutToShow()),
+ SLOT (slotShowColorMenu()));
+
+ slotSettingsChanged(KApplication::SETTINGS_MOUSE);
+ if (kapp)
+ connect( kapp, SIGNAL( settingsChanged(int) ),
+ SLOT( slotSettingsChanged(int) ) );
+
+ QObject::connect(_view,SIGNAL(returnPressed(TreeMapItem*)),
+ _ext,SLOT(selected(TreeMapItem*)));
+ QObject::connect(_view,SIGNAL(selectionChanged()),
+ _ext,SLOT(updateActions()));
+ QObject::connect(_view,
+ SIGNAL(contextMenuRequested(TreeMapItem*,const QPoint&)),
+ _ext,
+ SLOT(contextMenu(TreeMapItem*, const QPoint&)));
+
+ QObject::connect(_view, SIGNAL(started()), this, SLOT(startedSlot()));
+ QObject::connect(_view, SIGNAL(completed(int)),
+ this, SLOT(completedSlot(int)));
+
+ QTimer::singleShot(1, this, SLOT(showInfo()));
+
+ setXMLFile( "fsview_part.rc" );
+}
+
+
+FSViewPart::~FSViewPart()
+{
+ kdDebug(90100) << "FSViewPart Destructor" << endl;
+
+ delete _job;
+ _view->saveFSOptions();
+}
+
+void FSViewPart::slotSettingsChanged(int category)
+{
+ if (category != KApplication::SETTINGS_MOUSE) return;
+
+ QObject::disconnect(_view,SIGNAL(clicked(TreeMapItem*)),
+ _ext,SLOT(selected(TreeMapItem*)));
+ QObject::disconnect(_view,SIGNAL(doubleClicked(TreeMapItem*)),
+ _ext,SLOT(selected(TreeMapItem*)));
+
+ if (KGlobalSettings::singleClick())
+ QObject::connect(_view,SIGNAL(clicked(TreeMapItem*)),
+ _ext,SLOT(selected(TreeMapItem*)));
+ else
+ QObject::connect(_view,SIGNAL(doubleClicked(TreeMapItem*)),
+ _ext,SLOT(selected(TreeMapItem*)));
+}
+
+void FSViewPart::showInfo()
+{
+ QString info;
+ info = i18n("FSView intentionally does not support automatic updates "
+ "when changes are made to files or directories, "
+ "currently visible in FSView, from the outside.\n"
+ "For details, see the 'Help/FSView Manual'.");
+
+ KMessageBox::information( _view, info, QString::null, "ShowFSViewInfo");
+}
+
+void FSViewPart::showHelp()
+{
+ KApplication::startServiceByDesktopName("khelpcenter",
+ QString("help:/konq-plugins/fsview/index.html"));
+}
+
+void FSViewPart::startedSlot()
+{
+ _job = new FSJob(_view);
+ emit started(_job);
+}
+
+void FSViewPart::completedSlot(int dirs)
+{
+ if (_job) {
+ _job->progressSlot(100, dirs, QString::null);
+ delete _job;
+ _job = 0;
+ }
+
+ KConfigGroup cconfig(_view->config(), QCString("MetricCache"));
+ _view->saveMetric(&cconfig);
+
+ emit completed();
+}
+
+void FSViewPart::slotShowVisMenu()
+{
+ _visMenu->popupMenu()->clear();
+ _view->addVisualizationItems(_visMenu->popupMenu(), 1301);
+}
+
+void FSViewPart::slotShowAreaMenu()
+{
+ _areaMenu->popupMenu()->clear();
+ _view->addAreaStopItems(_areaMenu->popupMenu(), 1001, 0);
+}
+
+void FSViewPart::slotShowDepthMenu()
+{
+ _depthMenu->popupMenu()->clear();
+ _view->addDepthStopItems(_depthMenu->popupMenu(), 1501, 0);
+}
+
+void FSViewPart::slotShowColorMenu()
+{
+ _colorMenu->popupMenu()->clear();
+ _view->addColorItems(_colorMenu->popupMenu(), 1401);
+}
+
+bool FSViewPart::openFile() // never called since openURL is reimplemented
+{
+ kdDebug(90100) << "FSViewPart::openFile " << m_file << endl;
+ _view->setPath(m_file);
+
+ return true;
+}
+
+bool FSViewPart::openURL(const KURL &url)
+{
+ kdDebug(90100) << "FSViewPart::openURL " << url.path() << endl;
+
+ if (!url.isValid()) return false;
+ if (!url.isLocalFile()) return false;
+
+ m_url = url;
+ emit setWindowCaption( m_url.prettyURL() );
+
+ _view->setPath(url.path());
+
+ return true;
+}
+
+bool FSViewPart::closeURL()
+{
+ kdDebug(90100) << "FSViewPart::closeURL " << endl;
+
+ _view->stop();
+
+ return true;
+}
+
+// FSViewBrowserExtension
+
+FSViewBrowserExtension::FSViewBrowserExtension(FSViewPart* viewPart,
+ const char *name)
+ :KParts::BrowserExtension(viewPart, name)
+{
+ _view = viewPart->view();
+}
+
+FSViewBrowserExtension::~FSViewBrowserExtension()
+{}
+
+void FSViewBrowserExtension::updateActions()
+{
+ TreeMapItemList s = _view->selection();
+ TreeMapItem* i;
+ int canDel = 0, canCopy = 0;
+ KURL::List urls;
+
+ for(i=s.first();i;i=s.next()) {
+ KURL u;
+ u.setPath( ((Inode*)i)->path() );
+ urls.append(u);
+ canCopy++;
+ if ( KProtocolInfo::supportsDeleting( u ) ) canDel++;
+ }
+ emit enableAction( "copy", canCopy > 0 );
+ emit enableAction( "cut", canDel > 0 );
+ emit enableAction( "trash", canDel > 0);
+ emit enableAction( "del", canDel > 0 );
+ emit enableAction( "editMimeType", ( s.count() == 1 ) );
+
+ emit selectionInfo(urls);
+
+ kdDebug(90100) << "FSViewPart::updateActions, deletable " << canDel << endl;
+}
+
+
+void FSViewBrowserExtension::del()
+{
+ KonqOperations::del(_view, KonqOperations::DEL, _view->selectedUrls());
+ // How to get notified of end of delete operation?
+ // - search for the KonqOperations child of _view (name "KonqOperations")
+ // - connect to destroyed signal
+ KonqOperations* o = (KonqOperations*) _view->child("KonqOperations");
+ if (o) connect(o, SIGNAL(destroyed()), SLOT(refresh()));
+}
+
+void FSViewBrowserExtension::trash()
+{
+ KonqOperations::del(_view, KonqOperations::TRASH, _view->selectedUrls());
+ KonqOperations* o = (KonqOperations*) _view->child("KonqOperations");
+ if (o) connect(o, SIGNAL(destroyed()), SLOT(refresh()));
+}
+
+void FSViewBrowserExtension::copySelection( bool move )
+{
+ KonqDrag *urlData = KonqDrag::newDrag( _view->selectedUrls(), move );
+ QApplication::clipboard()->setData( urlData );
+}
+
+void FSViewBrowserExtension::editMimeType()
+{
+ Inode* i = (Inode*) _view->selection().first();
+ if (i)
+ KonqOperations::editMimeType( i->mimeType()->name() );
+}
+
+
+// refresh treemap at end of KIO jobs
+void FSViewBrowserExtension::refresh()
+{
+ // only need to refresh common ancestor for all selected items
+ TreeMapItemList s = _view->selection();
+ TreeMapItem *i, *commonParent = s.first();
+ if (!commonParent) return;
+ while( (i=s.next()) )
+ commonParent = commonParent->commonParent(i);
+
+ /* if commonParent is a file, update parent directory */
+ if ( !((Inode*)commonParent)->isDir() ) {
+ commonParent = commonParent->parent();
+ if (!commonParent) return;
+ }
+
+ kdDebug(90100) << "FSViewPart::refreshing "
+ << ((Inode*)commonParent)->path() << endl;
+
+ _view->requestUpdate( (Inode*)commonParent );
+}
+
+void FSViewBrowserExtension::selected(TreeMapItem* i)
+{
+ if (!i) return;
+
+ KURL url;
+ url.setPath( ((Inode*)i)->path() );
+ emit openURLRequest(url);
+}
+
+void FSViewBrowserExtension::contextMenu(TreeMapItem* /*item*/,const QPoint& p)
+{
+ TreeMapItemList s = _view->selection();
+ TreeMapItem* i;
+ KFileItemList items;
+ items.setAutoDelete(true);
+
+ for(i=s.first();i;i=s.next()) {
+ KURL u;
+ u.setPath( ((Inode*)i)->path() );
+ QString mimetype = ((Inode*)i)->mimeType()->name();
+ const QFileInfo& info = ((Inode*)i)->fileInfo();
+ mode_t mode =
+ info.isFile() ? S_IFREG :
+ info.isDir() ? S_IFDIR :
+ info.isSymLink() ? S_IFLNK : (mode_t)-1;
+ items.append(new KFileItem(u, mimetype, mode));
+ }
+
+ if (items.count()>0)
+ emit popupMenu(_view->mapToGlobal(p), items);
+}
+
+
+#include "fsview_part.moc"
diff --git a/konq-plugins/fsview/fsview_part.desktop b/konq-plugins/fsview/fsview_part.desktop
new file mode 100644
index 0000000..d282178
--- /dev/null
+++ b/konq-plugins/fsview/fsview_part.desktop
@@ -0,0 +1,58 @@
+[Desktop Entry]
+Name=File Size View
+Name[bg]=Преглед на файловия размер
+Name[bs]=Pogled veličine datoteka
+Name[ca]=Vista de mides de fitxers
+Name[cs]=Prohlížeč velikostí souborů
+Name[da]=Fremvisning af filstørrelse
+Name[de]=Dateigrößen-Ansicht
+Name[el]=Προβολή Μεγέθους αρχείων
+Name[eo]=Dosiergrandeca rigardo
+Name[es]=Vista del tamaño del archivo
+Name[et]=Failisuuruse vaade
+Name[eu]=Fitxategien neurriaren ikuspegia
+Name[fa]=نمای اندازۀ پرونده
+Name[fr]=Afficheur de taille de fichiers
+Name[gl]=Vista de Tamaño de Ficheiros
+Name[he]=מציג גדלי קבצים
+Name[hi]=फ़ाइल आकार दृश्य
+Name[hr]=Prikaz veličine datoteke
+Name[hu]=Fájlméret-nézet
+Name[is]=Skoða skráarstærð
+Name[it]=Visualizza dimensione file
+Name[ja]=ファイルサイズ表示
+Name[ka]=ფაილის ზომის ხილვა
+Name[kk]=Файл көлемдердің қарау
+Name[km]=មើល​ទំហំ​ឯកសារ​
+Name[lt]=Bylų dydžio vaizdas
+Name[mk]=Преглед на големина на датотеки
+Name[ms]=Pandangan Saiz Fail
+Name[nb]=Filstørrelsevisning
+Name[nds]=Dateigrött-Ansicht
+Name[ne]=फाइल साइज दृश्य
+Name[nn]=Filstorleikvisar
+Name[pa]=ਫਾਇਲ ਅਕਾਰ ਵੇਖੋ
+Name[pl]=Widok rozmiaru plików
+Name[pt]=Vista de Tamanho de Ficheiros
+Name[pt_BR]=Visão do Tam. do arquivo
+Name[ru]=Размер файла
+Name[sk]=Veľkosť súborov
+Name[sl]=Pregledovalnik velikosti datotek
+Name[sr]=Приказ величине фајла
+Name[sr@Latn]=Prikaz veličine fajla
+Name[sv]=Filstorleksvisning
+Name[ta]=கோப்பு அளவு காட்சி
+Name[tg]=Андозаи файл
+Name[tr]=Dosya Boyut Görüntüleme
+Name[uk]=Перегляд розміру файлів
+Name[uz]=Fayl hajmini koʻrish
+Name[uz@cyrillic]=Файл ҳажмини кўриш
+Name[vi]=Xem cỡ tập tin
+Name[zh_CN]=文件大小查看
+Name[zh_TW]=檔案大小檢視器
+MimeType=inode/directory
+ServiceTypes=KParts/ReadOnlyPart
+X-KDE-Library=libfsviewpart
+Type=Service
+Icon=fsview
+DocPath=konq-plugins/fsview/index.html
diff --git a/konq-plugins/fsview/fsview_part.h b/konq-plugins/fsview/fsview_part.h
new file mode 100644
index 0000000..4f2c734
--- /dev/null
+++ b/konq-plugins/fsview/fsview_part.h
@@ -0,0 +1,122 @@
+/* This file is part of FSView.
+ Copyright (C) 2002, 2003 Josef Weidendorfer <Josef.Weidendorfer@gmx.de>
+
+ KCachegrind is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation, version 2.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+/*
+ * The KPart embedding the FSView widget
+ */
+
+#ifndef FSVIEW_PART_H
+#define FSVIEW_PART_H
+
+#include <kparts/part.h>
+#include <kparts/browserextension.h>
+#include <kio/jobclasses.h>
+
+#include "fsview.h"
+
+class KAboutData;
+class KActionMenu;
+
+class FSViewPart;
+
+class FSViewBrowserExtension : public KParts::BrowserExtension
+{
+ Q_OBJECT
+
+public:
+ FSViewBrowserExtension(FSViewPart *viewPart, const char *name=0L);
+ ~FSViewBrowserExtension();
+
+protected slots:
+ void selected(TreeMapItem*);
+ void contextMenu(TreeMapItem*,const QPoint&);
+
+ void updateActions();
+ void refresh();
+
+ void copy() { copySelection( false ); }
+ void cut() { copySelection( true ); }
+ void trash();
+ void del();
+ void editMimeType();
+
+private:
+ void copySelection( bool move );
+
+ FSView* _view;
+};
+
+class FSJob: public KIO::Job
+{
+ Q_OBJECT
+
+public:
+ FSJob(FSView*);
+
+ virtual void kill( bool quietly = true );
+
+public slots:
+ void progressSlot(int percent, int dirs, const QString& lastDir);
+
+private:
+ FSView* _view;
+};
+
+
+class FSViewPart : public KParts::ReadOnlyPart
+{
+ Q_OBJECT
+ Q_PROPERTY( bool supportsUndo READ supportsUndo )
+public:
+ FSViewPart(QWidget *parentWidget, const char *widgetName,
+ QObject *parent, const char *name, const QStringList &args);
+
+ virtual ~FSViewPart();
+
+ bool supportsUndo() const { return false; }
+
+ static KAboutData* createAboutData();
+ FSView* view() const { return _view; }
+
+public slots:
+ void showInfo();
+ void showHelp();
+ void startedSlot();
+ void completedSlot(int dirs);
+ void slotShowVisMenu();
+ void slotShowAreaMenu();
+ void slotShowDepthMenu();
+ void slotShowColorMenu();
+ void slotSettingsChanged(int);
+
+protected:
+ /**
+ * This must be implemented by each part
+ */
+ virtual bool openFile();
+ virtual bool openURL(const KURL &url);
+ virtual bool closeURL();
+
+private:
+ FSView* _view;
+ FSJob* _job;
+ FSViewBrowserExtension* _ext;
+ KActionMenu *_visMenu, *_areaMenu, *_depthMenu, *_colorMenu;
+};
+
+#endif // FSVIEW_PART_H
diff --git a/konq-plugins/fsview/fsview_part.rc b/konq-plugins/fsview/fsview_part.rc
new file mode 100644
index 0000000..c8df3df
--- /dev/null
+++ b/konq-plugins/fsview/fsview_part.rc
@@ -0,0 +1,15 @@
+<!DOCTYPE kpartplugin>
+<kpartplugin name="FSViewPart" library="libfsviewpart" version = "1">
+<MenuBar>
+ <Menu name="view"><Text>&amp;View</Text>
+ <Separator/>
+ <Action name="treemap_visdir"/>
+ <Action name="treemap_colordir"/>
+ <Action name="treemap_areadir"/>
+ <Action name="treemap_depthdir"/>
+ </Menu>
+ <Menu name="help"><text>&amp;Help</text>
+ <Action name="help_fsview"/>
+ </Menu>
+</MenuBar>
+</kpartplugin>
diff --git a/konq-plugins/fsview/hi22-app-fsview.png b/konq-plugins/fsview/hi22-app-fsview.png
new file mode 100644
index 0000000..efdcdcb
--- /dev/null
+++ b/konq-plugins/fsview/hi22-app-fsview.png
Binary files differ
diff --git a/konq-plugins/fsview/hi32-app-fsview.png b/konq-plugins/fsview/hi32-app-fsview.png
new file mode 100644
index 0000000..6e22f8b
--- /dev/null
+++ b/konq-plugins/fsview/hi32-app-fsview.png
Binary files differ
diff --git a/konq-plugins/fsview/inode.cpp b/konq-plugins/fsview/inode.cpp
new file mode 100644
index 0000000..0411d3a
--- /dev/null
+++ b/konq-plugins/fsview/inode.cpp
@@ -0,0 +1,385 @@
+/* This file is part of FSView.
+ Copyright (C) 2002, 2003 Josef Weidendorfer <Josef.Weidendorfer@gmx.de>
+
+ KCachegrind is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation, version 2.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+/*
+ * FSView specialisaton of TreeMapItem class.
+ */
+
+
+#include <kurl.h>
+#include <kmimetype.h>
+#include <kdebug.h>
+#include <kglobal.h>
+#include <klocale.h>
+
+#include "inode.h"
+#include "scan.h"
+#include "fsview.h"
+
+// Inode
+
+Inode::Inode()
+{
+ _dirPeer = 0;
+ _filePeer = 0;
+ init("");
+}
+
+Inode::Inode(ScanDir* d, Inode* parent)
+ : TreeMapItem(parent)
+{
+ QString absPath;
+ if (parent) {
+ absPath = parent->path();
+ if (!absPath.endsWith("/")) absPath += "/";
+ }
+ absPath += d->name();
+
+ _dirPeer = d;
+ _filePeer = 0;
+
+ init(absPath);
+}
+
+Inode::Inode(ScanFile* f, Inode* parent)
+ : TreeMapItem(parent)
+{
+ QString absPath;
+ if (parent)
+ absPath = parent->path() + "/";
+ absPath += f->name();
+
+ _dirPeer = 0;
+ _filePeer = f;
+
+ init(absPath);
+}
+
+Inode::~Inode()
+{
+ if (0) kdDebug(90100) << "~Inode [" << path()
+ << "]" << endl;
+
+ /* reset Listener of old Peer */
+ if (_dirPeer)
+ _dirPeer->setListener(0);
+ if (_filePeer)
+ _filePeer->setListener(0);
+}
+
+void Inode::setPeer(ScanDir* d)
+{
+ /* reset Listener of old Peer */
+ if (_dirPeer)
+ _dirPeer->setListener(0);
+ if (_filePeer)
+ _filePeer->setListener(0);
+
+ _dirPeer = d;
+ _filePeer = 0;
+ init(d->name());
+}
+
+QString Inode::path() const
+{
+ return _info.absFilePath();
+}
+
+void Inode::init(const QString& path)
+{
+ if (0) kdDebug(90100) << "Inode::init [" << path
+ << "]" << endl;
+
+ _info = QFileInfo(path);
+
+ if (!FSView::getDirMetric(path, _sizeEstimation,
+ _fileCountEstimation,
+ _dirCountEstimation)) {
+ _sizeEstimation = 0.0;
+ _fileCountEstimation = 0;
+ _dirCountEstimation = 0;
+ }
+
+ _mimeSet = false;
+ _mimePixmapSet = false;
+ _resortNeeded = false;
+
+ clear();
+
+ /* we want to get notifications about dir changes */
+ if (_dirPeer)
+ _dirPeer->setListener(this);
+ if (_filePeer)
+ _filePeer->setListener(this);
+
+ if (_dirPeer && _dirPeer->scanFinished())
+ scanFinished(_dirPeer);
+}
+
+/* ScanListener interface */
+void Inode::sizeChanged(ScanDir* d)
+{
+ if (0) kdDebug(90100) << "Inode::sizeChanged [" << path() << "] in "
+ << d->name() << ": size " << d->size() << endl;
+
+ _resortNeeded = true;
+}
+
+void Inode::scanFinished(ScanDir* d)
+{
+ if (0) kdDebug(90100) << "Inode::scanFinished [" << path() << "] in "
+ << d->name() << ": size " << d->size() << endl;
+
+ _resortNeeded = true;
+
+ /* no estimation any longer */
+ _sizeEstimation = 0.0;
+ _fileCountEstimation = 0;
+ _dirCountEstimation = 0;
+
+ // cache metrics if "important" (for "/usr" is dd==3)
+ int dd = ((FSView*)widget())->pathDepth() + depth();
+ int files = d->fileCount();
+ int dirs = d->dirCount();
+
+ if ((files < 500) && (dirs < 50)) {
+ if (dd>4 && (files < 50) && (dirs < 5)) return;
+ }
+
+ FSView::setDirMetric(path(), d->size(), files, dirs);
+}
+
+void Inode::destroyed(ScanDir* d)
+{
+ if (_dirPeer == d) _dirPeer = 0;
+
+ // remove children
+ clear();
+}
+
+void Inode::destroyed(ScanFile* f)
+{
+ if (_filePeer == f) _filePeer = 0;
+}
+
+
+
+TreeMapItemList* Inode::children()
+{
+ if (!_dirPeer) return 0;
+
+ if (!_children) {
+ if (!_dirPeer->scanStarted()) return 0;
+
+ _children = new TreeMapItemList;
+ _children->setAutoDelete(true);
+
+ setSorting(-1);
+
+ ScanFileVector& files = _dirPeer->files();
+ if (files.count()>0) {
+ ScanFileVector::iterator it;
+ for( it = files.begin(); it != files.end(); ++it )
+ new Inode( &(*it), this);
+ }
+
+ ScanDirVector& dirs = _dirPeer->dirs();
+ if (dirs.count()>0) {
+ ScanDirVector::iterator it;
+ for( it = dirs.begin(); it != dirs.end(); ++it ) {
+ new Inode( &(*it), this);
+ }
+ }
+
+ setSorting(-2);
+ _resortNeeded = false;
+ }
+
+ if (_resortNeeded) {
+ resort();
+ _resortNeeded = false;
+ }
+
+ return _children;
+}
+
+
+
+double Inode::size() const
+{
+ // sizes of files are always correct
+ if (_filePeer) return _filePeer->size();
+ if (!_dirPeer) return 0;
+
+ double size = _dirPeer->size();
+ return (_sizeEstimation > size) ? _sizeEstimation : size;
+}
+
+double Inode::value() const
+{
+ return size();
+}
+
+unsigned int Inode::fileCount() const
+{
+ unsigned int fileCount = 1;
+
+ if (_dirPeer) fileCount = _dirPeer->fileCount();
+
+ if (_fileCountEstimation > fileCount)
+ fileCount = _fileCountEstimation;
+
+ return fileCount;
+}
+
+unsigned int Inode::dirCount() const
+{
+ unsigned int dirCount = 0;
+
+ if (_dirPeer) dirCount = _dirPeer->dirCount();
+
+ if (_dirCountEstimation > dirCount)
+ dirCount = _dirCountEstimation;
+
+ return dirCount;
+}
+
+
+QColor Inode::backColor() const
+{
+ QString n;
+ int id = 0;
+
+ switch( ((FSView*)widget())->colorMode() ) {
+ case FSView::Depth:
+ {
+ int d = ((FSView*)widget())->pathDepth() + depth();
+ return QColor((100*d)%360, 192,128, QColor::Hsv);
+ }
+
+ case FSView::Name: n = text(0); break;
+ case FSView::Owner: id = _info.ownerId(); break;
+ case FSView::Group: id = _info.groupId(); break;
+ case FSView::Mime: n = text(7); break;
+
+ default:
+ break;
+ }
+
+ if (id>0) n = QString::number(id);
+
+ if (n.isEmpty())
+ return widget()->colorGroup().button();
+
+ const char* str = n.ascii();
+ int h = 0, s = 100;
+ while (*str) {
+ h = (h * 37 + s* (unsigned)*str) % 256;
+ s = (s * 17 + h* (unsigned)*str) % 192;
+ str++;
+ }
+ return QColor(h, 64+s, 192, QColor::Hsv);
+}
+
+KMimeType::Ptr Inode::mimeType() const
+{
+ if (!_mimeSet) {
+ KURL u;
+ u.setPath(path());
+ _mimeType = KMimeType::findByURL( u, 0, true, false );
+
+ _mimeSet = true;
+ }
+ return _mimeType;
+}
+
+QString Inode::text(int i) const
+{
+ if (i==0) {
+ QString name;
+ if (_dirPeer) {
+ name = _dirPeer->name();
+ if (!name.endsWith("/")) name += "/";
+ }
+ else if (_filePeer) name = _filePeer->name();
+
+ return name;
+ }
+ if (i==1) {
+ QString text;
+ double s = size();
+
+ if (s < 1000)
+ text = QString("%1 B").arg((int)(s+.5));
+ else if (s < 10 * 1024)
+ text = QString("%1 kB").arg(KGlobal::locale()->formatNumber(s/1024+.005,2));
+ else if (s < 100 * 1024)
+ text = QString("%1 kB").arg(KGlobal::locale()->formatNumber(s/1024+.05,1));
+ else if (s < 1000 * 1024)
+ text = QString("%1 kB").arg((int)(s/1024+.5));
+ else if (s < 10 * 1024 * 1024)
+ text = QString("%1 MB").arg(KGlobal::locale()->formatNumber(s/1024/1024+.005,2));
+ else if (s < 100 * 1024 * 1024)
+ text = QString("%1 MB").arg(KGlobal::locale()->formatNumber(s/1024/1024+.05,1));
+ else if (s < 1000 * 1024 * 1024)
+ text = QString("%1 MB").arg((int)(s/1024/1024+.5));
+ else
+ text = QString("%1 GB").arg(KGlobal::locale()->formatNumber(s/1024/1024/1024+.005,2));
+
+ if (_sizeEstimation>0) text += "+";
+ return text;
+ }
+
+ if ((i==2) || (i==3)) {
+ /* file/dir count makes no sense for files */
+ if (_filePeer) return QString();
+
+ QString text;
+ unsigned int f = (i==2) ? fileCount() : dirCount();
+
+ if (f>0) {
+ while (f>1000) {
+ text = QString("%1 %2").arg(QString::number(f).right(3)).arg(text);
+ f /= 1000;
+ }
+ text = QString("%1 %2").arg(QString::number(f)).arg(text);
+ if (_fileCountEstimation>0) text += "+";
+ }
+ return text;
+ }
+
+ if (i==4) return _info.lastModified().toString();
+ if (i==5) return _info.owner();
+ if (i==6) return _info.group();
+ if (i==7) return mimeType()->comment();
+ return QString();
+}
+
+QPixmap Inode::pixmap(int i) const
+{
+ if (i!=0) return QPixmap();
+
+ if (!_mimePixmapSet) {
+ KURL u;
+ u.setPath(path());
+ _mimePixmap = mimeType()->pixmap(u, KIcon::Small);
+
+ _mimePixmapSet = true;
+ }
+ return _mimePixmap;
+}
diff --git a/konq-plugins/fsview/inode.h b/konq-plugins/fsview/inode.h
new file mode 100644
index 0000000..8289f6b
--- /dev/null
+++ b/konq-plugins/fsview/inode.h
@@ -0,0 +1,97 @@
+/* This file is part of FSView.
+ Copyright (C) 2002, 2003 Josef Weidendorfer <Josef.Weidendorfer@gmx.de>
+
+ KCachegrind is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation, version 2.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+/*
+ * FSView specialisaton of TreeMapItem class.
+ */
+
+#ifndef INODE_H
+#define INODE_H
+
+#include <qmap.h>
+#include <qptrlist.h>
+#include <qfileinfo.h>
+#include <qstring.h>
+
+#include <kmimetype.h>
+
+#include "treemap.h"
+#include "scan.h"
+
+
+/**
+ * A specialized version of a TreeMapItem
+ * for representation of an Directory or File.
+ *
+ * These are dynamically created on drawing.
+ * The real breadth-first scanning of the filesystem
+ * uses ScanDir:scan.
+ */
+class Inode: public TreeMapItem, public ScanListener
+{
+public:
+ Inode();
+ Inode(ScanDir*, Inode*);
+ Inode(ScanFile*, Inode*);
+ ~Inode();
+ void init(const QString&);
+
+ void setPeer(ScanDir*);
+
+ TreeMapItemList* children();
+
+ double value() const;
+ double size() const;
+ unsigned int fileCount() const;
+ unsigned int dirCount() const;
+ QString path() const;
+ QString text(int i) const;
+ QPixmap pixmap(int i) const;
+ QColor backColor() const;
+ KMimeType::Ptr mimeType() const;
+
+ const QFileInfo& fileInfo() const { return _info; }
+ ScanDir* dirPeer() { return _dirPeer; }
+ ScanFile* filePeer() { return _filePeer; }
+ bool isDir() { return (_dirPeer != 0); }
+
+ void sizeChanged(ScanDir*);
+ void scanFinished(ScanDir*);
+ void destroyed(ScanDir*);
+ void destroyed(ScanFile*);
+
+private:
+ void setMetrics(double, unsigned int);
+
+ QFileInfo _info;
+ ScanDir* _dirPeer;
+ ScanFile* _filePeer;
+
+ double _sizeEstimation;
+ unsigned int _fileCountEstimation, _dirCountEstimation;
+
+ bool _resortNeeded;
+
+ // Cached values, calculated lazy.
+ // This means a change even in const methods, thus has to be "mutable"
+ mutable bool _mimeSet, _mimePixmapSet;
+ mutable KMimeType::Ptr _mimeType;
+ mutable QPixmap _mimePixmap;
+};
+
+#endif
diff --git a/konq-plugins/fsview/main.cpp b/konq-plugins/fsview/main.cpp
new file mode 100644
index 0000000..da18dcf
--- /dev/null
+++ b/konq-plugins/fsview/main.cpp
@@ -0,0 +1,56 @@
+/*****************************************************
+ * FSView, a simple TreeMap application
+ *
+ * (C) 2002, Josef Weidendorfer
+ */
+
+#include <kapplication.h>
+#include <kcmdlineargs.h>
+#include <kaboutdata.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kconfig.h>
+
+#include "fsview.h"
+
+
+static KCmdLineOptions options[] =
+{
+ { "+[folder]", I18N_NOOP("View filesystem starting from this folder"), 0 },
+ KCmdLineLastOption // End of options.
+};
+
+int main(int argc, char* argv[])
+{
+ // KDE compliant startup
+ KAboutData aboutData("fsview", I18N_NOOP("FSView"), "0.1",
+ I18N_NOOP("Filesystem Viewer"),
+ KAboutData::License_GPL,
+ I18N_NOOP("(c) 2002, Josef Weidendorfer"));
+ KCmdLineArgs::init(argc, argv, &aboutData);
+ KCmdLineArgs::addCmdLineOptions(options);
+ KApplication a;
+
+ KConfigGroup gconfig(KGlobal::config(), QCString("General"));
+ QString path = gconfig.readPathEntry("Path", ".");
+
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+ if (args->count()>0) path = args->arg(0);
+
+ // TreeMap Widget as toplevel window
+ FSView w(new Inode());
+
+ QObject::connect(&w,SIGNAL(clicked(TreeMapItem*)),
+ &w,SLOT(selected(TreeMapItem*)));
+ QObject::connect(&w,SIGNAL(returnPressed(TreeMapItem*)),
+ &w,SLOT(selected(TreeMapItem*)));
+ QObject::connect(&w,
+ SIGNAL(contextMenuRequested(TreeMapItem*,const QPoint&)),
+ &w,SLOT(contextMenu(TreeMapItem*, const QPoint&)));
+
+ w.setPath(path);
+ w.show();
+
+ a.connect( &a, SIGNAL( lastWindowClosed() ), &w, SLOT( quit() ) );
+ return a.exec();
+}
diff --git a/konq-plugins/fsview/scan.cpp b/konq-plugins/fsview/scan.cpp
new file mode 100644
index 0000000..ed691e3
--- /dev/null
+++ b/konq-plugins/fsview/scan.cpp
@@ -0,0 +1,362 @@
+/* This file is part of FSView.
+ Copyright (C) 2002, 2003 Josef Weidendorfer <Josef.Weidendorfer@gmx.de>
+
+ KCachegrind is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation, version 2.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qdir.h>
+#include <qstringlist.h>
+
+#include <kapplication.h>
+#include <kdebug.h>
+
+#include "scan.h"
+#include "inode.h"
+
+
+// ScanManager
+
+ScanManager::ScanManager()
+{
+ _topDir = 0;
+ _listener = 0;
+}
+
+ScanManager::ScanManager(const QString& path)
+{
+ _topDir = 0;
+ _listener = 0;
+ setTop(path);
+}
+
+ScanManager::~ScanManager()
+{
+ stopScan();
+ if (_topDir) delete _topDir;
+}
+
+void ScanManager::setListener(ScanListener* l)
+{
+ _listener = l;
+}
+
+ScanDir* ScanManager::setTop(const QString& path, int data)
+{
+ stopScan();
+ if (_topDir) {
+ delete _topDir;
+ _topDir = 0;
+ }
+ if (!path.isEmpty()) {
+ _topDir = new ScanDir(path, this, 0, data);
+ }
+ return _topDir;
+}
+
+bool ScanManager::scanRunning()
+{
+ if (!_topDir) return false;
+
+ return _topDir->scanRunning();
+}
+
+void ScanManager::startScan(ScanDir* from)
+{
+ if (!_topDir) return;
+ if (!from) from = _topDir;
+
+ if (scanRunning()) stopScan();
+
+ from->clear();
+ if (from->parent())
+ from->parent()->setupChildRescan();
+
+ _list.append(new ScanItem(from->path(),from));
+}
+
+void ScanManager::stopScan()
+{
+ if (!_topDir) return;
+
+ if (0) kdDebug(90100) << "ScanManager::stopScan, scanLength "
+ << _list.count() << endl;
+
+ ScanItem* si;
+ while( (si=_list.take(0))!=0 ) {
+ si->dir->finish();
+ delete si;
+ }
+}
+
+int ScanManager::scan(int data)
+{
+ ScanItem* si = _list.take(0);
+ if (!si) return false;
+
+ int newCount = si->dir->scan(si, _list, data);
+ delete si;
+
+ return newCount;
+}
+
+
+// ScanFile
+
+ScanFile::ScanFile()
+{
+ _size = 0;
+ _listener = 0;
+}
+
+ScanFile::ScanFile(const QString& n, KIO::fileoffset_t s)
+{
+ _name = n;
+ _size = s;
+ _listener = 0;
+}
+
+ScanFile::~ScanFile()
+{
+ if (_listener) _listener->destroyed(this);
+}
+
+// ScanDir
+
+ScanDir::ScanDir()
+{
+ _dirty = true;
+ _dirsFinished = -1; /* scan not started */
+
+ _parent = 0;
+ _manager = 0;
+ _listener = 0;
+ _data = 0;
+}
+
+ScanDir::ScanDir(const QString& n, ScanManager* m,
+ ScanDir* p, int data)
+ : _name(n)
+{
+ _dirty = true;
+ _dirsFinished = -1; /* scan not started */
+
+ _parent = p;
+ _manager = m;
+ _listener = 0;
+ _data = data;
+}
+
+ScanDir::~ScanDir()
+{
+ if (_listener) _listener->destroyed(this);
+}
+
+void ScanDir::setListener(ScanListener* l)
+{
+ _listener = l;
+}
+
+QString ScanDir::path()
+{
+ if (_parent) {
+ QString p = _parent->path();
+ if (!p.endsWith("/")) p += "/";
+ return p + _name;
+ }
+
+ return _name;
+}
+
+void ScanDir::clear()
+{
+ _dirty = true;
+ _dirsFinished = -1; /* scan not started */
+
+ _files.clear();
+ _dirs.clear();
+}
+
+void ScanDir::update()
+{
+ if (!_dirty) return;
+ _dirty = false;
+
+ _fileCount = 0;
+ _dirCount = 0;
+ _size = 0;
+
+ if (_dirsFinished == -1) return;
+
+ if (_files.count()>0) {
+ _fileCount += _files.count();
+ _size = _fileSize;
+ }
+ if (_dirs.count()>0) {
+ _dirCount += _dirs.count();
+ ScanDirVector::iterator it;
+ for( it = _dirs.begin(); it != _dirs.end(); ++it ) {
+ (*it).update();
+ _fileCount += (*it)._fileCount;
+ _dirCount += (*it)._dirCount;
+ _size += (*it)._size;
+ }
+ }
+}
+
+int ScanDir::scan(ScanItem* si, ScanItemList& list, int data)
+{
+ clear();
+ _dirsFinished = 0;
+ _fileSize = 0;
+ _dirty = true;
+
+ KURL u;
+ u.setPath(si->absPath);
+ if (!kapp->authorizeURLAction("list", KURL(), u)) {
+ if (_parent)
+ _parent->subScanFinished();
+
+ return 0;
+ }
+
+ QDir d(si->absPath);
+ QStringList fileList = d.entryList( QDir::Files |
+ QDir::Hidden | QDir::NoSymLinks );
+
+ if (fileList.count()>0) {
+ KDE_struct_stat buff;
+
+ _files.reserve(fileList.count());
+
+ QStringList::Iterator it;
+ for (it = fileList.begin(); it != fileList.end(); ++it ) {
+ KDE_lstat( QFile::encodeName(si->absPath + "/" + (*it)), &buff );
+ _files.append( ScanFile(*it, buff.st_size) );
+ _fileSize += buff.st_size;
+ }
+ }
+
+ QStringList dirList = d.entryList( QDir::Dirs |
+ QDir::Hidden | QDir::NoSymLinks );
+
+ if (dirList.count()>2) {
+ _dirs.reserve(dirList.count()-2);
+
+ QStringList::Iterator it;
+ for (it = dirList.begin(); it != dirList.end(); ++it ) {
+ if ( ((*it) == "..") || ((*it) == ".") ) continue;
+ _dirs.append( ScanDir(*it, _manager, this, data) );
+ list.append( new ScanItem( si->absPath + "/" + (*it),
+ &(_dirs.last()) ));
+ }
+ _dirCount += _dirs.count();
+ }
+
+ callScanStarted();
+ callSizeChanged();
+
+ if (_dirs.count() == 0) {
+ callScanFinished();
+
+ if (_parent)
+ _parent->subScanFinished();
+ }
+
+ return _dirs.count();
+}
+
+void ScanDir::subScanFinished()
+{
+ _dirsFinished++;
+ callSizeChanged();
+
+ if (0) kdDebug(90100) << "ScanDir::subScanFinished [" << path()
+ << "]: " << _dirsFinished << "/" << _dirs.count() << endl;
+
+
+
+ if (_dirsFinished < (int)_dirs.count()) return;
+
+ /* all subdirs read */
+ callScanFinished();
+
+ if (_parent)
+ _parent->subScanFinished();
+}
+
+void ScanDir::finish()
+{
+ if (scanRunning()) {
+ _dirsFinished = (int)_dirs.count();
+ callScanFinished();
+ }
+
+ if (_parent)
+ _parent->finish();
+}
+
+void ScanDir::setupChildRescan()
+{
+ if (_dirs.count() == 0) return;
+
+ _dirsFinished = 0;
+ ScanDirVector::iterator it;
+ for( it = _dirs.begin(); it != _dirs.end(); ++it )
+ if ((*it).scanFinished()) _dirsFinished++;
+
+ if (_parent &&
+ (_dirsFinished < (int)_dirs.count()) )
+ _parent->setupChildRescan();
+
+ callScanStarted();
+}
+
+void ScanDir::callScanStarted()
+{
+ if (0) kdDebug(90100) << "ScanDir:Started [" << path()
+ << "]: size " << size() << ", files " << fileCount() << endl;
+
+ ScanListener* mListener = _manager ? _manager->listener() : 0;
+
+ if (_listener) _listener->scanStarted(this);
+ if (mListener) mListener->scanStarted(this);
+}
+
+void ScanDir::callSizeChanged()
+{
+ if (0) kdDebug(90100) << ". [" << path()
+ << "]: size " << size() << ", files " << fileCount() << endl;
+
+ _dirty = true;
+
+ if (_parent) _parent->callSizeChanged();
+
+ ScanListener* mListener = _manager ? _manager->listener() : 0;
+
+ if (_listener) _listener->sizeChanged(this);
+ if (mListener) mListener->sizeChanged(this);
+}
+
+void ScanDir::callScanFinished()
+{
+ if (0) kdDebug(90100) << "ScanDir:Finished [" << path()
+ << "]: size " << size() << ", files " << fileCount() << endl;
+
+ ScanListener* mListener = _manager ? _manager->listener() : 0;
+
+ if (_listener) _listener->scanFinished(this);
+ if (mListener) mListener->scanFinished(this);
+}
+
diff --git a/konq-plugins/fsview/scan.h b/konq-plugins/fsview/scan.h
new file mode 100644
index 0000000..38b015c
--- /dev/null
+++ b/konq-plugins/fsview/scan.h
@@ -0,0 +1,230 @@
+/* This file is part of FSView.
+ Copyright (C) 2002, 2003 Josef Weidendorfer <Josef.Weidendorfer@gmx.de>
+
+ KCachegrind is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation, version 2.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+/*
+ * Classes for breadth-first search in local filesystem
+ */
+
+#ifndef FSDIR_H
+#define FSDIR_H
+
+#include <qptrlist.h>
+#include <qvaluevector.h>
+#include <qfile.h>
+
+/* Use KDE_lstat and KIO::fileoffset_t for 64-bit sizes */
+#include <klargefile.h>
+#include <kio/global.h>
+
+class ScanDir;
+class ScanFile;
+
+class ScanItem
+{
+ public:
+ ScanItem(const QString& p, ScanDir* d)
+ { absPath = p; dir = d; }
+
+ QString absPath;
+ ScanDir* dir;
+};
+
+typedef QPtrList<ScanItem> ScanItemList;
+
+
+/**
+ * Listener for events from directory scanning.
+ *
+ * You can register a listener for the ScanManager to get
+ * all scan events and a listener for every ScanDir for
+ * directory specific scan events.
+ *
+ * sizeChanged is called when a scan of a subdirectory
+ * finished.
+ */
+class ScanListener
+{
+ public:
+ virtual void scanStarted(ScanDir*) {}
+ virtual void sizeChanged(ScanDir*) {}
+ virtual void scanFinished(ScanDir*) {}
+ // destroyed events are not delivered to listeners of ScanManager
+ virtual void destroyed(ScanDir*) {}
+ virtual void destroyed(ScanFile*) {}
+};
+
+
+
+/**
+ * ScanManager
+ *
+ * Start/Stop/Restart Scans. Example:
+ *
+ * ScanManager m("/opt");
+ * m.startScan();
+ * while(m.scan());
+ */
+class ScanManager
+{
+ public:
+ ScanManager();
+ ScanManager(const QString& path);
+ ~ScanManager();
+
+ /** Set the top path for scanning
+ * The ScanDir object created gets attribute data.
+ */
+ ScanDir* setTop(const QString& path, int data = 0);
+ ScanDir* top() { return _topDir; }
+
+ bool scanRunning();
+ unsigned int scanLength() { return _list.count(); }
+
+ /**
+ * Starts the scan. Stop previous scan if running.
+ * For the actual scan to happen, you have to call
+ * scan() peridically.
+ *
+ * If from !=0, restart scan at given position; from must
+ * be from the previous scan of this manager.
+ */
+ void startScan(ScanDir* from = 0);
+
+ /** Stop a current running scan.
+ * Make all directories to finish their scan.
+ */
+ void stopScan();
+
+ /**
+ * Scan first directory from todo list.
+ * Directories added to the todo list are attributed with data.
+ * Returns the number of new subdirectories created for scanning.
+ */
+ int scan(int data);
+
+ /* set listener to get a callbacks from this ScanDir */
+ void setListener(ScanListener*);
+ ScanListener* listener() { return _listener; }
+
+ private:
+ ScanItemList _list;
+ ScanDir* _topDir;
+ ScanListener* _listener;
+};
+
+class ScanFile
+{
+ public:
+ ScanFile();
+ ScanFile(const QString& n, KIO::fileoffset_t s);
+ ~ScanFile();
+
+ const QString& name() { return _name; }
+ KIO::fileoffset_t size() { return _size; }
+
+ /* set listener to get callbacks from this ScanDir */
+ void setListener(ScanListener* l) { _listener = l; }
+ ScanListener* listener() { return _listener; }
+
+ private:
+ QString _name;
+ KIO::fileoffset_t _size;
+ ScanListener* _listener;
+};
+
+typedef QValueVector<ScanFile> ScanFileVector;
+typedef QValueVector<ScanDir> ScanDirVector;
+
+/**
+ * A directory to scan.
+ * You can attribute a directory to scan with a
+ * integer data attribute.
+ */
+class ScanDir
+{
+ public:
+ ScanDir();
+ ScanDir(const QString& n, ScanManager* m,
+ ScanDir* p = 0, int data = 0);
+ ~ScanDir();
+
+ /* Get items of this directory
+ * and append subdirectories to todo list.
+ *
+ * Directories added to the todo list are attributed with data.
+ * Returns the number of new subdirectories created for scanning.
+ */
+ int scan(ScanItem* si, ScanItemList& list, int data);
+
+ /* clear scan objects below */
+ void clear();
+
+ /*
+ * Setup for child rescan
+ */
+ void setupChildRescan();
+
+ /* Absolute path. Warning: Slow, loops to top parent. */
+ QString path();
+
+ /* get integer data attribute */
+ int data() { return _data; }
+ void setData(int d) { _data = d; }
+
+ ScanFileVector& files() { return _files; }
+ ScanDirVector& dirs() { return _dirs; }
+ const QString& name() { return _name; }
+ KIO::fileoffset_t size() { update(); return _size; }
+ unsigned int fileCount() { update(); return _fileCount; }
+ unsigned int dirCount() { update(); return _dirCount; }
+ ScanDir* parent() { return _parent; }
+ bool scanStarted() { return (_dirsFinished >= 0); }
+ bool scanFinished() { return (_dirsFinished == (int)_dirs.count()); }
+ bool scanRunning() { return scanStarted() && !scanFinished(); }
+
+ /* set listener to get a callbacks from this ScanDir */
+ void setListener(ScanListener*);
+ ScanListener* listener() { return _listener; }
+ ScanManager* manager() { return _manager; }
+
+ /* force current scan to be finished */
+ void finish();
+
+ private:
+ void update();
+
+ /* this propagates file count and size to upper dirs */
+ void subScanFinished();
+ void callScanStarted();
+ void callSizeChanged();
+ void callScanFinished();
+
+ ScanFileVector _files;
+ ScanDirVector _dirs;
+
+ QString _name;
+ bool _dirty; /* needs a call to update() */
+ KIO::fileoffset_t _size, _fileSize;
+ unsigned int _fileCount, _dirCount;
+ int _dirsFinished, _data;
+ ScanDir* _parent;
+ ScanListener* _listener;
+ ScanManager* _manager;
+};
+
+#endif
diff --git a/konq-plugins/fsview/scantest.cpp b/konq-plugins/fsview/scantest.cpp
new file mode 100644
index 0000000..e1319a9
--- /dev/null
+++ b/konq-plugins/fsview/scantest.cpp
@@ -0,0 +1,56 @@
+/* This file is part of FSView.
+ Copyright (C) 2002, 2003 Josef Weidendorfer <Josef.Weidendorfer@gmx.de>
+
+ KCachegrind is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation, version 2.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+/* Test Directory Scanning. Usually not build. */
+
+#include <stdio.h>
+#include <unistd.h>
+
+#include "scan.h"
+
+class MyListener: public ScanListener
+{
+public:
+ void scanStarted(ScanDir* d)
+ {
+ printf("Started Scan on %s\n", d->name().latin1());
+ };
+
+ void sizeChanged(ScanDir* d)
+ {
+ printf("Change in %s: Dirs %d, Files %d",
+ d->name().latin1(),
+ d->dirCount(), d->fileCount());
+ printf("Size %llu\n", (unsigned long long int)d->size());
+ }
+
+ void scanFinished(ScanDir* d)
+ {
+ printf("Finished Scan on %s\n", d->name().latin1());
+ }
+};
+
+int main(int argc, char* argv[])
+{
+ ScanManager m("/opt");
+ if (argc>1) m.setTop(argv[1]);
+
+ m.setListener(new MyListener());
+ m.startScan();
+ while(m.scan(1));
+}
diff --git a/konq-plugins/fsview/treemap.cpp b/konq-plugins/fsview/treemap.cpp
new file mode 100644
index 0000000..8de5c01
--- /dev/null
+++ b/konq-plugins/fsview/treemap.cpp
@@ -0,0 +1,3199 @@
+/* This file is part of KCachegrind.
+ Copyright (C) 2002, 2003 Josef Weidendorfer <Josef.Weidendorfer@gmx.de>
+
+ KCachegrind is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation, version 2.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+/*
+ * A Widget for visualizing hierarchical metrics as areas.
+ * The API is similar to QListView.
+ */
+
+#include <math.h>
+
+#include <qpainter.h>
+#include <qtooltip.h>
+#include <qregexp.h>
+#include <qstyle.h>
+#include <qpopupmenu.h>
+
+#include <klocale.h>
+#include <kconfig.h>
+#include <kdebug.h>
+
+#include "treemap.h"
+
+
+// set this to 1 to enable debug output
+#define DEBUG_DRAWING 0
+#define MAX_FIELD 12
+
+
+//
+// StoredDrawParams
+//
+StoredDrawParams::StoredDrawParams()
+{
+ _selected = false;
+ _current = false;
+ _shaded = true;
+ _rotated = false;
+
+ _backColor = Qt::white;
+
+ // field array has size 0
+}
+
+StoredDrawParams::StoredDrawParams(QColor c,
+ bool selected, bool current)
+{
+ _backColor = c;
+
+ _selected = selected;
+ _current = current;
+ _shaded = true;
+ _rotated = false;
+
+ // field array has size 0
+}
+
+QString StoredDrawParams::text(int f) const
+{
+ if ((f<0) || (f >= (int)_field.size()))
+ return QString::null;
+
+ return _field[f].text;
+}
+
+QPixmap StoredDrawParams::pixmap(int f) const
+{
+ if ((f<0) || (f >= (int)_field.size()))
+ return QPixmap();
+
+ return _field[f].pix;
+}
+
+DrawParams::Position StoredDrawParams::position(int f) const
+{
+ if ((f<0) || (f >= (int)_field.size()))
+ return Default;
+
+ return _field[f].pos;
+}
+
+int StoredDrawParams::maxLines(int f) const
+{
+ if ((f<0) || (f >= (int)_field.size()))
+ return 0;
+
+ return _field[f].maxLines;
+}
+
+const QFont& StoredDrawParams::font() const
+{
+ static QFont* f = 0;
+ if (!f) f = new QFont(QApplication::font());
+
+ return *f;
+}
+
+void StoredDrawParams::ensureField(int f)
+{
+ static Field* def = 0;
+ if (!def) {
+ def = new Field();
+ def->pos = Default;
+ def->maxLines = 0;
+ }
+
+ if (f<0 || f>=MAX_FIELD) return;
+
+ if ((int)_field.size() < f+1) _field.resize(f+1, *def);
+}
+
+
+void StoredDrawParams::setField(int f, const QString& t, QPixmap pm,
+ Position p, int maxLines)
+{
+ if (f<0 || f>=MAX_FIELD) return;
+ ensureField(f);
+
+ _field[f].text = t;
+ _field[f].pix = pm;
+ _field[f].pos = p;
+ _field[f].maxLines = maxLines;
+}
+
+void StoredDrawParams::setText(int f, const QString& t)
+{
+ if (f<0 || f>=MAX_FIELD) return;
+ ensureField(f);
+
+ _field[f].text = t;
+}
+
+void StoredDrawParams::setPixmap(int f, const QPixmap& pm)
+{
+ if (f<0 || f>=MAX_FIELD) return;
+ ensureField(f);
+
+ _field[f].pix = pm;
+}
+
+void StoredDrawParams::setPosition(int f, Position p)
+{
+ if (f<0 || f>=MAX_FIELD) return;
+ ensureField(f);
+
+ _field[f].pos = p;
+}
+
+void StoredDrawParams::setMaxLines(int f, int m)
+{
+ if (f<0 || f>=MAX_FIELD) return;
+ ensureField(f);
+
+ _field[f].maxLines = m;
+}
+
+
+
+//
+// RectDrawing
+//
+
+RectDrawing::RectDrawing(QRect r)
+{
+ _fm = 0;
+ _dp = 0;
+ setRect(r);
+}
+
+
+RectDrawing::~RectDrawing()
+{
+ delete _fm;
+ delete _dp;
+}
+
+DrawParams* RectDrawing::drawParams()
+{
+ if (!_dp)
+ _dp = new StoredDrawParams();
+
+ return _dp;
+}
+
+
+void RectDrawing::setDrawParams(DrawParams* dp)
+{
+ if (_dp) delete _dp;
+ _dp = dp;
+}
+
+void RectDrawing::setRect(QRect r)
+{
+ _rect = r;
+
+ _usedTopLeft = 0;
+ _usedTopCenter = 0;
+ _usedTopRight = 0;
+ _usedBottomLeft = 0;
+ _usedBottomCenter = 0;
+ _usedBottomRight = 0;
+
+ _fontHeight = 0;
+}
+
+QRect RectDrawing::remainingRect(DrawParams* dp)
+{
+ if (!dp) dp = drawParams();
+
+ if ((_usedTopLeft >0) ||
+ (_usedTopCenter >0) ||
+ (_usedTopRight >0)) {
+ if (dp->rotated())
+ _rect.setLeft(_rect.left() + _fontHeight);
+ else
+ _rect.setTop(_rect.top() + _fontHeight);
+ }
+
+ if ((_usedBottomLeft >0) ||
+ (_usedBottomCenter >0) ||
+ (_usedBottomRight >0)) {
+ if (dp->rotated())
+ _rect.setRight(_rect.right() - _fontHeight);
+ else
+ _rect.setBottom(_rect.bottom() - _fontHeight);
+ }
+ return _rect;
+}
+
+
+void RectDrawing::drawBack(QPainter* p, DrawParams* dp)
+{
+ if (!dp) dp = drawParams();
+ if (_rect.width()<=0 || _rect.height()<=0) return;
+
+ QRect r = _rect;
+ QColor normal = dp->backColor();
+ if (dp->selected()) normal = normal.light();
+ bool isCurrent = dp->current();
+
+ // 3D raised/sunken frame effect...
+ QColor high = normal.light();
+ QColor low = normal.dark();
+ p->setPen( isCurrent ? low:high);
+ p->drawLine(r.left(), r.top(), r.right(), r.top());
+ p->drawLine(r.left(), r.top(), r.left(), r.bottom());
+ p->setPen( isCurrent ? high:low);
+ p->drawLine(r.right(), r.top(), r.right(), r.bottom());
+ p->drawLine(r.left(), r.bottom(), r.right(), r.bottom());
+ r.setRect(r.x()+1, r.y()+1, r.width()-2, r.height()-2);
+ if (r.width()<=0 || r.height()<=0) return;
+
+ if (dp->shaded()) {
+ // some shading
+ bool goDark = qGray(normal.rgb())>128;
+ int rBase, gBase, bBase;
+ normal.rgb(&rBase, &gBase, &bBase);
+ p->setBrush(QBrush::NoBrush);
+
+ // shade parameters:
+ int d = 7;
+ float factor = 0.1, forth=0.7, back1 =0.9, toBack2 = .7, back2 = 0.97;
+
+ // coefficient corrections because of rectangle size
+ int s = r.width();
+ if (s > r.height()) s = r.height();
+ if (s<100) {
+ forth -= .3 * (100-s)/100;
+ back1 -= .2 * (100-s)/100;
+ back2 -= .02 * (100-s)/100;
+ }
+
+
+ // maximal color difference
+ int rDiff = goDark ? -rBase/d : (255-rBase)/d;
+ int gDiff = goDark ? -gBase/d : (255-gBase)/d;
+ int bDiff = goDark ? -bBase/d : (255-bBase)/d;
+
+ QColor shadeColor;
+ while (factor<.95) {
+ shadeColor.setRgb((int)(rBase+factor*rDiff+.5),
+ (int)(gBase+factor*gDiff+.5),
+ (int)(bBase+factor*bDiff+.5));
+ p->setPen(shadeColor);
+ p->drawRect(r);
+ r.setRect(r.x()+1, r.y()+1, r.width()-2, r.height()-2);
+ if (r.width()<=0 || r.height()<=0) return;
+ factor = 1.0 - ((1.0 - factor) * forth);
+ }
+
+ // and back (1st half)
+ while (factor>toBack2) {
+ shadeColor.setRgb((int)(rBase+factor*rDiff+.5),
+ (int)(gBase+factor*gDiff+.5),
+ (int)(bBase+factor*bDiff+.5));
+ p->setPen(shadeColor);
+ p->drawRect(r);
+ r.setRect(r.x()+1, r.y()+1, r.width()-2, r.height()-2);
+ if (r.width()<=0 || r.height()<=0) return;
+ factor = 1.0 - ((1.0 - factor) / back1);
+ }
+
+ // and back (2nd half)
+ while ( factor>.01) {
+ shadeColor.setRgb((int)(rBase+factor*rDiff+.5),
+ (int)(gBase+factor*gDiff+.5),
+ (int)(bBase+factor*bDiff+.5));
+ p->setPen(shadeColor);
+ p->drawRect(r);
+ r.setRect(r.x()+1, r.y()+1, r.width()-2, r.height()-2);
+ if (r.width()<=0 || r.height()<=0) return;
+
+ factor = factor * back2;
+ }
+ }
+
+ // fill inside
+ p->setPen(QPen::NoPen);
+ p->setBrush(normal);
+ p->drawRect(r);
+}
+
+
+bool RectDrawing::drawField(QPainter* p, int f, DrawParams* dp)
+{
+ if (!dp) dp = drawParams();
+
+ if (!_fm) {
+ _fm = new QFontMetrics(dp->font());
+ _fontHeight = _fm->height();
+ }
+
+ QRect r = _rect;
+
+ if (0) kdDebug(90100) << "DrawField: Rect " << r.x() << "/" << r.y()
+ << " - " << r.width() << "x" << r.height() << endl;
+
+ int h = _fontHeight;
+ bool rotate = dp->rotated();
+ int width = (rotate ? r.height() : r.width()) -4;
+ int height = (rotate ? r.width() : r.height());
+ int lines = height / h;
+
+ // stop if we have no space available
+ if (lines<1) return false;
+
+ // calculate free space in first line (<unused>)
+ int pos = dp->position(f);
+ if (pos == DrawParams::Default) {
+ switch(f%4) {
+ case 0: pos = DrawParams::TopLeft; break;
+ case 1: pos = DrawParams::TopRight; break;
+ case 2: pos = DrawParams::BottomRight; break;
+ case 3: pos = DrawParams::BottomLeft; break;
+ }
+ }
+
+ int unused = 0;
+ bool isBottom = false;
+ bool isCenter = false;
+ bool isRight = false;
+ int* used = 0;
+ switch(pos) {
+ case DrawParams::TopLeft:
+ used = &_usedTopLeft;
+ if (_usedTopLeft == 0) {
+ if (_usedTopCenter)
+ unused = (width - _usedTopCenter)/2;
+ else
+ unused = width - _usedTopRight;
+ }
+ break;
+
+ case DrawParams::TopCenter:
+ isCenter = true;
+ used = &_usedTopCenter;
+ if (_usedTopCenter == 0) {
+ if (_usedTopLeft > _usedTopRight)
+ unused = width - 2 * _usedTopLeft;
+ else
+ unused = width - 2 * _usedTopRight;
+ }
+ break;
+
+ case DrawParams::TopRight:
+ isRight = true;
+ used = &_usedTopRight;
+ if (_usedTopRight == 0) {
+ if (_usedTopCenter)
+ unused = (width - _usedTopCenter)/2;
+ else
+ unused = width - _usedTopLeft;
+ }
+ break;
+
+ case DrawParams::BottomLeft:
+ isBottom = true;
+ used = &_usedBottomLeft;
+ if (_usedBottomLeft == 0) {
+ if (_usedBottomCenter)
+ unused = (width - _usedBottomCenter)/2;
+ else
+ unused = width - _usedBottomRight;
+ }
+ break;
+
+ case DrawParams::BottomCenter:
+ isCenter = true;
+ isBottom = true;
+ used = &_usedBottomCenter;
+ if (_usedBottomCenter == 0) {
+ if (_usedBottomLeft > _usedBottomRight)
+ unused = width - 2 * _usedBottomLeft;
+ else
+ unused = width - 2 * _usedBottomRight;
+ }
+ break;
+
+ case DrawParams::BottomRight:
+ isRight = true;
+ isBottom = true;
+ used = &_usedBottomRight;
+ if (_usedBottomRight == 0) {
+ if (_usedBottomCenter)
+ unused = (width - _usedBottomCenter)/2;
+ else
+ unused = width - _usedBottomLeft;
+ }
+ break;
+ }
+
+ if (isBottom) {
+ if ((_usedTopLeft >0) ||
+ (_usedTopCenter >0) ||
+ (_usedTopRight >0))
+ lines--;
+ }
+ else if (!isBottom) {
+ if ((_usedBottomLeft >0) ||
+ (_usedBottomCenter >0) ||
+ (_usedBottomRight >0))
+ lines--;
+ }
+ if (lines<1) return false;
+
+
+ int y = isBottom ? height - h : 0;
+
+ if (unused < 0) unused = 0;
+ if (unused == 0) {
+ // no space available in last line at this position
+ y = isBottom ? (y-h) : (y+h);
+ lines--;
+
+ if (lines<1) return false;
+
+ // new line: reset used space
+ if (isBottom)
+ _usedBottomLeft = _usedBottomCenter = _usedBottomRight = 0;
+ else
+ _usedTopLeft = _usedTopCenter = _usedTopRight = 0;
+
+ unused = width;
+ }
+
+ // stop as soon as possible when there's no space for "..."
+ static int dotW = 0;
+ if (!dotW) dotW = _fm->width("...");
+ if (width < dotW) return false;
+
+ // get text and pixmap now, only if we need to, because it is possible
+ // that they are calculated on demand (and this can take some time)
+ QString name = dp->text(f);
+ if (name.isEmpty()) return 0;
+ QPixmap pix = dp->pixmap(f);
+
+ // check if pixmap can be drawn
+ int pixW = pix.width();
+ int pixH = pix.height();
+ int pixY = 0;
+ bool pixDrawn = true;
+ if (pixW>0) {
+ pixW += 2; // X distance from pix
+ if ((width < pixW + dotW) || (height < pixH)) {
+ // don't draw
+ pixW = 0;
+ }
+ else
+ pixDrawn = false;
+ }
+
+ // width of text and pixmap to be drawn
+ int w = pixW + _fm->width(name);
+
+ if (0) kdDebug(90100) << " For '" << name << "': Unused " << unused
+ << ", StrW " << w << ", Width " << width << endl;
+
+ // if we have limited space at 1st line:
+ // use it only if whole name does fit in last line...
+ if ((unused < width) && (w > unused)) {
+ y = isBottom ? (y-h) : (y+h);
+ lines--;
+
+ if (lines<1) return false;
+
+ // new line: reset used space
+ if (isBottom)
+ _usedBottomLeft = _usedBottomCenter = _usedBottomRight = 0;
+ else
+ _usedTopLeft = _usedTopCenter = _usedTopRight = 0;
+ }
+
+ p->save();
+ p->setPen( (qGray(dp->backColor().rgb())>100) ? Qt::black : Qt::white);
+ p->setFont(dp->font());
+ if (rotate) {
+ //p->translate(r.x()+2, r.y()+r.height());
+ p->translate(r.x(), r.y()+r.height()-2);
+ p->rotate(270);
+ }
+ else
+ p->translate(r.x()+2, r.y());
+
+
+ // adjust available lines according to maxLines
+ int max = dp->maxLines(f);
+ if ((max > 0) && (lines>max)) lines = max;
+
+ /* loop over name parts to break up string depending on available width.
+ * every char category change is supposed a possible break,
+ * with the exception Uppercase=>Lowercase.
+ * It's good enough for numbers, Symbols...
+ *
+ * If the text is to be written at the bottom, we start with the
+ * end of the string (so everything is reverted)
+ */
+ QString remaining;
+ int origLines = lines;
+ while (lines>0) {
+
+ if (w>width && lines>1) {
+ int lastBreakPos = name.length(), lastWidth = w;
+ int len = name.length();
+ QChar::Category caOld, ca;
+
+ if (!isBottom) {
+ // start with comparing categories of last 2 chars
+ caOld = name[len-1].category();
+ while (len>2) {
+ len--;
+ ca = name[len-1].category();
+ if (ca != caOld) {
+ // "Aa" has no break between...
+ if (ca == QChar::Letter_Uppercase &&
+ caOld == QChar::Letter_Lowercase) {
+ caOld = ca;
+ continue;
+ }
+ caOld = ca;
+ lastBreakPos = len;
+ w = pixW + _fm->width(name, len);
+ lastWidth = w;
+ if (w <= width) break;
+ }
+ }
+ w = lastWidth;
+ remaining = name.mid(lastBreakPos);
+ // remove space on break point
+ if (name[lastBreakPos-1].category() == QChar::Separator_Space)
+ name = name.left(lastBreakPos-1);
+ else
+ name = name.left(lastBreakPos);
+ }
+ else { // bottom
+ int l = len;
+ caOld = name[l-len].category();
+ while (len>2) {
+ len--;
+ ca = name[l-len].category();
+
+ if (ca != caOld) {
+ // "Aa" has no break between...
+ if (caOld == QChar::Letter_Uppercase &&
+ ca == QChar::Letter_Lowercase) {
+ caOld = ca;
+ continue;
+ }
+ caOld = ca;
+ lastBreakPos = len;
+ w = pixW + _fm->width(name.right(len));
+ lastWidth = w;
+ if (w <= width) break;
+ }
+ }
+ w = lastWidth;
+ remaining = name.left(l-lastBreakPos);
+ // remove space on break point
+ if (name[l-lastBreakPos].category() == QChar::Separator_Space)
+ name = name.right(lastBreakPos-1);
+ else
+ name = name.right(lastBreakPos);
+ }
+ }
+ else
+ remaining = QString::null;
+
+ /* truncate and add ... if needed */
+ if (w>width) {
+ int len = name.length();
+ w += dotW;
+ while (len>2 && (w > width)) {
+ len--;
+ w = pixW + _fm->width(name, len) + dotW;
+ }
+ // stop drawing: we cannot draw 2 chars + "..."
+ if (w>width) break;
+
+ name = name.left(len) + "...";
+ }
+
+ int x = 0;
+ if (isCenter)
+ x = (width - w)/2;
+ else if (isRight)
+ x = width - w;
+
+ if (!pixDrawn) {
+ pixY = y+(h-pixH)/2; // default: center vertically
+ if (pixH > h) pixY = isBottom ? y-(pixH-h) : y;
+
+ p->drawPixmap( x, pixY, pix);
+
+ // for distance to next text
+ pixY = isBottom ? (pixY - h - 2) : (pixY + pixH + 2);
+ pixDrawn = true;
+ }
+
+
+ if (0) kdDebug(90100) << " Drawing '" << name << "' at "
+ << x+pixW << "/" << y << endl;
+
+ p->drawText( x+pixW, y,
+ width - pixW, h,
+ Qt::AlignLeft, name);
+ y = isBottom ? (y-h) : (y+h);
+ lines--;
+
+ if (remaining.isEmpty()) break;
+ name = remaining;
+ w = pixW + _fm->width(name);
+ }
+
+ // make sure the pix stays visible
+ if (pixDrawn && (pixY>0)) {
+ if (isBottom && (pixY<y)) y = pixY;
+ if (!isBottom && (pixY>y)) y = pixY;
+ }
+
+ if (origLines > lines) {
+ // if only 1 line written, don't reset _used* vars
+ if (lines - origLines >1) {
+ if (isBottom)
+ _usedBottomLeft = _usedBottomCenter = _usedBottomRight = 0;
+ else
+ _usedTopLeft = _usedTopCenter = _usedTopRight = 0;
+ }
+
+ // take back one line
+ y = isBottom ? (y+h) : (y-h);
+ if (used) *used = w;
+ }
+
+ // update free space
+ if (!isBottom) {
+ if (rotate)
+ _rect.setRect(r.x()+y, r.y(), r.width()-y, r.height());
+ else
+ _rect.setRect(r.x(), r.y()+y, r.width(), r.height()-y);
+ }
+ else {
+ if (rotate)
+ _rect.setRect(r.x(), r.y(), y+h, r.height());
+ else
+ _rect.setRect(r.x(), r.y(), r.width(), y+h);
+ }
+
+ p->restore();
+
+ return true;
+}
+
+
+
+
+
+
+//
+// TreeMapItemList
+//
+
+int TreeMapItemList::compareItems ( Item item1, Item item2 )
+{
+ bool ascending;
+ int result;
+
+ TreeMapItem* parent = ((TreeMapItem*)item1)->parent();
+ // shouldn't happen
+ if (!parent) return 0;
+
+ int textNo = parent->sorting(&ascending);
+
+ if (textNo < 0) {
+ double diff = ((TreeMapItem*)item1)->value() -
+ ((TreeMapItem*)item2)->value();
+ result = (diff < -.9) ? -1 : (diff > .9) ? 1 : 0;
+ }
+ else
+ result = (((TreeMapItem*)item1)->text(textNo) <
+ ((TreeMapItem*)item2)->text(textNo)) ? -1 : 1;
+
+ return ascending ? result : -result;
+}
+
+
+TreeMapItem* TreeMapItemList::commonParent()
+{
+ TreeMapItem* parent, *item;
+ parent = first();
+ if (parent)
+ while( (item = next()) != 0)
+ parent = parent->commonParent(item);
+
+ return parent;
+}
+
+
+// TreeMapItem
+
+TreeMapItem::TreeMapItem(TreeMapItem* parent, double value)
+{
+ _value = value;
+ _parent = parent;
+
+ _sum = 0;
+ _children = 0;
+ _widget = 0;
+ _index = -1;
+ _depth = -1; // not set
+ _unused_self = 0;
+ _freeRects = 0;
+
+ if (_parent) {
+ // take sorting from parent
+ _sortTextNo = _parent->sorting(&_sortAscending);
+ _parent->addItem(this);
+ }
+ else {
+ _sortAscending = false;
+ _sortTextNo = -1; // default: no sorting
+ }
+}
+
+
+TreeMapItem::TreeMapItem(TreeMapItem* parent, double value,
+ QString text1, QString text2,
+ QString text3, QString text4)
+{
+ _value = value;
+ _parent = parent;
+
+ // this resizes the text vector only if needed
+ if (!text4.isEmpty()) setText(3, text4);
+ if (!text3.isEmpty()) setText(2, text3);
+ if (!text2.isEmpty()) setText(1, text2);
+ setText(0, text1);
+
+ _sum = 0;
+ _children = 0;
+ _widget = 0;
+ _index = -1;
+ _depth = -1; // not set
+ _unused_self = 0;
+ _freeRects = 0;
+
+ if (_parent) _parent->addItem(this);
+}
+
+TreeMapItem::~TreeMapItem()
+{
+ if (_children) delete _children;
+ if (_freeRects) delete _freeRects;
+
+ // finally, notify widget about deletion
+ if (_widget) _widget->deletingItem(this);
+}
+
+void TreeMapItem::setParent(TreeMapItem* p)
+{
+ _parent = p;
+ if (p) _widget = p->_widget;
+}
+
+bool TreeMapItem::isChildOf(TreeMapItem* item)
+{
+ if (!item) return false;
+
+ TreeMapItem* i = this;
+ while (i) {
+ if (item == i) return true;
+ i = i->_parent;
+ }
+ return false;
+}
+
+TreeMapItem* TreeMapItem::commonParent(TreeMapItem* item)
+{
+ while (item && !isChildOf(item)) {
+ item = item->parent();
+ }
+ return item;
+}
+
+void TreeMapItem::redraw()
+{
+ if (_widget)
+ _widget->redraw(this);
+}
+
+void TreeMapItem::clear()
+{
+ if (_children) {
+ // delete selected items below this item from selection
+ if (_widget) _widget->clearSelection(this);
+
+ delete _children;
+ _children = 0;
+ }
+}
+
+
+// invalidates current children and forces redraw
+// this is only usefull when children are created on demand in items()
+void TreeMapItem::refresh()
+{
+ clear();
+ redraw();
+}
+
+
+QStringList TreeMapItem::path(int textNo) const
+{
+ QStringList list(text(textNo));
+
+ TreeMapItem* i = _parent;
+ while (i) {
+ QString text = i->text(textNo);
+ if (!text.isEmpty())
+ list.prepend(i->text(textNo));
+ i = i->_parent;
+ }
+ return list;
+}
+
+int TreeMapItem::depth() const
+{
+ if (_depth>0) return _depth;
+
+ if (_parent)
+ return _parent->depth() + 1;
+ return 1;
+}
+
+
+bool TreeMapItem::initialized()
+{
+ if (!_children) {
+ _children = new TreeMapItemList;
+ _children->setAutoDelete(true);
+ return false;
+ }
+ return true;
+}
+
+void TreeMapItem::addItem(TreeMapItem* i)
+{
+ if (!i) return;
+
+ if (!_children) {
+ _children = new TreeMapItemList;
+ _children->setAutoDelete(true);
+ }
+ i->setParent(this);
+
+ if (sorting(0) == -1)
+ _children->append(i); // preserve insertion order
+ else
+ _children->inSort(i);
+}
+
+
+// default implementations of virtual functions
+
+double TreeMapItem::value() const
+{
+ return _value;
+}
+
+double TreeMapItem::sum() const
+{
+ return _sum;
+}
+
+DrawParams::Position TreeMapItem::position(int f) const
+{
+ Position p = StoredDrawParams::position(f);
+ if (_widget && (p == Default))
+ p = _widget->fieldPosition(f);
+
+ return p;
+}
+
+// use widget font
+const QFont& TreeMapItem::font() const
+{
+ return _widget->currentFont();
+}
+
+
+bool TreeMapItem::isMarked(int) const
+{
+ return false;
+}
+
+
+int TreeMapItem::borderWidth() const
+{
+ if (_widget)
+ return _widget->borderWidth();
+
+ return 2;
+}
+
+int TreeMapItem::sorting(bool* ascending) const
+{
+ if (ascending) *ascending = _sortAscending;
+ return _sortTextNo;
+}
+
+// do *not* set sorting recursively
+void TreeMapItem::setSorting(int textNo, bool ascending)
+{
+ if (_sortTextNo == textNo) {
+ if(_sortAscending == ascending) return;
+ if (textNo == -1) {
+ // when no sorting is done, order change doesn't do anything
+ _sortAscending = ascending;
+ return;
+ }
+ }
+ _sortAscending = ascending;
+ _sortTextNo = textNo;
+
+ if (_children && _sortTextNo != -1) _children->sort();
+}
+
+void TreeMapItem::resort(bool recursive)
+{
+ if (!_children) return;
+
+ if (_sortTextNo != -1) _children->sort();
+
+ if (recursive)
+ for (TreeMapItem* i=_children->first(); i; i=_children->next())
+ i->resort(recursive);
+}
+
+
+TreeMapItem::SplitMode TreeMapItem::splitMode() const
+{
+ if (_widget)
+ return _widget->splitMode();
+
+ return Best;
+}
+
+int TreeMapItem::rtti() const
+{
+ return 0;
+}
+
+TreeMapItemList* TreeMapItem::children()
+{
+ if (!_children) {
+ _children = new TreeMapItemList;
+ _children->setAutoDelete(true);
+ }
+ return _children;
+}
+
+void TreeMapItem::clearItemRect()
+{
+ _rect = QRect();
+ clearFreeRects();
+}
+
+void TreeMapItem::clearFreeRects()
+{
+ if (_freeRects) _freeRects->clear();
+}
+
+void TreeMapItem::addFreeRect(const QRect& r)
+{
+ // don't add invalid rects
+ if ((r.width() < 1) || (r.height() < 1)) return;
+
+ if (!_freeRects) {
+ _freeRects = new QPtrList<QRect>;
+ _freeRects->setAutoDelete(true);
+ }
+
+ if (0) kdDebug(90100) << "addFree(" << path(0).join("/") << ", "
+ << r.x() << "/" << r.y() << "-"
+ << r.width() << "x" << r.height() << ")" << endl;
+
+ QRect* last = _freeRects->last();
+ if (!last) {
+ _freeRects->append(new QRect(r));
+ return;
+ }
+
+ // join rect with last rect if possible
+ // this saves memory and doesn't make the tooltip flicker
+
+ bool replaced = false;
+ if ((last->left() == r.left()) && (last->width() == r.width())) {
+ if ((last->bottom()+1 == r.top()) || (r.bottom()+1 == last->top())) {
+ *last |= r;
+ replaced = true;
+ }
+ }
+ else if ((last->top() == r.top()) && (last->height() == r.height())) {
+ if ((last->right()+1 == r.left()) || (r.right()+1 == last->left())) {
+ *last |= r;
+ replaced = true;
+ }
+ }
+
+ if (!replaced) {
+ _freeRects->append(new QRect(r));
+ return;
+ }
+
+ if (0) kdDebug(90100) << " united with last to ("
+ << last->x() << "/" << last->y() << "-"
+ << last->width() << "x" << last->height() << ")" << endl;
+}
+
+
+// Tooltips for TreeMapWidget
+
+class TreeMapTip: public QToolTip
+{
+public:
+ TreeMapTip( QWidget* p ):QToolTip(p) {}
+
+protected:
+ void maybeTip( const QPoint & );
+};
+
+void TreeMapTip::maybeTip( const QPoint& pos )
+{
+ if ( !parentWidget()->inherits( "TreeMapWidget" ) )
+ return;
+
+ TreeMapWidget* p = (TreeMapWidget*)parentWidget();
+ TreeMapItem* i;
+ i = p->item(pos.x(), pos.y());
+ QPtrList<QRect>* rList = i ? i->freeRects() : 0;
+ if (rList) {
+ QRect* r;
+ for(r=rList->first();r;r=rList->next())
+ if (r->contains(pos))
+ tip(*r, p->tipString(i));
+ }
+}
+
+
+
+// TreeMapWidget
+
+TreeMapWidget::TreeMapWidget(TreeMapItem* base,
+ QWidget* parent, const char* name)
+ : QWidget(parent, name)
+{
+ _base = base;
+ _base->setWidget(this);
+
+ _font = font();
+ _fontHeight = fontMetrics().height();
+
+
+ // default behaviour
+ _selectionMode = Single;
+ _splitMode = TreeMapItem::AlwaysBest;
+ _visibleWidth = 2;
+ _reuseSpace = false;
+ _skipIncorrectBorder = false;
+ _drawSeparators = false;
+ _allowRotation = true;
+ _borderWidth = 2;
+ _shading = true; // beautiful is default!
+ _maxSelectDepth = -1; // unlimited
+ _maxDrawingDepth = -1; // unlimited
+ _minimalArea = -1; // unlimited
+ _markNo = 0;
+
+ // _stopAtText will be unset on resizing (per default)
+ // _textVisible will be true on resizing (per default)
+ // _forceText will be false on resizing (per default)
+
+ // start state: _selection is an empty list
+ _current = 0;
+ _oldCurrent = 0;
+ _pressed = 0;
+ _lastOver = 0;
+ _needsRefresh = _base;
+
+ setBackgroundMode(Qt::NoBackground);
+ setFocusPolicy(QWidget::StrongFocus);
+ _tip = new TreeMapTip(this);
+}
+
+TreeMapWidget::~TreeMapWidget()
+{
+}
+
+const QFont& TreeMapWidget::currentFont() const
+{
+ return _font;
+}
+
+void TreeMapWidget::setSplitMode(TreeMapItem::SplitMode m)
+{
+ if (_splitMode == m) return;
+
+ _splitMode = m;
+ redraw();
+}
+
+TreeMapItem::SplitMode TreeMapWidget::splitMode() const
+{
+ return _splitMode;
+}
+
+bool TreeMapWidget::setSplitMode(QString mode)
+{
+ if (mode == "Bisection") setSplitMode(TreeMapItem::Bisection);
+ else if (mode == "Columns") setSplitMode(TreeMapItem::Columns);
+ else if (mode == "Rows") setSplitMode(TreeMapItem::Rows);
+ else if (mode == "AlwaysBest") setSplitMode(TreeMapItem::AlwaysBest);
+ else if (mode == "Best") setSplitMode(TreeMapItem::Best);
+ else if (mode == "HAlternate") setSplitMode(TreeMapItem::HAlternate);
+ else if (mode == "VAlternate") setSplitMode(TreeMapItem::VAlternate);
+ else if (mode == "Horizontal") setSplitMode(TreeMapItem::Horizontal);
+ else if (mode == "Vertical") setSplitMode(TreeMapItem::Vertical);
+ else return false;
+
+ return true;
+}
+
+QString TreeMapWidget::splitModeString() const
+{
+ QString mode;
+ switch(splitMode()) {
+ case TreeMapItem::Bisection: mode = "Bisection"; break;
+ case TreeMapItem::Columns: mode = "Columns"; break;
+ case TreeMapItem::Rows: mode = "Rows"; break;
+ case TreeMapItem::AlwaysBest: mode = "AlwaysBest"; break;
+ case TreeMapItem::Best: mode = "Best"; break;
+ case TreeMapItem::HAlternate: mode = "HAlternate"; break;
+ case TreeMapItem::VAlternate: mode = "VAlternate"; break;
+ case TreeMapItem::Horizontal: mode = "Horizontal"; break;
+ case TreeMapItem::Vertical: mode = "Vertical"; break;
+ default: mode = "Unknown"; break;
+ }
+ return mode;
+}
+
+
+void TreeMapWidget::setShadingEnabled(bool s)
+{
+ if (_shading == s) return;
+
+ _shading = s;
+ redraw();
+}
+
+void TreeMapWidget::setAllowRotation(bool enable)
+{
+ if (_allowRotation == enable) return;
+
+ _allowRotation = enable;
+ redraw();
+}
+
+void TreeMapWidget::setVisibleWidth(int width, bool reuseSpace)
+{
+ if (_visibleWidth == width && _reuseSpace == reuseSpace) return;
+
+ _visibleWidth = width;
+ _reuseSpace = reuseSpace;
+ redraw();
+}
+
+void TreeMapWidget::setSkipIncorrectBorder(bool enable)
+{
+ if (_skipIncorrectBorder == enable) return;
+
+ _skipIncorrectBorder = enable;
+ redraw();
+}
+
+void TreeMapWidget::setBorderWidth(int w)
+{
+ if (_borderWidth == w) return;
+
+ _borderWidth = w;
+ redraw();
+}
+
+void TreeMapWidget::setMaxDrawingDepth(int d)
+{
+ if (_maxDrawingDepth == d) return;
+
+ _maxDrawingDepth = d;
+ redraw();
+}
+
+QString TreeMapWidget::defaultFieldType(int f) const
+{
+ return i18n("Text %1").arg(f+1);
+}
+
+QString TreeMapWidget::defaultFieldStop(int) const
+{
+ return QString();
+}
+
+bool TreeMapWidget::defaultFieldVisible(int f) const
+{
+ return (f<2);
+}
+
+bool TreeMapWidget::defaultFieldForced(int) const
+{
+ return false;
+}
+
+DrawParams::Position TreeMapWidget::defaultFieldPosition(int f) const
+{
+ switch(f%4) {
+ case 0: return DrawParams::TopLeft;
+ case 1: return DrawParams::TopRight;
+ case 2: return DrawParams::BottomRight;
+ case 3: return DrawParams::BottomLeft;
+ default:break;
+ }
+ return DrawParams::TopLeft;
+}
+
+bool TreeMapWidget::resizeAttr(int size)
+{
+ if (size<0 || size>=MAX_FIELD) return false;
+
+ if (size>(int)_attr.size()) {
+ struct FieldAttr a;
+ int oldSize = _attr.size();
+ _attr.resize(size, a);
+ while (oldSize<size) {
+ _attr[oldSize].type = defaultFieldType(oldSize);
+ _attr[oldSize].stop = defaultFieldStop(oldSize);
+ _attr[oldSize].visible = defaultFieldVisible(oldSize);
+ _attr[oldSize].forced = defaultFieldForced(oldSize);
+ _attr[oldSize].pos = defaultFieldPosition(oldSize);
+ oldSize++;
+ }
+ }
+ return true;
+}
+
+void TreeMapWidget::setFieldType(int f, QString type)
+{
+ if (((int)_attr.size() < f+1) &&
+ (type == defaultFieldType(f))) return;
+ if (resizeAttr(f+1)) _attr[f].type = type;
+
+ // no need to redraw: the type string is not visible in the TreeMap
+}
+
+QString TreeMapWidget::fieldType(int f) const
+{
+ if (f<0 || (int)_attr.size()<f+1) return defaultFieldType(f);
+ return _attr[f].type;
+}
+
+void TreeMapWidget::setFieldStop(int f, QString stop)
+{
+ if (((int)_attr.size() < f+1) &&
+ (stop == defaultFieldStop(f))) return;
+ if (resizeAttr(f+1)) {
+ _attr[f].stop = stop;
+ redraw();
+ }
+}
+
+QString TreeMapWidget::fieldStop(int f) const
+{
+ if (f<0 || (int)_attr.size()<f+1) return defaultFieldStop(f);
+ return _attr[f].stop;
+}
+
+void TreeMapWidget::setFieldVisible(int f, bool enable)
+{
+ if (((int)_attr.size() < f+1) &&
+ (enable == defaultFieldVisible(f))) return;
+
+ if (resizeAttr(f+1)) {
+ _attr[f].visible = enable;
+ redraw();
+ }
+}
+
+bool TreeMapWidget::fieldVisible(int f) const
+{
+ if (f<0 || (int)_attr.size()<f+1)
+ return defaultFieldVisible(f);
+
+ return _attr[f].visible;
+}
+
+void TreeMapWidget::setFieldForced(int f, bool enable)
+{
+ if (((int)_attr.size() < f+1) &&
+ (enable == defaultFieldForced(f))) return;
+
+ if (resizeAttr(f+1)) {
+ _attr[f].forced = enable;
+ if (_attr[f].visible) redraw();
+ }
+}
+
+bool TreeMapWidget::fieldForced(int f) const
+{
+ if (f<0 || (int)_attr.size()<f+1)
+ return defaultFieldForced(f);
+
+ return _attr[f].forced;
+}
+
+void TreeMapWidget::setFieldPosition(int f, TreeMapItem::Position pos)
+{
+ if (((int)_attr.size() < f+1) &&
+ (pos == defaultFieldPosition(f))) return;
+
+ if (resizeAttr(f+1)) {
+ _attr[f].pos = pos;
+ if (_attr[f].visible) redraw();
+ }
+}
+
+DrawParams::Position TreeMapWidget::fieldPosition(int f) const
+{
+ if (f<0 || (int)_attr.size()<f+1)
+ return defaultFieldPosition(f);
+
+ return _attr[f].pos;
+}
+
+void TreeMapWidget::setFieldPosition(int f, QString pos)
+{
+ if (pos == "TopLeft")
+ setFieldPosition(f, DrawParams::TopLeft);
+ else if (pos == "TopCenter")
+ setFieldPosition(f, DrawParams::TopCenter);
+ else if (pos == "TopRight")
+ setFieldPosition(f, DrawParams::TopRight);
+ else if (pos == "BottomLeft")
+ setFieldPosition(f, DrawParams::BottomLeft);
+ else if (pos == "BottomCenter")
+ setFieldPosition(f, DrawParams::BottomCenter);
+ else if (pos == "BottomRight")
+ setFieldPosition(f, DrawParams::BottomRight);
+ else if (pos == "Default")
+ setFieldPosition(f, DrawParams::Default);
+}
+
+QString TreeMapWidget::fieldPositionString(int f) const
+{
+ TreeMapItem::Position pos = fieldPosition(f);
+ if (pos == DrawParams::TopLeft) return QString("TopLeft");
+ if (pos == DrawParams::TopCenter) return QString("TopCenter");
+ if (pos == DrawParams::TopRight) return QString("TopRight");
+ if (pos == DrawParams::BottomLeft) return QString("BottomLeft");
+ if (pos == DrawParams::BottomCenter) return QString("BottomCenter");
+ if (pos == DrawParams::BottomRight) return QString("BottomRight");
+ if (pos == DrawParams::Default) return QString("Default");
+ return QString("unknown");
+}
+
+void TreeMapWidget::setMinimalArea(int area)
+{
+ if (_minimalArea == area) return;
+
+ _minimalArea = area;
+ redraw();
+}
+
+
+void TreeMapWidget::deletingItem(TreeMapItem* i)
+{
+ // remove any references to the item to be deleted
+ while(_selection.findRef(i) > -1)
+ _selection.remove();
+
+ while(_tmpSelection.findRef(i) > -1)
+ _tmpSelection.remove();
+
+ if (_current == i) _current = 0;
+ if (_oldCurrent == i) _oldCurrent = 0;
+ if (_pressed == i) _pressed = 0;
+ if (_lastOver == i) _lastOver = 0;
+
+ // don't redraw a deleted item
+ if (_needsRefresh == i) {
+ // we can savely redraw the parent, as deleting order is
+ // from child to parent; i.e. i->parent() is existing.
+ _needsRefresh = i->parent();
+ }
+}
+
+
+QString TreeMapWidget::tipString(TreeMapItem* i) const
+{
+ QString tip, itemTip;
+
+ while (i) {
+ if (!i->text(0).isEmpty()) {
+ itemTip = i->text(0);
+ if (!i->text(1).isEmpty())
+ itemTip += " (" + i->text(1) + ")";
+
+ if (!tip.isEmpty())
+ tip += "\n";
+
+ tip += itemTip;
+ }
+ i = i->parent();
+ }
+ return tip;
+}
+
+TreeMapItem* TreeMapWidget::item(int x, int y) const
+{
+ TreeMapItem* p = _base;
+ TreeMapItem* i;
+
+ if (!rect().contains(x, y)) return 0;
+ if (DEBUG_DRAWING) kdDebug(90100) << "item(" << x << "," << y << "):" << endl;
+
+ while (1) {
+ TreeMapItemList* list = p->children();
+ if (!list)
+ i = 0;
+ else {
+ int idx=0;
+ for (i=list->first();i;i=list->next(),idx++) {
+
+ if (DEBUG_DRAWING)
+ kdDebug(90100) << " Checking " << i->path(0).join("/") << " ("
+ << i->itemRect().x() << "/" << i->itemRect().y()
+ << "-" << i->itemRect().width()
+ << "x" << i->itemRect().height() << ")" << endl;
+
+ if (i->itemRect().contains(x, y)) {
+
+ if (DEBUG_DRAWING) kdDebug(90100) << " .. Got. Index " << idx << endl;
+
+ p->setIndex(idx);
+ break;
+ }
+ }
+ }
+
+ if (!i) {
+ static TreeMapItem* last = 0;
+ if (p != last) {
+ last = p;
+
+ if (DEBUG_DRAWING)
+ kdDebug(90100) << "item(" << x << "," << y << "): Got "
+ << p->path(0).join("/") << " (Size "
+ << p->itemRect().width() << "x" << p->itemRect().height()
+ << ", Val " << p->value() << ")" << endl;
+ }
+
+ return p;
+ }
+ p = i;
+ }
+ return 0;
+}
+
+TreeMapItem* TreeMapWidget::possibleSelection(TreeMapItem* i) const
+{
+ if (i) {
+ if (_maxSelectDepth>=0) {
+ int depth = i->depth();
+ while(i && depth > _maxSelectDepth) {
+ i = i->parent();
+ depth--;
+ }
+ }
+ }
+ return i;
+}
+
+TreeMapItem* TreeMapWidget::visibleItem(TreeMapItem* i) const
+{
+ if (i) {
+ /* Must have a visible area */
+ while(i && ((i->itemRect().width() <1) ||
+ (i->itemRect().height() <1))) {
+ TreeMapItem* p = i->parent();
+ if (!p) break;
+ int idx = p->children()->findRef(i);
+ idx--;
+ if (idx<0)
+ i = p;
+ else
+ i = p->children()->at(idx);
+ }
+ }
+ return i;
+}
+
+void TreeMapWidget::setSelected(TreeMapItem* item, bool selected)
+{
+ item = possibleSelection(item);
+ setCurrent(item);
+
+ TreeMapItem* changed = setTmpSelected(item, selected);
+ if (!changed) return;
+
+ _selection = _tmpSelection;
+ if (_selectionMode == Single)
+ emit selectionChanged(item);
+ emit selectionChanged();
+ redraw(changed);
+
+ if (0) kdDebug(90100) << (selected ? "S":"Des") << "elected Item "
+ << (item ? item->path(0).join("") : QString("(null)"))
+ << " (depth " << (item ? item->depth() : -1)
+ << ")" << endl;
+}
+
+void TreeMapWidget::setMarked(int markNo, bool redrawWidget)
+{
+ // if there's no marking, return
+ if ((_markNo == 0) && (markNo == 0)) return;
+
+ _markNo = markNo;
+ if (!clearSelection() && redrawWidget) redraw();
+}
+
+/* Returns all items which appear only in one of the given lists */
+TreeMapItemList TreeMapWidget::diff(TreeMapItemList& l1,
+ TreeMapItemList& l2)
+{
+ TreeMapItemList l;
+ TreeMapItemListIterator it1(l1), it2(l2);
+
+ TreeMapItem* item;
+ while ( (item = it1.current()) != 0 ) {
+ ++it1;
+ if (l2.containsRef(item) > 0) continue;
+ l.append(item);
+ }
+ while ( (item = it2.current()) != 0 ) {
+ ++it2;
+ if (l1.containsRef(item) > 0) continue;
+ l.append(item);
+ }
+
+ return l;
+}
+
+/* Only modifies _tmpSelection.
+ * Returns 0 when no change happened, otherwise the TreeMapItem that has
+ * to be redrawn for all changes.
+ */
+TreeMapItem* TreeMapWidget::setTmpSelected(TreeMapItem* item, bool selected)
+{
+ if (!item) return 0;
+ if (_selectionMode == NoSelection) return 0;
+
+ TreeMapItemList old = _tmpSelection;
+
+ if (_selectionMode == Single) {
+ _tmpSelection.clear();
+ if (selected) _tmpSelection.append(item);
+ }
+ else {
+ if (selected) {
+ TreeMapItem* i=_tmpSelection.first();
+ while (i) {
+ if (i->isChildOf(item) || item->isChildOf(i)) {
+ _tmpSelection.remove();
+ i = _tmpSelection.current();
+ }
+ else
+ i = _tmpSelection.next();
+ }
+ _tmpSelection.append(item);
+ }
+ else
+ _tmpSelection.removeRef(item);
+ }
+
+ return diff(old, _tmpSelection).commonParent();
+}
+
+
+bool TreeMapWidget::clearSelection(TreeMapItem* parent)
+{
+ TreeMapItemList old = _selection;
+
+ TreeMapItem* i=_selection.first();
+ while (i) {
+ if (i->isChildOf(parent)) {
+ _selection.remove();
+ i = _selection.current();
+ }
+ else
+ i = _selection.next();
+ }
+
+ TreeMapItem* changed = diff(old, _selection).commonParent();
+ if (changed) {
+ changed->redraw();
+ emit selectionChanged();
+ }
+ return (changed != 0);
+}
+
+bool TreeMapWidget::isSelected(TreeMapItem* i) const
+{
+ return _selection.containsRef(i)>0;
+}
+
+bool TreeMapWidget::isTmpSelected(TreeMapItem* i)
+{
+ return _tmpSelection.containsRef(i)>0;
+}
+
+
+void TreeMapWidget::setCurrent(TreeMapItem* i, bool kbd)
+{
+ TreeMapItem* old = _current;
+ _current = i;
+
+ if (_markNo >0) {
+ // remove mark
+ _markNo = 0;
+
+ if (1) kdDebug(90100) << "setCurrent(" << i->path(0).join("/")
+ << ") - mark removed" << endl;
+
+ // always complete redraw needed to remove mark
+ redraw();
+
+ if (old == _current) return;
+ }
+ else {
+ if (old == _current) return;
+
+ if (old) old->redraw();
+ if (i) i->redraw();
+ }
+
+ //kdDebug(90100) << "Current Item " << (i ? i->path().ascii() : "(null)") << endl;
+
+ emit currentChanged(i, kbd);
+}
+
+void TreeMapWidget::setRangeSelection(TreeMapItem* i1,
+ TreeMapItem* i2, bool selected)
+{
+ i1 = possibleSelection(i1);
+ i2 = possibleSelection(i2);
+ setCurrent(i2);
+
+ TreeMapItem* changed = setTmpRangeSelection(i1, i2, selected);
+ if (!changed) return;
+
+ _selection = _tmpSelection;
+ if (_selectionMode == Single)
+ emit selectionChanged(i2);
+ emit selectionChanged();
+ redraw(changed);
+}
+
+TreeMapItem* TreeMapWidget::setTmpRangeSelection(TreeMapItem* i1,
+ TreeMapItem* i2,
+ bool selected)
+{
+ if ((i1 == 0) && (i2 == 0)) return 0;
+ if ((i1 == 0) || i1->isChildOf(i2)) return setTmpSelected(i2, selected);
+ if ((i2 == 0) || i2->isChildOf(i1)) return setTmpSelected(i1, selected);
+
+ TreeMapItem* changed = setTmpSelected(i1, selected);
+ TreeMapItem* changed2 = setTmpSelected(i2, selected);
+ if (changed2) changed = changed2->commonParent(changed);
+
+ TreeMapItem* commonParent = i1;
+ while (commonParent && !i2->isChildOf(commonParent)) {
+ i1 = commonParent;
+ commonParent = commonParent->parent();
+ }
+ if (!commonParent) return changed;
+ while (i2 && i2->parent() != commonParent)
+ i2 = i2->parent();
+ if (!i2) return changed;
+
+ TreeMapItemList* list = commonParent->children();
+ if (!list) return changed;
+
+ TreeMapItem* i = list->first();
+ bool between = false;
+ while (i) {
+ if (between) {
+ if (i==i1 || i==i2) break;
+ changed2 = setTmpSelected(i, selected);
+ if (changed2) changed = changed2->commonParent(changed);
+ }
+ else if (i==i1 || i==i2)
+ between = true;
+ i = list->next();
+ }
+
+ return changed;
+}
+
+void TreeMapWidget::contextMenuEvent( QContextMenuEvent* e )
+{
+ //kdDebug(90100) << "TreeMapWidget::contextMenuEvent" << endl;
+
+ if ( receivers( SIGNAL(contextMenuRequested(TreeMapItem*, const QPoint &)) ) )
+ e->accept();
+
+ if ( e->reason() == QContextMenuEvent::Keyboard ) {
+ QRect r = (_current) ? _current->itemRect() : _base->itemRect();
+ QPoint p = QPoint(r.left() + r.width()/2, r.top() + r.height()/2);
+ emit contextMenuRequested(_current, p);
+ }
+ else {
+ TreeMapItem* i = item(e->x(), e->y());
+ emit contextMenuRequested(i, e->pos());
+ }
+}
+
+
+void TreeMapWidget::mousePressEvent( QMouseEvent* e )
+{
+ //kdDebug(90100) << "TreeMapWidget::mousePressEvent" << endl;
+
+ _oldCurrent = _current;
+
+ TreeMapItem* i = item(e->x(), e->y());
+
+ _pressed = i;
+
+ _inShiftDrag = e->state() & ShiftButton;
+ _inControlDrag = e->state() & ControlButton;
+ _lastOver = _pressed;
+
+ TreeMapItem* changed = 0;
+ TreeMapItem* item = possibleSelection(_pressed);
+
+ switch(_selectionMode) {
+ case Single:
+ changed = setTmpSelected(item, true);
+ break;
+ case Multi:
+ changed = setTmpSelected(item, !isTmpSelected(item));
+ break;
+ case Extended:
+ if (_inControlDrag)
+ changed = setTmpSelected(item, !isTmpSelected(item));
+ else if (_inShiftDrag) {
+ TreeMapItem* sCurrent = possibleSelection(_current);
+ changed = setTmpRangeSelection(sCurrent, item,
+ !isTmpSelected(item));
+ }
+ else {
+ _selectionMode = Single;
+ changed = setTmpSelected(item, true);
+ _selectionMode = Extended;
+ }
+ break;
+ default:
+ break;
+ }
+
+ // item under mouse always selected on right button press
+ if (e->button() == RightButton) {
+ TreeMapItem* changed2 = setTmpSelected(item, true);
+ if (changed2) changed = changed2->commonParent(changed);
+ }
+
+ setCurrent(_pressed);
+
+ if (changed)
+ redraw(changed);
+
+ if (e->button() == RightButton) {
+
+ // emit selection change
+ if (! (_tmpSelection == _selection)) {
+ _selection = _tmpSelection;
+ if (_selectionMode == Single)
+ emit selectionChanged(_lastOver);
+ emit selectionChanged();
+ }
+ _pressed = 0;
+ _lastOver = 0;
+ emit rightButtonPressed(i, e->pos());
+ }
+}
+
+void TreeMapWidget::mouseMoveEvent( QMouseEvent* e )
+{
+ //kdDebug(90100) << "TreeMapWidget::mouseMoveEvent" << endl;
+
+ if (!_pressed) return;
+ TreeMapItem* over = item(e->x(), e->y());
+ if (_lastOver == over) return;
+
+ setCurrent(over);
+ if (over == 0) {
+ _lastOver = 0;
+ return;
+ }
+
+ TreeMapItem* changed = 0;
+ TreeMapItem* item = possibleSelection(over);
+
+ switch(_selectionMode) {
+ case Single:
+ changed = setTmpSelected(item, true);
+ break;
+ case Multi:
+ changed = setTmpSelected(item, !isTmpSelected(item));
+ break;
+ case Extended:
+ if (_inControlDrag)
+ changed = setTmpSelected(item, !isTmpSelected(item));
+ else {
+ TreeMapItem* sLast = possibleSelection(_lastOver);
+ changed = setTmpRangeSelection(sLast, item, true);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ _lastOver = over;
+
+ if (changed)
+ redraw(changed);
+}
+
+void TreeMapWidget::mouseReleaseEvent( QMouseEvent* )
+{
+ //kdDebug(90100) << "TreeMapWidget::mouseReleaseEvent" << endl;
+
+ if (!_pressed) return;
+
+ if (!_lastOver) {
+ // take back
+ setCurrent(_oldCurrent);
+ TreeMapItem* changed = diff(_tmpSelection, _selection).commonParent();
+ _tmpSelection = _selection;
+ if (changed)
+ redraw(changed);
+ }
+ else {
+ if (! (_tmpSelection == _selection)) {
+ _selection = _tmpSelection;
+ if (_selectionMode == Single)
+ emit selectionChanged(_lastOver);
+ emit selectionChanged();
+ }
+ if (!_inControlDrag && !_inShiftDrag && (_pressed == _lastOver))
+ emit clicked(_lastOver);
+ }
+
+ _pressed = 0;
+ _lastOver = 0;
+}
+
+
+void TreeMapWidget::mouseDoubleClickEvent( QMouseEvent* e )
+{
+ TreeMapItem* over = item(e->x(), e->y());
+
+ emit doubleClicked(over);
+}
+
+
+/* returns -1 if nothing visible found */
+int nextVisible(TreeMapItem* i)
+{
+ TreeMapItem* p = i->parent();
+ if (!p || p->itemRect().isEmpty()) return -1;
+
+ int idx = p->children()->findRef(i);
+ if (idx<0) return -1;
+
+ while (idx < (int)p->children()->count()-1) {
+ idx++;
+ QRect r = p->children()->at(idx)->itemRect();
+ if (r.width()>1 && r.height()>1)
+ return idx;
+ }
+ return -1;
+}
+
+/* returns -1 if nothing visible found */
+int prevVisible(TreeMapItem* i)
+{
+ TreeMapItem* p = i->parent();
+ if (!p || p->itemRect().isEmpty()) return -1;
+
+ int idx = p->children()->findRef(i);
+ if (idx<0) return -1;
+
+ while (idx > 0) {
+ idx--;
+ QRect r = p->children()->at(idx)->itemRect();
+ if (r.width()>1 && r.height()>1)
+ return idx;
+ }
+ return -1;
+}
+
+
+
+
+void TreeMapWidget::keyPressEvent( QKeyEvent* e )
+{
+ if (e->key() == Key_Escape && _pressed) {
+
+ // take back
+ if (_oldCurrent != _lastOver)
+ setCurrent(_oldCurrent);
+ if (! (_tmpSelection == _selection)) {
+ TreeMapItem* changed = diff(_tmpSelection, _selection).commonParent();
+ _tmpSelection = _selection;
+ if (changed)
+ redraw(changed);
+ }
+ _pressed = 0;
+ _lastOver = 0;
+ }
+
+ if ((e->key() == Key_Space) ||
+ (e->key() == Key_Return)) {
+
+ switch(_selectionMode) {
+ case NoSelection:
+ break;
+ case Single:
+ setSelected(_current, true);
+ break;
+ case Multi:
+ setSelected(_current, !isSelected(_current));
+ break;
+ case Extended:
+ if ((e->state() & ControlButton) || (e->state() & ShiftButton))
+ setSelected(_current, !isSelected(_current));
+ else {
+ _selectionMode = Single;
+ setSelected(_current, true);
+ _selectionMode = Extended;
+ }
+ }
+
+ if (_current && (e->key() == Key_Return))
+ emit returnPressed(_current);
+
+ return;
+ }
+
+ if (!_current) {
+ if (e->key() == Key_Down) {
+ setCurrent(_base, true);
+ }
+ return;
+ }
+
+ TreeMapItem* old = _current, *newItem;
+ TreeMapItem* p = _current->parent();
+
+ bool goBack;
+ if (_current->sorting(&goBack) == -1) {
+ // noSorting
+ goBack = false;
+ }
+
+
+ if ((e->key() == Key_Backspace) ||
+ (e->key() == Key_Up)) {
+ newItem = visibleItem(p);
+ setCurrent(newItem, true);
+ }
+ else if (e->key() == Key_Left) {
+ int newIdx = goBack ? nextVisible(_current) : prevVisible(_current);
+ if (p && newIdx>=0) {
+ p->setIndex(newIdx);
+ setCurrent(p->children()->at(newIdx), true);
+ }
+ }
+ else if (e->key() == Key_Right) {
+ int newIdx = goBack ? prevVisible(_current) : nextVisible(_current);
+ if (p && newIdx>=0) {
+ p->setIndex(newIdx);
+ setCurrent(p->children()->at(newIdx), true);
+ }
+ }
+ else if (e->key() == Key_Down) {
+ if (_current->children() && _current->children()->count()>0) {
+ int newIdx = _current->index();
+ if (newIdx<0)
+ newIdx = goBack ? (_current->children()->count()-1) : 0;
+ if (newIdx>=(int)_current->children()->count())
+ newIdx = _current->children()->count()-1;
+ newItem = visibleItem(_current->children()->at(newIdx));
+ setCurrent(newItem, true);
+ }
+ }
+
+ if (old == _current) return;
+ if (! (e->state() & ControlButton)) return;
+ if (! (e->state() & ShiftButton)) return;
+
+ switch(_selectionMode) {
+ case NoSelection:
+ break;
+ case Single:
+ setSelected(_current, true);
+ break;
+ case Multi:
+ setSelected(_current, !isSelected(_current));
+ break;
+ case Extended:
+ if (e->state() & ControlButton)
+ setSelected(_current, !isSelected(_current));
+ else
+ setSelected(_current, isSelected(old));
+ }
+}
+
+void TreeMapWidget::fontChange( const QFont& )
+{
+ redraw();
+}
+
+
+void TreeMapWidget::resizeEvent( QResizeEvent * )
+{
+ // this automatically redraws (as size is changed)
+ drawTreeMap();
+}
+
+void TreeMapWidget::paintEvent( QPaintEvent * )
+{
+ drawTreeMap();
+}
+
+void TreeMapWidget::showEvent( QShowEvent * )
+{
+ // refresh only if needed
+ drawTreeMap();
+}
+
+// Updates screen from shadow buffer,
+// but redraws before if needed
+void TreeMapWidget::drawTreeMap()
+{
+ // no need to draw if hidden
+ if (!isVisible()) return;
+
+ if (_pixmap.size() != size())
+ _needsRefresh = _base;
+
+ if (_needsRefresh) {
+
+ if (DEBUG_DRAWING)
+ kdDebug(90100) << "Redrawing " << _needsRefresh->path(0).join("/") << endl;
+
+ if (_needsRefresh == _base) {
+ // redraw whole widget
+ _pixmap = QPixmap(size());
+ _pixmap.fill(backgroundColor());
+ }
+ QPainter p(&_pixmap);
+ if (_needsRefresh == _base) {
+ p.setPen(black);
+ p.drawRect(QRect(2, 2, QWidget::width()-4, QWidget::height()-4));
+ _base->setItemRect(QRect(3, 3, QWidget::width()-6, QWidget::height()-6));
+ }
+ else {
+ // only subitem
+ if (!_needsRefresh->itemRect().isValid()) return;
+ }
+
+ // reset cached font object; it could have been changed
+ _font = font();
+ _fontHeight = fontMetrics().height();
+
+ drawItems(&p, _needsRefresh);
+ _needsRefresh = 0;
+ }
+
+ bitBlt( this, 0, 0, &_pixmap, 0, 0,
+ QWidget::width(), QWidget::height(), CopyROP, true);
+
+ if (hasFocus()) {
+ QPainter p(this);
+ style().drawPrimitive( QStyle::PE_FocusRect, &p,
+ QRect(0, 0, QWidget::width(), QWidget::height()),
+ colorGroup() );
+ }
+}
+
+
+
+void TreeMapWidget::redraw(TreeMapItem* i)
+{
+ if (!i) return;
+
+ if (!_needsRefresh)
+ _needsRefresh = i;
+ else {
+ if (!i->isChildOf(_needsRefresh))
+ _needsRefresh = _needsRefresh->commonParent(i);
+ }
+
+ if (isVisible()) {
+ // delayed drawing if we have multiple redraw requests
+ update();
+ }
+}
+
+void TreeMapWidget::drawItem(QPainter* p,
+ TreeMapItem* item)
+{
+ bool isSelected = false;
+ TreeMapItem* i;
+
+ if (_markNo>0) {
+ for(i = item;i;i=i->parent())
+ if (i->isMarked(_markNo)) break;
+
+ isSelected = (i!=0);
+ }
+ else {
+ for (i=_tmpSelection.first();i;i=_tmpSelection.next())
+ if (item->isChildOf(i)) break;
+
+ isSelected = (i!=0);
+ }
+
+ bool isCurrent = _current && item->isChildOf(_current);
+
+ RectDrawing d(item->itemRect());
+ item->setSelected(isSelected);
+ item->setCurrent(isCurrent);
+ item->setShaded(_shading);
+ d.drawBack(p, item);
+}
+
+
+bool TreeMapWidget::horizontal(TreeMapItem* i, const QRect& r)
+{
+ switch(i->splitMode()) {
+ case TreeMapItem::HAlternate:
+ return (i->depth()%2)==1;
+ case TreeMapItem::VAlternate:
+ return (i->depth()%2)==0;
+ case TreeMapItem::Horizontal:
+ return true;
+ case TreeMapItem::Vertical:
+ return false;
+ default:
+ return r.width() > r.height();
+ }
+ return false;
+}
+
+
+/**
+ * Draw TreeMapItems recursive, starting from item
+ */
+void TreeMapWidget::drawItems(QPainter* p,
+ TreeMapItem* item)
+{
+ if (DEBUG_DRAWING)
+ kdDebug(90100) << "+drawItems(" << item->path(0).join("/") << ", "
+ << item->itemRect().x() << "/" << item->itemRect().y()
+ << "-" << item->itemRect().width() << "x"
+ << item->itemRect().height() << "), Val " << item->value()
+ << ", Sum " << item->sum() << endl;
+
+ drawItem(p, item);
+ item->clearFreeRects();
+
+ QRect origRect = item->itemRect();
+ int bw = item->borderWidth();
+ QRect r = QRect(origRect.x()+bw, origRect.y()+bw,
+ origRect.width()-2*bw, origRect.height()-2*bw);
+
+ TreeMapItemList* list = item->children();
+ TreeMapItem* i;
+
+ bool stopDrawing = false;
+
+ // only subdivide if there are children
+ if (!list || list->count()==0)
+ stopDrawing = true;
+
+ // only subdivide if there is enough space
+ if (!stopDrawing && (r.width()<=0 || r.height()<=0))
+ stopDrawing = true;
+
+ // stop drawing if maximum depth is reached
+ if (!stopDrawing &&
+ (_maxDrawingDepth>=0 && item->depth()>=_maxDrawingDepth))
+ stopDrawing = true;
+
+ // stop drawing if stopAtText is reached
+ if (!stopDrawing)
+ for (int no=0;no<(int)_attr.size();no++) {
+ QString stopAt = fieldStop(no);
+ if (!stopAt.isEmpty() && (item->text(no) == stopAt)) {
+ stopDrawing = true;
+ break;
+ }
+ }
+
+ // area size is checked later...
+#if 0
+ // stop drawing if minimal area size is reached
+ if (!stopDrawing &&
+ (_minimalArea > 0) &&
+ (r.width() * r.height() < _minimalArea)) stopDrawing = true;
+#endif
+
+ if (stopDrawing) {
+ if (list) {
+ // invalidate rects
+ for (i=list->first();i;i=list->next())
+ i->clearItemRect();
+ }
+ // tooltip apears on whole item rect
+ item->addFreeRect(item->itemRect());
+
+ // if we have space for text...
+ if ((r.height() < _fontHeight) || (r.width() < _fontHeight)) return;
+
+ RectDrawing d(r);
+ item->setRotated(_allowRotation && (r.height() > r.width()));
+ for (int no=0;no<(int)_attr.size();no++) {
+ if (!fieldVisible(no)) continue;
+ d.drawField(p, no, item);
+ }
+ r = d.remainingRect(item);
+
+ if (DEBUG_DRAWING)
+ kdDebug(90100) << "-drawItems(" << item->path(0).join("/") << ")" << endl;
+ return;
+ }
+
+ double user_sum, child_sum, self;
+
+ // user supplied sum
+ user_sum = item->sum();
+
+ // own sum
+ child_sum = 0;
+ for (i=list->first();i;i=list->next()) {
+ child_sum += i->value();
+ if (DEBUG_DRAWING)
+ kdDebug(90100) << " child: " << i->text(0) << ", value "
+ << i->value() << endl;
+ }
+
+ QRect orig = r;
+
+ // if we have space for text...
+ if ((r.height() >= _fontHeight) && (r.width() >= _fontHeight)) {
+
+ RectDrawing d(r);
+ item->setRotated(_allowRotation && (r.height() > r.width()));
+ for (int no=0;no<(int)_attr.size();no++) {
+ if (!fieldVisible(no)) continue;
+ if (!fieldForced(no)) continue;
+ d.drawField(p, no, item);
+ }
+ r = d.remainingRect(item);
+ }
+
+ if (orig.x() == r.x()) {
+ // Strings on top
+ item->addFreeRect(QRect(orig.x(), orig.y(),
+ orig.width(), orig.height()-r.height()));
+ }
+ else {
+ // Strings on the left
+ item->addFreeRect(QRect(orig.x(), orig.y(),
+ orig.width()-r.width(), orig.height()));
+ }
+
+ if (user_sum == 0) {
+ // user didn't supply any sum
+ user_sum = child_sum;
+ self = 0;
+ }
+ else {
+ self = user_sum - child_sum;
+
+ if (user_sum < child_sum) {
+ //kdDebug(90100) << "TreeMWidget " <<
+ // item->path() << ": User sum " << user_sum << " < Child Items sum " << child_sum << endl;
+
+ // invalid user supplied sum: ignore and use calculate sum
+ user_sum = child_sum;
+ self = 0.0;
+ }
+ else {
+ // Try to put the border waste in self
+ // percent of wasted space on border...
+ float borderArea = origRect.width() * origRect.height();
+ borderArea = (borderArea - r.width()*r.height())/borderArea;
+ unsigned borderValue = (unsigned)(borderArea * user_sum);
+
+ if (borderValue > self) {
+ if (_skipIncorrectBorder) {
+ r = origRect;
+ // should add my self to nested self and set my self =0
+ }
+ else
+ self = 0.0;
+ }
+ else
+ self -= borderValue;
+
+ user_sum = child_sum + self;
+ }
+ }
+
+ bool rotate = (_allowRotation && (r.height() > r.width()));
+ int self_length = (int)( ((rotate) ? r.width() : r.height()) *
+ self / user_sum + .5);
+ if (self_length > 0) {
+ // take space for self cost
+ QRect sr = r;
+ if (rotate) {
+ sr.setWidth( self_length );
+ r.setRect(r.x()+sr.width(), r.y(), r.width()-sr.width(), r.height());
+ }
+ else {
+ sr.setHeight( self_length );
+ r.setRect(r.x(), r.y()+sr.height(), r.width(), r.height()-sr.height());
+ }
+
+ // set selfRect (not occupied by children) for tooltip
+ item->addFreeRect(sr);
+
+ if (0) kdDebug(90100) << "Item " << item->path(0).join("/") << ": SelfR "
+ << sr.x() << "/" << sr.y() << "-" << sr.width()
+ << "/" << sr.height() << ", self " << self << "/"
+ << user_sum << endl;
+
+ if ((sr.height() >= _fontHeight) && (sr.width() >= _fontHeight)) {
+
+ RectDrawing d(sr);
+ item->setRotated(_allowRotation && (r.height() > r.width()));
+ for (int no=0;no<(int)_attr.size();no++) {
+ if (!fieldVisible(no)) continue;
+ if (fieldForced(no)) continue;
+ d.drawField(p, no, item);
+ }
+ }
+
+ user_sum -= self;
+ }
+
+ bool goBack;
+ if (item->sorting(&goBack) == -1) {
+ // noSorting
+ goBack = false;
+ }
+
+ TreeMapItemListIterator it(*list);
+ if (goBack) it.toLast();
+
+ if (item->splitMode() == TreeMapItem::Columns) {
+ int len = list->count();
+ bool drawDetails = true;
+
+ while (len>0 && user_sum>0) {
+ TreeMapItemListIterator first = it;
+ double valSum = 0;
+ int lenLeft = len;
+ int columns = (int)(sqrt((double)len * r.width()/r.height())+.5);
+ if (columns==0) columns = 1; //should never be needed
+
+ while (lenLeft>0 && ((double)valSum*(len-lenLeft) <
+ (double)len*user_sum/columns/columns)) {
+ valSum += it.current()->value();
+ if (goBack) --it; else ++it;
+ lenLeft--;
+ }
+
+ // we always split horizontally
+ int nextPos = (int)((double)r.width() * valSum / user_sum);
+ QRect firstRect = QRect(r.x(), r.y(), nextPos, r.height());
+
+ if (nextPos < _visibleWidth) {
+ if (item->sorting(0) == -1) {
+ // fill current rect with hash pattern
+ drawFill(item, p, firstRect);
+ }
+ else {
+ // fill rest with hash pattern
+ drawFill(item, p, r, first, len, goBack);
+ break;
+ }
+ }
+ else {
+ drawDetails = drawItemArray(p, item, firstRect,
+ valSum, first, len-lenLeft, goBack);
+ }
+ r.setRect(r.x()+nextPos, r.y(), r.width()-nextPos, r.height());
+ user_sum -= valSum;
+ len = lenLeft;
+
+ if (!drawDetails) {
+ if (item->sorting(0) == -1)
+ drawDetails = true;
+ else {
+ drawFill(item, p, r, it, len, goBack);
+ break;
+ }
+ }
+ }
+ }
+ else if (item->splitMode() == TreeMapItem::Rows) {
+ int len = list->count();
+ bool drawDetails = true;
+
+ while (len>0 && user_sum>0) {
+ TreeMapItemListIterator first = it;
+ double valSum = 0;
+ int lenLeft = len;
+ int rows = (int)(sqrt((double)len * r.height()/r.width())+.5);
+ if (rows==0) rows = 1; //should never be needed
+
+ while (lenLeft>0 && ((double)valSum*(len-lenLeft) <
+ (double)len*user_sum/rows/rows)) {
+ valSum += it.current()->value();
+ if (goBack) --it; else ++it;
+ lenLeft--;
+ }
+
+ // we always split horizontally
+ int nextPos = (int)((double)r.height() * valSum / user_sum);
+ QRect firstRect = QRect(r.x(), r.y(), r.width(), nextPos);
+
+ if (nextPos < _visibleWidth) {
+ if (item->sorting(0) == -1) {
+ drawFill(item, p, firstRect);
+ }
+ else {
+ drawFill(item, p, r, first, len, goBack);
+ break;
+ }
+ }
+ else {
+ drawDetails = drawItemArray(p, item, firstRect,
+ valSum, first, len-lenLeft, goBack);
+ }
+ r.setRect(r.x(), r.y()+nextPos, r.width(), r.height()-nextPos);
+ user_sum -= valSum;
+ len = lenLeft;
+
+ if (!drawDetails) {
+ if (item->sorting(0) == -1)
+ drawDetails = true;
+ else {
+ drawFill(item, p, r, it, len, goBack);
+ break;
+ }
+ }
+ }
+ }
+ else
+ drawItemArray(p, item, r, user_sum, it, list->count(), goBack);
+
+ if (DEBUG_DRAWING)
+ kdDebug(90100) << "-drawItems(" << item->path(0).join("/") << ")" << endl;
+}
+
+// fills area with a pattern if to small to draw children
+void TreeMapWidget::drawFill(TreeMapItem* i, QPainter* p, QRect& r)
+{
+ p->setBrush(Qt::Dense4Pattern);
+ p->setPen(Qt::NoPen);
+ p->drawRect(r);
+ i->addFreeRect(r);
+}
+
+// fills area with a pattern if to small to draw children
+void TreeMapWidget::drawFill(TreeMapItem* i, QPainter* p, QRect& r,
+ TreeMapItemListIterator it, int len, bool goBack)
+{
+ if (DEBUG_DRAWING)
+ kdDebug(90100) << " +drawFill(" << r.x() << "/" << r.y()
+ << "-" << r.width() << "x" << r.height()
+ << ", len " << len << ")" << endl;
+
+ p->setBrush(Qt::Dense4Pattern);
+ p->setPen(Qt::NoPen);
+ p->drawRect(r);
+ i->addFreeRect(r);
+
+ // reset rects
+ while (len>0 && it.current()) {
+
+ if (DEBUG_DRAWING)
+ kdDebug(90100) << " Reset Rect " << (*it)->path(0).join("/") << endl;
+
+ (*it)->clearItemRect();
+ if (goBack) --it; else ++it;
+ len--;
+ }
+ if (DEBUG_DRAWING)
+ kdDebug(90100) << " -drawFill(" << r.x() << "/" << r.y()
+ << "-" << r.width() << "x" << r.height()
+ << ", len " << len << ")" << endl;
+}
+
+// returns false if rect gets to small
+bool TreeMapWidget::drawItemArray(QPainter* p, TreeMapItem* item,
+ QRect& r, double user_sum,
+ TreeMapItemListIterator it, int len,
+ bool goBack)
+{
+ if (user_sum == 0) return false;
+
+ static bool b2t = true;
+
+ // stop recursive bisection for small rectangles
+ if (((r.height() < _visibleWidth) &&
+ (r.width() < _visibleWidth)) ||
+ ((_minimalArea > 0) &&
+ (r.width() * r.height() < _minimalArea))) {
+
+ drawFill(item, p, r, it, len, goBack);
+ return false;
+ }
+
+ if (DEBUG_DRAWING)
+ kdDebug(90100) << " +drawItemArray(" << item->path(0).join("/")
+ << ", " << r.x() << "/" << r.y() << "-" << r.width()
+ << "x" << r.height() << ")" << endl;
+
+ if (len>2 && (item->splitMode() == TreeMapItem::Bisection)) {
+
+ TreeMapItemListIterator first = it;
+ double valSum = 0;
+ int lenLeft = len;
+ //while (lenLeft>0 && valSum<user_sum/2) {
+ while (lenLeft>len/2) {
+ valSum += it.current()->value();
+ if (goBack) --it; else ++it;
+ lenLeft--;
+ }
+
+ // draw first half...
+ bool drawOn;
+
+ if (r.width() > r.height()) {
+ int halfPos = (int)((double)r.width() * valSum / user_sum);
+ QRect firstRect = QRect(r.x(), r.y(), halfPos, r.height());
+ drawOn = drawItemArray(p, item, firstRect,
+ valSum, first, len-lenLeft, goBack);
+ r.setRect(r.x()+halfPos, r.y(), r.width()-halfPos, r.height());
+ }
+ else {
+ int halfPos = (int)((double)r.height() * valSum / user_sum);
+ QRect firstRect = QRect(r.x(), r.y(), r.width(), halfPos);
+ drawOn = drawItemArray(p, item, firstRect,
+ valSum, first, len-lenLeft, goBack);
+ r.setRect(r.x(), r.y()+halfPos, r.width(), r.height()-halfPos);
+ }
+
+ // if no sorting, don't stop drawing
+ if (item->sorting(0) == -1) drawOn = true;
+
+ // second half
+ if (drawOn)
+ drawOn = drawItemArray(p, item, r, user_sum - valSum,
+ it, lenLeft, goBack);
+ else {
+ drawFill(item, p, r, it, len, goBack);
+ }
+
+ if (DEBUG_DRAWING)
+ kdDebug(90100) << " -drawItemArray(" << item->path(0).join("/")
+ << ")" << endl;
+
+ return drawOn;
+ }
+
+ bool hor = horizontal(item,r);
+
+ TreeMapItem* i;
+ while (len>0) {
+ i = it.current();
+ if (user_sum <= 0) {
+
+ if (DEBUG_DRAWING)
+ kdDebug(90100) << "drawItemArray: Reset " << i->path(0).join("/") << endl;
+
+ i->clearItemRect();
+ if (goBack) --it; else ++it;
+ len--;
+ continue;
+ }
+
+ // stop drawing for small rectangles
+ if (((r.height() < _visibleWidth) &&
+ (r.width() < _visibleWidth)) ||
+ ((_minimalArea > 0) &&
+ (r.width() * r.height() < _minimalArea))) {
+
+ drawFill(item, p, r, it, len, goBack);
+ if (DEBUG_DRAWING)
+ kdDebug(90100) << " -drawItemArray(" << item->path(0).join("/")
+ << "): Stop" << endl;
+ return false;
+ }
+
+ if (i->splitMode() == TreeMapItem::AlwaysBest)
+ hor = r.width() > r.height();
+
+ int lastPos = hor ? r.width() : r.height();
+ double val = i->value();
+ int nextPos = (user_sum <= 0.0) ? 0: (int)(lastPos * val / user_sum +.5);
+ if (nextPos>lastPos) nextPos = lastPos;
+
+ if ((item->sorting(0) != -1) && (nextPos < _visibleWidth)) {
+ drawFill(item, p, r, it, len, goBack);
+ if (DEBUG_DRAWING)
+ kdDebug(90100) << " -drawItemArray(" << item->path(0).join("/")
+ << "): Stop" << endl;
+ return false;
+ }
+
+ QRect currRect = r;
+
+ if (hor)
+ currRect.setWidth(nextPos);
+ else {
+ if (b2t)
+ currRect.setRect(r.x(), r.bottom()-nextPos+1, r.width(), nextPos);
+ else
+ currRect.setHeight(nextPos);
+ }
+
+ // don't draw very small rectangles:
+ if (nextPos >= _visibleWidth) {
+ i->setItemRect(currRect);
+ drawItems(p, i);
+ }
+ else {
+ i->clearItemRect();
+ drawFill(item, p, currRect);
+ }
+
+ // draw Separator
+ if (_drawSeparators && (nextPos<lastPos)) {
+ p->setPen(black);
+ if (hor) {
+ if (r.top()<=r.bottom())
+ p->drawLine(r.x() + nextPos, r.top(), r.x() + nextPos, r.bottom());
+ }
+ else {
+ if (r.left()<=r.right())
+ p->drawLine(r.left(), r.y() + nextPos, r.right(), r.y() + nextPos);
+ }
+ nextPos++;
+ }
+
+ if (hor)
+ r.setRect(r.x() + nextPos, r.y(), lastPos-nextPos, r.height());
+ else {
+ if (b2t)
+ r.setRect(r.x(), r.y(), r.width(), lastPos-nextPos);
+ else
+ r.setRect(r.x(), r.y() + nextPos, r.width(), lastPos-nextPos);
+ }
+
+ user_sum -= val;
+ if (goBack) --it; else ++it;
+ len--;
+ }
+
+ if (DEBUG_DRAWING)
+ kdDebug(90100) << " -drawItemArray(" << item->path(0).join("/")
+ << "): Continue" << endl;
+
+ return true;
+}
+
+
+/*----------------------------------------------------------------
+ * Popup menus for option setting
+ */
+
+void TreeMapWidget::splitActivated(int id)
+{
+ if (id == _splitID) setSplitMode(TreeMapItem::Bisection);
+ else if (id == _splitID+1) setSplitMode(TreeMapItem::Columns);
+ else if (id == _splitID+2) setSplitMode(TreeMapItem::Rows);
+ else if (id == _splitID+3) setSplitMode(TreeMapItem::AlwaysBest);
+ else if (id == _splitID+4) setSplitMode(TreeMapItem::Best);
+ else if (id == _splitID+5) setSplitMode(TreeMapItem::VAlternate);
+ else if (id == _splitID+6) setSplitMode(TreeMapItem::HAlternate);
+ else if (id == _splitID+7) setSplitMode(TreeMapItem::Horizontal);
+ else if (id == _splitID+8) setSplitMode(TreeMapItem::Vertical);
+}
+
+
+void TreeMapWidget::addSplitDirectionItems(QPopupMenu* popup, int id)
+{
+ _splitID = id;
+ popup->setCheckable(true);
+
+ connect(popup, SIGNAL(activated(int)),
+ this, SLOT(splitActivated(int)));
+
+ popup->insertItem(i18n("Recursive Bisection"), id);
+ popup->insertItem(i18n("Columns"), id+1);
+ popup->insertItem(i18n("Rows"), id+2);
+ popup->insertItem(i18n("Always Best"), id+3);
+ popup->insertItem(i18n("Best"), id+4);
+ popup->insertItem(i18n("Alternate (V)"), id+5);
+ popup->insertItem(i18n("Alternate (H)"), id+6);
+ popup->insertItem(i18n("Horizontal"), id+7);
+ popup->insertItem(i18n("Vertical"), id+8);
+
+ switch(splitMode()) {
+ case TreeMapItem::Bisection: popup->setItemChecked(id,true); break;
+ case TreeMapItem::Columns: popup->setItemChecked(id+1,true); break;
+ case TreeMapItem::Rows: popup->setItemChecked(id+2,true); break;
+ case TreeMapItem::AlwaysBest: popup->setItemChecked(id+3,true); break;
+ case TreeMapItem::Best: popup->setItemChecked(id+4,true); break;
+ case TreeMapItem::VAlternate: popup->setItemChecked(id+5,true); break;
+ case TreeMapItem::HAlternate: popup->setItemChecked(id+6,true); break;
+ case TreeMapItem::Horizontal: popup->setItemChecked(id+7,true); break;
+ case TreeMapItem::Vertical: popup->setItemChecked(id+8,true); break;
+ default: break;
+ }
+}
+
+void TreeMapWidget::visualizationActivated(int id)
+{
+ if (id == _visID+2) setSkipIncorrectBorder(!skipIncorrectBorder());
+ else if (id == _visID+3) setBorderWidth(0);
+ else if (id == _visID+4) setBorderWidth(1);
+ else if (id == _visID+5) setBorderWidth(2);
+ else if (id == _visID+6) setBorderWidth(3);
+ else if (id == _visID+10) setAllowRotation(!allowRotation());
+ else if (id == _visID+11) setShadingEnabled(!isShadingEnabled());
+ else if (id<_visID+19 || id>_visID+100) return;
+
+ id -= 20+_visID;
+ int f = id/10;
+ if ((id%10) == 1) setFieldVisible(f, !fieldVisible(f));
+ else if ((id%10) == 2) setFieldForced(f, !fieldForced(f));
+ else if ((id%10) == 3) setFieldPosition(f, DrawParams::TopLeft);
+ else if ((id%10) == 4) setFieldPosition(f, DrawParams::TopCenter);
+ else if ((id%10) == 5) setFieldPosition(f, DrawParams::TopRight);
+ else if ((id%10) == 6) setFieldPosition(f, DrawParams::BottomLeft);
+ else if ((id%10) == 7) setFieldPosition(f, DrawParams::BottomCenter);
+ else if ((id%10) == 8) setFieldPosition(f, DrawParams::BottomRight);
+}
+
+void TreeMapWidget::addVisualizationItems(QPopupMenu* popup, int id)
+{
+ _visID = id;
+
+ popup->setCheckable(true);
+
+ QPopupMenu* bpopup = new QPopupMenu();
+ bpopup->setCheckable(true);
+
+ connect(popup, SIGNAL(activated(int)),
+ this, SLOT(visualizationActivated(int)));
+ connect(bpopup, SIGNAL(activated(int)),
+ this, SLOT(visualizationActivated(int)));
+
+ QPopupMenu* spopup = new QPopupMenu();
+ addSplitDirectionItems(spopup, id+100);
+ popup->insertItem(i18n("Nesting"), spopup, id);
+
+ popup->insertItem(i18n("Border"), bpopup, id+1);
+ bpopup->insertItem(i18n("Correct Borders Only"), id+2);
+ bpopup->insertSeparator();
+ bpopup->insertItem(i18n("Width %1").arg(0), id+3);
+ bpopup->insertItem(i18n("Width %1").arg(1), id+4);
+ bpopup->insertItem(i18n("Width %1").arg(2), id+5);
+ bpopup->insertItem(i18n("Width %1").arg(3), id+6);
+ bpopup->setItemChecked(id+2, skipIncorrectBorder());
+ bpopup->setItemChecked(id+3, borderWidth()==0);
+ bpopup->setItemChecked(id+4, borderWidth()==1);
+ bpopup->setItemChecked(id+5, borderWidth()==2);
+ bpopup->setItemChecked(id+6, borderWidth()==3);
+
+ popup->insertItem(i18n("Allow Rotation"), id+10);
+ popup->setItemChecked(id+10,allowRotation());
+ popup->insertItem(i18n("Shading"), id+11);
+ popup->setItemChecked(id+11,isShadingEnabled());
+
+ if (_attr.size() ==0) return;
+
+ popup->insertSeparator();
+ int f;
+ QPopupMenu* tpopup;
+ id += 20;
+ for (f=0;f<(int)_attr.size();f++, id+=10) {
+ tpopup = new QPopupMenu();
+ tpopup->setCheckable(true);
+ popup->insertItem(_attr[f].type, tpopup, id);
+ tpopup->insertItem(i18n("Visible"), id+1);
+ tpopup->insertItem(i18n("Take Space From Children"), id+2);
+ tpopup->insertSeparator();
+ tpopup->insertItem(i18n("Top Left"), id+3);
+ tpopup->insertItem(i18n("Top Center"), id+4);
+ tpopup->insertItem(i18n("Top Right"), id+5);
+ tpopup->insertItem(i18n("Bottom Left"), id+6);
+ tpopup->insertItem(i18n("Bottom Center"), id+7);
+ tpopup->insertItem(i18n("Bottom Right"), id+8);
+
+ tpopup->setItemChecked(id+1,_attr[f].visible);
+ tpopup->setItemEnabled(id+2,_attr[f].visible);
+ tpopup->setItemEnabled(id+3,_attr[f].visible);
+ tpopup->setItemEnabled(id+4,_attr[f].visible);
+ tpopup->setItemEnabled(id+5,_attr[f].visible);
+ tpopup->setItemEnabled(id+6,_attr[f].visible);
+ tpopup->setItemEnabled(id+7,_attr[f].visible);
+ tpopup->setItemEnabled(id+8,_attr[f].visible);
+ tpopup->setItemChecked(id+2,_attr[f].forced);
+ tpopup->setItemChecked(id+3,_attr[f].pos == DrawParams::TopLeft);
+ tpopup->setItemChecked(id+4,_attr[f].pos == DrawParams::TopCenter);
+ tpopup->setItemChecked(id+5,_attr[f].pos == DrawParams::TopRight);
+ tpopup->setItemChecked(id+6,_attr[f].pos == DrawParams::BottomLeft);
+ tpopup->setItemChecked(id+7,_attr[f].pos == DrawParams::BottomCenter);
+ tpopup->setItemChecked(id+8,_attr[f].pos == DrawParams::BottomRight);
+
+ connect(tpopup, SIGNAL(activated(int)),
+ this, SLOT(visualizationActivated(int)));
+ }
+}
+
+void TreeMapWidget::selectionActivated(int id)
+{
+ TreeMapItem* i = _menuItem;
+ id -= _selectionID;
+ while (id>0 && i) {
+ i=i->parent();
+ id--;
+ }
+ if (i)
+ setSelected(i, true);
+}
+
+void TreeMapWidget::addSelectionItems(QPopupMenu* popup,
+ int id, TreeMapItem* i)
+{
+ if (!i) return;
+
+ _selectionID = id;
+ _menuItem = i;
+
+ connect(popup, SIGNAL(activated(int)),
+ this, SLOT(selectionActivated(int)));
+
+ while (i) {
+ QString name = i->text(0);
+ if (name.isEmpty()) break;
+ popup->insertItem(i->text(0), id++);
+ i = i->parent();
+ }
+}
+
+void TreeMapWidget::fieldStopActivated(int id)
+{
+ if (id == _fieldStopID) setFieldStop(0, QString::null);
+ else {
+ TreeMapItem* i = _menuItem;
+ id -= _fieldStopID+1;
+ while (id>0 && i) {
+ i=i->parent();
+ id--;
+ }
+ if (i)
+ setFieldStop(0, i->text(0));
+ }
+}
+
+void TreeMapWidget::addFieldStopItems(QPopupMenu* popup,
+ int id, TreeMapItem* i)
+{
+ _fieldStopID = id;
+
+ connect(popup, SIGNAL(activated(int)),
+ this, SLOT(fieldStopActivated(int)));
+
+ popup->insertItem(i18n("No %1 Limit").arg(fieldType(0)), id);
+ popup->setItemChecked(id, fieldStop(0).isEmpty());
+ _menuItem = i;
+ bool foundFieldStop = false;
+ if (i) {
+ popup->insertSeparator();
+
+ while (i) {
+ id++;
+ QString name = i->text(0);
+ if (name.isEmpty()) break;
+ popup->insertItem(i->text(0), id);
+ if (fieldStop(0) == i->text(0)) {
+ popup->setItemChecked(id, true);
+ foundFieldStop = true;
+ }
+ i = i->parent();
+ }
+ }
+
+ if (!foundFieldStop && !fieldStop(0).isEmpty()) {
+ popup->insertSeparator();
+ popup->insertItem(fieldStop(0), id+1);
+ popup->setItemChecked(id+1, true);
+ }
+}
+
+void TreeMapWidget::areaStopActivated(int id)
+{
+ if (id == _areaStopID) setMinimalArea(-1);
+ else if (id == _areaStopID+1) {
+ int area = _menuItem ? (_menuItem->width() * _menuItem->height()) : -1;
+ setMinimalArea(area);
+ }
+ else if (id == _areaStopID+2) setMinimalArea(100);
+ else if (id == _areaStopID+3) setMinimalArea(400);
+ else if (id == _areaStopID+4) setMinimalArea(1000);
+ else if (id == _areaStopID+5) setMinimalArea(minimalArea()*2);
+ else if (id == _areaStopID+6) setMinimalArea(minimalArea()/2);
+}
+
+void TreeMapWidget::addAreaStopItems(QPopupMenu* popup,
+ int id, TreeMapItem* i)
+{
+ _areaStopID = id;
+ _menuItem = i;
+
+ connect(popup, SIGNAL(activated(int)),
+ this, SLOT(areaStopActivated(int)));
+
+ bool foundArea = false;
+
+ popup->insertItem(i18n("No Area Limit"), id);
+ popup->setItemChecked(id, minimalArea() == -1);
+
+ if (i) {
+ int area = i->width() * i->height();
+ popup->insertSeparator();
+ popup->insertItem(i18n("Area of '%1' (%2)")
+ .arg(i->text(0)).arg(area), id+1);
+ if (area == minimalArea()) {
+ popup->setItemChecked(id+1, true);
+ foundArea = true;
+ }
+ }
+
+ popup->insertSeparator();
+ int area = 100, count;
+ for (count=0;count<3;count++) {
+ popup->insertItem(i18n("1 Pixel", "%n Pixels", area), id+2+count);
+ if (area == minimalArea()) {
+ popup->setItemChecked(id+2+count, true);
+ foundArea = true;
+ }
+ area = (area==100) ? 400 : (area==400) ? 1000 : 4000;
+ }
+
+ if (minimalArea()>0) {
+ popup->insertSeparator();
+ if (!foundArea) {
+ popup->insertItem(i18n("1 Pixel", "%n Pixels", minimalArea()), id+10);
+ popup->setItemChecked(id+10, true);
+ }
+
+ popup->insertItem(i18n("Double Area Limit (to %1)")
+ .arg(minimalArea()*2), id+5);
+ popup->insertItem(i18n("Halve Area Limit (to %1)")
+ .arg(minimalArea()/2), id+6);
+ }
+}
+
+
+void TreeMapWidget::depthStopActivated(int id)
+{
+ if (id == _depthStopID) setMaxDrawingDepth(-1);
+ else if (id == _depthStopID+1) {
+ int d = _menuItem ? _menuItem->depth() : -1;
+ setMaxDrawingDepth(d);
+ }
+ else if (id == _depthStopID+2) setMaxDrawingDepth(maxDrawingDepth()-1);
+ else if (id == _depthStopID+3) setMaxDrawingDepth(maxDrawingDepth()+1);
+ else if (id == _depthStopID+4) setMaxDrawingDepth(2);
+ else if (id == _depthStopID+5) setMaxDrawingDepth(4);
+ else if (id == _depthStopID+6) setMaxDrawingDepth(6);
+}
+
+void TreeMapWidget::addDepthStopItems(QPopupMenu* popup,
+ int id, TreeMapItem* i)
+{
+ _depthStopID = id;
+ _menuItem = i;
+
+ connect(popup, SIGNAL(activated(int)),
+ this, SLOT(depthStopActivated(int)));
+
+ bool foundDepth = false;
+
+ popup->insertItem(i18n("No Depth Limit"), id);
+ popup->setItemChecked(id, maxDrawingDepth() == -1);
+
+ if (i) {
+ int d = i->depth();
+ popup->insertSeparator();
+ popup->insertItem(i18n("Depth of '%1' (%2)")
+ .arg(i->text(0)).arg(d), id+1);
+ if (d == maxDrawingDepth()) {
+ popup->setItemChecked(id+1, true);
+ foundDepth = true;
+ }
+ }
+
+ popup->insertSeparator();
+ int depth = 2, count;
+ for (count=0;count<3;count++) {
+ popup->insertItem(i18n("Depth %1").arg(depth), id+4+count);
+ if (depth == maxDrawingDepth()) {
+ popup->setItemChecked(id+4+count, true);
+ foundDepth = true;
+ }
+ depth = (depth==2) ? 4 : 6;
+ }
+
+ if (maxDrawingDepth()>1) {
+ popup->insertSeparator();
+ if (!foundDepth) {
+ popup->insertItem(i18n("Depth %1").arg(maxDrawingDepth()), id+10);
+ popup->setItemChecked(id+10, true);
+ }
+
+ popup->insertItem(i18n("Decrement (to %1)")
+ .arg(maxDrawingDepth()-1), id+2);
+ popup->insertItem(i18n("Increment (to %1)")
+ .arg(maxDrawingDepth()+1), id+3);
+ }
+}
+
+
+
+/*----------------------------------------------------------------
+ * Option saving/restoring
+ */
+
+void TreeMapWidget::saveOptions(KConfigGroup* config, QString prefix)
+{
+ config->writeEntry(prefix+"Nesting", splitModeString());
+ config->writeEntry(prefix+"AllowRotation", allowRotation());
+ config->writeEntry(prefix+"ShadingEnabled", isShadingEnabled());
+ config->writeEntry(prefix+"OnlyCorrectBorder", skipIncorrectBorder());
+ config->writeEntry(prefix+"BorderWidth", borderWidth());
+ config->writeEntry(prefix+"MaxDepth", maxDrawingDepth());
+ config->writeEntry(prefix+"MinimalArea", minimalArea());
+
+ int f, fCount = _attr.size();
+ config->writeEntry(prefix+"FieldCount", fCount);
+ for (f=0;f<fCount;f++) {
+ config->writeEntry(QString(prefix+"FieldVisible%1").arg(f),
+ _attr[f].visible);
+ config->writeEntry(QString(prefix+"FieldForced%1").arg(f),
+ _attr[f].forced);
+ config->writeEntry(QString(prefix+"FieldStop%1").arg(f),
+ _attr[f].stop);
+ config->writeEntry(QString(prefix+"FieldPosition%1").arg(f),
+ fieldPositionString(f));
+ }
+}
+
+
+void TreeMapWidget::restoreOptions(KConfigGroup* config, QString prefix)
+{
+ bool enabled;
+ int num;
+ QString str;
+
+ str = config->readEntry(prefix+"Nesting");
+ if (!str.isEmpty()) setSplitMode(str);
+
+ if (config->hasKey(prefix+"AllowRotation")) {
+ enabled = config->readBoolEntry(prefix+"AllowRotation", true);
+ setAllowRotation(enabled);
+ }
+
+ if (config->hasKey(prefix+"ShadingEnabled")) {
+ enabled = config->readBoolEntry(prefix+"ShadingEnabled", true);
+ setShadingEnabled(enabled);
+ }
+
+ if (config->hasKey(prefix+"OnlyCorrectBorder")) {
+ enabled = config->readBoolEntry(prefix+"OnlyCorrectBorder", false);
+ setSkipIncorrectBorder(enabled);
+ }
+
+ num = config->readNumEntry(prefix+"BorderWidth", -2);
+ if (num!=-2) setBorderWidth(num);
+
+ num = config->readNumEntry(prefix+"MaxDepth", -2);
+ if (num!=-2) setMaxDrawingDepth(num);
+
+ num = config->readNumEntry(prefix+"MinimalArea", -2);
+ if (num!=-2) setMinimalArea(num);
+
+ num = config->readNumEntry(prefix+"FieldCount", -2);
+ if (num<=0 || num>MAX_FIELD) return;
+
+ int f;
+ for (f=0;f<num;f++) {
+ str = QString(prefix+"FieldVisible%1").arg(f);
+ if (config->hasKey(str))
+ setFieldVisible(f, config->readBoolEntry(str));
+
+ str = QString(prefix+"FieldForced%1").arg(f);
+ if (config->hasKey(str))
+ setFieldForced(f, config->readBoolEntry(str));
+
+ str = config->readEntry(QString(prefix+"FieldStop%1").arg(f));
+ setFieldStop(f, str);
+
+ str = config->readEntry(QString(prefix+"FieldPosition%1").arg(f));
+ if (!str.isEmpty()) setFieldPosition(f, str);
+ }
+}
+
+#include "treemap.moc"
diff --git a/konq-plugins/fsview/treemap.h b/konq-plugins/fsview/treemap.h
new file mode 100644
index 0000000..a834d23
--- /dev/null
+++ b/konq-plugins/fsview/treemap.h
@@ -0,0 +1,742 @@
+/* This file is part of KCachegrind.
+ Copyright (C) 2002, 2003 Josef Weidendorfer <Josef.Weidendorfer@gmx.de>
+
+ KCachegrind is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation, version 2.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+/**
+ * A Widget for visualizing hierarchical metrics as areas.
+ * The API is similar to QListView.
+ *
+ * This file defines the following classes:
+ * DrawParams, RectDrawing, TreeMapItem, TreeMapWidget
+ *
+ * DrawParams/RectDrawing allows reusing of TreeMap drawing
+ * functions in other widgets.
+ */
+
+#ifndef TREEMAP_H
+#define TREEMAP_H
+
+#include <qstring.h>
+#include <qwidget.h>
+#include <qpixmap.h>
+#include <qptrlist.h>
+#include <qvaluevector.h>
+#include <qcolor.h>
+#include <qapplication.h>
+#include <qstringlist.h>
+
+class QPopupMenu;
+class TreeMapTip;
+class TreeMapWidget;
+class TreeMapItem;
+class TreeMapItemList;
+class QString;
+
+class KConfigGroup;
+
+
+/**
+ * Drawing parameters for an object.
+ * A Helper Interface for RectDrawing.
+ */
+class DrawParams
+{
+public:
+ /**
+ * Positions for drawing into a rectangle.
+ *
+ * The specified position assumes no rotation.
+ * If there is more than one text for one position, it is put
+ * nearer to the center of the item.
+ *
+ * Drawing at top positions cuts free space from top,
+ * drawing at bottom positions cuts from bottom.
+ * Default usually gives positions clockwise according to field number.
+ */
+ enum Position { TopLeft, TopCenter, TopRight,
+ BottomLeft, BottomCenter, BottomRight,
+ Default, Unknown};
+
+ // no constructor as this is an abstract class
+ virtual ~DrawParams() {}
+
+ virtual QString text(int) const = 0;
+ virtual QPixmap pixmap(int) const = 0;
+ virtual Position position(int) const = 0;
+ // 0: no limit, negative: leave at least -maxLines() free
+ virtual int maxLines(int) const { return 0; }
+ virtual int fieldCount() const { return 0; }
+
+ virtual QColor backColor() const { return Qt::white; }
+ virtual const QFont& font() const = 0;
+
+ virtual bool selected() const { return false; }
+ virtual bool current() const { return false; }
+ virtual bool shaded() const { return true; }
+ virtual bool rotated() const { return false; }
+};
+
+
+/*
+ * DrawParam with attributes stored
+ */
+class StoredDrawParams: public DrawParams
+{
+public:
+ StoredDrawParams();
+ StoredDrawParams(QColor c,
+ bool selected = false, bool current = false);
+
+ // getters
+ QString text(int) const;
+ QPixmap pixmap(int) const;
+ Position position(int) const;
+ int maxLines(int) const;
+ int fieldCount() const { return _field.size(); }
+
+ QColor backColor() const { return _backColor; }
+ bool selected() const { return _selected; }
+ bool current() const { return _current; }
+ bool shaded() const { return _shaded; }
+ bool rotated() const { return _rotated; }
+
+ const QFont& font() const;
+
+ // attribute setters
+ void setField(int f, const QString& t, QPixmap pm = QPixmap(),
+ Position p = Default, int maxLines = 0);
+ void setText(int f, const QString&);
+ void setPixmap(int f, const QPixmap&);
+ void setPosition(int f, Position);
+ void setMaxLines(int f, int);
+ void setBackColor(const QColor& c) { _backColor = c; }
+ void setSelected(bool b) { _selected = b; }
+ void setCurrent(bool b) { _current = b; }
+ void setShaded(bool b) { _shaded = b; }
+ void setRotated(bool b) { _rotated = b; }
+
+protected:
+ QColor _backColor;
+ bool _selected, _current, _shaded, _rotated;
+
+private:
+ // resize field array if needed to allow to access field <f>
+ void ensureField(int f);
+
+ struct Field {
+ QString text;
+ QPixmap pix;
+ Position pos;
+ int maxLines;
+ };
+
+ QValueVector<Field> _field;
+};
+
+
+/* State for drawing on a rectangle.
+ *
+ * Following drawing functions are provided:
+ * - background drawing with shading and 3D frame
+ * - successive pixmap/text drawing at various positions with wrap-around
+ * optimized for minimal space usage (e.g. if a text is drawn at top right
+ * after text on top left, the same line is used if space allows)
+ *
+ */
+class RectDrawing
+{
+public:
+ RectDrawing(QRect);
+ ~RectDrawing();
+
+ // The default DrawParams object used.
+ DrawParams* drawParams();
+ // we take control over the given object (i.e. delete at destruction)
+ void setDrawParams(DrawParams*);
+
+ // draw on a given QPainter, use this class as info provider per default
+ void drawBack(QPainter*, DrawParams* dp = 0);
+ /* Draw field at position() from pixmap()/text() with maxLines().
+ * Returns true if something was drawn
+ */
+ bool drawField(QPainter*, int f, DrawParams* dp = 0);
+
+ // resets rectangle for free space
+ void setRect(QRect);
+
+ // Returns the rectangle area still free of text/pixmaps after
+ // a number of drawText() calls.
+ QRect remainingRect(DrawParams* dp = 0);
+
+private:
+ int _usedTopLeft, _usedTopCenter, _usedTopRight;
+ int _usedBottomLeft, _usedBottomCenter, _usedBottomRight;
+ QRect _rect;
+
+ // temporary
+ int _fontHeight;
+ QFontMetrics* _fm;
+ DrawParams* _dp;
+};
+
+
+class TreeMapItemList: public QPtrList<TreeMapItem>
+{
+public:
+ TreeMapItem* commonParent();
+protected:
+ int compareItems ( Item item1, Item item2 );
+};
+
+typedef QPtrListIterator<TreeMapItem> TreeMapItemListIterator;
+
+
+/**
+ * Base class of items in TreeMap.
+ *
+ * This class supports an arbitrary number of text() strings
+ * positioned counterclock-wise starting at TopLeft. Each item
+ * has its own static value(), sum() and sorting(). The
+ * splitMode() and borderWidth() is taken from a TreeMapWidget.
+ *
+ * If you want more flexibility, reimplement TreeMapItem and
+ * override the corresponding methods. For dynamic creation of child
+ * items on demand, reimplement children().
+ */
+class TreeMapItem: public StoredDrawParams
+{
+public:
+
+ /**
+ * Split direction for nested areas:
+ * AlwaysBest: Choose split direction for every subitem according to
+ * longest side of rectangle left for drawing
+ * Best: Choose split direction for all subitems of an area
+ * depending on longest side
+ * HAlternate: Horizontal at top; alternate direction on depth step
+ * VAlternate: Vertical at top; alternate direction on depth step
+ * Horizontal: Always horizontal split direction
+ * Vertical: Always vertical split direction
+ */
+ enum SplitMode { Bisection, Columns, Rows,
+ AlwaysBest, Best,
+ HAlternate, VAlternate,
+ Horizontal, Vertical };
+
+ TreeMapItem(TreeMapItem* parent = 0, double value = 1.0 );
+ TreeMapItem(TreeMapItem* parent, double value,
+ QString text1, QString text2 = QString::null,
+ QString text3 = QString::null, QString text4 = QString::null);
+ virtual ~TreeMapItem();
+
+ bool isChildOf(TreeMapItem*);
+
+ TreeMapItem* commonParent(TreeMapItem* item);
+
+ // force a redraw of this item
+ void redraw();
+
+ // delete all children
+ void clear();
+
+ // force new child generation & refresh
+ void refresh();
+
+ // call in a reimplemented items() method to check if already called
+ // after a clear(), this will return false
+ bool initialized();
+
+ /**
+ * Adds an item to a parent.
+ * When no sorting is used, the item is appended (drawn at bottom).
+ * This is only needed if the parent was not already specified in the
+ * construction of the item.
+ */
+ void addItem(TreeMapItem*);
+
+ /**
+ * Returns a list of text strings of specified text number,
+ * from root up to this item.
+ */
+ QStringList path(int) const;
+
+ /**
+ * Depth of this item. This is the distance to root.
+ */
+ int depth() const;
+
+ /**
+ * Parent Item
+ */
+ TreeMapItem* parent() const { return _parent; }
+
+ /**
+ * Temporary rectangle used for drawing this item the last time.
+ * This is internally used to map from a point to an item.
+ */
+ void setItemRect(const QRect& r) { _rect = r; }
+ void clearItemRect();
+ const QRect& itemRect() const { return _rect; }
+ int width() const { return _rect.width(); }
+ int height() const { return _rect.height(); }
+
+ /**
+ * Temporary rectangle list of free space of this item.
+ * Used internally to enable tooltip.
+ */
+ void clearFreeRects();
+ QPtrList<QRect>* freeRects() const { return _freeRects; }
+ void addFreeRect(const QRect& r);
+
+ /**
+ * Temporary child item index of the child that was current() recently.
+ */
+ int index() const { return _index; }
+ void setIndex(int i) { _index = i; }
+
+
+ /**
+ * TreeMap widget this item is put in.
+ */
+ TreeMapWidget* widget() const { return _widget; }
+
+ void setParent(TreeMapItem* p);
+ void setWidget(TreeMapWidget* w) { _widget = w; }
+ void setSum(double s) { _sum = s; }
+ void setValue(double s) { _value = s; }
+
+ virtual double sum() const;
+ virtual double value() const;
+ // replace "Default" position with setting from TreeMapWidget
+ virtual Position position(int) const;
+ virtual const QFont& font() const;
+ virtual bool isMarked(int) const;
+
+ virtual int borderWidth() const;
+
+ /**
+ * Returns the text number after that sorting is done or
+ * -1 for no sorting, -2 for value() sorting (default).
+ * If ascending != 0, a bool value is written at that location
+ * to indicate if sorting should be ascending.
+ */
+ virtual int sorting(bool* ascending) const;
+
+ /**
+ * Set the sorting for child drawing.
+ *
+ * Default is no sorting: <textNo> = -1
+ * For value() sorting, use <textNo> = -2
+ *
+ * For fast sorting, set this to -1 before child insertions and call
+ * again after inserting all children.
+ */
+ void setSorting(int textNo, bool ascending = true);
+
+ /**
+ * Resort according to the already set sorting.
+ *
+ * This has to be done if the sorting base changes (e.g. text or values
+ * change). If this is only true for the children of this item, you can
+ * set the recursive parameter to false.
+ */
+ void resort(bool recursive = true);
+
+ virtual SplitMode splitMode() const;
+ virtual int rtti() const;
+ // not const as this can create children on demand
+ virtual TreeMapItemList* children();
+
+protected:
+ TreeMapItemList* _children;
+ double _sum, _value;
+
+private:
+ TreeMapWidget* _widget;
+ TreeMapItem* _parent;
+
+ int _sortTextNo;
+ bool _sortAscending;
+
+ // temporary layout
+ QRect _rect;
+ QPtrList<QRect>* _freeRects;
+ int _depth;
+
+ // temporary self value (when using level skipping)
+ double _unused_self;
+
+ // index of last active subitem
+ int _index;
+};
+
+
+/**
+ * Class for visualisation of a metric of hierarchically
+ * nested items as 2D areas.
+ */
+class TreeMapWidget: public QWidget
+{
+ Q_OBJECT
+
+public:
+
+ /**
+ * Same as in QListBox/QListView
+ */
+ enum SelectionMode { Single, Multi, Extended, NoSelection };
+
+ TreeMapWidget(TreeMapItem* base, QWidget* parent=0, const char* name=0);
+ ~TreeMapWidget();
+
+ /**
+ * Returns the TreeMapItem filling out the widget space
+ */
+ TreeMapItem* base() const { return _base; }
+
+ /**
+ * Returns a reference to the current widget font.
+ */
+ const QFont& currentFont() const;
+
+ /**
+ * Returns the area item at position x/y, independent from any
+ * maxSelectDepth setting.
+ */
+ TreeMapItem* item(int x, int y) const;
+
+ /**
+ * Returns the nearest item with a visible area; this
+ * can be the given item itself.
+ */
+ TreeMapItem* visibleItem(TreeMapItem*) const;
+
+ /**
+ * Returns the item possible for selection. this returns the
+ * given item itself or a parent thereof,
+ * depending on setting of maxSelectDepth().
+ */
+ TreeMapItem* possibleSelection(TreeMapItem*) const;
+
+ /**
+ * Selects or unselects an item.
+ * In multiselection mode, the constrain that a selected item
+ * has no selected children or parents stays true.
+ */
+ void setSelected(TreeMapItem*, bool selected = true);
+
+ /**
+ * Switches on the marking <markNo>. Marking 0 switches off marking.
+ * This is mutually exclusive to selection, and is automatically
+ * switched off when selection is changed (also by the user).
+ * Marking is visually the same as selection, and is based on
+ * TreeMapItem::isMarked(<markNo>).
+ * This enables to programmatically show multiple selected items
+ * at once even in single selection mode.
+ */
+ void setMarked(int markNo = 1, bool redraw = true);
+
+ /**
+ * Clear selection of all selected items which are children of
+ * parent. When parent == 0, clears whole selection
+ * Returns true if selection changed.
+ */
+ bool clearSelection(TreeMapItem* parent = 0);
+
+ /**
+ * Selects or unselects items in a range.
+ * This is needed internally for Shift-Click in Extented mode.
+ * Range means for a hierarchical widget:
+ * - select/unselect i1 and i2 according selected
+ * - search common parent of i1 and i2, and select/unselect the
+ * range of direct children between but excluding the child
+ * leading to i1 and the child leading to i2.
+ */
+ void setRangeSelection(TreeMapItem* i1,
+ TreeMapItem* i2, bool selected);
+
+ /**
+ * Sets the current item.
+ * The current item is mainly used for keyboard navigation.
+ */
+ void setCurrent(TreeMapItem*, bool kbd=false);
+
+ /**
+ * Set the maximal depth a selected item can have.
+ * If you try to select a item with higher depth, the ancestor holding
+ * this condition is used.
+ *
+ * See also possibleSelection().
+ */
+ void setMaxSelectDepth(int d) { _maxSelectDepth = d; }
+
+
+ void setSelectionMode(SelectionMode m) { _selectionMode = m; }
+
+ /**
+ * for setting/getting global split direction
+ */
+ void setSplitMode(TreeMapItem::SplitMode m);
+ TreeMapItem::SplitMode splitMode() const;
+ // returns true if string was recognized
+ bool setSplitMode(QString);
+ QString splitModeString() const;
+
+
+ /*
+ * Shading of rectangles enabled ?
+ */
+ void setShadingEnabled(bool s);
+ bool isShadingEnabled() const { return _shading; }
+
+
+ /**
+ * Items usually have a size proportional to their value().
+ * With <width>, you can give the minimum width
+ * of the resulting rectangle to still be drawn.
+ * For space not used because of to small items, you can specify
+ * with <reuseSpace> if the background should shine through or
+ * the space will be used to enlarge the next item to be drawn
+ * at this level.
+ */
+ void setVisibleWidth(int width, bool reuseSpace = false);
+
+ /**
+ * If a children value() is almost the parents sum(),
+ * it can happen that the border to be drawn for visibilty of
+ * nesting relations takes to much space, and the
+ * parent/child size relation can not be mapped to a correct
+ * area size relation.
+ *
+ * Either
+ * (1) Ignore the incorrect drawing, or
+ * (2) Skip drawing of the parent level alltogether.
+ */
+ void setSkipIncorrectBorder(bool enable = true);
+ bool skipIncorrectBorder() const { return _skipIncorrectBorder; }
+
+ /**
+ * Maximal nesting depth
+ */
+ void setMaxDrawingDepth(int d);
+ int maxDrawingDepth() const { return _maxDrawingDepth; }
+
+ /**
+ * Minimal area for rectangles to draw
+ */
+ void setMinimalArea(int area);
+ int minimalArea() const { return _minimalArea; }
+
+ /* defaults for text attributes */
+ QString defaultFieldType(int) const;
+ QString defaultFieldStop(int) const;
+ bool defaultFieldVisible(int) const;
+ bool defaultFieldForced(int) const;
+ DrawParams::Position defaultFieldPosition(int) const;
+
+ /**
+ * Set the type name of a field.
+ * This is important for the visualization menu generated
+ * with visualizationMenu()
+ */
+ void setFieldType(int, QString);
+ QString fieldType(int) const;
+
+ /**
+ * Stop drawing at item with name
+ */
+ void setFieldStop(int, QString);
+ QString fieldStop(int) const;
+
+ /**
+ * Should the text with number textNo be visible?
+ * This is only done if remaining space is enough to allow for
+ * proportional size constrains.
+ */
+ void setFieldVisible(int, bool);
+ bool fieldVisible(int) const;
+
+ /**
+ * Should the drawing of the name into the rectangle be forced?
+ * This enables drawing of the name before drawing subitems, and
+ * thus destroys proportional constrains.
+ */
+ void setFieldForced(int, bool);
+ bool fieldForced(int) const;
+
+ /**
+ * Set the field position in the area. See TreeMapItem::Position
+ */
+ void setFieldPosition(int, DrawParams::Position);
+ DrawParams::Position fieldPosition(int) const;
+ void setFieldPosition(int, QString);
+ QString fieldPositionString(int) const;
+
+ /**
+ * Do we allow the texts to be rotated by 90 degrees for better fitting?
+ */
+ void setAllowRotation(bool);
+ bool allowRotation() const { return _allowRotation; }
+
+ void setBorderWidth(int w);
+ int borderWidth() const { return _borderWidth; }
+
+ /**
+ * Save/restore options.
+ */
+ void saveOptions(KConfigGroup*, QString prefix = QString::null);
+ void restoreOptions(KConfigGroup*, QString prefix = QString::null);
+
+ /**
+ * These functions populate given popup menus.
+ * The added items are already connected to handlers.
+ *
+ * The int is the menu id where to start for the items (100 IDs reserved).
+ */
+ void addSplitDirectionItems(QPopupMenu*, int);
+ void addSelectionItems(QPopupMenu*, int, TreeMapItem*);
+ void addFieldStopItems(QPopupMenu*, int, TreeMapItem*);
+ void addAreaStopItems(QPopupMenu*, int, TreeMapItem*);
+ void addDepthStopItems(QPopupMenu*, int, TreeMapItem*);
+ void addVisualizationItems(QPopupMenu*, int);
+
+ TreeMapWidget* widget() { return this; }
+ TreeMapItem* current() const { return _current; }
+ TreeMapItemList selection() const { return _selection; }
+ bool isSelected(TreeMapItem* i) const;
+ int maxSelectDepth() const { return _maxSelectDepth; }
+ SelectionMode selectionMode() const { return _selectionMode; }
+
+ /**
+ * Return tooltip string to show for a item (can be rich text)
+ * Default implementation gives lines with "text0 (text1)" going to root.
+ */
+ virtual QString tipString(TreeMapItem* i) const;
+
+ /**
+ * Redraws an item with all children.
+ * This takes changed values(), sums(), colors() and text() into account.
+ */
+ void redraw(TreeMapItem*);
+ void redraw() { redraw(_base); }
+
+ /**
+ * Resort all TreeMapItems. See TreeMapItem::resort().
+ */
+ void resort() { _base->resort(true); }
+
+ // internal
+ void drawTreeMap();
+
+ // used internally when items are destroyed
+ void deletingItem(TreeMapItem*);
+
+protected slots:
+ void splitActivated(int);
+ void selectionActivated(int);
+ void fieldStopActivated(int);
+ void areaStopActivated(int);
+ void depthStopActivated(int);
+ void visualizationActivated(int);
+
+signals:
+ void selectionChanged();
+ void selectionChanged(TreeMapItem*);
+
+ /**
+ * This signal is emitted if the current item changes.
+ * If the change is done because of keyboard navigation,
+ * the <kbd> is set to true
+ */
+ void currentChanged(TreeMapItem*, bool keyboard);
+ void clicked(TreeMapItem*);
+ void returnPressed(TreeMapItem*);
+ void doubleClicked(TreeMapItem*);
+ void rightButtonPressed(TreeMapItem*, const QPoint &);
+ void contextMenuRequested(TreeMapItem*, const QPoint &);
+
+protected:
+ void mousePressEvent( QMouseEvent * );
+ void contextMenuEvent( QContextMenuEvent * );
+ void mouseReleaseEvent( QMouseEvent * );
+ void mouseMoveEvent( QMouseEvent * );
+ void mouseDoubleClickEvent( QMouseEvent * );
+ void keyPressEvent( QKeyEvent* );
+ void paintEvent( QPaintEvent * );
+ void resizeEvent( QResizeEvent * );
+ void showEvent( QShowEvent * );
+ void fontChange( const QFont& );
+
+private:
+ TreeMapItemList diff(TreeMapItemList&, TreeMapItemList&);
+ // returns true if selection changed
+ TreeMapItem* setTmpSelected(TreeMapItem*, bool selected = true);
+ TreeMapItem* setTmpRangeSelection(TreeMapItem* i1,
+ TreeMapItem* i2, bool selected);
+ bool isTmpSelected(TreeMapItem* i);
+
+ void drawItem(QPainter* p, TreeMapItem*);
+ void drawItems(QPainter* p, TreeMapItem*);
+ bool horizontal(TreeMapItem* i, const QRect& r);
+ void drawFill(TreeMapItem*,QPainter* p, QRect& r);
+ void drawFill(TreeMapItem*,QPainter* p, QRect& r,
+ TreeMapItemListIterator it, int len, bool goBack);
+ bool drawItemArray(QPainter* p, TreeMapItem*, QRect& r, double,
+ TreeMapItemListIterator it, int len, bool);
+ bool resizeAttr(int);
+
+ TreeMapItem* _base;
+ TreeMapItem *_current, *_pressed, *_lastOver, *_oldCurrent;
+ TreeMapTip* _tip;
+ int _maxSelectDepth, _maxDrawingDepth;
+
+ // attributes for field, per textNo
+ struct FieldAttr {
+ QString type, stop;
+ bool visible, forced;
+ DrawParams::Position pos;
+ };
+ QValueVector<FieldAttr> _attr;
+
+ SelectionMode _selectionMode;
+ TreeMapItem::SplitMode _splitMode;
+ int _visibleWidth, _stopArea, _minimalArea, _borderWidth;
+ bool _reuseSpace, _skipIncorrectBorder, _drawSeparators, _shading;
+ bool _allowRotation;
+ TreeMapItem * _needsRefresh;
+ TreeMapItemList _selection;
+ int _markNo;
+
+ // for the context menus: start IDs
+ int _splitID, _selectionID, _visID;
+ int _fieldStopID, _areaStopID, _depthStopID;
+ TreeMapItem* _menuItem;
+
+ // temporary selection while dragging, used for drawing
+ // most of the time, _selection == _tmpSelection
+ TreeMapItemList _tmpSelection;
+ bool _inShiftDrag, _inControlDrag;
+
+ // temporary widget font metrics while drawing
+ QFont _font;
+ int _fontHeight;
+
+ // back buffer pixmap
+ QPixmap _pixmap;
+};
+
+#endif
diff --git a/konq-plugins/imagerotation/Makefile.am b/konq-plugins/imagerotation/Makefile.am
new file mode 100644
index 0000000..f0686ad
--- /dev/null
+++ b/konq-plugins/imagerotation/Makefile.am
@@ -0,0 +1,7 @@
+progdir = $(kde_datadir)/imagerotation
+prog_SCRIPTS = exif.py orient.py
+
+bin_SCRIPTS = jpegorient
+
+desktop_DATA = jpegorient.desktop imageconverter.desktop
+desktopdir = $(kde_datadir)/konqueror/servicemenus
diff --git a/konq-plugins/imagerotation/exif.py b/konq-plugins/imagerotation/exif.py
new file mode 100755
index 0000000..309df47
--- /dev/null
+++ b/konq-plugins/imagerotation/exif.py
@@ -0,0 +1,1079 @@
+#! /usr/bin/env python
+# Library to extract EXIF information in digital camera image files
+#
+# Contains code from "exifdump.py" originally written by Thierry Bousch
+# <bousch@topo.math.u-psud.fr> and released into the public domain.
+#
+# Updated and turned into general-purpose library by Gene Cash
+# <gcash@cfl.rr.com>
+#
+# NOTE: This version has been modified by Leif Jensen
+#
+# This copyright license is intended to be similar to the FreeBSD license.
+#
+# Copyright 2002 Gene Cash All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the
+# distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY GENE CASH ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# 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 OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+# This means you may do anything you want with this code, except claim you
+# wrote it. Also, if it breaks you get to keep both pieces.
+#
+# 21-AUG-99 TB Last update by Thierry Bousch to his code.
+# 17-JAN-02 CEC Discovered code on web.
+# Commented everything.
+# Made small code improvements.
+# Reformatted for readability.
+# 19-JAN-02 CEC Added ability to read TIFFs and JFIF-format JPEGs.
+# Added ability to extract JPEG formatted thumbnail.
+# Added ability to read GPS IFD (not tested).
+# Converted IFD data structure to dictionaries indexed by
+# tag name.
+# Factored into library returning dictionary of IFDs plus
+# thumbnail, if any.
+# 20-JAN-02 CEC Added MakerNote processing logic.
+# Added Olympus MakerNote.
+# Converted data structure to single-level dictionary, avoiding
+# tag name collisions by prefixing with IFD name. This makes
+# it much easier to use.
+# 23-JAN-02 CEC Trimmed nulls from end of string values.
+# 25-JAN-02 CEC Discovered JPEG thumbnail in Olympus TIFF MakerNote.
+# 26-JAN-02 CEC Added ability to extract TIFF thumbnails.
+# Added Nikon, Fujifilm, Casio MakerNotes.
+#
+# To do:
+# * Finish Canon MakerNote format
+# * Better printing of ratios
+
+# field type descriptions as (length, abbreviation, full name) tuples
+FIELD_TYPES=(
+ (0, 'X', 'Dummy'), # no such type
+ (1, 'B', 'Byte'),
+ (1, 'A', 'ASCII'),
+ (2, 'S', 'Short'),
+ (4, 'L', 'Long'),
+ (8, 'R', 'Ratio'),
+ (1, 'SB', 'Signed Byte'),
+ (1, 'U', 'Undefined'),
+ (2, 'SS', 'Signed Short'),
+ (4, 'SL', 'Signed Long'),
+ (8, 'SR', 'Signed Ratio')
+ )
+
+# dictionary of main EXIF tag names
+# first element of tuple is tag name, optional second element is
+# another dictionary giving names to values
+EXIF_TAGS={
+ 0x0100: ('ImageWidth', ),
+ 0x0101: ('ImageLength', ),
+ 0x0102: ('BitsPerSample', ),
+ 0x0103: ('Compression',
+ {1: 'Uncompressed TIFF',
+ 6: 'JPEG Compressed'}),
+ 0x0106: ('PhotometricInterpretation', ),
+ 0x010A: ('FillOrder', ),
+ 0x010D: ('DocumentName', ),
+ 0x010E: ('ImageDescription', ),
+ 0x010F: ('Make', ),
+ 0x0110: ('Model', ),
+ 0x0111: ('StripOffsets', ),
+ 0x0112: ('Orientation', ),
+ 0x0115: ('SamplesPerPixel', ),
+ 0x0116: ('RowsPerStrip', ),
+ 0x0117: ('StripByteCounts', ),
+ 0x011A: ('XResolution', ),
+ 0x011B: ('YResolution', ),
+ 0x011C: ('PlanarConfiguration', ),
+ 0x0128: ('ResolutionUnit',
+ {1: 'Not Absolute',
+ 2: 'Pixels/Inch',
+ 3: 'Pixels/Centimeter'}),
+ 0x012D: ('TransferFunction', ),
+ 0x0131: ('Software', ),
+ 0x0132: ('DateTime', ),
+ 0x013B: ('Artist', ),
+ 0x013E: ('WhitePoint', ),
+ 0x013F: ('PrimaryChromaticities', ),
+ 0x0156: ('TransferRange', ),
+ 0x0200: ('JPEGProc', ),
+ 0x0201: ('JPEGInterchangeFormat', ),
+ 0x0202: ('JPEGInterchangeFormatLength', ),
+ 0x0211: ('YCbCrCoefficients', ),
+ 0x0212: ('YCbCrSubSampling', ),
+ 0x0213: ('YCbCrPositioning', ),
+ 0x0214: ('ReferenceBlackWhite', ),
+ 0x828D: ('CFARepeatPatternDim', ),
+ 0x828E: ('CFAPattern', ),
+ 0x828F: ('BatteryLevel', ),
+ 0x8298: ('Copyright', ),
+ 0x829A: ('ExposureTime', ),
+ 0x829D: ('FNumber', ),
+ 0x83BB: ('IPTC/NAA', ),
+ 0x8769: ('ExifOffset', ),
+ 0x8773: ('InterColorProfile', ),
+ 0x8822: ('ExposureProgram',
+ {0: 'Unidentified',
+ 1: 'Manual',
+ 2: 'Program Normal',
+ 3: 'Aperture Priority',
+ 4: 'Shutter Priority',
+ 5: 'Program Creative',
+ 6: 'Program Action',
+ 7: 'Portrait Mode',
+ 8: 'Landscape Mode'}),
+ 0x8824: ('SpectralSensitivity', ),
+ 0x8825: ('GPSInfo', ),
+ 0x8827: ('ISOSpeedRatings', ),
+ 0x8828: ('OECF', ),
+ 0x9000: ('ExifVersion', ),
+ 0x9003: ('DateTimeOriginal', ),
+ 0x9004: ('DateTimeDigitized', ),
+ 0x9101: ('ComponentsConfiguration',
+ {0: '',
+ 1: 'Y',
+ 2: 'Cb',
+ 3: 'Cr',
+ 4: 'Red',
+ 5: 'Green',
+ 6: 'Blue'}),
+ 0x9102: ('CompressedBitsPerPixel', ),
+ 0x9201: ('ShutterSpeedValue', ),
+ 0x9202: ('ApertureValue', ),
+ 0x9203: ('BrightnessValue', ),
+ 0x9204: ('ExposureBiasValue', ),
+ 0x9205: ('MaxApertureValue', ),
+ 0x9206: ('SubjectDistance', ),
+ 0x9207: ('MeteringMode',
+ {0: 'Unidentified',
+ 1: 'Average',
+ 2: 'CenterWeightedAverage',
+ 3: 'Spot',
+ 4: 'MultiSpot'}),
+ 0x9208: ('LightSource',
+ {0: 'Unknown',
+ 1: 'Daylight',
+ 2: 'Fluorescent',
+ 3: 'Tungsten',
+ 10: 'Flash',
+ 17: 'Standard Light A',
+ 18: 'Standard Light B',
+ 19: 'Standard Light C',
+ 20: 'D55',
+ 21: 'D65',
+ 22: 'D75',
+ 255: 'Other'}),
+ 0x9209: ('Flash', {0: 'No',
+ 1: 'Fired',
+ 5: 'Fired (?)', # no return sensed
+ 7: 'Fired (!)', # return sensed
+ 9: 'Fill Fired',
+ 13: 'Fill Fired (?)',
+ 15: 'Fill Fired (!)',
+ 16: 'Off',
+ 24: 'Auto Off',
+ 25: 'Auto Fired',
+ 29: 'Auto Fired (?)',
+ 31: 'Auto Fired (!)',
+ 32: 'Not Available'}),
+ 0x920A: ('FocalLength', ),
+ 0x927C: ('MakerNote', ),
+ 0x9286: ('UserComment', ),
+ 0x9290: ('SubSecTime', ),
+ 0x9291: ('SubSecTimeOriginal', ),
+ 0x9292: ('SubSecTimeDigitized', ),
+ 0xA000: ('FlashPixVersion', ),
+ 0xA001: ('ColorSpace', ),
+ 0xA002: ('ExifImageWidth', ),
+ 0xA003: ('ExifImageLength', ),
+ 0xA005: ('InteroperabilityOffset', ),
+ 0xA20B: ('FlashEnergy', ), # 0x920B in TIFF/EP
+ 0xA20C: ('SpatialFrequencyResponse', ), # 0x920C - -
+ 0xA20E: ('FocalPlaneXResolution', ), # 0x920E - -
+ 0xA20F: ('FocalPlaneYResolution', ), # 0x920F - -
+ 0xA210: ('FocalPlaneResolutionUnit', ), # 0x9210 - -
+ 0xA214: ('SubjectLocation', ), # 0x9214 - -
+ 0xA215: ('ExposureIndex', ), # 0x9215 - -
+ 0xA217: ('SensingMethod', ), # 0x9217 - -
+ 0xA300: ('FileSource',
+ {3: 'Digital Camera'}),
+ 0xA301: ('SceneType',
+ {1: 'Directly Photographed'}),
+ }
+
+# interoperability tags
+INTR_TAGS={
+ 0x0001: ('InteroperabilityIndex', ),
+ 0x0002: ('InteroperabilityVersion', ),
+ 0x1000: ('RelatedImageFileFormat', ),
+ 0x1001: ('RelatedImageWidth', ),
+ 0x1002: ('RelatedImageLength', ),
+ }
+
+# GPS tags (not used yet, haven't seen camera with GPS)
+GPS_TAGS={
+ 0x0000: ('GPSVersionID', ),
+ 0x0001: ('GPSLatitudeRef', ),
+ 0x0002: ('GPSLatitude', ),
+ 0x0003: ('GPSLongitudeRef', ),
+ 0x0004: ('GPSLongitude', ),
+ 0x0005: ('GPSAltitudeRef', ),
+ 0x0006: ('GPSAltitude', ),
+ 0x0007: ('GPSTimeStamp', ),
+ 0x0008: ('GPSSatellites', ),
+ 0x0009: ('GPSStatus', ),
+ 0x000A: ('GPSMeasureMode', ),
+ 0x000B: ('GPSDOP', ),
+ 0x000C: ('GPSSpeedRef', ),
+ 0x000D: ('GPSSpeed', ),
+ 0x000E: ('GPSTrackRef', ),
+ 0x000F: ('GPSTrack', ),
+ 0x0010: ('GPSImgDirectionRef', ),
+ 0x0011: ('GPSImgDirection', ),
+ 0x0012: ('GPSMapDatum', ),
+ 0x0013: ('GPSDestLatitudeRef', ),
+ 0x0014: ('GPSDestLatitude', ),
+ 0x0015: ('GPSDestLongitudeRef', ),
+ 0x0016: ('GPSDestLongitude', ),
+ 0x0017: ('GPSDestBearingRef', ),
+ 0x0018: ('GPSDestBearing', ),
+ 0x0019: ('GPSDestDistanceRef', ),
+ 0x001A: ('GPSDestDistance', )
+ }
+
+# Nikon E99x MakerNote Tags
+# http://members.tripod.com/~tawba/990exif.htm
+MAKERNOTE_NIKON_NEWER_TAGS={
+ 0x0002: ('ISOSetting', ),
+ 0x0003: ('ColorMode', ),
+ 0x0004: ('Quality', ),
+ 0x0005: ('Whitebalance', ),
+ 0x0006: ('ImageSharpening', ),
+ 0x0007: ('FocusMode', ),
+ 0x0008: ('FlashSetting', ),
+ 0x000F: ('ISOSelection', ),
+ 0x0080: ('ImageAdjustment', ),
+ 0x0082: ('AuxiliaryLens', ),
+ 0x0085: ('ManualFocusDistance', ),
+ 0x0086: ('DigitalZoomFactor', ),
+ 0x0088: ('AFFocusPosition',
+ {0x0000: 'Center',
+ 0x0100: 'Top',
+ 0x0200: 'Bottom',
+ 0x0300: 'Left',
+ 0x0400: 'Right'}),
+ 0x0094: ('Saturation',
+ {-3: 'B&W',
+ -2: '-2',
+ -1: '-1',
+ 0: '0',
+ 1: '1',
+ 2: '2'}),
+ 0x0095: ('NoiseReduction', ),
+ 0x0010: ('DataDump', )
+ }
+
+MAKERNOTE_NIKON_OLDER_TAGS={
+ 0x0003: ('Quality',
+ {1: 'VGA Basic',
+ 2: 'VGA Normal',
+ 3: 'VGA Fine',
+ 4: 'SXGA Basic',
+ 5: 'SXGA Normal',
+ 6: 'SXGA Fine'}),
+ 0x0004: ('ColorMode',
+ {1: 'Color',
+ 2: 'Monochrome'}),
+ 0x0005: ('ImageAdjustment',
+ {0: 'Normal',
+ 1: 'Bright+',
+ 2: 'Bright-',
+ 3: 'Contrast+',
+ 4: 'Contrast-'}),
+ 0x0006: ('CCDSpeed',
+ {0: 'ISO 80',
+ 2: 'ISO 160',
+ 4: 'ISO 320',
+ 5: 'ISO 100'}),
+ 0x0007: ('WhiteBalance',
+ {0: 'Auto',
+ 1: 'Preset',
+ 2: 'Daylight',
+ 3: 'Incandescent',
+ 4: 'Fluorescent',
+ 5: 'Cloudy',
+ 6: 'Speed Light'})
+ }
+
+# decode Olympus SpecialMode tag in MakerNote
+def olympus_special_mode(v):
+ a={
+ 0: 'Normal',
+ 1: 'Unknown',
+ 2: 'Fast',
+ 3: 'Panorama'}
+ b={
+ 0: 'Non-panoramic',
+ 1: 'Left to right',
+ 2: 'Right to left',
+ 3: 'Bottom to top',
+ 4: 'Top to bottom'}
+ return '%s - sequence %d - %s' % (a[v[0]], v[1], b[v[2]])
+
+MAKERNOTE_OLYMPUS_TAGS={
+ # ah HAH! those sneeeeeaky bastids! this is how they get past the fact
+ # that a JPEG thumbnail is not allowed in an uncompressed TIFF file
+ 0x0100: ('JPEGThumbnail', ),
+ 0x0200: ('SpecialMode', olympus_special_mode),
+ 0x0201: ('JPEGQual',
+ {1: 'SQ',
+ 2: 'HQ',
+ 3: 'SHQ'}),
+ 0x0202: ('Macro',
+ {0: 'Normal',
+ 1: 'Macro'}),
+ 0x0204: ('DigitalZoom', ),
+ 0x0207: ('SoftwareRelease', ),
+ 0x0208: ('PictureInfo', ),
+ # print as string
+ 0x0209: ('CameraID', lambda x: ''.join(map(chr, x))),
+ 0x0F00: ('DataDump', )
+ }
+
+MAKERNOTE_CASIO_TAGS={
+ 0x0001: ('RecordingMode',
+ {1: 'Single Shutter',
+ 2: 'Panorama',
+ 3: 'Night Scene',
+ 4: 'Portrait',
+ 5: 'Landscape'}),
+ 0x0002: ('Quality',
+ {1: 'Economy',
+ 2: 'Normal',
+ 3: 'Fine'}),
+ 0x0003: ('FocusingMode',
+ {2: 'Macro',
+ 3: 'Auto Focus',
+ 4: 'Manual Focus',
+ 5: 'Infinity'}),
+ 0x0004: ('FlashMode',
+ {1: 'Auto',
+ 2: 'On',
+ 3: 'Off',
+ 4: 'Red Eye Reduction'}),
+ 0x0005: ('FlashIntensity',
+ {11: 'Weak',
+ 13: 'Normal',
+ 15: 'Strong'}),
+ 0x0006: ('Object Distance', ),
+ 0x0007: ('WhiteBalance',
+ {1: 'Auto',
+ 2: 'Tungsten',
+ 3: 'Daylight',
+ 4: 'Fluorescent',
+ 5: 'Shade',
+ 129: 'Manual'}),
+ 0x000B: ('Sharpness',
+ {0: 'Normal',
+ 1: 'Soft',
+ 2: 'Hard'}),
+ 0x000C: ('Contrast',
+ {0: 'Normal',
+ 1: 'Low',
+ 2: 'High'}),
+ 0x000D: ('Saturation',
+ {0: 'Normal',
+ 1: 'Low',
+ 2: 'High'}),
+ 0x0014: ('CCDSpeed',
+ {64: 'Normal',
+ 80: 'Normal',
+ 100: 'High',
+ 125: '+1.0',
+ 244: '+3.0',
+ 250: '+2.0',})
+ }
+
+MAKERNOTE_FUJIFILM_TAGS={
+ 0x0000: ('NoteVersion', lambda x: ''.join(map(chr, x))),
+ 0x1000: ('Quality', ),
+ 0x1001: ('Sharpness',
+ {1: 'Soft',
+ 2: 'Soft',
+ 3: 'Normal',
+ 4: 'Hard',
+ 5: 'Hard'}),
+ 0x1002: ('WhiteBalance',
+ {0: 'Auto',
+ 256: 'Daylight',
+ 512: 'Cloudy',
+ 768: 'DaylightColor-Fluorescent',
+ 769: 'DaywhiteColor-Fluorescent',
+ 770: 'White-Fluorescent',
+ 1024: 'Incandescent',
+ 3840: 'Custom'}),
+ 0x1003: ('Color',
+ {0: 'Normal',
+ 256: 'High',
+ 512: 'Low'}),
+ 0x1004: ('Tone',
+ {0: 'Normal',
+ 256: 'High',
+ 512: 'Low'}),
+ 0x1010: ('FlashMode',
+ {0: 'Auto',
+ 1: 'On',
+ 2: 'Off',
+ 3: 'Red Eye Reduction'}),
+ 0x1011: ('FlashStrength', ),
+ 0x1020: ('Macro',
+ {0: 'Off',
+ 1: 'On'}),
+ 0x1021: ('FocusMode',
+ {0: 'Auto',
+ 1: 'Manual'}),
+ 0x1030: ('SlowSync',
+ {0: 'Off',
+ 1: 'On'}),
+ 0x1031: ('PictureMode',
+ {0: 'Auto',
+ 1: 'Portrait',
+ 2: 'Landscape',
+ 4: 'Sports',
+ 5: 'Night',
+ 6: 'Program AE',
+ 256: 'Aperture Priority AE',
+ 512: 'Shutter Priority AE',
+ 768: 'Manual Exposure'}),
+ 0x1100: ('MotorOrBracket',
+ {0: 'Off',
+ 1: 'On'}),
+ 0x1300: ('BlurWarning',
+ {0: 'Off',
+ 1: 'On'}),
+ 0x1301: ('FocusWarning',
+ {0: 'Off',
+ 1: 'On'}),
+ 0x1302: ('AEWarning',
+ {0: 'Off',
+ 1: 'On'})
+ }
+
+MAKERNOTE_CANON_TAGS={
+ 0x0006: ('ImageType', ),
+ 0x0007: ('FirmwareVersion', ),
+ 0x0008: ('ImageNumber', ),
+ 0x0009: ('OwnerName', )
+ }
+
+# see http://www.burren.cx/david/canon.html by David Burren
+# this is in element offset, name, optional value dictionary format
+MAKERNOTE_CANON_TAG_0x001={
+ 1: ('Macromode',
+ {1: 'Macro',
+ 2: 'Normal'}),
+ 2: ('SelfTimer', ),
+ 3: ('Quality',
+ {2: 'Normal',
+ 3: 'Fine',
+ 5: 'Superfine'}),
+ 4: ('FlashMode',
+ {0: 'Flash Not Fired',
+ 1: 'Auto',
+ 2: 'On',
+ 3: 'Red-Eye Reduction',
+ 4: 'Slow Synchro',
+ 5: 'Auto + Red-Eye Reduction',
+ 6: 'On + Red-Eye Reduction',
+ 16: 'external flash'}),
+ 5: ('ContinuousDriveMode',
+ {0: 'Single Or Timer',
+ 1: 'Continuous'}),
+ 7: ('FocusMode',
+ {0: 'One-Shot',
+ 1: 'AI Servo',
+ 2: 'AI Focus',
+ 3: 'MF',
+ 4: 'Single',
+ 5: 'Continuous',
+ 6: 'MF'}),
+ 10: ('ImageSize',
+ {0: 'Large',
+ 1: 'Medium',
+ 2: 'Small'}),
+ 11: ('EasyShootingMode',
+ {0: 'Full Auto',
+ 1: 'Manual',
+ 2: 'Landscape',
+ 3: 'Fast Shutter',
+ 4: 'Slow Shutter',
+ 5: 'Night',
+ 6: 'B&W',
+ 7: 'Sepia',
+ 8: 'Portrait',
+ 9: 'Sports',
+ 10: 'Macro/Close-Up',
+ 11: 'Pan Focus'}),
+ 12: ('DigitalZoom',
+ {0: 'None',
+ 1: '2x',
+ 2: '4x'}),
+ 13: ('Contrast',
+ {0xFFFF: 'Low',
+ 0: 'Normal',
+ 1: 'High'}),
+ 14: ('Saturation',
+ {0xFFFF: 'Low',
+ 0: 'Normal',
+ 1: 'High'}),
+ 15: ('Sharpness',
+ {0xFFFF: 'Low',
+ 0: 'Normal',
+ 1: 'High'}),
+ 16: ('ISO',
+ {0: 'See ISOSpeedRatings Tag',
+ 15: 'Auto',
+ 16: '50',
+ 17: '100',
+ 18: '200',
+ 19: '400'}),
+ 17: ('MeteringMode',
+ {3: 'Evaluative',
+ 4: 'Partial',
+ 5: 'Center-weighted'}),
+ 18: ('FocusType',
+ {0: 'Manual',
+ 1: 'Auto',
+ 3: 'Close-Up (Macro)',
+ 8: 'Locked (Pan Mode)'}),
+ 19: ('AFPointSelected',
+ {0x3000: 'None (MF)',
+ 0x3001: 'Auto-Selected',
+ 0x3002: 'Right',
+ 0x3003: 'Center',
+ 0x3004: 'Left'}),
+ 20: ('ExposureMode',
+ {0: 'Easy Shooting',
+ 1: 'Program',
+ 2: 'Tv-priority',
+ 3: 'Av-priority',
+ 4: 'Manual',
+ 5: 'A-DEP'}),
+ 23: ('LongFocalLengthOfLensInFocalUnits', ),
+ 24: ('ShortFocalLengthOfLensInFocalUnits', ),
+ 25: ('FocalUnitsPerMM', ),
+ 28: ('FlashActivity',
+ {0: 'Did Not Fire',
+ 1: 'Fired'}),
+ 29: ('FlashDetails',
+ {14: 'External E-TTL',
+ 13: 'Internal Flash',
+ 11: 'FP Sync Used',
+ 7: '2nd("Rear")-Curtain Sync Used',
+ 4: 'FP Sync Enabled'}),
+ 32: ('FocusMode',
+ {0: 'Single',
+ 1: 'Continuous'})
+ }
+
+MAKERNOTE_CANON_TAG_0x004={
+ 7: ('WhiteBalance',
+ {0: 'Auto',
+ 1: 'Sunny',
+ 2: 'Cloudy',
+ 3: 'Tungsten',
+ 4: 'Fluorescent',
+ 5: 'Flash',
+ 6: 'Custom'}),
+ 9: ('SequenceNumber', ),
+ 14: ('AFPointUsed', ),
+ 15: ('FlashBias',
+ {0XFFC0: '-2 EV',
+ 0XFFCC: '-1.67 EV',
+ 0XFFD0: '-1.50 EV',
+ 0XFFD4: '-1.33 EV',
+ 0XFFE0: '-1 EV',
+ 0XFFEC: '-0.67 EV',
+ 0XFFF0: '-0.50 EV',
+ 0XFFF4: '-0.33 EV',
+ 0X0000: '0 EV',
+ 0X000C: '0.33 EV',
+ 0X0010: '0.50 EV',
+ 0X0014: '0.67 EV',
+ 0X0020: '1 EV',
+ 0X002C: '1.33 EV',
+ 0X0030: '1.50 EV',
+ 0X0034: '1.67 EV',
+ 0X0040: '2 EV'}),
+ 19: ('SubjectDistance', )
+ }
+
+# extract multibyte integer in Motorola format (little endian)
+def s2n_motorola(str):
+ x=0
+ for c in str:
+ x=(long(x) << 8) | ord(c)
+ return x
+
+# extract multibyte integer in Intel format (big endian)
+def s2n_intel(str):
+ x=0
+ y=0
+ for c in str:
+ x=x | (ord(c) << y)
+ y=y+8
+ return x
+
+# ratio object that eventually will be able to reduce itself to lowest
+# common denominator for printing
+def gcd(a, b):
+ if b == 0:
+ return a
+ else:
+ return gcd(b, a % b)
+
+class Ratio:
+ def __init__(self, num, den):
+ self.num=num
+ self.den=den
+
+ def __repr__(self):
+# self.reduce() # ugh, 259/250 worse 1036/1000
+ if self.den == 1:
+ return str(self.num)
+ return '%d/%d' % (self.num, self.den)
+
+ def reduce(self):
+ div=gcd(self.num, self.den)
+ if div > 1:
+ self.num=self.num/div
+ self.den=self.den/div
+
+# for ease of dealing with tags
+class IFD_Tag:
+ def __init__(self, printable, tag, field_type, values, field_offset,
+ field_length):
+ self.printable=printable
+ self.tag=tag
+ self.field_type=field_type
+ self.field_offset=field_offset
+ self.field_length=field_length
+ self.values=values
+
+ def __str__(self):
+ return self.printable
+
+ def __repr__(self):
+ return '(0x%04X) %s=%s @ %d' % (self.tag,
+ FIELD_TYPES[self.field_type][2],
+ self.printable,
+ self.field_offset)
+
+# class that handles an EXIF header
+class EXIF_header:
+ def __init__(self, file, endian, offset, debug=0):
+ self.file=file
+ self.endian=endian
+ self.offset=offset
+ self.debug=debug
+ self.tags={}
+
+ # convert slice to integer, based on sign and endian flags
+ def s2n(self, offset, length, signed=0):
+ self.file.seek(self.offset+offset)
+ slice=self.file.read(length)
+ if self.endian == 'I':
+ val=s2n_intel(slice)
+ else:
+ val=s2n_motorola(slice)
+ # Sign extension ?
+ if signed:
+ msb=1L << (8*length-1)
+ if val & msb:
+ val=val-(msb << 1)
+ return val
+
+ # convert offset to string
+ def n2s(self, offset, length):
+ s=''
+ for i in range(length):
+ if self.endian == 'I':
+ s=s+chr(offset & 0xFF)
+ else:
+ s=chr(offset & 0xFF)+s
+ offset=offset >> 8
+ return s
+
+ # return first IFD
+ def first_IFD(self):
+ return self.s2n(4, 4)
+
+ # return pointer to next IFD
+ def next_IFD(self, ifd):
+ entries=self.s2n(ifd, 2)
+ return self.s2n(ifd+2+12*entries, 4)
+
+ # return list of IFDs in header
+ def list_IFDs(self):
+ i=self.first_IFD()
+ a=[]
+ while i:
+ a.append(i)
+ i=self.next_IFD(i)
+ return a
+
+ # return list of entries in this IFD
+ def dump_IFD(self, ifd, ifd_name, dict=EXIF_TAGS):
+ entries=self.s2n(ifd, 2)
+ for i in range(entries):
+ entry=ifd+2+12*i
+ tag=self.s2n(entry, 2)
+ field_type=self.s2n(entry+2, 2)
+ if not 0 < field_type < len(FIELD_TYPES):
+ # unknown field type
+ raise ValueError, \
+ 'unknown type %d in tag 0x%04X' % (field_type, tag)
+ typelen=FIELD_TYPES[field_type][0]
+ count=self.s2n(entry+4, 4)
+ offset=entry+8
+ if count*typelen > 4:
+ # not the value, it's a pointer to the value
+ offset=self.s2n(offset, 4)
+ field_offset=offset
+ if field_type == 2:
+ # special case: null-terminated ASCII string
+ if count != 0:
+ self.file.seek(self.offset+offset)
+ values=self.file.read(count).strip().replace('\x00','')
+ else:
+ values=''
+ elif tag == 0x927C or tag == 0x9286: # MakerNote or UserComment
+# elif tag == 0x9286: # UserComment
+ values=[]
+ else:
+ values=[]
+ signed=(field_type in [6, 8, 9, 10])
+ for j in range(count):
+ if field_type in (5, 10):
+ # a ratio
+ value_j=Ratio(self.s2n(offset, 4, signed),
+ self.s2n(offset+4, 4, signed))
+ else:
+ value_j=self.s2n(offset, typelen, signed)
+ values.append(value_j)
+ offset=offset+typelen
+ # now "values" is either a string or an array
+ if count == 1 and field_type != 2:
+ printable=str(values[0])
+ else:
+ printable=str(values)
+ # figure out tag name
+ tag_entry=dict.get(tag)
+ if tag_entry:
+ tag_name=tag_entry[0]
+ if len(tag_entry) != 1:
+ # optional 2nd tag element is present
+ if callable(tag_entry[1]):
+ # call mapping function
+ printable=tag_entry[1](values)
+ else:
+ printable=''
+ for i in values:
+ # use LUT for this tag
+ printable+=tag_entry[1].get(i, repr(i))
+ else:
+ tag_name='Tag 0x%04X' % tag
+ self.tags[ifd_name+' '+tag_name]=IFD_Tag(printable, tag,
+ field_type,
+ values, field_offset,
+ count*typelen)
+ if self.debug:
+ print ' %s: %s' % (tag_name,
+ repr(self.tags[ifd_name+' '+tag_name]))
+
+ # extract uncompressed TIFF thumbnail (like pulling teeth)
+ # we take advantage of the pre-existing layout in the thumbnail IFD as
+ # much as possible
+ def extract_TIFF_thumbnail(self, thumb_ifd):
+ entries=self.s2n(thumb_ifd, 2)
+ # this is header plus offset to IFD ...
+ if self.endian == 'M':
+ tiff='MM\x00*\x00\x00\x00\x08'
+ else:
+ tiff='II*\x00\x08\x00\x00\x00'
+ # ... plus thumbnail IFD data plus a null "next IFD" pointer
+ self.file.seek(self.offset+thumb_ifd)
+ tiff+=self.file.read(entries*12+2)+'\x00\x00\x00\x00'
+
+ # fix up large value offset pointers into data area
+ for i in range(entries):
+ entry=thumb_ifd+2+12*i
+ tag=self.s2n(entry, 2)
+ field_type=self.s2n(entry+2, 2)
+ typelen=FIELD_TYPES[field_type][0]
+ count=self.s2n(entry+4, 4)
+ oldoff=self.s2n(entry+8, 4)
+ # start of the 4-byte pointer area in entry
+ ptr=i*12+18
+ # remember strip offsets location
+ if tag == 0x0111:
+ strip_off=ptr
+ strip_len=count*typelen
+ # is it in the data area?
+ if count*typelen > 4:
+ # update offset pointer (nasty "strings are immutable" crap)
+ # should be able to say "tiff[ptr:ptr+4]=newoff"
+ newoff=len(tiff)
+ tiff=tiff[:ptr]+self.n2s(newoff, 4)+tiff[ptr+4:]
+ # remember strip offsets location
+ if tag == 0x0111:
+ strip_off=newoff
+ strip_len=4
+ # get original data and store it
+ self.file.seek(self.offset+oldoff)
+ tiff+=self.file.read(count*typelen)
+
+ # add pixel strips and update strip offset info
+ old_offsets=self.tags['Thumbnail StripOffsets'].values
+ old_counts=self.tags['Thumbnail StripByteCounts'].values
+ for i in range(len(old_offsets)):
+ # update offset pointer (more nasty "strings are immutable" crap)
+ offset=self.n2s(len(tiff), strip_len)
+ tiff=tiff[:strip_off]+offset+tiff[strip_off+strip_len:]
+ strip_off+=strip_len
+ # add pixel strip to end
+ self.file.seek(self.offset+old_offsets[i])
+ tiff+=self.file.read(old_counts[i])
+
+ self.tags['TIFFThumbnail']=tiff
+
+ # decode all the camera-specific MakerNote formats
+ def decode_maker_note(self):
+ note=self.tags['EXIF MakerNote']
+ make=self.tags['Image Make'].printable
+ model=self.tags['Image Model'].printable
+
+ # Nikon
+ if make == 'NIKON':
+ if note.values[0:5] == [78, 105, 107, 111, 110]: # "Nikon"
+ # older model
+ self.dump_IFD(note.field_offset+8, 'MakerNote',
+ dict=MAKERNOTE_NIKON_OLDER_TAGS)
+ else:
+ # newer model (E99x or D1)
+ self.dump_IFD(note.field_offset, 'MakerNote',
+ dict=MAKERNOTE_NIKON_NEWER_TAGS)
+ return
+
+ # Olympus
+ if make[:7] == 'OLYMPUS':
+ self.dump_IFD(note.field_offset+8, 'MakerNote',
+ dict=MAKERNOTE_OLYMPUS_TAGS)
+ return
+
+ # Casio
+ if make == 'Casio':
+ self.dump_IFD(note.field_offset, 'MakerNote',
+ dict=MAKERNOTE_CASIO_TAGS)
+ return
+
+ # Fujifilm
+ if make == 'FUJIFILM':
+ # bug: everything else is "Motorola" endian, but the MakerNote
+ # is "Intel" endian
+ endian=self.endian
+ self.endian='I'
+ # bug: IFD offsets are from beginning of MakerNote, not
+ # beginning of file header
+ offset=self.offset
+ self.offset+=note.field_offset
+ # process note with bogus values (note is actually at offset 12)
+ self.dump_IFD(12, 'MakerNote', dict=MAKERNOTE_FUJIFILM_TAGS)
+ # reset to correct values
+ self.endian=endian
+ self.offset=offset
+ return
+
+ # Canon
+ if make == 'Canon':
+ self.dump_IFD(note.field_offset, 'MakerNote',
+ dict=MAKERNOTE_CANON_TAGS)
+ for i in (('MakerNote Tag 0x0001', MAKERNOTE_CANON_TAG_0x001),
+ ('MakerNote Tag 0x0004', MAKERNOTE_CANON_TAG_0x004)):
+ if self.debug:
+ print ' SubMakerNote BitSet for ' +i[0]
+ self.canon_decode_tag(self.tags[i[0]].values, i[1])
+ return
+
+ # decode Canon MakerNote tag based on offset within tag
+ # see http://www.burren.cx/david/canon.html by David Burren
+ def canon_decode_tag(self, value, dict):
+ for i in range(1, len(value)):
+ x=dict.get(i, ('Unknown', ))
+# if self.debug:
+# print i, x
+ name=x[0]
+ if len(x) > 1:
+ val=x[1].get(value[i], 'Unknown')
+ else:
+ val=value[i]
+ if self.debug:
+ print ' '+name+':', val
+ self.tags['MakerNote '+name]=val
+
+# process an image file (expects an open file object)
+# this is the function that has to deal with all the arbitrary nasty bits
+# of the EXIF standard
+def process_file(file, debug=0, noclose=0):
+ # determine whether it's a JPEG or TIFF
+ data=file.read(12)
+ if data[0:4] in ['II*\x00', 'MM\x00*']:
+ # it's a TIFF file
+ file.seek(0)
+ endian=file.read(1)
+ file.read(1)
+ offset=0
+ elif data[0:2] == '\xFF\xD8':
+ # it's a JPEG file
+ # skip JFIF style header(s)
+ while data[2] == '\xFF' and data[6:10] in ('JFIF', 'JFXX', 'OLYM'):
+ length=ord(data[4])*256+ord(data[5])
+ file.read(length-8)
+ # fake an EXIF beginning of file
+ data='\xFF\x00'+file.read(10)
+ if data[2] == '\xFF' and data[6:10] == 'Exif':
+ # detected EXIF header
+ offset=file.tell()
+ endian=file.read(1)
+ else:
+ # no EXIF information
+ return {}
+ else:
+ # file format not recognized
+ return {}
+
+ # deal with the EXIF info we found
+ if debug:
+ print {'I': 'Intel', 'M': 'Motorola'}[endian], 'format'
+ hdr=EXIF_header(file, endian, offset, debug)
+ ifd_list=hdr.list_IFDs()
+ ctr=0
+ for i in ifd_list:
+ if ctr == 0:
+ IFD_name='Image'
+ elif ctr == 1:
+ IFD_name='Thumbnail'
+ thumb_ifd=i
+ else:
+ IFD_name='IFD %d' % ctr
+ if debug:
+ print ' IFD %d (%s) at offset %d:' % (ctr, IFD_name, i)
+ hdr.tags['Exif Offset'] = offset
+ hdr.tags['Exif Endian'] = endian
+ hdr.tags[IFD_name+' IFDOffset'] = i
+ hdr.dump_IFD(i, IFD_name)
+ # EXIF IFD
+ exif_off=hdr.tags.get(IFD_name+' ExifOffset')
+ if exif_off:
+ if debug:
+ print ' EXIF SubIFD at offset %d:' % exif_off.values[0]
+ hdr.dump_IFD(exif_off.values[0], 'EXIF')
+ # Interoperability IFD contained in EXIF IFD
+ #intr_off=hdr.tags.get('EXIF SubIFD InteroperabilityOffset')
+ intr_off=hdr.tags.get('EXIF InteroperabilityOffset')
+ if intr_off:
+ if debug:
+ print ' EXIF Interoperability SubSubIFD at offset %d:' \
+ % intr_off.values[0]
+ hdr.dump_IFD(intr_off.values[0], 'EXIF Interoperability',
+ dict=INTR_TAGS)
+ # deal with MakerNote contained in EXIF IFD
+ if hdr.tags.has_key('EXIF MakerNote'):
+ if debug:
+ print ' EXIF MakerNote SubSubIFD at offset %d:' \
+ % intr_off.values[0]
+ hdr.decode_maker_note()
+ # GPS IFD
+ gps_off=hdr.tags.get(IFD_name+' GPSInfoOffset')
+ if gps_off:
+ if debug:
+ print ' GPS SubIFD at offset %d:' % gps_off.values[0]
+ hdr.dump_IFD(gps_off.values[0], 'GPS', dict=GPS_TAGS)
+ ctr+=1
+
+
+ # extract uncompressed TIFF thumbnail
+ thumb=hdr.tags.get('Thumbnail Compression')
+ if thumb and thumb.printable == 'Uncompressed TIFF':
+ hdr.extract_TIFF_thumbnail(thumb_ifd)
+
+ # JPEG thumbnail (thankfully the JPEG data is stored as a unit)
+ thumb_off=hdr.tags.get('Thumbnail JPEGInterchangeFormat')
+ if thumb_off:
+ file.seek(offset+thumb_off.values[0])
+ size=hdr.tags['Thumbnail JPEGInterchangeFormatLength'].values[0]
+ hdr.tags['JPEGThumbnail']=file.read(size)
+
+ # Sometimes in a TIFF file, a JPEG thumbnail is hidden in the MakerNote
+ # since it's not allowed in a uncompressed TIFF IFD
+ if not hdr.tags.has_key('JPEGThumbnail'):
+ thumb_off=hdr.tags.get('MakerNote JPEGThumbnail')
+ if thumb_off:
+ file.seek(offset+thumb_off.values[0])
+ hdr.tags['JPEGThumbnail']=file.read(thumb_off.field_length)
+
+ if noclose == 0:
+ file.close()
+ return hdr.tags
+
+# library test/debug function (dump given files)
+if __name__ == '__main__':
+ import sys
+
+ if len(sys.argv) < 2:
+ print 'Usage: %s files...\n' % sys.argv[0]
+ sys.exit(0)
+
+ for filename in sys.argv[1:]:
+ try:
+ file=open(filename, 'rb')
+ except:
+ print filename, 'unreadable'
+ print
+ continue
+ print filename+':'
+ # data=process_file(file, 1) # with debug info
+ data=process_file(file, 1)
+ if not data:
+ print 'No EXIF information found'
+ continue
+
+# x=data.keys()
+# x.sort()
+# for i in x:
+# if i in ('JPEGThumbnail', 'TIFFThumbnail'):
+# continue
+# print ' %s (%s): %s' % \
+# (i, FIELD_TYPES[data[i].field_type][2], data[i].printable)
+# if data.has_key('JPEGThumbnail'):
+# print 'File has JPEG thumbnail'
+# print
diff --git a/konq-plugins/imagerotation/imageconverter.desktop b/konq-plugins/imagerotation/imageconverter.desktop
new file mode 100644
index 0000000..07cb700
--- /dev/null
+++ b/konq-plugins/imagerotation/imageconverter.desktop
@@ -0,0 +1,83 @@
+#
+# Servicemenu image converter, by Jens Benecke <jens-kde@spamfreemail.de>.
+# Released under the same license as the KDE core distribution (GPL 2.0).
+#
+[Desktop Entry]
+ServiceTypes=image/*
+Actions=convToJPEG;convToPNG;convToGIF;convToTIF;
+X-KDE-Submenu=Convert To
+X-KDE-Submenu[bg]=Конвертиране в
+X-KDE-Submenu[ca]=Converteix a
+X-KDE-Submenu[cs]=Převést na
+X-KDE-Submenu[da]=Konvertér til
+X-KDE-Submenu[de]=Konvertieren in
+X-KDE-Submenu[el]=Μετατροπή σε
+X-KDE-Submenu[eo]=Konvertu al
+X-KDE-Submenu[es]=Convertir a
+X-KDE-Submenu[et]=Teisendamine
+X-KDE-Submenu[eu]=Bihurtu honetara
+X-KDE-Submenu[fa]=تبدیل به
+X-KDE-Submenu[fi]=Muunna
+X-KDE-Submenu[fr]=Convertir en
+X-KDE-Submenu[fy]=Konvertearje nei
+X-KDE-Submenu[ga]=Tiontaigh Go
+X-KDE-Submenu[gl]=Converter En
+X-KDE-Submenu[hr]=Pretvori u
+X-KDE-Submenu[hu]=Átalakítás
+X-KDE-Submenu[is]=Umbreyta í
+X-KDE-Submenu[it]=Converti in
+X-KDE-Submenu[ja]=変換
+X-KDE-Submenu[ka]=კონვერტაცია
+X-KDE-Submenu[kk]=Мынаған айналдыру
+X-KDE-Submenu[km]=បម្លែង​ទៅ​ជា
+X-KDE-Submenu[lt]=Konvertuoti į
+X-KDE-Submenu[mk]=Претвори во
+X-KDE-Submenu[nb]=Konverter til
+X-KDE-Submenu[nds]=Ümwanneln na
+X-KDE-Submenu[ne]=यसमा बदल्नुहोस्
+X-KDE-Submenu[nl]=Converteren naar
+X-KDE-Submenu[nn]=Konverter til
+X-KDE-Submenu[pl]=Konwertuj do
+X-KDE-Submenu[pt]=Converter Para
+X-KDE-Submenu[pt_BR]=Converter Para
+X-KDE-Submenu[ru]=Сохранить как
+X-KDE-Submenu[sk]=Konvertovať na
+X-KDE-Submenu[sl]=Pretvori v
+X-KDE-Submenu[sr]=Претвори у
+X-KDE-Submenu[sr@Latn]=Pretvori u
+X-KDE-Submenu[sv]=Konvertera till
+X-KDE-Submenu[tr]=Dönüştür
+X-KDE-Submenu[uk]=Перетворити в
+X-KDE-Submenu[vi]=Chuyển đổi sang
+X-KDE-Submenu[zh_CN]=转换为
+X-KDE-Submenu[zh_TW]=轉換為
+TryExec=convert
+
+[Desktop Action convToJPEG]
+Name=JPEG
+Name[hi]=जेपीईजी
+Name[ne]=जेपीईजी
+Icon=image
+Exec=convert %f "`echo %f | perl -pe 's/\.[^.]+$//'`.jpg"
+
+[Desktop Action convToPNG]
+Name=PNG
+Name[hi]=पीएनजी
+Name[ne]=पीएनजी
+Icon=image
+Exec=convert %f "`echo %f | perl -pe 's/\.[^.]+$//'`.png"
+
+[Desktop Action convToTIF]
+Name=TIF
+Name[hi]=टिफ़
+Name[ne]=टीआईएफ
+Icon=image
+Exec=convert %f "`echo %f | perl -pe 's/\.[^.]+$//'`.tif"
+
+[Desktop Action convToGIF]
+Name=GIF
+Name[hi]=जिफ़
+Name[ne]=जीआईएफ
+Icon=image
+Exec=convert %f "`echo %f | perl -pe 's/\.[^.]+$//'`.gif"
+
diff --git a/konq-plugins/imagerotation/jpegorient b/konq-plugins/imagerotation/jpegorient
new file mode 100755
index 0000000..6323289
--- /dev/null
+++ b/konq-plugins/imagerotation/jpegorient
@@ -0,0 +1,89 @@
+#!/bin/sh
+
+if test "$#" -lt 2; then
+ echo "Usage: $0 '##|v|h' jpegs"
+ exit 2
+fi
+
+die() {
+ echo "$@"; exit 1
+}
+
+notify() {
+ case "$1" in
+ /*) url=file:"$1" ;;
+ *) url=file:"$PWD"/"$1" ;;
+ esac
+
+ konq=`dcop konqueror-\*`
+ for k in $konq; do
+ notify=`dcop $k KDirNotify-\*`
+ for n in $notify; do
+ dcop $k $n FilesChanged [ "$url" ] # $1 must be a url
+ done
+ done
+}
+
+IFS=:
+for path in `kde-config --path data --expandvars`; do
+ PATH=$path/imagerotation:$PATH
+done
+export PATH
+unset IFS
+
+action=$1
+
+case $action in
+[1-8]|+[1-8]) o=$action ;;
+90|[+-]90) o=+6 ;; # Use + for all these
+270|[+-]270) o=+8 ;;
+180|[+-]180) o=+3 ;;
+v|-v) o=+4 ;;
+h|-h) o=+2 ;;
+*) die cannot understand transformation "$action" ;;
+esac
+
+shift
+
+for file in "$@"; do
+
+if orient.py $o "$file" | grep 'orientation changed' >/dev/null 2>&1; then
+ notify "$file"
+ continue
+fi
+
+### try jpegtran instead
+if which jpegtran-mmx >/dev/null 2>&1; then
+ JPEGTRAN=jpegtran-mmx
+else
+ if which jpegtran >/dev/null 2>&1; then
+ JPEGTRAN=jpegtran
+ else
+ die could not change orientation
+ fi
+fi
+
+case $action in
+v|-v) c='-flip vertical' ;;
+h|-h) c='-flip horizontal' ;;
+*90) c='-rotate 90' ;;
+*180) c='-rotate 180' ;;
+*270) c='-rotate 270' ;;
++5) c='-transpose' ;;
++7) c='-transverse' ;;
+*) die cannot understand transformation "$action" using jpegtran ;;
+esac # others could be emulated, but ...
+
+tmp="$file.a.$$"
+
+cleandie() {
+ mv -i "$tmp" $"2" </dev/null 2>/dev/null; die "$@"
+}
+
+mv -i "$file" "$tmp" </dev/null 2>/dev/null || die unable to move temp files
+$JPEGTRAN -copy all -outfile "$file" $c "$tmp" || cleandie error using jpegtran
+rm "$tmp"
+notify "$file"
+
+done
+
diff --git a/konq-plugins/imagerotation/jpegorient.desktop b/konq-plugins/imagerotation/jpegorient.desktop
new file mode 100644
index 0000000..3f5b26c
--- /dev/null
+++ b/konq-plugins/imagerotation/jpegorient.desktop
@@ -0,0 +1,307 @@
+[Desktop Entry]
+ServiceTypes=image/jpeg
+Actions=jpegRot90;jpegRot270;jpegFlipV;jpegFlipH;
+X-KDE-Submenu=Transform Image
+X-KDE-Submenu[bg]=Конвертиране на изображението
+X-KDE-Submenu[ca]=Transforma la imatge
+X-KDE-Submenu[cs]=Převést obrázek
+X-KDE-Submenu[da]=Transformér billede
+X-KDE-Submenu[de]=Bild transformieren
+X-KDE-Submenu[el]=Μετασχηματισμός εικόνας
+X-KDE-Submenu[eo]=Transformu bildon
+X-KDE-Submenu[es]=Transformar imagen
+X-KDE-Submenu[et]=Pildi muutmine
+X-KDE-Submenu[eu]=Irudia eraldatu
+X-KDE-Submenu[fa]=تبدیل تصویر
+X-KDE-Submenu[fi]=Muuta kuva
+X-KDE-Submenu[fr]=Transformer l'image
+X-KDE-Submenu[fy]=Ofbyld transformearje
+X-KDE-Submenu[ga]=Trasfhoirmigh Íomhá
+X-KDE-Submenu[gl]=Transformar a Imaxe
+X-KDE-Submenu[hr]=Pretvaranje slike
+X-KDE-Submenu[hu]=Képátalakítás
+X-KDE-Submenu[is]=Ummynda
+X-KDE-Submenu[it]=Trasforma immagine
+X-KDE-Submenu[ja]=画像を変換
+X-KDE-Submenu[ka]=გამოსახულებათა ტრანსფორმაცია
+X-KDE-Submenu[kk]=Кескінді түрлендіру
+X-KDE-Submenu[km]=ប្លែង​រូបភាព
+X-KDE-Submenu[lt]=Transformuoti paveikslėlį
+X-KDE-Submenu[mk]=Трансформирај слика
+X-KDE-Submenu[nb]=Transformer bilde
+X-KDE-Submenu[nds]=Bild ännern
+X-KDE-Submenu[ne]=छवि रुपान्तरण गर्नुहोस्
+X-KDE-Submenu[nl]=Afbeelding transformeren
+X-KDE-Submenu[nn]=Forvandla bilete
+X-KDE-Submenu[pl]=Przekształć obrazek
+X-KDE-Submenu[pt]=Transformar a Imagem
+X-KDE-Submenu[pt_BR]=Transformar Imagem
+X-KDE-Submenu[ru]=Преобразовать
+X-KDE-Submenu[sk]=Transformovať obrázok
+X-KDE-Submenu[sl]=Preoblikuj sliko
+X-KDE-Submenu[sr]=Трансформиши слику
+X-KDE-Submenu[sr@Latn]=Transformiši sliku
+X-KDE-Submenu[sv]=Ändra bild
+X-KDE-Submenu[tr]=Resmi Döndür
+X-KDE-Submenu[uk]=Перетворити зображення
+X-KDE-Submenu[vi]=Chuyển đổi ảnh
+X-KDE-Submenu[zh_CN]=图像变形
+X-KDE-Submenu[zh_TW]=轉換影像
+X-KDE-Require=Write
+
+[Desktop Action jpegRot90]
+Name=Rotate Clockwise
+Name[ar]=تدوير في اتجاه الساعة
+Name[az]=Saat Əqrəbi İstiqamətində Fırlat
+Name[bg]=Завъртане по посока на часов. стрелка
+Name[bs]=Rotiraj u smjeru kazaljke
+Name[ca]=Gira 90 graus
+Name[cs]=Rotovat ve směru hod. ručiček
+Name[cy]=Cylchdroi yn Glocwedd
+Name[da]=Rotér med uret
+Name[de]=Im Uhrzeigersinn drehen (nach rechts)
+Name[el]=Περιστροφή δεξιόστροφα
+Name[eo]=Turnu laŭhorloĝe
+Name[es]=Girar en el sentido de las agujas del reloj
+Name[et]=Pööra päripäeva
+Name[eu]=Biratu erloju orratzen norabidean
+Name[fa]=چرخش در جهت ساعت
+Name[fi]=Käännä myötäpäivään
+Name[fr]=Tourner en sens horaire
+Name[fy]=Mei de wizers fan'e klok mei draaie
+Name[ga]=Rothlaigh go Deisealach
+Name[gl]=Xirar en Sentido Horário
+Name[he]=סובב עם כיוון השעון
+Name[hi]=घड़ी की दिशा में घुमाएँ
+Name[hr]=Okret udesno
+Name[hu]=Forgatás jobbra
+Name[is]=Snúa réttsælis
+Name[it]=Ruota in senso orario
+Name[ja]=右回転
+Name[ka]=საათის ისრის მიმართულებით მოტრიალება
+Name[kk]=Сағаттың тіліне сәйкес айналдыру
+Name[km]=បង្វិល​ស្រប​ទ្រនិច​នាឡិកា
+Name[lt]=Sukti pagal laikrodžio rodyklę
+Name[mk]=Ротирај кон стрелката на часовникот
+Name[ms]=Putar Ikut Jam
+Name[nb]=Roter medurs
+Name[nds]=Na rechts dreihen
+Name[ne]=घडिको दिशामा घुमाउनुहोस्
+Name[nl]=Klokgewijs draaien
+Name[nn]=Roter med klokka
+Name[pa]=ਸੱਜਾ ਦਾਅ ਘੁੰਮਾਉ
+Name[pl]=Obróć zgodnie z ruchem wskazówek zegara
+Name[pt]=Rodar no Sentido Horário
+Name[pt_BR]=Rodar Relógio Sentido Horário
+Name[ro]=Roteşte la dreapta
+Name[ru]=Повернуть по часовой стрелке
+Name[sk]=Otočiť v smere hodinových ručičiek
+Name[sl]=Zasuči v smeri urinega kazalca
+Name[sr]=Ротирај у смеру казаљке на часовнику
+Name[sr@Latn]=Rotiraj u smeru kazaljke na časovniku
+Name[sv]=Rotera medurs
+Name[ta]=வலதுபுறமாக சுழற்று
+Name[tg]=Чархиш бо ақрабаки соат
+Name[tr]=Saat Yönünde Döndür
+Name[uk]=Обернути за годинниковою стрілкою
+Name[uz]=Soat koʻrsatgichi boʻyicha burish
+Name[uz@cyrillic]=Соат кўрсатгичи бўйича буриш
+Name[vi]=Xoay xuôi chiều
+Name[zh_CN]=顺时针旋转
+Name[zh_TW]=順時針旋轉
+Icon=rotate_cw
+Exec=jpegorient +90 %F
+
+[Desktop Action jpegRot270]
+Name=Rotate Counter-Clockwise
+Name[ar]=تدوير عكس اتجاه الساعة
+Name[az]=Saat Əqrəbinə Tərs İstiqamətdə Fırlat
+Name[bg]=Завъртане обратно на часов. стрелка
+Name[bs]=Rotiraj u smjeru suprotnom od kazaljke
+Name[ca]=Gira 270 graus
+Name[cs]=Rotovat proti směru hod. ručiček
+Name[cy]=Cylchdroi yn Wrthglocwedd
+Name[da]=Rotér mod uret
+Name[de]=Gegen den Uhrzeigersinn drehen (nach links)
+Name[el]=Περιστροφή αριστερόστροφα
+Name[en_GB]=Rotate Anti-Clockwise
+Name[eo]=Turnu kontraŭhorloĝe
+Name[es]=Girar en el sentido contrario a las agujas del reloj
+Name[et]=Pööra vastupäeva
+Name[eu]=Biratu erloju orratzen aurkako norabidean
+Name[fa]=چرخش در خلاف جهت ساعت
+Name[fi]=Käännä vastapäivään
+Name[fr]=Tourner en sens anti-horaire
+Name[fy]=Tsjin'e wizers fan de klok yn draaie
+Name[ga]=Rothlaigh go Tuathalach
+Name[gl]=Xirar en Sentido Antiorário
+Name[he]=סובב נגד כיוון השעון
+Name[hi]=घड़ी की उलटी दिशा में घुमाएँ
+Name[hr]=Okret ulijevo
+Name[hu]=Forgatás balra
+Name[is]=Snúa rangsælis
+Name[it]=Ruota in senso anti-orario
+Name[ja]=左回転
+Name[ka]=საათის ისრის მიმართულებით მოტრიალება
+Name[kk]=Сағаттың тіліне қарсы айналдыру
+Name[km]=បង្វិល​ច្រាស​ទ្រនិច​នាឡិកា
+Name[lt]=Sukti prieš laikrodžio rodyklę
+Name[mk]=Ротирај обратно од стрелката на часовникот
+Name[ms]=Putar Lawan Jam
+Name[nb]=Roter moturs
+Name[nds]=Na links dreihen
+Name[ne]=घडिको विपरित दिशामा घुमाउनुहोस्
+Name[nl]=Anti-klokgewijs draaien
+Name[nn]=Roter mot klokka
+Name[pa]=ਖੱਬੇ ਦਾਅ ਘੁੰਮਾਓ
+Name[pl]=Obróć przeciwnie do ruchu wskazówek zegara
+Name[pt]=Rodar no Sentido Anti-Horário
+Name[pt_BR]=Rodar Contador de Relógio
+Name[ro]=Roteşte la stînga
+Name[ru]=Повернуть против часовой стрелки
+Name[sk]=Otočiť proti smeru hodinových ručičiek
+Name[sl]=Zasuči v nasportni smeri urinega kazalca
+Name[sr]=Ротирај супротно смеру казаљке на часовнику
+Name[sr@Latn]=Rotiraj suprotno smeru kazaljke na časovniku
+Name[sv]=Rotera moturs
+Name[ta]=கடிகார ஓட்டத்திற்கெதிராக சுழற்று
+Name[tg]=Чархиш ба муқобили ақрабаки соат
+Name[tr]=Saat Yönünün Tesine Döndür
+Name[uk]=Обернути проти годинникової стрілки
+Name[uz]=Soat koʻrsatgichiga qarshi burish
+Name[uz@cyrillic]=Соат кўрсатгичига қарши буриш
+Name[vi]=Xoay ngược chiều
+Name[zh_CN]=逆时针旋转
+Name[zh_TW]=逆時針旋轉
+Icon=rotate_ccw
+Exec=jpegorient +270 %F
+
+#[Desktop Action jpegRot180]
+#Name=Rotate 180
+#Icon=misc
+#Exec=jpegorient +180 %F
+
+[Desktop Action jpegFlipV]
+Name=Flip Vertically
+Name[ar]=تدوير رأسي
+Name[az]=Şaquli Olaraq Çevir
+Name[bg]=Вертикално обръщане
+Name[bs]=Obrni vertikalno
+Name[ca]=Torna vertical
+Name[cs]=Převrátit svisle
+Name[cy]=Troi Drosodd yn Fertigol
+Name[da]=Flip lodret
+Name[de]=Vertikal kippen
+Name[el]=Αναστροφή κατακόρυφα
+Name[eo]=Inversigu vertikale
+Name[es]=Reflejar verticalmente
+Name[et]=Keera ümber vertikaalselt
+Name[eu]=Buruz behera ipini
+Name[fa]=قرینۀ عمودی
+Name[fi]=Käännä pystysuorassa
+Name[fr]=Retourner verticalement
+Name[fy]=Fertikaal omdraaie
+Name[ga]=Smeach go hIngearach
+Name[gl]=Inverter Verticalmente
+Name[he]=שקף אנכית
+Name[hi]=खड़ा पलटें
+Name[hr]=Prevrni uspravno
+Name[hu]=Tükrözés függőlegesen
+Name[is]=Snúa við um miðju lóðrétt
+Name[it]=Fletti verticalmente
+Name[ja]=上下反転
+Name[ka]=ვერტიკალურად შეტრიალება
+Name[kk]=Тігінен терістеу
+Name[km]=ត្រឡប់​​​បញ្ឈរ
+Name[lt]=Versti vertikaliai
+Name[mk]=Преврти вертикално
+Name[nb]=Speilvend loddrett
+Name[nds]=Pielliek ümdreihen
+Name[ne]=ठाडो गरी फ्लिप गर्नुहोस्
+Name[nl]=Verticaal omdraaien
+Name[nn]=Snu loddrett
+Name[pa]=ਲੰਬਕਾਰੀ ਝਟਕੋ
+Name[pl]=Odwróć pionowo
+Name[pt]=Inverter Verticalmente
+Name[pt_BR]=Refletir Verticalmente
+Name[ro]=Întoarce pe verticală
+Name[ru]=Отразить вертикально
+Name[sk]=Preklopiť vertikálne
+Name[sl]=Obrni navpično
+Name[sr]=Преврни усправно
+Name[sr@Latn]=Prevrni uspravno
+Name[sv]=Vänd vertikalt
+Name[ta]=மேல்கீழாக திருப்பு
+Name[tg]=Баргардондан ба амудӣ
+Name[tr]=Dik Olarak Dağıt
+Name[uk]=Перекинути вертикально
+Name[uz]=Eni boʻyicha burish
+Name[uz@cyrillic]=Эни бўйича буриш
+Name[vi]=Lật dọc
+Name[zh_CN]=上下翻转
+Name[zh_TW]=垂直翻轉
+Icon=2uparrow
+Exec=jpegorient v %F
+
+[Desktop Action jpegFlipH]
+Name=Flip Horizontally
+Name[ar]=تدوير أفقي
+Name[az]=Üfüqi Olaraq Çevir
+Name[bg]=Хоризонтално обръщане
+Name[bs]=Obrni horizontalno
+Name[ca]=Torna horitzontal
+Name[cs]=Převrátit vodorovně
+Name[cy]=Troi Drosodd yn Llorweddol
+Name[da]=Flip vandret
+Name[de]=Horizontal kippen
+Name[el]=Αναστροφή οριζόντια
+Name[eo]=Inversigu horizontale
+Name[es]=Reflejar horizontalmente
+Name[et]=Keera ümber horisontaalselt
+Name[eu]=Biratu horizontalki
+Name[fa]=قرینۀ افقی
+Name[fi]=Käännä vaakasuorassa
+Name[fr]=Retourner horizontalement
+Name[fy]=Horizontaal omdraaie
+Name[ga]=Smeach go Cothrománach
+Name[gl]=Inverter Horizontalmente
+Name[he]=שקף אופקית
+Name[hi]=आड़ा पलटें
+Name[hr]=Prevrni vodoravno
+Name[hu]=Tükrözés vízszintesen
+Name[is]=Snúa við um miðju lárétt
+Name[it]=Fletti orizzontalmente
+Name[ja]=左右反転
+Name[ka]=ჰორიზონტალურად შეტრიალება
+Name[kk]=Төңкеру
+Name[km]=ត្រឡប់​​ផ្ដេក
+Name[lt]=Versti horizontaliai
+Name[mk]=Преврти хоризонтално
+Name[ms]=Balikkan Melintang
+Name[nb]=Speilvend vannrett
+Name[nds]=Waagrecht ümdreihen
+Name[ne]=तेर्सो गरी फ्लिप गर्नुहोस्
+Name[nl]=Horizontaal omdraaien
+Name[nn]=Snu vassrett
+Name[pa]=ਖਿਤਿਜੀ ਝਟਕੋ
+Name[pl]=Odwróć poziomo
+Name[pt]=Inverter Horizontalmente
+Name[pt_BR]=Refletir Horizontalmente
+Name[ro]=Întoarce pe orizontală
+Name[ru]=Отразить горизонтально
+Name[sk]=Preklopiť horizontálne
+Name[sl]=Obrni vodoravno
+Name[sr]=Преврни водоравно
+Name[sr@Latn]=Prevrni vodoravno
+Name[sv]=Vänd horisontellt
+Name[ta]=இடம்வலமாக திருப்புக
+Name[tg]=Баргардондан ба уфуқӣ
+Name[tr]=Yatay Olarak Dağıt
+Name[uk]=Перекинути горизонтально
+Name[uz]=Boʻyi boʻyicha burish
+Name[uz@cyrillic]=Бўйи бўйича буриш
+Name[vi]=Lật ngang
+Name[zh_CN]=左右翻转
+Name[zh_TW]=水平翻轉
+Icon=2rightarrow
+Exec=jpegorient h %F
diff --git a/konq-plugins/imagerotation/orient.py b/konq-plugins/imagerotation/orient.py
new file mode 100755
index 0000000..0671876
--- /dev/null
+++ b/konq-plugins/imagerotation/orient.py
@@ -0,0 +1,104 @@
+#! /usr/bin/env python
+import os
+import sys
+import exif
+
+def compose(delta, old):
+ map=[0, 4, 2, 6, 5, 1, 7, 3]
+ unmap=[1, 6, 3, 8, 2, 5, 4, 7]
+ x = map[delta-1]
+ y = map[old-1]
+ z = ((x^y)&4) + ((y+(x&3)*(((y&4)>>1)+1))&3)
+ return unmap[z]
+
+def deg2o(d):
+ map={90:6, 270:8, 180:3}
+ if map.has_key(d):
+ return map[d]
+ else:
+ return 0
+
+if len(sys.argv) < 2:
+ print 'Usage: %s [[+]orientnum] file\n' % sys.argv[0]
+ sys.exit(1)
+try:
+ if len(sys.argv) == 2:
+ filename=sys.argv[1]
+ file=open(filename, "r");
+ else:
+ filename=sys.argv[2]
+ mod=sys.argv[1]
+ fd = os.open(filename, os.O_RDWR)
+ file=os.fdopen(fd,'r')
+ # check file exists and is readable
+ file.read(1)
+ file.seek(0,0)
+except:
+ print 'Cannot open', filename
+ sys.exit(1)
+
+tags=exif.process_file(file,0,1)
+if not tags:
+ print 'no EXIF information in', filename
+ sys.exit(1)
+if not tags.has_key('Exif Offset') \
+ or not tags.has_key('Image Orientation'):
+ print 'cannot get orientation info in', filename
+ sys.exit(1)
+
+exifp = tags['Exif Offset']
+endian = tags['Exif Endian']
+tagp = tags['Image Orientation'].field_offset
+
+orientp = exifp + tagp
+
+if endian == 'M': # MM byte order
+ orientp += 1
+
+file.seek(orientp)
+o = ord(file.read(1))
+
+if o < 1 or o > 8:
+ print 'orientation out of range', o
+ sys.exit(1)
+
+if len(sys.argv) == 2:
+ print 'orientation is', o
+ sys.exit(0)
+
+try:
+ if mod[0] == '+':
+ deltao = int(mod)
+ if 1 <= deltao and deltao <= 8:
+ newo = compose(deltao, o)
+ elif deg2o(deltao) != 0:
+ newo = compose(deg2o(deltao), o)
+ else:
+ print 'cannot understand orientation modification', mod
+ sys.exit(1) # it will still hit the except ... how to fix?
+ else:
+ newo = int(mod)
+except:
+ print 'expected numeric orientation and got',mod
+ sys.exit(1)
+
+if newo < 1 or newo > 8:
+ newo = deg2o(newo)
+ if newo == 0:
+ print 'cannot understand orientation', deltao
+ sys.exit(1)
+
+os.lseek(fd,orientp,0)
+os.write(fd,chr(newo))
+
+# Thumbnail orientation :
+thumb_ifdp = 0
+if tags.has_key('Thumbnail Orientation'):
+ thumb_tagp = tags['Thumbnail Orientation'].field_offset
+ thumb_orientp = exifp + thumb_tagp
+ if endian == 'M': # MM byte order
+ thumb_orientp += 1
+ os.lseek(fd,thumb_orientp,0)
+ os.write(fd,chr(newo))
+
+print 'orientation changed from', o, 'to', newo
diff --git a/konq-plugins/khtmlsettingsplugin/Makefile.am b/konq-plugins/khtmlsettingsplugin/Makefile.am
new file mode 100644
index 0000000..1c98400
--- /dev/null
+++ b/konq-plugins/khtmlsettingsplugin/Makefile.am
@@ -0,0 +1,18 @@
+INCLUDES = $(all_includes)
+
+kde_module_LTLIBRARIES = libkhtmlsettingsplugin.la
+
+libkhtmlsettingsplugin_la_SOURCES = settingsplugin.cpp
+libkhtmlsettingsplugin_la_LIBADD = $(LIB_KHTML)
+libkhtmlsettingsplugin_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+
+pluginsdir = $(kde_datadir)/khtml/kpartplugins
+plugins_DATA = khtmlsettingsplugin.rc khtmlsettingsplugin.desktop
+
+appsdir = $(kde_appsdir)/.hidden
+apps_DATA = khtmlsettingsplugin.desktop
+
+METASOURCES = AUTO
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/khtmlsettingsplugin.pot
diff --git a/konq-plugins/khtmlsettingsplugin/khtmlsettingsplugin.desktop b/konq-plugins/khtmlsettingsplugin/khtmlsettingsplugin.desktop
new file mode 100644
index 0000000..94ff35a
--- /dev/null
+++ b/konq-plugins/khtmlsettingsplugin/khtmlsettingsplugin.desktop
@@ -0,0 +1,136 @@
+[Desktop Entry]
+X-KDE-Library=khtmlsettingsplugin
+X-KDE-PluginInfo-Author=Carsten Pfeiffer
+X-KDE-PluginInfo-Email=pfeiffer@kde.org
+X-KDE-PluginInfo-Name=khtmlsettingsplugin
+X-KDE-PluginInfo-Version=3.3
+X-KDE-PluginInfo-Website=
+X-KDE-PluginInfo-Category=Tools
+X-KDE-PluginInfo-Depends=
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=true
+Name=KHTML Settings
+Name[af]=Khtml Instellings
+Name[ar]=اعدادات KHTML
+Name[az]=KHTML Qurğuları
+Name[bg]=Настройки на KHTML
+Name[br]=Dibarzhoù KHTML
+Name[bs]=KHTML postavke
+Name[ca]=Preferències KHTML
+Name[cs]=Nastavení KHTML
+Name[cy]=Gosodiadau KHTML
+Name[da]=KHTML-opsætning
+Name[de]=KHTML-Einstellungen
+Name[el]=Ρυθμίσεις KHTML
+Name[eo]=KHTML-agordo
+Name[es]=Preferencias de KHTML
+Name[et]=KHTML seadistused
+Name[eu]=KHTMLren ezarpenak
+Name[fa]=تنظیمات KHTML
+Name[fi]=KHTML-asetukset
+Name[fo]=KHTML-uppseting
+Name[fr]=Réglages KHTML
+Name[fy]=KHTML-ynstellingen
+Name[ga]=Socruithe KHTML
+Name[gl]=Configuración de KHTML
+Name[he]=הגדרות KHTML
+Name[hi]=के-एचटीएमएल विन्यास
+Name[hr]=KHTML postavke
+Name[hu]=KHTML-beállítások
+Name[it]=Impostazioni KHTML
+Name[ja]=KHTML 設定
+Name[ka]=KHTML პარამეტრები
+Name[kk]=KHTML параметрлері
+Name[km]=ការ​កំណត់​ KHTML
+Name[lt]=KHTML nustatymai
+Name[mk]=Поставувања за KHTML
+Name[ms]=Seting KHTML
+Name[nb]=KHTML-innstillinger
+Name[nds]=KHTML-Instellen
+Name[ne]=केएचटीएमएल सेटिङ
+Name[nl]=KHTML-instellingen
+Name[nn]=KHTML-innstillingar
+Name[pa]=KHTML ਸਥਾਪਨ
+Name[pl]=Ustawienia KHTML
+Name[pt]=Configuração do KHTML
+Name[pt_BR]=Configurações KHTML
+Name[ro]=Setări KHTML
+Name[ru]=Параметры KHTML
+Name[sk]=KHTML nastavenia
+Name[sl]=Nastavitve KHTML
+Name[sr]=Подешавања KHTML-а
+Name[sr@Latn]=Podešavanja KHTML-a
+Name[sv]=KHTML-inställningar
+Name[ta]=KHTML அமைப்புகள்
+Name[tg]=Танзимотҳои KHTML
+Name[tr]=KHTML Ayarları
+Name[uk]=Параметри KHTML
+Name[uz]=KHTML moslamalari
+Name[uz@cyrillic]=KHTML мосламалари
+Name[vi]=Thiết lập KHTML
+Name[xh]=Ucwangciso lwe KHTML
+Name[zh_CN]=KHTML 设置
+Name[zh_TW]=KHTML 設定
+Comment=Fast way to change the KHTML settings
+Comment[af]=Vinnige weg na verander die Khtml instellings
+Comment[ar]=طريقة سهلة لتغيير اعدادات KHTML
+Comment[az]=KHTML qurğularını dəyişdirmənin sür'ətli yolu
+Comment[bg]=Бърз начин да се променят някои от най-важните настройки на KHTML
+Comment[bs]=Brz način za mijenjanje KHTML postavki
+Comment[ca]=Per a canviar ràpidament les preferències de KHTML
+Comment[cs]=Rychlé přepínání nastavení KHTML
+Comment[cy]=Ffordd cyflym o newid y gosodiadau KHTML
+Comment[da]=Hurtig måde at ændre KHTML-opsætningen på
+Comment[de]=Schnelle Möglichkeiten zur Änderung der KHTML-Einstellungen
+Comment[el]=Γρήγορος τρόπος αλλαγής των ρυθμίσεων του KHTML
+Comment[eo]=Rapida kielo por ŝanĝi la KHTML-agordon
+Comment[es]=Una forma rápida de cambiar las preferencias de KHTML
+Comment[et]=Kiirmeetod muuta KHTML seadistusi
+Comment[eu]=KHTMLren ezarpenak aldatzeko bide azkarra
+Comment[fa]=روش سریع تغییر تنظیمات KHTML
+Comment[fi]=Nopea tapa muuttaa KHTML asetuksia
+Comment[fo]=Snarvegur uppsetingin av KHTML
+Comment[fr]=Méthode rapide pour configurer les réglages KHTML
+Comment[fy]=Snelle manier om de ynstellingen fan KHTML te wizigjen
+Comment[gl]=Unha forma rápida de alterar a configuración de KHTML
+Comment[he]=דרך מהירה לשנות את ההגדרות של KHTML
+Comment[hi]=के-एचटीएमएल विन्यास बदलने का तेज तरीका
+Comment[hr]=Brz način izmjene KHTML postavki
+Comment[hu]=A KHTML objektum beállításai
+Comment[is]=Fljótvirk leið til að stilla KHTML
+Comment[it]=Modo veloce per cambiare le impostazioni KHTML
+Comment[ja]=KHTML 設定を素早く変更します
+Comment[ka]=KHTML პარამეტრების შეცვლის სწრაფი გზა
+Comment[kk]=KHTML параметрлерін шұғыл өзгертудің жолы
+Comment[km]=​វិធី​ដ៏​​រហ័ស​ដើម្បី​ផ្លាស់ប្ដូរ​ការ​កំណត់ KHTML
+Comment[lt]=Greitas būdas KHTML parinktims pakeisti
+Comment[mk]=Брз начин за промена на поставувањата за KHTML
+Comment[ms]=Cara pantas untuk mengubah seting KHTML
+Comment[nb]=Rask måte å endre KHTML-innstillinger
+Comment[nds]=De KHTML-Instellen gau ännern
+Comment[ne]=केएचटीएमएल सेटिङ परिवर्तन गर्ने छिटो तरिका
+Comment[nl]=Snelle manier om de instellingen van KHTML te wijzigen
+Comment[nn]=Ein rask måte å endra KHTML-innstillingane
+Comment[pl]=Szybka zmiana ustawień KHTML
+Comment[pt]=Uma forma rápida de alterar a configuração do KHTML
+Comment[pt_BR]=Modo rápido de mudar as configurações do KHTML
+Comment[ro]=Configurează rapid şi uşor setările KHTML
+Comment[ru]=Быстрое изменение параметров KHTML
+Comment[sk]=Rýchla cesta ako zmeniť nastavenia KHTML
+Comment[sl]=Hiter način za spreminjanje nastavitev KHTML
+Comment[sr]=Брз начин за промену подешавања KHTML-а
+Comment[sr@Latn]=Brz način za promenu podešavanja KHTML-a
+Comment[sv]=Snabbt sätt att ändra KHTML-inställningarna
+Comment[ta]=KHTML அமைப்புகளை மாற்றுவதற்கான விரைவான வழி
+Comment[tg]=Тағйирёбии тези танзимотҳои KHTML
+Comment[tr]=KHTML ayarlarını değiştirmek için hızlı bir yol
+Comment[uk]=Швидкий шлях змінити параметри KHTML
+Comment[uz]=KHTML moslamalarini tez oʻzgartirish yoʻli
+Comment[uz@cyrillic]=KHTML мосламаларини тез ўзгартириш йўли
+Comment[vi]=Cách thay đổi nhanh thiết lập KHTML
+Comment[xh]=Indlela ekhawulezayo yokutshintsha ucwangciso lwe KHTML
+Comment[zh_CN]=改变 KHTML 设置的快速方式
+Comment[zh_TW]=快速變更 KHTML 設定的方法
+X-KDE-ParentApp=konqueror
+Icon=configure
+DocPath=konq-plugins/khtmlsettings/index.html
diff --git a/konq-plugins/khtmlsettingsplugin/khtmlsettingsplugin.lsm b/konq-plugins/khtmlsettingsplugin/khtmlsettingsplugin.lsm
new file mode 100644
index 0000000..29d3818
--- /dev/null
+++ b/konq-plugins/khtmlsettingsplugin/khtmlsettingsplugin.lsm
@@ -0,0 +1,18 @@
+Begin3
+Title: KHTMLSettingsPlugin -- Java/Javascript/Cookies settings
+Version: 0.1
+Entered-date: 01/28/2001
+Description: Puts a button with a dropdown menu with settings for
+ Java,Javascript,Cookies and Image-loading into Konqueror's
+ Extra-Toolbar
+Keywords: KDE Qt
+Author: Carsten Pfeiffer <pfeiffer@kde.org>
+Maintained-by: Carsten Pfeiffer <pfeiffer@kde.org>
+Home-page:
+Alternate-site: http://devel-home.kde.org/~pfeiffer/
+Primary-site: ftp://ftp.kde.org/pub/kde/unstable/apps/utils
+ xxxxxx khtmlsettingsplugin-0.1.tar.gz
+ xxx khtmlsettingsplugin-0.1.lsm
+Platform: Linux. Needs Qt 2.2.x and KDE 2.0 (KDE 2.1 for Cookie config)
+Copying-policy: GPL
+End
diff --git a/konq-plugins/khtmlsettingsplugin/khtmlsettingsplugin.rc b/konq-plugins/khtmlsettingsplugin/khtmlsettingsplugin.rc
new file mode 100644
index 0000000..916a52e
--- /dev/null
+++ b/konq-plugins/khtmlsettingsplugin/khtmlsettingsplugin.rc
@@ -0,0 +1,11 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="khtmlsettingsplugin" library="libkhtmlsettingsplugin" version="3">
+<MenuBar>
+ <Menu name="tools"><Text>&amp;Tools</Text>
+ <Action name="action menu"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="extraToolBar"><text>Extra Toolbar</text>
+ <Action name="action menu"/>
+</ToolBar>
+</kpartplugin>
diff --git a/konq-plugins/khtmlsettingsplugin/settingsplugin.cpp b/konq-plugins/khtmlsettingsplugin/settingsplugin.cpp
new file mode 100644
index 0000000..74f2613
--- /dev/null
+++ b/konq-plugins/khtmlsettingsplugin/settingsplugin.cpp
@@ -0,0 +1,328 @@
+/* This file is part of the KDE project
+ Copyright (C) 2001 Carsten Pfeiffer <pfeiffer@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <dcopclient.h>
+
+#include <kapplication.h>
+#include <kaction.h>
+#include <kconfig.h>
+#include <kglobal.h>
+#include <khtml_part.h>
+#include <kinstance.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kpopupmenu.h>
+#include <kprotocolmanager.h>
+#include <kgenericfactory.h>
+#include <kaboutdata.h>
+
+#include "settingsplugin.h"
+
+typedef KGenericFactory<SettingsPlugin> SettingsPluginFactory;
+static const KAboutData aboutdata("khtmlsettingsplugin", I18N_NOOP("HTML Settings") , "1.0" );
+K_EXPORT_COMPONENT_FACTORY( libkhtmlsettingsplugin,
+ SettingsPluginFactory( &aboutdata ) )
+
+SettingsPlugin::SettingsPlugin( QObject* parent, const char* name,
+ const QStringList & )
+ : KParts::Plugin( parent, name ), mConfig(0)
+{
+
+ setInstance(SettingsPluginFactory::instance());
+
+ if ( !kapp->dcopClient()->isAttached() )
+ kapp->dcopClient()->attach();
+
+ KActionMenu *menu = new KActionMenu( i18n("HTML Settings"), "configure",
+ actionCollection(), "action menu" );
+ menu->setDelayed( false );
+
+ KToggleAction *action;
+
+
+ action = new KToggleAction( i18n("Java&Script"), 0,
+ this, SLOT(toggleJavascript()),
+ actionCollection(), "javascript" );
+ menu->insert( action );
+
+ action = new KToggleAction( i18n("&Java"), 0,
+ this, SLOT(toggleJava()),
+ actionCollection(), "java" );
+ menu->insert( action );
+
+ action = new KToggleAction( i18n("&Cookies"), 0,
+ this, SLOT(toggleCookies()),
+ actionCollection(), "cookies" );
+ menu->insert( action );
+
+ action = new KToggleAction( i18n("&Plugins"), 0,
+ this, SLOT(togglePlugins()),
+ actionCollection(), "plugins" );
+ menu->insert( action );
+
+ action = new KToggleAction( i18n("Autoload &Images"), 0,
+ this, SLOT(toggleImageLoading()),
+ actionCollection(), "imageloading" );
+ menu->insert( action );
+
+ menu->insert( new KActionSeparator(actionCollection()) );
+
+ action = new KToggleAction( i18n("Enable Pro&xy"), 0,
+ this, SLOT(toggleProxy()),
+ actionCollection(), "useproxy" );
+ action->setCheckedState(i18n("Disable Pro&xy"));
+ menu->insert( action );
+
+ action = new KToggleAction( i18n("Enable Cac&he"), 0,
+ this, SLOT(toggleCache()),
+ actionCollection(), "usecache" );
+ action->setCheckedState(i18n("Disable Cac&he"));
+ menu->insert( action );
+
+
+ KSelectAction *sAction = new KSelectAction( i18n("Cache Po&licy"), 0,
+ 0, 0, actionCollection(),
+ "cachepolicy" );
+ QStringList policies;
+ policies += i18n( "&Keep Cache in Sync" );
+ policies += i18n( "&Use Cache if Possible" );
+ policies += i18n( "&Offline Browsing Mode" );
+ sAction->setItems( policies );
+ connect( sAction, SIGNAL( activated( int ) ), SLOT( cachePolicyChanged(int) ) );
+
+ menu->insert( sAction );
+
+ connect( menu->popupMenu(), SIGNAL( aboutToShow() ), SLOT( showPopup() ));
+}
+
+SettingsPlugin::~SettingsPlugin()
+{
+ delete mConfig;
+}
+
+void SettingsPlugin::showPopup()
+{
+ if( !parent() || !parent()->inherits("KHTMLPart"))
+ return;
+
+ if (!mConfig)
+ mConfig = new KConfig("settingspluginrc", false, false);
+
+ KHTMLPart *part = static_cast<KHTMLPart *>( parent() );
+
+ KProtocolManager::reparseConfiguration();
+ bool cookies = cookiesEnabled( part->url().url() );
+
+ ((KToggleAction*)actionCollection()->action("useproxy"))->setChecked(KProtocolManager::useProxy());
+ ((KToggleAction*)actionCollection()->action("java"))->setChecked( part->javaEnabled() );
+ ((KToggleAction*)actionCollection()->action("javascript"))->setChecked( part->jScriptEnabled() );
+ ((KToggleAction*)actionCollection()->action("cookies"))->setChecked( cookies );
+ ((KToggleAction*)actionCollection()->action("plugins"))->setChecked( part->pluginsEnabled() );
+ ((KToggleAction*)actionCollection()->action("imageloading"))->setChecked( part->autoloadImages() );
+ ((KToggleAction*)actionCollection()->action("usecache"))->setChecked(KProtocolManager::useCache());
+
+ KIO::CacheControl cc = KProtocolManager::cacheControl();
+ switch ( cc )
+ {
+ case KIO::CC_Verify:
+ ((KSelectAction*)actionCollection()->action("cachepolicy"))->setCurrentItem( 0 );
+ break;
+ case KIO::CC_CacheOnly:
+ ((KSelectAction*)actionCollection()->action("cachepolicy"))->setCurrentItem( 2 );
+ break;
+ case KIO::CC_Cache:
+ ((KSelectAction*)actionCollection()->action("cachepolicy"))->setCurrentItem( 1 );
+ break;
+ case KIO::CC_Reload: // nothing for now
+ case KIO::CC_Refresh:
+ default:
+ break;
+
+ }
+}
+
+void SettingsPlugin::toggleJava()
+{
+ if( parent() && parent()->inherits("KHTMLPart"))
+ {
+ KHTMLPart *part = static_cast<KHTMLPart *>(parent());
+ part->setJavaEnabled( ((KToggleAction*)actionCollection()->action("java"))->isChecked() );
+ }
+}
+
+void SettingsPlugin::toggleJavascript()
+{
+ if( parent() && parent()->inherits("KHTMLPart"))
+ {
+ KHTMLPart *part = static_cast<KHTMLPart *>(parent());
+ part->setJScriptEnabled( ((KToggleAction*)actionCollection()->action("javascript"))->isChecked() );
+ }
+}
+
+void SettingsPlugin::toggleCookies()
+{
+ if( !parent() || !parent()->inherits("KHTMLPart"))
+ return;
+
+ KHTMLPart *part = static_cast<KHTMLPart *>( parent() );
+
+ QString advice;
+ bool enable = ((KToggleAction*)actionCollection()->action("cookies"))->isChecked();
+ advice = enable ? "Accept" : "Reject";
+
+ QCString replyType;
+ QByteArray data, replyData;
+ QDataStream stream( data, IO_WriteOnly );
+ stream << part->url().url() << advice;
+ bool ok = kapp->dcopClient()->call( "kded", "kcookiejar",
+ "setDomainAdvice(QString,QString)",
+ data, replyType, replyData, true );
+
+ if ( !ok )
+ KMessageBox::sorry( part->widget(),
+ i18n("I can't enable cookies, because the "
+ "cookie daemon could not be started."),
+ i18n("Cookies Disabled"));
+}
+
+void SettingsPlugin::togglePlugins()
+{
+ if( parent() && parent()->inherits("KHTMLPart"))
+ {
+ KHTMLPart *part = static_cast<KHTMLPart *>(parent());
+ part->setPluginsEnabled( ((KToggleAction*)actionCollection()->action("plugins"))->isChecked() );
+ }
+}
+
+void SettingsPlugin::toggleImageLoading()
+{
+ if( parent() && parent()->inherits("KHTMLPart"))
+ {
+ KHTMLPart *part = static_cast<KHTMLPart *>(parent());
+ part->setAutoloadImages( ((KToggleAction*)actionCollection()->action("imageloading"))->isChecked() );
+ }
+}
+
+bool SettingsPlugin::cookiesEnabled( const QString& url )
+{
+ QByteArray data, reply;
+ QCString replyType;
+ QDataStream stream( data, IO_WriteOnly );
+ stream << url;
+ kapp->dcopClient()->call( "kcookiejar", "kcookiejar", "getDomainAdvice(QString)", data, replyType, reply, true );
+
+ bool enabled = false;
+
+ if ( replyType == "QString" )
+ {
+ QString advice;
+ QDataStream s( reply, IO_ReadOnly );
+ s >> advice;
+ enabled = ( advice == "Accept" );
+ if ( !enabled && advice == "Dunno" ) {
+ // TODO, check the global setting via dcop
+ KConfig kc( "kcookiejarrc", true, false );
+ kc.setGroup( "Cookie Policy" );
+ enabled =
+ (kc.readEntry( "CookieGlobalAdvice", "Reject" ) == "Accept");
+ }
+ }
+
+ return enabled;
+}
+
+
+//
+// sync with kcontrol/kio/ksaveioconfig.* !
+//
+
+void SettingsPlugin::toggleProxy()
+{
+ bool enable = ((KToggleAction*)actionCollection()->action("useproxy"))->isChecked();
+
+ int type;
+
+ if( enable )
+ type = mConfig->readNumEntry( "SavedProxyType", KProtocolManager::ManualProxy );
+ else
+ {
+ mConfig->writeEntry( "SavedProxyType", KProtocolManager::proxyType() );
+ type = KProtocolManager::NoProxy;
+ }
+
+ KConfig config("kioslaverc", false, false);
+ config.setGroup( "Proxy Settings" );
+ config.writeEntry( "ProxyType", type );
+
+ ((KToggleAction*)actionCollection()->action("useproxy"))->setChecked(enable);
+ updateIOSlaves();
+}
+
+
+void SettingsPlugin::toggleCache()
+{
+ bool usesCache = KProtocolManager::useCache();
+ KConfig config( "kio_httprc", false, false );
+ config.writeEntry( "UseCache", !usesCache );
+
+ ((KToggleAction*)actionCollection()->action("usecache"))->setChecked( !usesCache );
+
+ updateIOSlaves();
+}
+
+void SettingsPlugin::cachePolicyChanged( int p )
+{
+ QString policy;
+
+ switch ( p ) {
+ case 0:
+ policy = KIO::getCacheControlString( KIO::CC_Verify );
+ break;
+ case 1:
+ policy = KIO::getCacheControlString( KIO::CC_Cache );
+ break;
+ case 2:
+ policy = KIO::getCacheControlString( KIO::CC_CacheOnly );
+ break;
+ };
+
+ if ( !policy.isEmpty() ) {
+ KConfig config("kio_httprc", false, false);
+ config.writeEntry("cache", policy);
+
+ updateIOSlaves();
+ }
+}
+
+void SettingsPlugin::updateIOSlaves()
+{
+ QByteArray data;
+ QDataStream stream( data, IO_WriteOnly );
+
+ DCOPClient* client = kapp->dcopClient();
+ if ( !client->isAttached() )
+ client->attach();
+
+ QString protocol; // null -> all of them
+ stream << protocol;
+ client->send( "*", "KIO::Scheduler",
+ "reparseSlaveConfiguration(QString)", data );
+}
+
+#include "settingsplugin.moc"
diff --git a/konq-plugins/khtmlsettingsplugin/settingsplugin.h b/konq-plugins/khtmlsettingsplugin/settingsplugin.h
new file mode 100644
index 0000000..367846b
--- /dev/null
+++ b/konq-plugins/khtmlsettingsplugin/settingsplugin.h
@@ -0,0 +1,56 @@
+/* This file is part of the KDE project
+ Copyright (C) 2001 Carsten Pfeiffer <pfeiffer@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SETTINGS_PLUGIN
+#define SETTINGS_PLUGIN
+
+#include <kparts/plugin.h>
+#include <klibloader.h>
+
+class KConfig;
+
+class SettingsPlugin : public KParts::Plugin
+{
+ Q_OBJECT
+public:
+ SettingsPlugin( QObject* parent, const char* name,
+ const QStringList & );
+ virtual ~SettingsPlugin();
+
+private:
+ bool cookiesEnabled( const QString& url );
+ void updateIOSlaves();
+
+private slots:
+ void toggleJavascript();
+ void toggleJava();
+ void toggleCookies();
+ void togglePlugins();
+ void toggleImageLoading();
+ void toggleProxy();
+ void toggleCache();
+ void cachePolicyChanged( int p );
+
+ void showPopup();
+
+private:
+ KConfig* mConfig;
+};
+
+#endif // SETTINGS_PLUGIN
diff --git a/konq-plugins/kimgalleryplugin/Makefile.am b/konq-plugins/kimgalleryplugin/Makefile.am
new file mode 100644
index 0000000..1efb965
--- /dev/null
+++ b/konq-plugins/kimgalleryplugin/Makefile.am
@@ -0,0 +1,21 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = libkimgallery.la
+libkimgallery_la_SOURCES = imgalleryplugin.cpp imgallerydialog.cpp
+libkimgallery_la_LIBADD = -lkonq
+libkimgallery_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+iconviewdir = $(kde_datadir)/konqiconview/kpartplugins
+iconview_DATA = kimgalleryplugin.rc kimgalleryplugin.desktop
+
+listviewdir = $(kde_datadir)/konqlistview/kpartplugins
+listview_DATA = kimgalleryplugin.rc kimgalleryplugin.desktop
+
+appsdir = $(kde_appsdir)/.hidden
+apps_DATA = kimgalleryplugin.desktop
+
+KDE_ICON = imagegallery
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/imgalleryplugin.pot
diff --git a/konq-plugins/kimgalleryplugin/cr16-action-imagegallery.png b/konq-plugins/kimgalleryplugin/cr16-action-imagegallery.png
new file mode 100644
index 0000000..537e4f1
--- /dev/null
+++ b/konq-plugins/kimgalleryplugin/cr16-action-imagegallery.png
Binary files differ
diff --git a/konq-plugins/kimgalleryplugin/cr22-action-imagegallery.png b/konq-plugins/kimgalleryplugin/cr22-action-imagegallery.png
new file mode 100644
index 0000000..af66538
--- /dev/null
+++ b/konq-plugins/kimgalleryplugin/cr22-action-imagegallery.png
Binary files differ
diff --git a/konq-plugins/kimgalleryplugin/imgallerydialog.cpp b/konq-plugins/kimgalleryplugin/imgallerydialog.cpp
new file mode 100644
index 0000000..54db458
--- /dev/null
+++ b/konq-plugins/kimgalleryplugin/imgallerydialog.cpp
@@ -0,0 +1,455 @@
+/* This file is part of the KDE project
+
+Copyright (C) 2001, 2003 Lukas Tinkl <lukas@kde.org>
+Andreas Schlapbach <schlpbch@iam.unibe.ch>
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License version 2 as published by the Free Software Foundation.
+
+This library 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 the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public License
+along with this library; see the file COPYING.LIB. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.
+*/
+
+#include <qlabel.h>
+#include <qvbox.h>
+#include <qgroupbox.h>
+#include <qlayout.h>
+#include <qcombobox.h>
+#include <qwhatsthis.h>
+#include <qcheckbox.h>
+#include <qlineedit.h>
+#include <qspinbox.h>
+
+
+#include <klocale.h>
+#include <kurl.h>
+#include <kfontdialog.h>
+#include <kiconloader.h>
+#include <kdebug.h>
+#include <klineedit.h>
+#include <knuminput.h>
+#include <kcolorbutton.h>
+#include <kurlrequester.h>
+#include <kglobalsettings.h>
+#include <kconfig.h>
+
+#include "imgallerydialog.h"
+#include "imgallerydialog.moc"
+
+KIGPDialog::KIGPDialog(QWidget *parent, const QString& path, const char *name )
+ : KDialogBase( IconList, i18n("Configure"), Default|Ok|Cancel,
+ Ok, parent, name, true, true ),
+ m_dialogOk( false )
+{
+ m_path = path;
+ setCaption(i18n("Create Image Gallery"));
+ setButtonOK( KGuiItem(i18n("Create"),"imagegallery") );
+ m_config = new KConfig("kimgallerypluginrc", false, false);
+ setupLookPage(path);
+ setupDirectoryPage(path);
+ setupThumbnailPage(path);
+}
+
+void KIGPDialog::slotDefault()
+{
+ m_title->setText(i18n("Image Gallery for %1").arg(m_path));
+ m_imagesPerRow->setValue(4);
+ m_imageName->setChecked(true);
+ m_imageSize->setChecked(false);
+ m_imageProperty->setChecked(false);
+ m_fontName->setCurrentText( KGlobalSettings::generalFont().family() );
+ m_fontSize->setValue(14);
+ m_foregroundColor->setColor( QColor( "#d0ffd0") );
+ m_backgroundColor->setColor( QColor("#333333") );
+
+ m_imageNameReq->setURL(m_path + "images.html");
+ m_recurseSubDir->setChecked( false );
+ m_recursionLevel->setEnabled( false );
+ m_copyOriginalFiles->setChecked( false );
+ m_useCommentFile->setChecked( false );
+ m_commentFileReq->setURL(m_path + "comments");
+ m_commentFileReq->setEnabled( false );
+
+ m_imageFormat->setCurrentText( "JPEG");
+ m_thumbnailSize->setValue(140);
+ m_colorDepthSet->setChecked(false);
+ m_colorDepth->setCurrentText("8");
+}
+
+void KIGPDialog::setupLookPage(const QString& path) {
+ QFrame *page = addPage( i18n("Look"), i18n("Page Look"),
+ BarIcon("colorize", KIcon::SizeMedium ) );
+
+ m_config->setGroup("Look");
+ QVBoxLayout *vlay = new QVBoxLayout( page, 0, spacingHint() );
+
+ QLabel *label;
+
+ label = new QLabel( i18n("&Page title:"), page);
+ vlay->addWidget(label);
+
+ m_title = new QLineEdit(i18n("Image Gallery for %1").arg(path), page);
+ vlay->addWidget( m_title );
+ label->setBuddy(m_title);
+
+ m_imagesPerRow = new KIntNumInput(m_config->readNumEntry("ImagesPerRow", 4), page);
+ m_imagesPerRow->setRange(1, 8, 1, true );
+ m_imagesPerRow->setLabel( i18n("I&mages per row:") );
+ vlay->addWidget( m_imagesPerRow );
+
+ QGridLayout *grid = new QGridLayout( 2, 2 );
+ vlay->addLayout( grid );
+
+ m_imageName = new QCheckBox( i18n("Show image file &name"), page);
+ m_imageName->setChecked( m_config->readBoolEntry("ImageName", true) );
+ grid->addWidget( m_imageName, 0, 0 );
+
+ m_imageSize = new QCheckBox( i18n("Show image file &size"), page);
+ m_imageSize->setChecked( m_config->readBoolEntry("ImageSize", false) );
+ grid->addWidget( m_imageSize, 0, 1 );
+
+ m_imageProperty = new QCheckBox( i18n("Show image &dimensions"), page);
+ m_imageProperty->setChecked( m_config->readBoolEntry("ImageProperty", false) );
+ grid->addWidget( m_imageProperty, 1, 0 );
+
+ QHBoxLayout *hlay11 = new QHBoxLayout( );
+ vlay->addLayout( hlay11 );
+
+ m_fontName = new QComboBox( false,page );
+ QStringList standardFonts;
+ KFontChooser::getFontList(standardFonts, 0);
+ m_fontName->insertStringList( standardFonts );
+ m_fontName->setCurrentText( m_config->readEntry("FontName", KGlobalSettings::generalFont().family() ) );
+
+ label = new QLabel( i18n("Fon&t name:"), page );
+ label->setBuddy( m_fontName );
+ hlay11->addWidget( label );
+ hlay11->addStretch( 1 );
+ hlay11->addWidget( m_fontName );
+
+ QHBoxLayout *hlay12 = new QHBoxLayout( );
+ vlay->addLayout( hlay12 );
+
+ m_fontSize = new QSpinBox( 6, 15, 1, page );
+ m_fontSize->setValue( m_config->readNumEntry("FontSize", 14) );
+
+ label = new QLabel( i18n("Font si&ze:"), page );
+ label->setBuddy( m_fontSize );
+ hlay12->addWidget( label );
+ hlay12->addStretch( 1 );
+ hlay12->addWidget( m_fontSize );
+
+ QHBoxLayout *hlay1 = new QHBoxLayout( spacingHint() );
+ vlay->addLayout( hlay1 );
+
+ m_foregroundColor = new KColorButton(page);
+ m_foregroundColor->setColor( QColor( m_config->readEntry("ForegroundColor", "#d0ffd0") ) );
+
+ label = new QLabel( i18n("&Foreground color:"), page);
+ label->setBuddy( m_foregroundColor );
+ hlay1->addWidget( label );
+ hlay1->addStretch( 1 );
+ hlay1->addWidget(m_foregroundColor);
+
+ QHBoxLayout *hlay2 = new QHBoxLayout( spacingHint() );
+ vlay->addLayout( hlay2 );
+
+ m_backgroundColor = new KColorButton(page);
+ m_backgroundColor->setColor( QColor(m_config->readEntry("BackgroundColor", "#333333") ) );
+
+ label = new QLabel( i18n("&Background color:"), page);
+ hlay2->addWidget( label );
+ label->setBuddy( m_backgroundColor );
+ hlay2->addStretch( 1 );
+ hlay2->addWidget(m_backgroundColor);
+
+ vlay->addStretch(1);
+}
+
+void KIGPDialog::setupDirectoryPage(const QString& path) {
+ QFrame *page = addPage( i18n("Folders"), i18n("Folders"),
+ BarIcon("folder", KIcon::SizeMedium ) );
+
+ m_config->setGroup("Directory");
+ QVBoxLayout *dvlay = new QVBoxLayout( page, 0, spacingHint() );
+
+ QLabel *label;
+ label = new QLabel(i18n("&Save to HTML file:"), page);
+ dvlay->addWidget( label );
+ QString whatsThis;
+ whatsThis = i18n("<p>The name of the HTML file this gallery will be saved to.");
+ QWhatsThis::add( label, whatsThis );
+
+ m_imageNameReq = new KURLRequester(path + "images.html", page);
+ label->setBuddy( m_imageNameReq );
+ dvlay->addWidget(m_imageNameReq);
+ connect( m_imageNameReq, SIGNAL(textChanged(const QString&)),
+ this, SLOT(imageUrlChanged(const QString&)) );
+ QWhatsThis::add( m_imageNameReq, whatsThis );
+
+ const bool recurseSubDir = m_config->readBoolEntry("RecurseSubDirectories", false);
+ m_recurseSubDir = new QCheckBox(i18n("&Recurse subfolders"), page);
+ m_recurseSubDir->setChecked( recurseSubDir );
+ whatsThis = i18n("<p>Whether subfolders should be included for the "
+ "image gallery creation or not.");
+ QWhatsThis::add( m_recurseSubDir, whatsThis );
+
+ const int recursionLevel = m_config->readNumEntry("RecursionLevel", 0);
+ m_recursionLevel = new KIntNumInput( recursionLevel, page );
+ m_recursionLevel->setRange( 0, 99, 1, true );
+ m_recursionLevel->setLabel( i18n("Rec&ursion depth:") );
+ if ( recursionLevel == 0 )
+ m_recursionLevel->setSpecialValueText( i18n("Endless"));
+ m_recursionLevel->setEnabled(recurseSubDir);
+ whatsThis = i18n("<p>You can limit the number of folders the "
+ "image gallery creator will traverse to by setting an "
+ "upper bound for the recursion depth.");
+ QWhatsThis::add( m_recursionLevel, whatsThis );
+
+
+ connect(m_recurseSubDir, SIGNAL( toggled(bool) ),
+ m_recursionLevel, SLOT( setEnabled(bool) ) );
+
+ dvlay->addWidget(m_recurseSubDir);
+ dvlay->addWidget(m_recursionLevel);
+
+ m_copyOriginalFiles = new QCheckBox(i18n("Copy or&iginal files"), page);
+ m_copyOriginalFiles->setChecked(m_config->readBoolEntry("CopyOriginalFiles", false) );
+ dvlay->addWidget(m_copyOriginalFiles);
+ whatsThis = i18n("<p>This makes a copy of all images and the gallery will refer "
+ "to these copies instead of the original images.");
+ QWhatsThis::add( m_copyOriginalFiles, whatsThis );
+
+
+ const bool useCommentFile = m_config->readBoolEntry("UseCommentFile", false);
+ m_useCommentFile = new QCheckBox(i18n("Use &comment file"), page);
+ m_useCommentFile->setChecked(useCommentFile);
+ dvlay->addWidget(m_useCommentFile);
+
+ whatsThis = i18n("<p>If you enable this option you can specify "
+ "a comment file which will be used for generating "
+ "subtitles for the images."
+ "<p>For details about the file format please see "
+ "the \"What's This?\" help below.");
+ QWhatsThis::add( m_useCommentFile, whatsThis );
+
+ label = new QLabel(i18n("Comments &file:"), page);
+ label->setEnabled( useCommentFile );
+ dvlay->addWidget( label );
+ whatsThis = i18n("<p>You can specify the name of the comment file here. "
+ "The comment file contains the subtitles for the images. "
+ "The format of this file is:"
+ "<p>FILENAME1:"
+ "<br>Description"
+ "<br>"
+ "<br>FILENAME2:"
+ "<br>Description"
+ "<br>"
+ "<br>and so on");
+ QWhatsThis::add( label, whatsThis );
+
+ m_commentFileReq = new KURLRequester(path + "comments", page);
+ m_commentFileReq->setEnabled(useCommentFile);
+ label->setBuddy( m_commentFileReq );
+ dvlay->addWidget(m_commentFileReq);
+ QWhatsThis::add( m_commentFileReq, whatsThis );
+
+ connect(m_useCommentFile, SIGNAL(toggled(bool)),
+ label, SLOT(setEnabled(bool)));
+ connect(m_useCommentFile, SIGNAL(toggled(bool)),
+ m_commentFileReq, SLOT(setEnabled(bool)));
+
+ dvlay->addStretch(1);
+}
+
+void KIGPDialog::setupThumbnailPage(const QString& path) {
+ QFrame *page = addPage( i18n("Thumbnails"), i18n("Thumbnails"),
+ BarIcon("thumbnail", KIcon::SizeMedium ) );
+
+ m_config->setGroup("Thumbnails");
+ QLabel *label;
+
+ QVBoxLayout *vlay = new QVBoxLayout( page, 0, spacingHint() );
+
+ QHBoxLayout *hlay3 = new QHBoxLayout( spacingHint() );
+ vlay->addLayout( hlay3 );
+
+ m_imageFormat = new QComboBox(false, page);
+ m_imageFormat->insertItem("JPEG");
+ m_imageFormat->insertItem("PNG");
+ m_imageFormat->setCurrentText( m_config->readEntry("ImageFormat", "JPEG") );
+
+ label = new QLabel( i18n("Image format f&or the thumbnails:"), page);
+ hlay3->addWidget( label );
+ label->setBuddy( m_imageFormat );
+ hlay3->addStretch( 1 );
+ hlay3->addWidget(m_imageFormat);
+
+ m_thumbnailSize = new KIntNumInput(m_config->readNumEntry("ThumbnailSize", 140), page);
+ m_thumbnailSize->setRange(10, 1000, 1, true );
+ m_thumbnailSize->setLabel( i18n("Thumbnail size:") );
+ vlay->addWidget( m_thumbnailSize );
+
+ QGridLayout *grid = new QGridLayout( 2, 2 );
+ vlay->addLayout( grid );
+
+ QHBoxLayout *hlay4 = new QHBoxLayout( spacingHint() );
+ vlay->addLayout( hlay4 );
+ const bool colorDepthSet = m_config->readBoolEntry("ColorDepthSet", false);
+ m_colorDepthSet = new QCheckBox(i18n("&Set different color depth:"), page);
+ m_colorDepthSet->setChecked(colorDepthSet);
+ hlay4->addWidget( m_colorDepthSet );
+
+ m_colorDepth = new QComboBox(false, page);
+ m_colorDepth->insertItem("1");
+ m_colorDepth->insertItem("8");
+ m_colorDepth->insertItem("16");
+ m_colorDepth->insertItem("32");
+ m_colorDepth->setCurrentText(m_config->readEntry("ColorDepth", "8"));
+ m_colorDepth->setEnabled(colorDepthSet);
+ hlay4->addWidget( m_colorDepth );
+
+ connect(m_colorDepthSet, SIGNAL( toggled(bool) ),
+ m_colorDepth, SLOT( setEnabled(bool) ) );
+
+ vlay->addStretch(1);
+
+}
+
+void KIGPDialog::writeConfig()
+{
+ m_config->setGroup("Look");
+ m_config->writeEntry("ImagesPerRow", getImagesPerRow());
+ m_config->writeEntry("ImageName", printImageName());
+ m_config->writeEntry("ImageSize", printImageSize());
+ m_config->writeEntry("ImageProperty", printImageProperty());
+ m_config->writeEntry("FontName", getFontName());
+ m_config->writeEntry("FontSize", getFontSize());
+ m_config->writeEntry("ForegroundColor", getForegroundColor().name() );
+ m_config->writeEntry("BackgroundColor", getBackgroundColor().name());
+
+ m_config->setGroup("Directory");
+ m_config->writeEntry("RecurseSubDirectories", recurseSubDirectories());
+ m_config->writeEntry("RecursionLevel", recursionLevel());
+ m_config->writeEntry("CopyOriginalFiles", copyOriginalFiles());
+ m_config->writeEntry("UseCommentFile", useCommentFile());
+
+ m_config->setGroup("Thumbnails");
+ m_config->writeEntry("ThumbnailSize", getThumbnailSize());
+ m_config->writeEntry("ColorDepth", getColorDepth());
+ m_config->writeEntry("ColorDepthSet", colorDepthSet());
+ m_config->writeEntry("ImageFormat", getImageFormat());
+ m_config->sync();
+}
+
+KIGPDialog::~KIGPDialog()
+{
+}
+
+void KIGPDialog::imageUrlChanged(const QString &url )
+{
+ enableButtonOK( !url.isEmpty());
+}
+
+bool KIGPDialog::printImageName() const
+{
+ return m_imageName->isChecked();
+}
+
+bool KIGPDialog::printImageSize() const
+{
+ return m_imageSize->isChecked();
+}
+
+bool KIGPDialog::printImageProperty() const
+{
+ return m_imageProperty->isChecked();
+}
+
+bool KIGPDialog::recurseSubDirectories() const
+{
+ return m_recurseSubDir->isChecked();
+}
+
+int KIGPDialog::recursionLevel() const
+{
+ return m_recursionLevel->value();
+}
+
+bool KIGPDialog::copyOriginalFiles() const
+{
+ return m_copyOriginalFiles->isChecked();
+}
+
+bool KIGPDialog::useCommentFile() const
+{
+ return m_useCommentFile->isChecked();
+}
+
+int KIGPDialog::getImagesPerRow() const
+{
+ return m_imagesPerRow->value();
+}
+
+int KIGPDialog::getThumbnailSize() const
+{
+ return m_thumbnailSize->value();
+}
+
+int KIGPDialog::getColorDepth() const
+{
+ return m_colorDepth->currentText().toInt();
+}
+
+bool KIGPDialog::colorDepthSet() const
+{
+ return m_colorDepthSet->isChecked();
+}
+
+const QString KIGPDialog::getTitle() const
+{
+ return m_title->text();
+}
+
+const QString KIGPDialog::getImageName() const
+{
+ return m_imageNameReq->url();
+}
+
+const QString KIGPDialog::getCommentFile() const
+{
+ return m_commentFileReq->url();
+}
+
+const QString KIGPDialog::getFontName() const
+{
+ return m_fontName->currentText();
+}
+
+const QString KIGPDialog::getFontSize() const
+{
+ return m_fontSize->text();
+}
+
+const QColor KIGPDialog::getBackgroundColor() const
+{
+ return m_backgroundColor->color();
+}
+
+const QColor KIGPDialog::getForegroundColor() const
+{
+ return m_foregroundColor->color();
+}
+
+const QString KIGPDialog::getImageFormat() const
+{
+ return m_imageFormat->currentText();
+}
diff --git a/konq-plugins/kimgalleryplugin/imgallerydialog.h b/konq-plugins/kimgalleryplugin/imgallerydialog.h
new file mode 100644
index 0000000..7aa6163
--- /dev/null
+++ b/konq-plugins/kimgalleryplugin/imgallerydialog.h
@@ -0,0 +1,113 @@
+/* This file is part of the KDE project
+
+ Copyright (C) 2001, 2003 Lukas Tinkl <lukas@kde.org>
+ Andreas Schlapbach <schlpbch@iam.unibe.ch>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef kimdialogplugin_h
+#define kimdialogplugin_h
+
+
+#include <kdialogbase.h>
+
+class QProgressDialog;
+class KURL;
+class KIntNumInput;
+class QCheckBox;
+class QLineEdit;
+class KURLRequester;
+class QSpinBox;
+class KColorButton;
+class KConfig;
+
+typedef QMap<QString,QString> CommentMap;
+
+class KIGPDialog : public KDialogBase
+{
+ Q_OBJECT
+
+ public:
+ KIGPDialog(QWidget *parent=0, const QString& path=0, const char *name=0 );
+ ~KIGPDialog();
+
+ bool isDialogOk() const;
+ bool printImageName() const;
+ bool printImageSize() const;
+ bool printImageProperty() const;
+ bool copyOriginalFiles() const;
+ bool useCommentFile() const;
+ bool recurseSubDirectories() const;
+ int recursionLevel() const;
+ bool colorDepthSet() const;
+
+ int getImagesPerRow() const;
+ int getThumbnailSize() const;
+ int getColorDepth() const;
+
+ const QString getTitle() const;
+ const QString getImageName() const;
+ const QString getCommentFile() const;
+ const QString getFontName() const;
+ const QString getFontSize() const;
+
+ const QColor getBackgroundColor() const;
+ const QColor getForegroundColor() const;
+
+ const QString getImageFormat() const;
+
+ void writeConfig();
+ protected slots:
+ void imageUrlChanged(const QString & );
+ void slotDefault();
+
+ private:
+ KColorButton *m_foregroundColor;
+ KColorButton *m_backgroundColor;
+
+ QLineEdit *m_title;
+ QString m_path;
+
+ KIntNumInput *m_imagesPerRow;
+ KIntNumInput *m_thumbnailSize;
+ KIntNumInput *m_recursionLevel;
+ QSpinBox *m_fontSize;
+
+ QCheckBox *m_copyOriginalFiles;
+ QCheckBox *m_imageName;
+ QCheckBox *m_imageSize;
+ QCheckBox *m_imageProperty;
+ QCheckBox *m_useCommentFile;
+ QCheckBox *m_recurseSubDir;
+ QCheckBox *m_colorDepthSet;
+
+ QComboBox* m_fontName;
+ QComboBox* m_imageFormat;
+ QComboBox* m_colorDepth;
+
+ KURLRequester *m_imageNameReq;
+ KURLRequester *m_commentFileReq;
+ bool m_dialogOk;
+
+ KConfig *m_config;
+
+ private:
+ void setupLookPage(const QString& path);
+ void setupDirectoryPage(const QString& path);
+ void setupThumbnailPage(const QString& path);
+};
+
+#endif
diff --git a/konq-plugins/kimgalleryplugin/imgalleryplugin.cpp b/konq-plugins/kimgalleryplugin/imgalleryplugin.cpp
new file mode 100644
index 0000000..43df35b
--- /dev/null
+++ b/konq-plugins/kimgalleryplugin/imgalleryplugin.cpp
@@ -0,0 +1,499 @@
+/* This file is part of the KDE project
+
+Copyright (C) 2001, 2003 Lukas Tinkl <lukas@kde.org>
+Andreas Schlapbach <schlpbch@iam.unibe.ch>
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License version 2 as published by the Free Software Foundation.
+
+This library 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 the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public License
+along with this library; see the file COPYING.LIB. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.
+*/
+
+#include <qdir.h>
+#include <qtextstream.h>
+#include <qfile.h>
+#include <qfont.h>
+#include <qdatetime.h>
+#include <qpixmap.h>
+#include <qimage.h>
+#include <qprogressdialog.h>
+#include <qtextcodec.h>
+#include <qstylesheet.h>
+
+#include <kaction.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kcharsets.h>
+#include <kmessagebox.h>
+#include <kurl.h>
+#include <kapplication.h>
+#include <kimageio.h>
+#include <kdebug.h>
+#include <kgenericfactory.h>
+#include <kio/netaccess.h>
+#include <kpushbutton.h>
+
+#include "imgallerydialog.h"
+#include "imgalleryplugin.h"
+
+typedef KGenericFactory<KImGalleryPlugin> KImGalleryPluginFactory;
+K_EXPORT_COMPONENT_FACTORY( libkimgallery, KImGalleryPluginFactory( "imgalleryplugin" ) )
+
+KImGalleryPlugin::KImGalleryPlugin( QObject* parent, const char* name, const QStringList & )
+ : KParts::Plugin( parent, name ), m_commentMap(0)
+{
+ new KAction( i18n( "&Create Image Gallery..." ), "imagegallery", CTRL+Key_I, this,
+ SLOT( slotExecute() ), actionCollection(), "create_img_gallery" );
+}
+
+void KImGalleryPlugin::slotExecute()
+{
+ m_progressDlg=0L;
+ if ( !parent() || !parent()->inherits("KonqDirPart"))
+ {
+ KMessageBox::sorry( 0L, i18n("Could not create the plugin, please report a bug."));
+ return;
+ }
+ m_part = static_cast<KonqDirPart *>(parent());
+ if (!m_part->url().isLocalFile()) { //TODO support remote URLs too?
+ KMessageBox::sorry(m_part->widget(), i18n("Creating an image gallery works only on local folders."));
+ return;
+ }
+ kdDebug(90170) << "dialog is ok" << endl;
+ m_configDlg = new KIGPDialog(m_part->widget(), m_part->url().path(+1));
+
+ if ( m_configDlg->exec() == QDialog::Accepted ) {
+ kdDebug(90170) << "dialog is ok" << endl;
+ m_configDlg->writeConfig();
+ m_copyFiles = m_configDlg->copyOriginalFiles();
+ m_recurseSubDirectories = m_configDlg->recurseSubDirectories();
+ m_useCommentFile = m_configDlg->useCommentFile();
+ m_imagesPerRow = m_configDlg->getImagesPerRow();
+
+ KURL url(m_configDlg->getImageName());
+ if ( !url.isEmpty() && url.isValid()) {
+ m_progressDlg = new QProgressDialog(m_part->widget(), "progressDlg", true );
+ QObject::connect(m_progressDlg, SIGNAL( cancelled() ), this, SLOT( slotCancelled() ) );
+
+ m_progressDlg->setLabelText( i18n("Creating thumbnails") );
+ m_progressDlg->setCancelButton(new KPushButton(KStdGuiItem::cancel(),m_progressDlg));
+ m_cancelled = false;
+ m_progressDlg->show();
+ if ( createHtml( url, m_part->url().path(), m_configDlg->recursionLevel() > 0 ? m_configDlg->recursionLevel() + 1 : 0 , m_configDlg->getImageFormat()) ) {
+ kapp->invokeBrowser(url.url()); // Open a browser to show the result
+ } else {
+ deleteCancelledGallery(url, m_part->url().path(), m_configDlg->recursionLevel() > 0 ? m_configDlg->recursionLevel() + 1 : 0, m_configDlg->getImageFormat());
+ }
+ }
+ } else {
+ kdDebug(90170) << "dialog is not ok" << endl;
+ }
+ delete m_progressDlg;
+}
+
+bool KImGalleryPlugin::createDirectory(QDir thumb_dir, QString imgGalleryDir, QString dirName)
+{
+ if (!thumb_dir.exists()) {
+ thumb_dir.setPath( imgGalleryDir);
+ if (!(thumb_dir.mkdir(dirName, false))) {
+ KMessageBox::sorry(m_part->widget(), i18n("Couldn't create folder: %1").arg(thumb_dir.path()));
+ return false;
+ } else {
+ thumb_dir.setPath( imgGalleryDir + "/" + dirName + "/" );
+ return true;
+ }
+ } else {
+ return true;
+ }
+}
+
+void KImGalleryPlugin::createHead(QTextStream& stream)
+{
+ const QString chsetName = QTextCodec::codecForLocale()->mimeName();
+
+ stream << "<?xml version=\"1.0\" encoding=\"" + chsetName + "\" ?>" << endl;
+ stream << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">" << endl;
+ stream << "<html xmlns=\"http://www.w3.org/1999/xhtml\">" << endl;
+ stream << "<head>" << endl;
+ stream << "<title>" << QStyleSheet::escape(m_configDlg->getTitle()) << "</title>" << endl;
+ stream << "<meta http-equiv=\"content-type\" content=\"text/html; charset=" << chsetName << "\"/>" << endl;
+ stream << "<meta name=\"GENERATOR\" content=\"KDE Konqueror KImgallery plugin version " KDE_VERSION_STRING "\"/>" << endl;
+ createCSSSection(stream);
+ stream << "</head>" << endl;
+}
+
+void KImGalleryPlugin::createCSSSection(QTextStream& stream)
+{
+ const QString backgroundColor = m_configDlg->getBackgroundColor().name();
+ const QString foregroundColor = m_configDlg->getForegroundColor().name();
+ //adding a touch of style
+ stream << "<style type='text/css'>\n";
+ stream << "BODY {color: " << foregroundColor << "; background: " << backgroundColor << ";" << endl;
+ stream << " font-family: " << m_configDlg->getFontName() << ", sans-serif;" << endl;
+ stream << " font-size: " << m_configDlg->getFontSize() << "pt; margin: 8%; }" << endl;
+ stream << "H1 {color: " << foregroundColor << ";}" << endl;
+ stream << "TABLE {text-align: center; margin-left: auto; margin-right: auto;}" << endl;
+ stream << "TD { color: " << foregroundColor << "; padding: 1em}" << endl;
+ stream << "IMG { border: 1px solid " << foregroundColor << "; }" << endl;
+ stream << "</style>" << endl;
+}
+
+
+QString KImGalleryPlugin::extension(const QString& imageFormat)
+{
+ if (imageFormat == "PNG")
+ return ".png";
+ if (imageFormat == "JPEG")
+ return ".jpg";
+ Q_ASSERT(false);
+ return QString::null;
+}
+
+void KImGalleryPlugin::createBody(QTextStream& stream, const QString& sourceDirName, const QStringList& subDirList,
+ const QDir& imageDir, const KURL& url, const QString& imageFormat)
+{
+ int numOfImages = imageDir.count();
+ const QString imgGalleryDir = url.directory();
+ const QString today(KGlobal::locale()->formatDate(QDate::currentDate()));
+
+ stream << "<body>\n<h1>" << QStyleSheet::escape(m_configDlg->getTitle()) << "</h1><p>" << endl;
+ stream << i18n("<i>Number of images</i>: %1").arg(numOfImages) << "<br/>" << endl;
+ stream << i18n("<i>Created on</i>: %1").arg(today) << "</p>" << endl;
+
+ stream << "<hr/>" << endl;
+
+ if (m_recurseSubDirectories && subDirList.count() > 2) { //subDirList.count() is always >= 2 because of the "." and ".." directories
+ stream << i18n("<i>Subfolders</i>:") << "<br>" << endl;
+ for (QStringList::ConstIterator it = subDirList.begin(); it != subDirList.end(); it++) {
+ if (*it == "." || *it == "..")
+ continue; //disregard the "." and ".." directories
+ stream << "<a href=\"" << *it << "/" << url.fileName()
+ << "\">" << *it << "</a><br>" << endl;
+ }
+ stream << "<hr/>" << endl;
+ }
+
+ stream << "<table>" << endl;
+
+ //table with images
+ int imgIndex;
+ QFileInfo imginfo;
+ QPixmap imgProp;
+ for (imgIndex = 0; !m_cancelled && (imgIndex < numOfImages);) {
+ stream << "<tr>" << endl;
+
+ for (int col=0; !m_cancelled && (col < m_imagesPerRow) && (imgIndex < numOfImages); col++) {
+ const QString imgName = imageDir[imgIndex];
+
+ if (m_copyFiles) {
+ stream << "<td align='center'>\n<a href=\"images/" << imgName << "\">";
+ } else {
+ stream << "<td align='center'>\n<a href=\"" << imgName << "\">";
+ }
+
+
+ if (createThumb(imgName, sourceDirName, imgGalleryDir, imageFormat)) {
+ const QString imgPath("thumbs/" + imgName + extension(imageFormat));
+ stream << "<img src=\"" << imgPath << "\" width=\"" << m_imgWidth << "\" ";
+ stream << "height=\"" << m_imgHeight << "\" alt=\"" << imgPath << "\"/>";
+ m_progressDlg->setLabelText( i18n("Created thumbnail for: \n%1").arg(imgName) );
+ } else {
+ kdDebug(90170) << "Creating thumbnail for " << imgName << " failed" << endl;
+ m_progressDlg->setLabelText( i18n("Creating thumbnail for: \n%1\n failed").arg(imgName) );
+ }
+ stream << "</a>" << endl;
+
+ if (m_configDlg->printImageName()) {
+ stream << "<div>" << imgName << "</div>" << endl;
+ }
+
+ if (m_configDlg->printImageProperty()) {
+ imgProp.load( imageDir.absFilePath(imgName,true) );
+ stream << "<div>" << imgProp.width() << " x " << imgProp.height() << "</div>" << endl;
+ }
+
+ if (m_configDlg->printImageSize()) {
+ imginfo.setFile( imageDir, imgName );
+ stream << "<div>(" << (imginfo.size() / 1024) << " " << i18n("KB") << ")" << "</div>" << endl;
+ }
+
+ if (m_useCommentFile) {
+ QString imgComment = (*m_commentMap)[imgName];
+ stream << "<div>" << QStyleSheet::escape(imgComment) << "</div>" << endl;
+ }
+ stream << "</td>" << endl;
+
+ m_progressDlg->setTotalSteps( numOfImages );
+ m_progressDlg->setProgress( imgIndex );
+ kapp->processEvents();
+ imgIndex++;
+ }
+ stream << "</tr>" << endl;
+ }
+ //close the HTML
+ stream << "</table>\n</body>\n</html>" << endl;
+}
+
+
+bool KImGalleryPlugin::createHtml(const KURL& url, const QString& sourceDirName, int recursionLevel, const QString& imageFormat)
+{
+ if(m_cancelled) return false;
+
+
+ if( !parent() || !parent()->inherits("KonqDirPart"))
+ return false;
+ KonqDirPart * part = static_cast<KonqDirPart *>(parent());
+
+ QStringList subDirList;
+ if (m_recurseSubDirectories && (recursionLevel >= 0)) { //recursionLevel == 0 means endless
+ QDir toplevel_dir = QDir( sourceDirName );
+ toplevel_dir.setFilter( QDir::Dirs | QDir::Readable | QDir::Writable );
+ subDirList = toplevel_dir.entryList();
+
+ for (QStringList::ConstIterator it = subDirList.begin(); it != subDirList.end() && !m_cancelled; it++) {
+ const QString currentDir = *it;
+ if (currentDir == "." || currentDir == "..") { continue;} //disregard the "." and ".." directories
+ QDir subDir = QDir( url.directory() + "/" + currentDir );
+ if (!subDir.exists()) {
+ subDir.setPath( url.directory() );
+ if (!(subDir.mkdir(currentDir, false))) {
+ KMessageBox::sorry(part->widget(), i18n("Couldn't create folder: %1").arg(subDir.path()));
+ continue;
+ } else {
+ subDir.setPath( url.directory() + "/" + currentDir );
+ }
+ }
+ if(!createHtml( KURL( subDir.path() + "/" + url.fileName() ), sourceDirName + "/" + currentDir,
+ recursionLevel > 1 ? recursionLevel - 1 : 0, imageFormat)) { return false; }
+ }
+ }
+
+ if (m_useCommentFile) {
+ loadCommentFile();
+ }
+
+ kdDebug(90170) << "sourceDirName: " << sourceDirName << endl;
+ //We're interested in only the patterns, so look for the first |
+ //#### perhaps an accessor should be added to KImageIO instead?
+ QString filter = KImageIO::pattern(KImageIO::Reading).section('|', 0, 0);
+
+ QDir imageDir( sourceDirName, filter.latin1(),
+ QDir::Name|QDir::IgnoreCase, QDir::Files|QDir::Readable);
+
+ const QString imgGalleryDir = url.directory();
+ kdDebug(90170) << "imgGalleryDir: " << imgGalleryDir << endl;
+
+ // Create the "thumbs" subdirectory if necessary
+ QDir thumb_dir( imgGalleryDir + QString::fromLatin1("/thumbs/"));
+ if (createDirectory(thumb_dir, imgGalleryDir, "thumbs") == false)
+ return false;
+
+ // Create the "images" subdirectory if necessary
+ QDir images_dir( imgGalleryDir + QString::fromLatin1("/images/"));
+ if (m_copyFiles) {
+ if (createDirectory(images_dir, imgGalleryDir, "images") == false)
+ return false;
+ }
+
+ QFile file( url.path() );
+ kdDebug(90170) << "url.path(): " << url.path() << ", thumb_dir: "<< thumb_dir.path()
+ << ", imageDir: "<< imageDir.path() << endl;
+
+ if ( imageDir.exists() && file.open(IO_WriteOnly) ) {
+ QTextStream stream(&file);
+ stream.setEncoding(QTextStream::Locale);
+
+ createHead(stream);
+ createBody(stream, sourceDirName, subDirList, imageDir, url, imageFormat); //ugly
+
+ file.close();
+
+ return !m_cancelled;
+
+ } else {
+ KMessageBox::sorry(m_part->widget(),i18n("Couldn't open file: %1").arg(url.path(+1)));
+ return false;
+ }
+}
+
+void KImGalleryPlugin::deleteCancelledGallery(const KURL& url, const QString& sourceDirName, int recursionLevel, const QString& imageFormat)
+{
+ if (m_recurseSubDirectories && (recursionLevel >= 0)) {
+ QStringList subDirList;
+ QDir toplevel_dir = QDir( sourceDirName );
+ toplevel_dir.setFilter( QDir::Dirs );
+ subDirList = toplevel_dir.entryList();
+
+ for (QStringList::ConstIterator it = subDirList.begin(); it != subDirList.end(); it++) {
+ if (*it == "." || *it == ".." || *it == "thumbs" || (m_copyFiles && *it == "images")) {
+ continue; //disregard the "." and ".." directories
+ }
+ deleteCancelledGallery( KURL( url.directory() + "/" + *it + "/" + url.fileName() ),
+ sourceDirName + "/" + *it,
+ recursionLevel > 1 ? recursionLevel - 1 : 0, imageFormat);
+ }
+ }
+
+ const QString imgGalleryDir = url.directory();
+ QDir thumb_dir( imgGalleryDir + QString::fromLatin1("/thumbs/"));
+ QDir images_dir( imgGalleryDir + QString::fromLatin1("/images/"));
+ QDir imageDir( sourceDirName, "*.png *.PNG *.gif *.GIF *.jpg *.JPG *.jpeg *.JPEG *.bmp *.BMP",
+ QDir::Name|QDir::IgnoreCase, QDir::Files|QDir::Readable);
+ QFile file( url.path() );
+
+ // Remove the image file ..
+ file.remove();
+ // ..all the thumbnails ..
+ for (uint i=0; i < imageDir.count(); i++) {
+ const QString imgName = imageDir[i];
+ const QString imgNameFormat = imgName + extension(imageFormat);
+ bool isRemoved = thumb_dir.remove(imgNameFormat);
+ kdDebug(90170) << "removing: " << thumb_dir.path() << "/" << imgNameFormat << "; "<< isRemoved << endl;
+ }
+ // ..and the thumb directory
+ thumb_dir.rmdir(thumb_dir.path());
+
+ // ..and the images directory if images were to be copied
+ if (m_copyFiles) {
+ for (uint i=0; i < imageDir.count(); i++) {
+ const QString imgName = imageDir[i];
+ bool isRemoved = images_dir.remove(imgName);
+ kdDebug(90170) << "removing: " << images_dir.path() << "/" << imgName << "; "<< isRemoved << endl;
+ }
+ images_dir.rmdir(images_dir.path());
+ }
+}
+
+void KImGalleryPlugin::loadCommentFile()
+{
+ QFile file(m_configDlg->getCommentFile());
+ if (file.open(IO_ReadOnly)) {
+ kdDebug(90170) << "File opened."<< endl;
+
+ QTextStream* m_textStream = new QTextStream(&file);
+ m_textStream->setEncoding(QTextStream::Locale);
+
+ delete m_commentMap;
+ m_commentMap = new CommentMap;
+
+ QString picName, picComment, curLine, curLineStripped;
+ while (!m_textStream->eof()) {
+ curLine = m_textStream->readLine();
+ curLineStripped = curLine.stripWhiteSpace();
+ // Lines starting with '#' are comment
+ if (!(curLineStripped.isEmpty()) && !curLineStripped.startsWith("#")) {
+ if (curLineStripped.endsWith(":")) {
+ picComment = QString::null;
+ picName = curLineStripped.left(curLineStripped.length()-1);
+ kdDebug(90170) << "picName: " << picName << endl;
+ } else {
+ do {
+ //kdDebug(90170) << "picComment" << endl;
+ picComment += curLine + "\n";
+ curLine = m_textStream->readLine();
+ } while (!m_textStream->eof() && !(curLine.stripWhiteSpace().isEmpty()) &&
+ !curLine.stripWhiteSpace().startsWith("#"));
+ //kdDebug(90170) << "Pic comment: " << picComment << endl;
+ m_commentMap->insert(picName, picComment);
+ }
+ }
+ }
+ CommentMap::Iterator it;
+ for( it = m_commentMap->begin(); it != m_commentMap->end(); ++it ) {
+ kdDebug(90170) << "picName: " << it.key() << ", picComment: " << it.data() << endl;
+ }
+ file.close();
+ kdDebug(90170) << "File closed." << endl;
+ delete m_textStream;
+ } else {
+ KMessageBox::sorry(m_part->widget(), i18n("Couldn't open file: %1").arg(m_configDlg->getCommentFile()));
+ m_useCommentFile = false;
+ }
+}
+
+bool KImGalleryPlugin::createThumb( const QString& imgName, const QString& sourceDirName,
+ const QString& imgGalleryDir, const QString& imageFormat)
+{
+ QImage img;
+ const QString pixPath = sourceDirName + QString::fromLatin1("/") + imgName;
+
+ if (m_copyFiles) {
+ KURL srcURL = KURL::fromPathOrURL(pixPath);
+ //kdDebug(90170) << "srcURL: " << srcURL << endl;
+ KURL destURL = KURL::fromPathOrURL(imgGalleryDir + QString::fromLatin1("/images/") + imgName);
+ //kdDebug(90170) << "destURL: " << destURL << endl;
+ KIO::NetAccess::copy(srcURL, destURL, static_cast<KParts::Part *>(parent())->widget());
+ }
+
+ const QString imgNameFormat = imgName + extension(imageFormat);
+ const QString thumbDir = imgGalleryDir + QString::fromLatin1("/thumbs/");
+ int extent = m_configDlg->getThumbnailSize();
+
+ // this code is stolen from kdebase/kioslave/thumbnail/imagecreator.cpp
+ // (c) 2000 gis and malte
+
+ m_imgWidth = 120; // Setting the size of the images is
+ m_imgHeight = 90; // required to generate faster 'loading' pages
+ if ( img.load( pixPath ) )
+ {
+ int w = img.width(), h = img.height();
+ // scale to pixie size
+ // kdDebug(90170) << "w: " << w << " h: " << h << endl;
+ // Resizing if to big
+ if(w > extent || h > extent)
+ {
+ if(w > h)
+ {
+ h = (int)( (double)( h * extent ) / w );
+ if ( h == 0 ) h = 1;
+ w = extent;
+ Q_ASSERT( h <= extent );
+ }
+ else
+ {
+ w = (int)( (double)( w * extent ) / h );
+ if ( w == 0 ) w = 1;
+ h = extent;
+ Q_ASSERT( w <= extent );
+ }
+ const QImage scaleImg(img.smoothScale( w, h ));
+ if ( scaleImg.width() != w || scaleImg.height() != h )
+ {
+ kdDebug(90170) << "Resizing failed. Aborting." << endl;
+ return false;
+ }
+ img = scaleImg;
+ if (m_configDlg->colorDepthSet() == true )
+ {
+ const QImage depthImg(img.convertDepth(m_configDlg->getColorDepth()));
+ img = depthImg;
+ }
+ }
+ kdDebug(90170) << "Saving thumbnail to: " << thumbDir + imgNameFormat << endl;
+ if (!img.save(thumbDir + imgNameFormat, imageFormat.latin1()))
+ {
+ kdDebug(90170) << "Saving failed. Aborting." << endl;
+ return false;
+ }
+ m_imgWidth = w;
+ m_imgHeight = h;
+ return true;
+ }
+ return false;
+}
+
+void KImGalleryPlugin::slotCancelled()
+{
+ m_cancelled = true;
+}
+
+#include "imgalleryplugin.moc"
diff --git a/konq-plugins/kimgalleryplugin/imgalleryplugin.h b/konq-plugins/kimgalleryplugin/imgalleryplugin.h
new file mode 100644
index 0000000..6b580a0
--- /dev/null
+++ b/konq-plugins/kimgalleryplugin/imgalleryplugin.h
@@ -0,0 +1,80 @@
+/* This file is part of the KDE project
+
+Copyright (C) 2001, 2003 Lukas Tinkl <lukas@kde.org>
+Andreas Schlapbach <schlpbch@iam.unibe.ch>
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License version 2 as published by the Free Software Foundation.
+
+This library 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 the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public License
+along with this library; see the file COPYING.LIB. If not, write to
+the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.
+*/
+
+#ifndef kimgalleryplugin_h
+#define kimgalleryplugin_h
+
+#include <kparts/plugin.h>
+#include <klibloader.h>
+#include <konq_dirpart.h>
+#include <kio/jobclasses.h>
+
+class QProgressDialog;
+class KURL;
+class KIGPDialog;
+
+typedef QMap<QString,QString> CommentMap;
+
+class KImGalleryPlugin : public KParts::Plugin
+{
+ Q_OBJECT
+ public:
+ KImGalleryPlugin( QObject* parent, const char* name,
+ const QStringList & );
+ ~KImGalleryPlugin() {}
+
+ public slots:
+ void slotExecute();
+ void slotCancelled();
+
+ private:
+ bool m_cancelled;
+ bool m_recurseSubDirectories;
+ bool m_copyFiles;
+ bool m_useCommentFile;
+
+ int m_imgWidth;
+ int m_imgHeight;
+ int m_imagesPerRow;
+
+ QProgressDialog *m_progressDlg;
+
+ KonqDirPart* m_part;
+
+ KIGPDialog *m_configDlg;
+
+ CommentMap* m_commentMap;
+
+ bool createDirectory(QDir thumb_dir, QString imgGalleryDir, QString dirName);
+
+ void createHead(QTextStream& stream);
+ void createCSSSection(QTextStream& stream);
+ void createBody(QTextStream& stream, const QString& sourceDirName, const QStringList& subDirList, const QDir& imageDir, const KURL& url, const QString& imageFormat);
+
+ bool createThumb( const QString& imgName, const QString& sourceDirName, const QString& imgGalleryDir, const QString& imageFormat);
+
+ bool createHtml( const KURL& url, const QString& sourceDirName, int recursionLevel, const QString& imageFormat);
+ void deleteCancelledGallery( const KURL& url, const QString& sourceDirName, int recursionLevel, const QString& imageFormat);
+ void loadCommentFile();
+
+ static QString extension(const QString& imageFormat);
+};
+
+#endif
diff --git a/konq-plugins/kimgalleryplugin/kimgalleryplugin.desktop b/konq-plugins/kimgalleryplugin/kimgalleryplugin.desktop
new file mode 100644
index 0000000..c8190e1
--- /dev/null
+++ b/konq-plugins/kimgalleryplugin/kimgalleryplugin.desktop
@@ -0,0 +1,129 @@
+[Desktop Entry]
+X-KDE-PluginInfo-Author=Lukas Tinkl,Andreas Schlapbach
+X-KDE-PluginInfo-Email=lukas@kde.org,schlpbch@iam.unibe.ch
+X-KDE-PluginInfo-Name=ImgGalleryPlugin
+X-KDE-PluginInfo-Version=3.4
+X-KDE-PluginInfo-Website=
+X-KDE-PluginInfo-Category=Tools
+X-KDE-PluginInfo-Depends=
+X-KDE-PluginInfo-License=LGPL
+X-KDE-PluginInfo-EnabledByDefault=true
+Name=Image Gallery
+Name[bg]=Галерия с изображения
+Name[br]=Garidell ar skeudennoù
+Name[bs]=Galerija slika
+Name[ca]=Galeria d'imatges
+Name[cs]=Obrázková galerie
+Name[cy]=Oriel Ddelweddau
+Name[da]=Billedgalleri
+Name[de]=Bildergalerie
+Name[el]=Συλλογή εικόνων
+Name[eo]=Bildprezentilo
+Name[es]=Galería de imágenes
+Name[et]=Pildigalerii
+Name[eu]=Irudi galeria
+Name[fa]=گالری تصویر
+Name[fi]=Kuvagalleria
+Name[fr]=Galerie d'images
+Name[fy]=Ofbyldengalery
+Name[ga]=Gailearaí Íomhánna
+Name[gl]=Galeria de Imaxes
+Name[he]=גלריית תמונות
+Name[hi]=छवि दीर्घा
+Name[hr]=Galerija slika
+Name[hu]=Képbemutató
+Name[is]=Myndasafn
+Name[it]=Galleria di immagini
+Name[ja]=イメージギャラリー
+Name[ka]=გამოსახულებათა გალერეა
+Name[kk]=Кескіндер галереясы
+Name[km]=វិចិត្រសាល​រូបភាព
+Name[lt]=Paveikslėlių galerija
+Name[mk]=Галерија со слики
+Name[ms]=Galeri Imej
+Name[nb]=Bildegalleri
+Name[nds]=Bildgalerie
+Name[ne]=छवि ग्यालरी
+Name[nl]=Afbeeldingengalerij
+Name[nn]=Biletgalleri
+Name[pa]=ਚਿੱਤਰ ਗੈਲਰੀ
+Name[pl]=Galeria obrazków
+Name[pt]=Galeria de Imagens
+Name[pt_BR]=Galeria de Imagens
+Name[ru]=Галерея изображений
+Name[sk]=Galéria obrázkov
+Name[sl]=Galerija slik
+Name[sr]=Галерија слика
+Name[sr@Latn]=Galerija slika
+Name[sv]=Bildgalleri
+Name[ta]=பிம்ப படத் தொகுப்பு
+Name[tg]=Силсилаи тасвирҳо
+Name[tr]=Resim Galerisi
+Name[uk]=Галерея зображень
+Name[uz]=Rasmlar galereyasi
+Name[uz@cyrillic]=Расмлар галереяси
+Name[vi]=Nơi trưng bày ảnh
+Name[zh_CN]=图像集
+Name[zh_TW]=相簿
+Comment=Easy way to generate a HTML image gallery
+Comment[af]=Maklike weg na genereer 'n Html beeld galery
+Comment[ar]=طريقة سهلة لانشاء معرض صور HTML
+Comment[az]=HTML rəsm qalereyası yaradmanın asan yolu
+Comment[bg]=Лесен начин за генериране на галерия от изображения във формат HTML
+Comment[bs]=Lagan način za generisanje HTML galerija slika
+Comment[ca]=Genera fàcilment una galeria HTML d'imatges
+Comment[cs]=Jednoduchý způsob, jak vygenerovat HTML galerii obrázků
+Comment[cy]=Ffordd hawdd i greu oriel delweddau HTML
+Comment[da]=Nem måde at oprette et HTML-billedgalleri på
+Comment[de]=Einfache Möglichkeit, um eine Bildergalerie in HTML zu erzeugen
+Comment[el]=Εύκολος τρόπος δημιουργίας μιας συλλογής εικόνων σε HTML
+Comment[eo]=Facila kielo por generi HTML bildgalieron
+Comment[es]=Una forma sencilla para generar una galería de imágenes en HTML
+Comment[et]=Kiirmeetod tekitada HTML pildigalerii
+Comment[eu]=HTML irudi galeria sortzeko bide erraza
+Comment[fa]=روش آسان تولید گالری تصویر زنگام
+Comment[fi]=Nopea tapa luoda HTML kuvagalleria
+Comment[fr]=Méthode rapide pour configurer une galerie HTML d'images
+Comment[fy]=Ienfâldige manier om in HTML-ôfbyldengalery oan te meitsjen
+Comment[gl]=Unha forma fácil de xerar unha galeria de imaxes en HTML
+Comment[he]=דרך קלה ליצור גלריית תמונות מבוססת HTML
+Comment[hi]=एचटीएमएल छवि दीर्घा बनाने का तेज तरीका
+Comment[hr]=Jednostavan način izrade HTML galerije slika
+Comment[hu]=HTML-alapú képmegjelenítő
+Comment[is]=Einföld leið til að búa til HTML myndasöfn
+Comment[it]=Modo facile per generare una galleria di immagini in HTML
+Comment[ja]=HTML イメージギャラリーを簡単に作成します
+Comment[ka]=HTML გამოსახულებათა გალერეის გენერაციის მარტივი ხერხი
+Comment[kk]=HTML кескіндер галереясын құрудың оңай жолы
+Comment[km]=វិធី​ដ៏​​ងាយ​ស្រួល​ដើម្បី​បង្កើត​វិចិត្រសាល​រូបភាព HTML​​
+Comment[lt]=Lengvas būdas HTML paveikslėlių galerijai generuoti
+Comment[mk]=Лесен начин за создавање на HTML-галерија со слики
+Comment[ms]=Cara mudah untuk menghasilkan galery imej HTML
+Comment[nb]=Lett måte å lage et bildegalleri for HTML
+Comment[nds]=En HTML-Bildgalerie gau opstellen
+Comment[ne]=एचटीएमएल छवि ग्यालरी उत्पन्न गर्ने सजिलो तरिका
+Comment[nl]=Eenvoudige manier om een HTML-afbeeldingengalerij aan te maken
+Comment[nn]=Ein enkel måte å laga eit biletgalleri som nettsider
+Comment[pl]=Tworzenie galerii obrazków w HTML-u
+Comment[pt]=Uma forma fácil de gerar uma galeria de imagens em HTML
+Comment[pt_BR]=Modo fácil de gerar uma galeria de imagens HTML
+Comment[ro]=O modalitate uşoară de a genera o galerie de imagini în HTML
+Comment[ru]=Генератор веб-страницы с галереей изображений
+Comment[sk]=Jednoduchá cesta ako vygenerovať HTML galériu obrázkov
+Comment[sl]=Preprost način ustvarjanja galerije slik v HTML
+Comment[sr]=Лак начин за прављење HTML галерије слика
+Comment[sr@Latn]=Lak način za pravljenje HTML galerije slika
+Comment[sv]=Enkelt sätt att skapa ett HTML-bildgalleri
+Comment[ta]=ஒரு HTML பிம்ப படத்தொகுப்பை இயக்குவதற்கான சுலபமான வழி
+Comment[tg]=Генератор бо веб-саҳифаҳо аз силсилаи тасвирҳо
+Comment[tr]=HTML resim galerisi oluşturmak için kolay bir yol
+Comment[uk]=Простий спосіб створити галерею зображень в HTML
+Comment[uz]=HTML rasmlar galereyasini yaratish
+Comment[uz@cyrillic]=HTML расмлар галереясини яратиш
+Comment[vi]=Cách dễ tạo ra nơi trưng bày ảnh HTML
+Comment[xh]=Indlela elula yokwenza iHTML igumbi lomboniso wemifanekiso
+Comment[zh_CN]=生成 HTML 图像集的简捷方式
+Comment[zh_TW]=簡單建立 HTML 相簿的方法
+Icon=imagegallery
+X-KDE-ParentApp=konqueror
+DocPath=konq-plugins/imgallery/index.html
diff --git a/konq-plugins/kimgalleryplugin/kimgalleryplugin.rc b/konq-plugins/kimgalleryplugin/kimgalleryplugin.rc
new file mode 100644
index 0000000..2376f8b
--- /dev/null
+++ b/konq-plugins/kimgalleryplugin/kimgalleryplugin.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartplugin>
+<kpartplugin library="libkimgallery">
+<MenuBar>
+ <Menu name="tools"><text>&amp;Tools</text>
+ <Action name="create_img_gallery"/>
+ </Menu>
+</MenuBar>
+</kpartplugin>
diff --git a/konq-plugins/kuick/Makefile.am b/konq-plugins/kuick/Makefile.am
new file mode 100644
index 0000000..f0cfa4c
--- /dev/null
+++ b/konq-plugins/kuick/Makefile.am
@@ -0,0 +1,26 @@
+SUBDIRS= kcmkuick
+
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = libkuickplugin.la
+
+# This is all standard. Remove the LIB_KHTML reference if you are not
+# using the KHTML Part
+libkuickplugin_la_SOURCES = kuick_plugin.cpp kdirmenu.cpp kmetamenu.cpp kimcontactmenu.cpp
+libkuickplugin_la_LIBADD = $(LIB_KABC) -lkimproxy -lkonq
+libkuickplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+pluginsdir = $(kde_servicesdir)
+plugins_DATA = kuick_plugin.desktop
+
+appsdir = $(kde_appsdir)/.hidden
+apps_DATA = kuickplugin.desktop
+
+# Install the .rc file in the Part's directory (in this case, the part
+# is KHTMLPart)
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/kuick_plugin.pot
+noinst_HEADERS = kimcontactmenu.h
diff --git a/konq-plugins/kuick/kcmkuick/Makefile.am b/konq-plugins/kuick/kcmkuick/Makefile.am
new file mode 100644
index 0000000..6c81498
--- /dev/null
+++ b/konq-plugins/kuick/kcmkuick/Makefile.am
@@ -0,0 +1,17 @@
+INCLUDES= $(all_includes)
+
+kde_module_LTLIBRARIES = kcm_kuick.la
+
+kcm_kuick_la_SOURCES = kcmkuick.cpp kcmkuickdialog.ui
+
+kcm_kuick_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_kuick_la_LIBADD = $(LIB_KDEUI) $(LIB_KIO)
+kcm_kuick_la_METASOURCES = AUTO
+
+noinst_HEADERS = kcmkuick.h kcmkuickdialog.h
+
+apps_DATA = kcmkuick.desktop
+appsdir = $(kde_appsdir)/.hidden
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/kcmkuick.pot
diff --git a/konq-plugins/kuick/kcmkuick/kcmkuick.cpp b/konq-plugins/kuick/kcmkuick/kcmkuick.cpp
new file mode 100644
index 0000000..fdbf5c0
--- /dev/null
+++ b/konq-plugins/kuick/kcmkuick/kcmkuick.cpp
@@ -0,0 +1,155 @@
+/***************************************************************************
+ kcmkuick.cpp - control module for kuick
+ -------------------
+ copyright : (C) 2001 by Holger Freyther <freyther@kde.org>
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; version 2 of the License. *
+ * *
+ ***************************************************************************/
+
+#include "kcmkuick.h"
+
+#include <qlayout.h>
+#include <qfile.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kgenericfactory.h>
+#include <kstandarddirs.h>
+#include <kservice.h>
+
+#include <qcheckbox.h>
+#include <qgroupbox.h>
+#include <qpushbutton.h>
+#include <qspinbox.h>
+#include <qstring.h>
+
+typedef KGenericFactory<KCMKuick, QWidget> KuickFactory;
+K_EXPORT_COMPONENT_FACTORY ( kcm_kuick, KuickFactory( "kcmkuick" ) )
+
+KCMKuick::KCMKuick(QWidget *parent, const char *name, const QStringList &)
+:KCModule(parent, name)
+{
+ KAboutData *ab=new KAboutData( "kcmkuick", I18N_NOOP("KCM Kuick"),
+ "0.2",I18N_NOOP("KControl module for Kuick's configuration"), KAboutData::License_GPL,
+ "(c) 2001, Holger Freyther", 0, 0, "freyther@kde.org");
+ ab->addAuthor("Holger Freyther",0, "freyther@kde.org");
+ setAboutData( ab );
+
+ QVBoxLayout *topLayout = new QVBoxLayout(this, 0, 0);
+ dialog = new KCMKuickDialog(this);
+ topLayout->add(dialog);
+ topLayout->addStretch();
+
+ connect( dialog->m_sbCopy, SIGNAL(valueChanged(int) ), SLOT(configChanged() ) );
+ connect( dialog->m_sbMove, SIGNAL(valueChanged(int) ), SLOT(configChanged() ) );
+ connect( dialog->pbCopyClear, SIGNAL(pressed() ), SLOT(slotClearCopyCache() ) );
+ connect( dialog->pbMoveClear, SIGNAL(pressed() ), SLOT(slotClearMoveCache() ) );
+ connect( dialog->m_chkShow, SIGNAL(clicked() ), SLOT(slotShowToggled() ) );
+
+ load();
+}
+
+void KCMKuick::slotShowToggled()
+{
+ bool showChecked = dialog->m_chkShow->isChecked();
+ dialog->m_grpCopy->setEnabled( showChecked );
+ dialog->m_grpMove->setEnabled( showChecked );
+ configChanged();
+}
+
+void KCMKuick::load()
+{
+ KConfig config( "konquerorrc");
+ config.setGroup("kuick-copy");
+ dialog->m_sbCopy->setValue(config.readNumEntry("ShowRecent",5) );
+
+ config.setGroup("kuick-move" );
+ dialog->m_sbMove->setValue(config.readNumEntry("ShowRecent",5) );
+
+ KConfig cfg("kuick_plugin.desktop", true, false, "services");
+ cfg.setDesktopGroup();
+ bool hidden=cfg.readBoolEntry("Hidden", false);
+ dialog->m_chkShow->setChecked(!hidden);
+ slotShowToggled();
+
+ emit changed(false);
+}
+
+KCMKuick::~KCMKuick()
+{
+}
+
+void KCMKuick::load(const QString & /*s*/)
+{
+}
+
+void KCMKuick::configChanged()
+{
+ emit changed(true);
+}
+
+void KCMKuick::save()
+{
+ KConfig config("konquerorrc" );
+ config.setGroup("kuick-copy");
+
+ config.writeEntry("ShowRecent", dialog->m_sbCopy->value() );
+
+ config.setGroup("kuick-move" );
+ config.writeEntry("ShowRecent", dialog->m_sbMove->value() );
+
+ config.sync(); //is it necessary ?
+
+ if ( dialog->m_chkShow->isChecked() ) {
+ QString servicespath = KGlobal::dirs()->saveLocation( "services");
+ QFile::remove(servicespath+"/kuick_plugin.desktop");
+ }
+ else {
+ KConfig cfg("kuick_plugin.desktop", false, false, "services");
+ cfg.setDesktopGroup();
+ cfg.writeEntry("Hidden", true);
+ }
+ KService::rebuildKSycoca(this);
+
+ emit changed(false);
+}
+
+void KCMKuick::slotClearCopyCache( ) {
+ KConfig config("konquerorrc");
+ config.setGroup("kuick-copy" );
+ config.writePathEntry("Paths", QStringList() );
+ config.sync(); //is it necessary ?
+}
+
+void KCMKuick::slotClearMoveCache() {
+ KConfig config("konquerorrc");
+ config.setGroup("kuick-move" );
+ config.writePathEntry("Paths", QStringList() );
+ config.sync(); //is it necessary ?
+}
+
+void KCMKuick::defaults()
+{
+ dialog->m_sbCopy->setValue(4);
+ dialog->m_sbMove->setValue(4);
+
+ dialog->m_chkShow->setChecked(true);
+ slotShowToggled();
+
+ emit changed( true );
+}
+
+QString KCMKuick::quickHelp() const
+{
+ return i18n("<h1>Kuick</h1> With this module you can configure Kuick, the KDE quick"
+ "copy and move plugin for Konqueror.");
+}
+
+#include "kcmkuick.moc"
diff --git a/konq-plugins/kuick/kcmkuick/kcmkuick.desktop b/konq-plugins/kuick/kcmkuick/kcmkuick.desktop
new file mode 100644
index 0000000..772dcce
--- /dev/null
+++ b/konq-plugins/kuick/kcmkuick/kcmkuick.desktop
@@ -0,0 +1,202 @@
+[Desktop Entry]
+Icon=editcopy
+Type=Application
+Exec=kcmshell kcmkuick
+X-KDE-ModuleType=Library
+X-KDE-Library=kuick
+Name=Quick Copy & Move Plugin
+Name[af]=Vinnige Kopie & Beweeg Inplak
+Name[ar]=ملحق النقل و النسخ السريع
+Name[az]=Əlavəni Sürətli Köçür və Daşı
+Name[bg]=Приставка за бързо копиране и преместване
+Name[bs]=Dodatak za brzo kopiranje i premještanje
+Name[ca]=Connector copia i mou ràpidament
+Name[cs]=Rychlé kopírování a přesouvání
+Name[cy]=Ategyn Copïo & Symud Brys
+Name[da]=Plugin for hurtig kopiering & flytning
+Name[de]=Kopieren und Verschieben
+Name[el]=Πρόσθετο γρήγορης αντιγραφής & μετακίνησης
+Name[eo]=Kromaĵo por rapida kopiado kaj movado
+Name[es]=Complemento para copiar y mover rápido
+Name[et]=Kiire kopeerimise ja liigutamise plugin
+Name[eu]=Kopiatu eta mugitzeko plugin azkarra
+Name[fa]=وصلۀ حرکت و رونوشت سریع
+Name[fi]=Nopea kopiointi ja siirto sovelma
+Name[fo]=Skjót avrita-og-flyta-ístingur
+Name[fr]=Outil de copie et de déplacement rapides
+Name[fy]=Fluch kopiearje en ferpleatse
+Name[gl]=Pugin para Copiar e Mover Axiña
+Name[he]=תוסף העתקה והעברה מהירה
+Name[hi]=जल्दी नक़ल व खिसकाना प्लगइन
+Name[hr]=Dodatak za brzo kopiranje i premještanje
+Name[hu]=Kuick modul
+Name[is]=Quick Copy & Move Íforrit
+Name[it]=Plugin copia/spostamento rapidi
+Name[ja]=高速コピー & 移動プラグイン
+Name[ka]=სწრაფი ასლის და გადატანის მოდული
+Name[kk]=Шұғыл көшірмелеу және жылжыту плагин модулі
+Name[km]=ចម្លង និង​ផ្លាស់ទី​កម្មវិធី​ជំនួយ​ដ៏រហ័ស
+Name[lt]=Greito kopijavimo ir perkėlimo priedas
+Name[lv]=Ātras Kopēšanas un Pārvietošanas Iespraudnis
+Name[mk]=Приклучок за брзо копирање и преместување
+Name[ms]=Salin Pantas & Alih Plugin
+Name[mt]=Plugin għal ikkupjar u tmexxija malajr
+Name[nb]=Programtillegg for rask kopi og flytt
+Name[nds]=Fix-Koperen un -Verschuvenmoduul
+Name[ne]=छिटो प्रतिलिपि गर्नुहोस् र प्लगइन सार्नुहोस्
+Name[nl]=Snel kopiëren en verplaatsen
+Name[nn]=Snøggkopi-og-flytt-modul
+Name[nso]=Plugin ya Kapela ya Gatisa & Sutisa
+Name[pa]=ਚੁਸਤ ਨਕਲ ਅਤੇ ਭੇਜਣ ਪਲੱਗਇਨ
+Name[pl]=Szybkie kopiowanie i przesuwanie
+Name[pt]='Plugin' de Cópia e Mudança Rápida
+Name[pt_BR]= Plugin de Copiar & Mover Rápido
+Name[ro]=Modul de copiere şi mutare rapidă
+Name[ru]=Быстрый перенос и копирование файлов
+Name[sk]=Modul pre rýchle kopírovanie a presun
+Name[sl]=Vstavek za hitro kopiranje in premikanje
+Name[sr]=Прикључак за брзо копирање и премештање
+Name[sr@Latn]=Priključak za brzo kopiranje i premeštanje
+Name[sv]=Snabbkopiera och -flytta
+Name[ta]=விரைவான நகலெடு மற்றும் நகர்த்து சொருகுபொருள்
+Name[tg]=Кӯчондани тез ва нусхаи файлҳо
+Name[th]=ปลั๊กอินคัดลอกและย้ายอย่างรวดเร็ว
+Name[tr]=Hızlı Kopyalama ve Taşıma Eklentisi
+Name[uk]=Втулок швидкого копіювання та пересування
+Name[uz]=Tez nusxa olish va koʻchirish plagini
+Name[uz@cyrillic]=Тез нусха олиш ва кўчириш плагини
+Name[ven]=Khophi ya tavhanya & tshimbidza Plugin
+Name[vi]=Bổ sung sao chép và di chuyển nhanh
+Name[xh]=Khawuleza Khuphela & Susa iplagi yangaphakathi
+Name[zh_CN]=快速复制和移动文件的插件
+Name[zh_TW]=快速複製及搬移外掛程式
+Name[zu]=Kuick Khiphela futhi Ususe i Plugin
+Comment=Kuick configuration module
+Comment[af]=Vinnige opstelling module
+Comment[ar]=أداة تهيئة Kuick
+Comment[az]=Kuick quraşdırma modulu
+Comment[bg]=Модул за настройване на Kuick
+Comment[br]=Mollad kefluniañ buan
+Comment[bs]=Modul za podešavanje Kuick-a
+Comment[ca]=Mòdul de configuració per a Kuick
+Comment[cs]=Konfigurační modul 'kuick'
+Comment[cy]=Modiwl ffurfweddu Kuick
+Comment[da]=Kuick indstillingsmodul
+Comment[de]=Einstellungsmodul für die Kopier- und Verschieberoutine "Kuick"
+Comment[el]=Άρθρωμα ρύθμισης του Kuick
+Comment[eo]=Agordmodulo por Rapidkopiilo
+Comment[es]=Módulo de configuración rápida
+Comment[et]=Kuicki seadistamine
+Comment[eu]=Kuick konfiguratzeko modulua
+Comment[fa]=پیمانۀ پیکربندی Kuick
+Comment[fi]=Kuick asetusmoduuli
+Comment[fr]=Module de configuration de Kuick
+Comment[fy]=Kuick-konfiguraasjemodule
+Comment[ga]=Modúl cumraíochta Kuick
+Comment[gl]=Módulo de configuración de Kuick
+Comment[he]=שינוי הגדרות התוסף Kuick
+Comment[hi]=क्विक कॉन्फ़िगरेशन मॉड्यूल
+Comment[hr]=Modul za konfiguriranje Kuicka
+Comment[hu]=A Kuick beállítómodulja
+Comment[is]=Stillingatól Kuick
+Comment[it]=Modulo di configurazione per Kuick
+Comment[ja]=Kuick の設定モジュール
+Comment[ka]=Kuick კონფიგურაციის მოდული
+Comment[kk]=Kuick баптау модулі
+Comment[km]=ម៉ូឌុល​​កំណត់​រចនា​សម្ព័ន្ធ​ Kuick
+Comment[lt]=Kuick konfigūravimo modulis
+Comment[mk]=Конфигурациски модул на Kuick
+Comment[ms]=Modul konfigurasi Kuick
+Comment[mt]=Konfigurazzjoni malajr
+Comment[nb]=Oppsettsmodul for Kuick
+Comment[nds]=Kuick-Instellenmoduul
+Comment[ne]=छिटो कन्फिगरेसन मिड्युल
+Comment[nl]=Kuick-configuratiemodule
+Comment[nn]=Oppsettsmodul for Kuick
+Comment[nso]=Seripa sa peakanyo ya Kuick
+Comment[pl]=Moduł konfiguracji Kuick
+Comment[pt]=Módulo de configuração do Kuick
+Comment[pt_BR]=Módulo de configuração do Kuick
+Comment[ro]=Modul configurare Kuick
+Comment[ru]=Модуль настройки Kuick
+Comment[sk]=Konfiguračný modul kuick
+Comment[sl]=Nastavitveni modul Kuick
+Comment[sr]=Kuick-ов модул за подешавање
+Comment[sr@Latn]=Kuick-ov modul za podešavanje
+Comment[sv]=Inställningsmodul för Kuick
+Comment[ta]=விரைவான வடிவமைப்பு கூற்று
+Comment[tg]=Модули танзими Kuick
+Comment[th]=โมดูลปรับแต่ง Kuick
+Comment[tr]=Hızlı yapılandırma modülü
+Comment[uk]=Модуль конфігурації Kuick
+Comment[uz]=Kuick moslamasi moduli
+Comment[uz@cyrillic]=Kuick мосламаси модули
+Comment[ven]=Modulu wa nzudzanyo wa Kuick
+Comment[vi]=Mô-đun cấu hình Kuick
+Comment[xh]=Uqwalaselo lomqongo womlinganiselo we Kuick
+Comment[zh_CN]=Kuick 配置模块
+Comment[zh_TW]=Kuick 設定模組
+Comment[zu]=Kuick imojula yenhlanganiselo
+Keywords=kuick,copy,move
+Keywords[az]=kuick,copy,move,köçürt,daşı
+Keywords[bg]=копиране, преместване, бързо, kuick, copy, move
+Keywords[ca]=kuick,copia,mou
+Keywords[cs]=kuick,kopírovat,přesunout
+Keywords[cy]=kuick,copï,symud
+Keywords[da]=kuick,kopiér,flyt
+Keywords[de]=kuick,kopieren,verschieben
+Keywords[el]=kuick,αντιγραφή,μετακίνηση
+Keywords[eo]=rapida,kopio,movo
+Keywords[es]=rápida,copiar,mover
+Keywords[et]=kuick,kopeerimine,liigutamine
+Keywords[fa]=kuick ،رونوشت، حرکت
+Keywords[fi]=kuick,kopioi,siirrä
+Keywords[fo]=kuick,avrita,flyta
+Keywords[fr]=kuick,copie,déplacement
+Keywords[fy]=kuick, kopiearje, ferpleatse
+Keywords[ga]=kuick,cóipeáil,bog
+Keywords[gl]=kuick,copiar,mover
+Keywords[he]=מהיר,העתקה,העברה, kuick,copy,move, quick
+Keywords[hi]=क्विक,नक़ल,खिसकाना
+Keywords[hr]=kuick,copy,move,kopiraj,premjesti,kopiranje,premještanje
+Keywords[hu]=Kuick,másolás,mozgatás
+Keywords[is]=fljót,afrita,færa
+Keywords[it]=kuick,copia,spostamento
+Keywords[ja]=kuick,コピー,移動
+Keywords[ka]=kuick,ასლი,გადატანა
+Keywords[km]=kuick ចម្លង ផ្លាស់ទី
+Keywords[lt]=kuick,copy,move,kopijuoti, perkelti
+Keywords[lv]=kuick,kopēt,pārvietot
+Keywords[mk]=kuick,копирај,премести,копирање,преместување
+Keywords[ms]=kuick,salin, alih
+Keywords[mt]=kuick,copy,move,ikkopja,mexxi
+Keywords[nb]=kuick,kopier,flytt
+Keywords[nds]=kuick,koperen,verschuven
+Keywords[ne]=छिटो,प्रतिलिपि,सार्नुहोस्
+Keywords[nl]=kuick,kopiëren,verplaatsen
+Keywords[nn]=kuick,kopier,flytt
+Keywords[nso]=kapela,gatisa,suta
+Keywords[pl]=kuick,kopiuj,przesuń
+Keywords[pt]=kuick,copiar,mover
+Keywords[pt_BR]=kuick,copiar,mover
+Keywords[ro]=kuick,copiere,mutare
+Keywords[ru]=kuick,копирование,перенос
+Keywords[sk]=kuick,kopírovať,presun
+Keywords[sl]=kuick,kopira,premakn
+Keywords[sr]=kuick,copy,move,копирај,премести
+Keywords[sr@Latn]=kuick,copy,move,kopiraj,premesti
+Keywords[sv]=kuick,kopiera,flytta
+Keywords[ta]=விரைவான,நகல் எடு, நகர்த்து
+Keywords[tg]=kuick, нусха, гузарондан
+Keywords[th]=รวดเร็ว,คัดลอก,ย้าย
+Keywords[tr]=kuick,hızlı,kopyala,taşı
+Keywords[uk]=kuick,копіювання,пересування
+Keywords[uz]=kuick,nusxa olish,koʻchirish
+Keywords[uz@cyrillic]=kuick,нусха олиш,кўчириш
+Keywords[ven]=kuick,khophi,tshimbila
+Keywords[vi]=kuick,sao chép,chép,di chuyển,chuyển
+Keywords[xh]=kuick,khuphela,hambisa
+Keywords[zh_CN]=kuick,copy,move,复制,移动
+Keywords[zu]=kuick,khiphela,susa
+X-KDE-ParentApp=kcontrol
+DocPath=konq-plugins/kuick/index.html
diff --git a/konq-plugins/kuick/kcmkuick/kcmkuick.h b/konq-plugins/kuick/kcmkuick/kcmkuick.h
new file mode 100644
index 0000000..c10d04e
--- /dev/null
+++ b/konq-plugins/kuick/kcmkuick/kcmkuick.h
@@ -0,0 +1,46 @@
+/***************************************************************************
+ kcmkuick.h
+ -------------------
+ copyright : (C) 2001 by Holger Freyther
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; version 2 of the License. *
+ * *
+ ***************************************************************************/
+
+#ifndef KCMKUICK_H
+#define KCMKUICK_H
+
+#include <kcmodule.h>
+#include <kaboutdata.h>
+#include "kcmkuickdialog.h"
+
+
+class KCMKuick
+ : public KCModule
+{
+ Q_OBJECT
+
+public:
+ KCMKuick (QWidget *parent, const char *name, const QStringList &);
+ ~KCMKuick();
+ void load();
+ void load(const QString &);
+ void save();
+ void defaults();
+ QString quickHelp() const;
+public slots:
+ void configChanged();
+private:
+ KCMKuickDialog *dialog;
+protected slots:
+ void slotClearMoveCache();
+ void slotClearCopyCache();
+ void slotShowToggled();
+};
+
+#endif
diff --git a/konq-plugins/kuick/kcmkuick/kcmkuickdialog.ui b/konq-plugins/kuick/kcmkuick/kcmkuickdialog.ui
new file mode 100644
index 0000000..5001ad9
--- /dev/null
+++ b/konq-plugins/kuick/kcmkuick/kcmkuickdialog.ui
@@ -0,0 +1,197 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>KCMKuickDialog</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KCMKuickDialog</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>598</width>
+ <height>190</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>m_chkShow</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Show "Copy To" and "Move To" entries in context menus</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>m_grpCopy</cstring>
+ </property>
+ <property name="title">
+ <string>Copy Operations</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton" row="2" column="0">
+ <property name="name">
+ <cstring>pbCopyClear</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Clear List</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="2">
+ <property name="name">
+ <cstring>m_txtCopyDir</cstring>
+ </property>
+ <property name="text">
+ <string>folders.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>m_txtCopyCache</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Cache the last</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="0" column="1">
+ <property name="name">
+ <cstring>m_sbCopy</cstring>
+ </property>
+ <property name="maxValue">
+ <number>20</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ </widget>
+ <spacer row="0" column="3">
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>m_grpMove</cstring>
+ </property>
+ <property name="title">
+ <string>Move Operations</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QPushButton" row="2" column="0">
+ <property name="name">
+ <cstring>pbMoveClear</cstring>
+ </property>
+ <property name="text">
+ <string>Clear &amp;List</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>m_txtMoveCache</cstring>
+ </property>
+ <property name="text">
+ <string>Cache the last</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="0" column="1">
+ <property name="name">
+ <cstring>m_sbMove</cstring>
+ </property>
+ <property name="maxValue">
+ <number>20</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="2">
+ <property name="name">
+ <cstring>m_txtMoveDir</cstring>
+ </property>
+ <property name="text">
+ <string>folders.</string>
+ </property>
+ </widget>
+ <spacer row="0" column="3">
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ </vbox>
+</widget>
+<tabstops>
+ <tabstop>m_sbCopy</tabstop>
+ <tabstop>pbCopyClear</tabstop>
+ <tabstop>m_sbMove</tabstop>
+ <tabstop>pbMoveClear</tabstop>
+</tabstops>
+<slots>
+ <slot access="private">slotClearMoveCache()</slot>
+ <slot access="protected">slotClearCopyCache()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="0"/>
+<layoutfunctions spacing="KDialog::spacingHint"/>
+</UI>
diff --git a/konq-plugins/kuick/kdirmenu.cpp b/konq-plugins/kuick/kdirmenu.cpp
new file mode 100644
index 0000000..2cbf6de
--- /dev/null
+++ b/konq-plugins/kuick/kdirmenu.cpp
@@ -0,0 +1,169 @@
+/* This file is part of the KDE project
+ Copyright (C) 2001 Holger Freyther <freyther@yahoo.com>
+ Icon stroing inspired by Matthias Elters browser_mnu.* (currently not used)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; version 2
+ of the License.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+#include <qiconset.h>
+#include <qdir.h>
+#include <qfileinfo.h>
+
+#include <kaction.h>
+#include <kapplication.h>
+#include <kiconloader.h>
+#include <kio/global.h>
+#include <klocale.h>
+#include <kurl.h>
+#include <ksimpleconfig.h>
+#include "kdirmenu.h"
+
+#define CICON(a) (*_icons)[a]
+
+QMap<QString, QPixmap> *KDirMenu::_icons = 0;
+
+KDirMenu::KDirMenu ( QWidget *parent, const KURL &_src,
+ const QString &_path, const QString &_name, bool /*showfile*/ )
+ : QPopupMenu(parent),
+ path(_path),
+ name(_name),
+ src( _src ),
+ action( 0 )
+{
+ children.setAutoDelete( true );
+ initIconMap( );
+ connect( this, SIGNAL( aboutToShow( ) ), this, SLOT( slotAboutToShow( ) ) );
+ connect( this, SIGNAL( aboutToHide( ) ), this, SLOT( slotAboutToHide( ) ) );
+ children.clear(); // just in case
+
+ QFileInfo fileInfo(path);
+ if (( src.path() != path || !src.isLocalFile()) && fileInfo.isWritable())
+ action = new KAction(name, 0, this, SLOT(new_slot( ) ), this);
+}
+KDirMenu::~KDirMenu( ) {
+ delete action;
+ clear( );
+ children.clear( );
+}
+void KDirMenu::insert( KDirMenu *submenu, const QString &_path ) {
+ static const QIconSet folder = SmallIconSet("folder");
+ QString escapedPath = _path;
+ QString completPath=path+'/'+_path;
+ // parse .directory if it does exist
+ if (QFile::exists(completPath + "/.directory")) {
+
+ KSimpleConfig c(completPath + "/.directory", true);
+ c.setDesktopGroup();
+ QString iconPath = c.readEntry("Icon");
+
+ if ( iconPath.startsWith("./") )
+ iconPath = _path + '/' + iconPath.mid(2);
+ QPixmap icon;
+ icon = KGlobal::iconLoader()->loadIcon(iconPath,
+ KIcon::Small, KIcon::SizeSmall,
+ KIcon::DefaultState, 0, true);
+ if(icon.isNull())
+ icon = CICON("folder");
+ insertItem( icon, escapedPath.replace( "&", "&&" ), submenu );
+ }
+ else
+ insertItem( folder, escapedPath.replace( "&", "&&" ), submenu );
+ children.append( submenu );
+ connect(submenu, SIGNAL(fileChosen(const QString &)),
+ this, SLOT(slotFileSelected(const QString &)));
+}
+
+void KDirMenu::slotAboutToShow( ) {
+
+ // ok, prepare the dir: list all dirs and insert the new menus
+ if (count() >= 1) return;
+
+ //Precaution: if not a directory, exit, in case some path in KMetaMenu
+ //isn't checked right
+ if ( !QFileInfo(path).isDir() )
+ return;
+
+ if ( action )
+ action->plug( this );
+ else
+ setItemEnabled( insertItem( name ), false );
+
+ // all dirs writeable and readable
+ QDir dir(path, QString::null,
+ QDir::Name | QDir::DirsFirst | QDir::IgnoreCase,
+ QDir::Dirs | QDir::Readable | QDir::Executable);
+
+ const QFileInfoList* dirList = dir.entryInfoList();
+ if ( !dirList || dirList->isEmpty() ) {
+ if ( action )
+ action->setEnabled( false );
+ return;
+ }
+
+ insertSeparator( );
+
+ if (dirList->count() == 2) {
+ insertItem(i18n("No Sub-Folders"), 0);
+ setItemEnabled(0, false);
+ return;
+ }
+
+ static const QString& dot = KGlobal::staticQString( "." );
+ static const QString& dotdot = KGlobal::staticQString( ".." );
+
+ for ( QFileInfoListIterator it( *dirList ); *it; ++it ) {
+ QString fileName = (*it)->fileName();
+ if ( fileName == dot || fileName == dotdot )
+ continue;
+
+ KURL u;
+ u.setPath((*it)->absFilePath());
+ if (kapp->authorizeURLAction("list", u, u))
+ {
+ insert(new KDirMenu(this, src, (*it)->absFilePath(), name),
+ KIO::decodeFileName( fileName ));
+ }
+ }
+}
+void KDirMenu::slotAboutToHide( ) {
+
+}
+void KDirMenu::initIconMap()
+{
+ if(_icons) return;
+
+// kdDebug(90160) << "PanelBrowserMenu::initIconMap" << endl;
+
+ _icons = new QMap<QString, QPixmap>;
+
+ _icons->insert("folder", SmallIcon("folder"));
+ _icons->insert("unknown", SmallIcon("mime_empty"));
+ _icons->insert("folder_open", SmallIcon("folder_open"));
+ _icons->insert("kdisknav", SmallIcon("kdisknav"));
+ _icons->insert("kfm", SmallIcon("kfm"));
+ _icons->insert("terminal", SmallIcon("terminal"));
+ _icons->insert("txt", SmallIcon("txt"));
+ _icons->insert("exec", SmallIcon("exec"));
+ _icons->insert("chardevice", SmallIcon("chardevice"));
+}
+void KDirMenu::slotFileSelected(const QString &_path ){
+ emit fileChosen( _path );
+}
+
+void KDirMenu::new_slot() {
+ emit fileChosen(path );
+}
+
+#include "kdirmenu.moc"
diff --git a/konq-plugins/kuick/kdirmenu.h b/konq-plugins/kuick/kdirmenu.h
new file mode 100644
index 0000000..6356e83
--- /dev/null
+++ b/konq-plugins/kuick/kdirmenu.h
@@ -0,0 +1,61 @@
+/* This file is part of the KDE project
+ Copyright (C) 2001 Holger Freyther <freyther@yahoo.com>
+
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; version 2
+ of the License.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef __kdirmenu_h
+#define __kdirmenu_h
+
+#include <qpopupmenu.h>
+#include <qptrlist.h>
+#include <qmap.h>
+
+class KAction;
+class KURL;
+
+class KDirMenu : public QPopupMenu {
+ Q_OBJECT
+public:
+ KDirMenu( QWidget *parent, const KURL &src, const QString &_path,
+ const QString &name, bool showfiles = false );
+ ~KDirMenu( );
+ void setPath( const QString &_path);
+ void insert( KDirMenu *menu, const QString &path );
+protected:
+ int target_id;
+ static QMap<QString, QPixmap> *_icons;
+
+signals:
+ void fileChosen( const QString &_path );
+private:
+ QString path;
+ QString name;
+ KURL src;
+ KAction *action;
+ QPtrList<KDirMenu> children;
+ void initIconMap( );
+public slots:
+ void slotAboutToShow( );
+ void slotAboutToHide( );
+ void slotFileSelected(const QString &_path );
+ /** No descriptions */
+ void new_slot();
+};
+
+#endif // __kdirmenu_h
+
diff --git a/konq-plugins/kuick/kimcontactmenu.cpp b/konq-plugins/kuick/kimcontactmenu.cpp
new file mode 100644
index 0000000..42cf980
--- /dev/null
+++ b/konq-plugins/kuick/kimcontactmenu.cpp
@@ -0,0 +1,82 @@
+/* This file is part of the KDE project
+ Copyright (C) 2004 Will Stephenson <lists@stevello.free-online.co.uk>
+
+ kimcontactmenu.cpp - Menu allowing a choice from a list of instant
+ messaging contacts
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; version 2
+ of the License.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qstringlist.h>
+
+// The following enables kabc for contact name lookups instead of using Kopete's idea of their name.
+//#define KIMCONTACTS_USE_KABC
+
+#include <kimproxy.h>
+
+#ifdef KIMCONTACTS_USE_KABC
+#include <kabc/addressbook.h>
+#include <kabc/stdaddressbook.h>
+#endif
+
+#include "kimcontactmenu.h"
+
+KIMContactMenu::KIMContactMenu( QWidget *parent, KIMProxy *proxy )
+ : QPopupMenu( parent), mProxy( proxy )
+{
+#ifdef KIMCONTACTS_USE_KABC
+ m_addressBook = KABC::StdAddressBook::self( false );
+#endif
+ connect( this, SIGNAL( activated( int ) ), SLOT( slotItemActivated( int ) ) );
+ connect( this, SIGNAL( aboutToShow( ) ), this, SLOT( slotAboutToShow( ) ) );
+}
+
+KIMContactMenu::~KIMContactMenu()
+{
+}
+
+void KIMContactMenu::slotAboutToHide()
+{
+}
+
+void KIMContactMenu::slotAboutToShow()
+{
+ // the pointer may be returning to the menu, if it's already populated, there's nothing to do
+ if (count() >= 1) return;
+
+ mContacts = mProxy->fileTransferContacts();
+
+ int i = 0;
+
+ for ( QStringList::Iterator it = mContacts.begin(); it != mContacts.end(); ++it, ++i )
+ {
+#ifdef KIMCONTACTS_USE_KABC
+ insertItem( mProxy->presenceIcon( *it ), m_addressBook->findByUid( *it ).realName(), i );
+#else
+ insertItem( mProxy->presenceIcon( *it ), mProxy->displayName( *it ), i );
+#endif
+ }
+}
+
+void KIMContactMenu::slotItemActivated( int item )
+{
+ // look up corresponding UID
+ QString uid = mContacts[ item ];
+ // emit signal
+ emit contactChosen( uid );
+}
+
+#include "kimcontactmenu.moc"
diff --git a/konq-plugins/kuick/kimcontactmenu.h b/konq-plugins/kuick/kimcontactmenu.h
new file mode 100644
index 0000000..62c13bc
--- /dev/null
+++ b/konq-plugins/kuick/kimcontactmenu.h
@@ -0,0 +1,54 @@
+/* This file is part of the KDE project
+ Copyright (C) 2004 Will Stephenson <lists@stevello.free-online.co.uk>
+
+ kimcontactmenu.cpp - Menu allowing a choice from a list of instant
+ messaging contacts
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; version 2
+ of the License.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef __kim_contact_menu_h
+#define __kim_contact_menu_h
+
+#include <qpopupmenu.h>
+#include <qstringlist.h>
+
+class KIMProxy;
+namespace KABC {
+ class AddressBook;
+}
+
+class KIMContactMenu : public QPopupMenu
+{
+ Q_OBJECT
+public:
+ KIMContactMenu( QWidget *parent, KIMProxy *proxy );
+ ~KIMContactMenu();
+protected slots:
+ // populate menus if not already populated
+ void slotAboutToShow();
+ void slotAboutToHide();
+ void slotItemActivated( int item );
+signals:
+ void contactChosen( const QString &uid );
+
+protected:
+ KIMProxy *mProxy;
+ QStringList mContacts;
+ KABC::AddressBook* m_addressBook;
+};
+
+#endif
diff --git a/konq-plugins/kuick/kmetamenu.cpp b/konq-plugins/kuick/kmetamenu.cpp
new file mode 100644
index 0000000..065a825
--- /dev/null
+++ b/konq-plugins/kuick/kmetamenu.cpp
@@ -0,0 +1,180 @@
+/* This file is part of the KDE project
+ Copyright (C) 2001 Holger Freyther <freyther@yahoo.com>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; version 2
+ of the License.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kiconloader.h>
+#include <kimproxy.h>
+#include <kapplication.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kfiledialog.h>
+#include <kurl.h>
+#include <konq_popupmenu.h>
+
+#include <qpixmap.h>
+#include <qdir.h>
+#include <qiconset.h>
+#include <qstringlist.h>
+
+#include "kmetamenu.h"
+#include "kdirmenu.h"
+#include "kimcontactmenu.h"
+#include "kmetamenu.moc"
+
+KMetaMenu::KMetaMenu( QWidget *parent, const KURL &url,
+ const QString &text, const QString &key, KIMProxy *imProxy )
+: QPopupMenu( parent),
+ m_root( 0 ), m_home( 0 ), m_etc( 0 ), m_current( 0 ), m_browse( 0 ) {
+ int recent_no;
+ group = key;
+ actions.setAutoDelete( TRUE );
+
+ QStringList dirList;
+
+ KURL u;
+
+ u.setPath(QDir::homeDirPath());
+ if ( kapp->authorizeURLAction("list", u, u) )
+ {
+ m_home = new KDirMenu( parent, url, u.path() , text );
+ insertItem( SmallIcon( "kfm_home" ), i18n("&Home Folder"), m_home);
+ dirList << u.path();
+
+ connect(m_home, SIGNAL(fileChosen(const QString &)),
+ SLOT(slotFileChosen(const QString &) ) );
+ }
+
+ u.setPath(QDir::rootDirPath());
+ if ( kapp->authorizeURLAction("list", u, u) )
+ {
+ m_root = new KDirMenu( parent, url, u.path() , text );
+ insertItem( SmallIcon( "folder_red" ), i18n("&Root Folder"), m_root);
+ dirList << u.path();
+
+ connect(m_root, SIGNAL(fileChosen(const QString &)),
+ SLOT(slotFileChosen(const QString &) ) );
+ }
+
+ QString confDir = QDir::rootDirPath()+ "etc";
+ u.setPath(confDir);
+ if ( QFileInfo( confDir ).isWritable() &&
+ kapp->authorizeURLAction("list", u, u) )
+ {
+ m_etc = new KDirMenu( parent, url, confDir, text );
+ insertItem( SmallIcon( "folder_yellow" ) ,
+ i18n("&System Configuration"), m_etc);
+ dirList << confDir;
+
+ connect(m_etc , SIGNAL(fileChosen(const QString &)),
+ SLOT(slotFileChosen(const QString &) ) );
+ }
+
+ if ( url.isLocalFile()
+ && dirList.find( url.path() ) == dirList.end()
+ && QFileInfo( url.path() ).isWritable()
+ && QFileInfo( url.path() ).isDir()
+ && kapp->authorizeURLAction("list", url, url) )
+ //Need to check whether a directory so we don't crash trying to access it
+ //(#60192)
+ {
+ // Also add current working directory
+ m_current = new KDirMenu( parent, url, url.path(), text );
+ insertItem( SmallIcon( "folder" ), i18n( "&Current Folder" ),
+ m_current );
+
+ connect(m_current, SIGNAL(fileChosen(const QString &)),
+ SLOT(slotFileChosen(const QString &) ) );
+ }
+
+ if ( imProxy )
+ {
+ m_contacts = new KIMContactMenu( parent, imProxy );
+ int item = insertItem( SmallIconSet( "personal" ), i18n( "C&ontact" ), m_contacts );
+ connect ( m_contacts, SIGNAL( contactChosen( const QString &) ), SIGNAL( contactChosen( const QString & ) ) );
+ if ( !imProxy->initialize() || imProxy->fileTransferContacts().isEmpty() )
+ setItemEnabled( item, false );
+ }
+
+
+ m_browse = new KAction(i18n("&Browse..."), 0, this, SLOT(slotBrowse()), this );
+ m_browse->plug(this);
+ // read the last chosen dirs
+ // first set the group according to our parameter
+ conf = kapp->config( );
+ conf->setGroup(key );
+ recent_no = conf->readNumEntry("ShowRecent", 5);
+ list = conf->readPathListEntry("Paths");
+ if ( list.count() > 0 )
+ insertSeparator();
+ int i=1;
+ QStringList::Iterator it = list.begin();
+ while( it != list.end() ) {
+ if( i == (recent_no + 1) )
+ break;
+ QDir dir( *it );
+ u.setPath( *it );
+ if ( !dir.exists() || !kapp->authorizeURLAction("list", u, u) ) {
+ it = list.remove( it );
+ continue;
+ }
+ QString escapedDir = *it;
+ KAction *action = new KAction(escapedDir.replace("&", "&&"), 0, this, SLOT(slotFastPath()), this);
+ action->plug(this );
+ actions.append( action );
+ ++it;
+ i++;
+ }
+}
+
+KMetaMenu::KMetaMenu( ){
+
+}
+KMetaMenu::~KMetaMenu(){
+ delete m_root;
+ delete m_home;
+ delete m_etc;
+ delete m_current;
+ delete m_browse;
+ actions.clear();
+}
+void KMetaMenu::slotFileChosen(const QString &path ){
+ writeConfig(path );
+ emit fileChosen(path );
+}
+
+void KMetaMenu::slotFastPath( ) {
+ KAction *action;
+ action = (KAction*) sender();
+ QString text = action->plainText( );
+ slotFileChosen( text );
+}
+void KMetaMenu::writeConfig( const QString &path){
+ list.remove(path );
+ list.prepend(path );
+ conf->setGroup( group );
+ int c = conf->readNumEntry( "ShowRecent", 5 );
+ while ( list.count() > c && !list.isEmpty() )
+ list.remove(list.last());
+ conf->writePathEntry("Paths", list);
+ conf->sync( );
+}
+void KMetaMenu::slotBrowse() {
+ KURL dest = KFileDialog::getExistingURL();
+ if( dest.isEmpty() ) return;
+ slotFileChosen( dest.isLocalFile() ? dest.path() : dest.url() );
+}
diff --git a/konq-plugins/kuick/kmetamenu.h b/konq-plugins/kuick/kmetamenu.h
new file mode 100644
index 0000000..f6670f6
--- /dev/null
+++ b/konq-plugins/kuick/kmetamenu.h
@@ -0,0 +1,67 @@
+/* This file is part of the KDE project
+ Copyright (C) 2001 Holger Freyther <freyther@yahoo.com>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; version 2
+ of the License.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _kmetamenu_h
+#define _kmetamenu_h
+
+#include <qpopupmenu.h>
+#include <qptrlist.h>
+
+#include <kaction.h>
+
+class QIconSet;
+class QStringList;
+class KConfig;
+class KDirMenu;
+class KIMContactMenu;
+class KIMProxy;
+class KURL;
+
+class KMetaMenu : public QPopupMenu {
+ Q_OBJECT
+public:
+
+ KMetaMenu( QWidget *parent, const KURL &url, const QString &text,
+ const QString &key, KIMProxy * imProxy = 0L );
+ KMetaMenu();
+ ~KMetaMenu();
+ void writeConfig( const QString &path );
+public slots:
+ void slotFileChosen( const QString &path);
+ void slotFastPath( );
+ void slotBrowse( );
+signals:
+ void fileChosen( const QString &path );
+ void contactChosen( const QString &uid );
+private:
+ KDirMenu *m_root;
+ KDirMenu *m_home;
+ KDirMenu *m_etc;
+ KDirMenu *m_current;
+ KIMContactMenu *m_contacts;
+ KIMProxy *m_proxy;
+ KAction *m_browse;
+ QStringList list;
+ KConfig *conf;
+ QString group;
+ QPtrList<KAction> actions;
+};
+
+#endif
+
diff --git a/konq-plugins/kuick/kuick_plugin.cpp b/konq-plugins/kuick/kuick_plugin.cpp
new file mode 100644
index 0000000..80a7cc7
--- /dev/null
+++ b/konq-plugins/kuick/kuick_plugin.cpp
@@ -0,0 +1,114 @@
+/* This file is part of the KDE project
+ Copyright (C) 2001 Holger Freyther <freyther@yahoo.com>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; version 2
+ of the License.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "kuick_plugin.h"
+#include "kuick_plugin.moc"
+#include "kdirmenu.h"
+
+#include <kapplication.h>
+#include <kaction.h>
+#include <kinstance.h>
+#include <kiconloader.h>
+#include <kimproxy.h>
+#include <klocale.h>
+#include <konq_popupmenu.h>
+#include <kmessagebox.h>
+#include <kgenericfactory.h>
+#include <qobject.h>
+#include <kio/jobclasses.h>
+#include <kio/job.h>
+#include <kurl.h>
+
+typedef KGenericFactory<KTestMenu, KonqPopupMenu> KTestMenuFactory;
+K_EXPORT_COMPONENT_FACTORY( libkuickplugin, KTestMenuFactory("kuick_plugin") )
+
+KTestMenu::KTestMenu( KonqPopupMenu *popupmenu, const char *name, const QStringList& /*list*/ ) : KonqPopupMenuPlugin( popupmenu, name) {
+ popup= popupmenu ;
+ meta_copy_mmu = 0L;
+ meta_move_mmu = 0L;
+ my_action = new KAction( "kuick_plugin", 0, this, SLOT( slotPopupMaeh( ) ), actionCollection( ), "Do some funky stuff" );
+ addAction( my_action );
+ addSeparator();
+ //popupmenu->addMerge();
+ connect( popup, SIGNAL(aboutToShow() ), this, SLOT(slotPrepareMenu( ) ) );
+ m_imProxy = KIMProxy::instance( kapp->dcopClient() );
+}
+KTestMenu::~KTestMenu( ){
+ delete meta_copy_mmu;
+ delete meta_move_mmu;
+}
+void KTestMenu::slotPopupMaeh( ){
+
+}
+void KTestMenu::slotStartCopyJob( const QString &path ) {
+ KURL url = KURL::fromPathOrURL( path );
+ KIO::CopyJob *copy;
+ copy = KIO::copy( popup->popupURLList(), url);
+ copy->setAutoErrorHandlingEnabled( true );
+}
+void KTestMenu::slotStartMoveJob( const QString &path) {
+ KURL url = KURL::fromPathOrURL( path );
+ KIO::CopyJob *move;
+ move = KIO::move( popup->popupURLList(), url );
+ move->setAutoErrorHandlingEnabled( true );
+}
+
+void KTestMenu::slotFileTransfer( const QString &uid ) {
+ m_imProxy->sendFile( uid, popup->popupURLList().first() );
+}
+
+void KTestMenu::slotPrepareMenu( ) { // now it's time to set up the menu...
+// search for the dummy entry 'kuick_plugin' stores it index reomev it plug copy at the position
+ KGlobal::locale()->insertCatalogue("kuick_plugin");
+
+ bool isKDesktop = QCString( kapp->name() ) == "kdesktop";
+
+ for(int i= popup->count(); i >=1; i--) {
+ int id = popup->idAt( i );
+ QString text = popup->text( id );
+ if( text.contains("kuick_plugin") ) {
+ popup->removeItem( id );
+ if (isKDesktop && !kapp->authorize("editable_desktop_icons"))
+ {
+ // Remove seperator as well
+ id = popup->idAt( i-1 );
+ if (popup->text( id ).isEmpty())
+ popup->removeItem( id );
+ break;
+ }
+ meta_copy_mmu = new KMetaMenu(popup, popup->url(),
+ i18n("&Copy Here") , "kuick-copy", m_imProxy );
+ popup->insertItem(i18n("Copy To"), meta_copy_mmu, -1, i );
+ connect( meta_copy_mmu, SIGNAL(fileChosen(const QString &) ),
+ SLOT(slotStartCopyJob(const QString & )) );
+
+ connect( meta_copy_mmu, SIGNAL( contactChosen( const QString & ) ),
+ SLOT( slotFileTransfer( const QString & )) );
+
+ if( popup->protocolInfo().supportsMoving() ){
+ meta_move_mmu = new KMetaMenu(popup, popup->url(),
+ i18n("&Move Here"), "kuick-move");
+ popup->insertItem(i18n("Move To"), meta_move_mmu, -1, i+1 );
+ connect( meta_move_mmu, SIGNAL(fileChosen(const QString &) ),
+ SLOT(slotStartMoveJob(const QString & )) );
+ }
+ break;
+ }
+ }
+}
diff --git a/konq-plugins/kuick/kuick_plugin.desktop b/konq-plugins/kuick/kuick_plugin.desktop
new file mode 100644
index 0000000..41138df
--- /dev/null
+++ b/konq-plugins/kuick/kuick_plugin.desktop
@@ -0,0 +1,67 @@
+[Desktop Entry]
+Type=Service
+Name=Kuick Copy and Move
+Name[af]=Vinnige Kopie en Beweeg
+Name[az]=Kuik Köçür və Daşı
+Name[bg]=Бързо копиране и преместване
+Name[bs]=Kuick kopiranje i premještanje
+Name[ca]=Kuick copia i mou
+Name[cs]=Rychlé kopírování a přesouvání
+Name[cy]=Copïo a Symud Kuick
+Name[da]=Kuick kopiér & flyt
+Name[de]=Kuick - Kopieren und Verschieben
+Name[el]=Γρήγορη αντιγραφή και μετακίνηση
+Name[eo]=Rapidkopiilo
+Name[es]=Movimiento y copiado rápido
+Name[et]=Kuicki kopeerimine ja liigutamine
+Name[eu]=Kuick kopiatu eta mugitu
+Name[fa]=رونوشت و حرکت Kuick
+Name[fi]=Nopea kopiointi ja siirto
+Name[fr]=Copie et déplacement rapides
+Name[fy]=Kuick Kopiearje en Ferpleatse
+Name[gl]=Copiar e Mover Rapidamente
+Name[he]=העתקה והעברה מהירה
+Name[hi]=क्विक नक़ल तथा खिसकाना
+Name[hr]=KBrzo kopiranje i premještanje
+Name[hu]=Kuick - másolás és mozgatás
+Name[it]=Copia e spostamento rapidi
+Name[ja]=高速コピー & 移動
+Name[ka]=Kuick ასლი და გადატანა
+Name[kk]=Kuick көшірмелеу мен жылжыту
+Name[km]=Kuick ចម្លង ​និង​ផ្លាស់ទី
+Name[lt]=Kuick kopijavimas ir perkėlimas
+Name[lv]=Kuick Kopēšana un Pārvietošana
+Name[mk]=Kuick копирање и преместување
+Name[ms]=Salin Kuick dan Alih
+Name[nb]=Kuick kopier og flytt
+Name[nds]=Kuick - Koperen un Verschuven
+Name[ne]=छिटो प्रतिलिपि गर्नुहोस् र सार्नुहोस्
+Name[nl]=Kuick Kopiëren en Verplaatsen
+Name[nn]=Snøggkopi-og-flytt
+Name[nso]=Tshutiso le Kgatiso ya Kuick
+Name[pl]=Szybkie kopiowanie i przesuwanie
+Name[pt]=Cópia e Mudança Rápida
+Name[pt_BR]=Lançador rápido
+Name[ro]=Mutare şi copiere Kuick
+Name[ru]=Быстрое копирование
+Name[sk]=Kuick Kopírovanie a Presun
+Name[sl]=Kopiranje in premikanje Kuick
+Name[sr]=Kuick, копирај и премести
+Name[sr@Latn]=Kuick, kopiraj i premesti
+Name[sv]=Snabbkopiera och -flytta
+Name[ta]=விரைவான நகல் எடு மற்றும் நகர்த்து
+Name[tg]=Нусхаи тез - Kuick
+Name[th]=คัดลอกและย้ายอย่างรวดเร็ว
+Name[tr]=Hızlı Kopyalama ve Taşıma
+Name[uk]=Kuick копіювання та пересування
+Name[uz]=Tez nusxa olish va koʻchirish
+Name[uz@cyrillic]=Тез нусха олиш ва кўчириш
+Name[ven]=Kuick khophi na u tshimbila
+Name[vi]=Sao chép và di chuyển Kuick
+Name[xh]=Ukhuphelo noHambiso lweKuick
+Name[zh_CN]=快速复制和移动
+Name[zh_TW]=Kuick 複製與移動
+Name[zu]=Kuick Khiphela futhi Ususe
+Icon=kmultiple
+X-KDE-Library=libkuickplugin
+ServiceTypes=KonqPopupMenu/Plugin,all/all
diff --git a/konq-plugins/kuick/kuick_plugin.h b/konq-plugins/kuick/kuick_plugin.h
new file mode 100644
index 0000000..15ffdcd
--- /dev/null
+++ b/konq-plugins/kuick/kuick_plugin.h
@@ -0,0 +1,54 @@
+/* This file is part of the KDE project
+ Copyright (C) 2001 Holger Freyther <freyther@yahoo.com>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; version 2
+ of the License.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _PLUGIN_TEST_H_
+#define _PLUGIN_TEST_H_
+
+#include <konq_popupmenu.h>
+
+#include "kmetamenu.h"
+
+class KAction;
+class KURL;
+class KTestMenu : public KonqPopupMenuPlugin {
+ Q_OBJECT
+public:
+ KTestMenu (KonqPopupMenu *, const char *name, const QStringList &list);
+ virtual ~KTestMenu( );
+ KMetaMenu *meta_copy_mmu;
+ KMetaMenu *meta_move_mmu;
+ KonqPopupMenu *popup;
+
+private:
+ KAction *my_action;
+ KIMProxy *m_imProxy;
+
+public slots:
+ void slotPopupMaeh( );
+ void slotStartCopyJob(const QString &path );
+ //void slotStartCopyJob(const KURL &url );
+ void slotStartMoveJob(const QString &path );
+ //void slotStartMoveJob(const KURL &url );
+ void slotFileTransfer( const QString &uid );
+ void slotPrepareMenu( );
+};
+
+
+#endif
+
diff --git a/konq-plugins/kuick/kuickplugin.desktop b/konq-plugins/kuick/kuickplugin.desktop
new file mode 100644
index 0000000..da4b262
--- /dev/null
+++ b/konq-plugins/kuick/kuickplugin.desktop
@@ -0,0 +1,66 @@
+[Desktop Entry]
+Name=Kuick Copy and Move
+Name[af]=Vinnige Kopie en Beweeg
+Name[az]=Kuik Köçür və Daşı
+Name[bg]=Бързо копиране и преместване
+Name[bs]=Kuick kopiranje i premještanje
+Name[ca]=Kuick copia i mou
+Name[cs]=Rychlé kopírování a přesouvání
+Name[cy]=Copïo a Symud Kuick
+Name[da]=Kuick kopiér & flyt
+Name[de]=Kuick - Kopieren und Verschieben
+Name[el]=Γρήγορη αντιγραφή και μετακίνηση
+Name[eo]=Rapidkopiilo
+Name[es]=Movimiento y copiado rápido
+Name[et]=Kuicki kopeerimine ja liigutamine
+Name[eu]=Kuick kopiatu eta mugitu
+Name[fa]=رونوشت و حرکت Kuick
+Name[fi]=Nopea kopiointi ja siirto
+Name[fr]=Copie et déplacement rapides
+Name[fy]=Kuick Kopiearje en Ferpleatse
+Name[gl]=Copiar e Mover Rapidamente
+Name[he]=העתקה והעברה מהירה
+Name[hi]=क्विक नक़ल तथा खिसकाना
+Name[hr]=KBrzo kopiranje i premještanje
+Name[hu]=Kuick - másolás és mozgatás
+Name[it]=Copia e spostamento rapidi
+Name[ja]=高速コピー & 移動
+Name[ka]=Kuick ასლი და გადატანა
+Name[kk]=Kuick көшірмелеу мен жылжыту
+Name[km]=Kuick ចម្លង ​និង​ផ្លាស់ទី
+Name[lt]=Kuick kopijavimas ir perkėlimas
+Name[lv]=Kuick Kopēšana un Pārvietošana
+Name[mk]=Kuick копирање и преместување
+Name[ms]=Salin Kuick dan Alih
+Name[nb]=Kuick kopier og flytt
+Name[nds]=Kuick - Koperen un Verschuven
+Name[ne]=छिटो प्रतिलिपि गर्नुहोस् र सार्नुहोस्
+Name[nl]=Kuick Kopiëren en Verplaatsen
+Name[nn]=Snøggkopi-og-flytt
+Name[nso]=Tshutiso le Kgatiso ya Kuick
+Name[pl]=Szybkie kopiowanie i przesuwanie
+Name[pt]=Cópia e Mudança Rápida
+Name[pt_BR]=Lançador rápido
+Name[ro]=Mutare şi copiere Kuick
+Name[ru]=Быстрое копирование
+Name[sk]=Kuick Kopírovanie a Presun
+Name[sl]=Kopiranje in premikanje Kuick
+Name[sr]=Kuick, копирај и премести
+Name[sr@Latn]=Kuick, kopiraj i premesti
+Name[sv]=Snabbkopiera och -flytta
+Name[ta]=விரைவான நகல் எடு மற்றும் நகர்த்து
+Name[tg]=Нусхаи тез - Kuick
+Name[th]=คัดลอกและย้ายอย่างรวดเร็ว
+Name[tr]=Hızlı Kopyalama ve Taşıma
+Name[uk]=Kuick копіювання та пересування
+Name[uz]=Tez nusxa olish va koʻchirish
+Name[uz@cyrillic]=Тез нусха олиш ва кўчириш
+Name[ven]=Kuick khophi na u tshimbila
+Name[vi]=Sao chép và di chuyển Kuick
+Name[xh]=Ukhuphelo noHambiso lweKuick
+Name[zh_CN]=快速复制和移动
+Name[zh_TW]=Kuick 複製與移動
+Name[zu]=Kuick Khiphela futhi Ususe
+Icon=kmultiple
+X-KDE-ParentApp=konqueror
+DocPath=konq-plugins/kuick/index.html
diff --git a/konq-plugins/mediarealfolder/Makefile.am b/konq-plugins/mediarealfolder/Makefile.am
new file mode 100644
index 0000000..76b7287
--- /dev/null
+++ b/konq-plugins/mediarealfolder/Makefile.am
@@ -0,0 +1,5 @@
+servicesdir = $(kde_datadir)/konqueror/servicemenus
+services_DATA = media_realfolder.desktop
+
+bin_SCRIPTS = kio_media_realfolder
+
diff --git a/konq-plugins/mediarealfolder/kio_media_realfolder b/konq-plugins/mediarealfolder/kio_media_realfolder
new file mode 100755
index 0000000..cbb3d06
--- /dev/null
+++ b/konq-plugins/mediarealfolder/kio_media_realfolder
@@ -0,0 +1,20 @@
+#! /usr/bin/env perl
+
+use warnings;
+use strict;
+
+my @parts = split(/\//, $ARGV[0]);
+
+my $medium = $parts[$#parts];
+
+open(IN, "-|") || exec "dcop", "kded", "mediamanager", "properties", $medium;
+my @prop = <IN>;
+close(IN);
+
+if ($prop[6] =~ /^\//)
+{
+ my $mountpoint = $prop[6];
+ chomp($mountpoint);
+ exec "kfmclient", "exec", "file://$mountpoint/";
+}
+
diff --git a/konq-plugins/mediarealfolder/media_realfolder.desktop b/konq-plugins/mediarealfolder/media_realfolder.desktop
new file mode 100644
index 0000000..9cee0c6
--- /dev/null
+++ b/konq-plugins/mediarealfolder/media_realfolder.desktop
@@ -0,0 +1,55 @@
+[Desktop Entry]
+ServiceTypes=media/cdrom_mounted,media/cdwriter_mounted,media/dvd_mounted,media/floppy5_mounted,media/floppy_mounted,media/hdd_mounted,media/nfs_mounted,media/smb_mounted,media/removable_mounted,media/zip_mounted
+Actions=MediaRealFolder
+X-KDE-Priority=TopLevel
+X-KDE-MediaNotifierHide=true
+
+[Desktop Action MediaRealFolder]
+Name=Open Medium System Folder
+Name[bg]=Отваряне на системната директория на носителя
+Name[ca]=Obre la carpeta de mitjans del sistema
+Name[cs]=Otevřít systémovou složku média
+Name[da]=Åbn medium-system-mappen
+Name[de]=Systemordner des Mediums öffnen
+Name[el]=Άνοιγμα του φακέλου συστήματος του μέσου
+Name[eo]=Malfermu mediosisteman dosierujon
+Name[es]=Abrir la carpeta del administrador de medios
+Name[et]=Ava andmekandja süsteemi kataloog
+Name[eu]=Ireki euskarriaren kudeatzailea
+Name[fa]=باز کردن پوشۀ سیستم رسانه
+Name[fi]=Avaa mediajärjestelmän kansio
+Name[fr]=Dossier système d'ouverture de média
+Name[fy]=Systeemmap medium iepenje
+Name[gl]=Cartafol de Sistema de Médio Aberto
+Name[he]=פתח את תיקיית מדיית המערכת
+Name[hr]=Otvaranje srednjih mapa sustava
+Name[hu]=A médiaanyagok rendszerkönyvtárának megnyitása
+Name[is]=Opin miðils kerfismappa
+Name[it]=Cartella di sistema per l'apertura di supporti
+Name[ja]=メディアシステムフォルダを開く
+Name[ka]=მედიუმის სისტემური საქაღალდის გახსნა
+Name[kk]=Жүйелік қалтаны ашу
+Name[km]=បើក​ថត​ប្រព័ន្ធ​ឧបករណ៍​ផ្ទុក
+Name[mk]=Отвори ја системската папка на медиумот
+Name[nb]=Åpne systemmappe for medie
+Name[nds]=Systeemorner vun't Medium opmaken
+Name[ne]=मध्यम प्रणाली फोल्डर खोल्नुहोस्
+Name[nl]=Systeemmap medium openen
+Name[nn]=Opna mediesystemmappe
+Name[pa]=ਮੀਡੀਅਮ ਸਿਸਟਮ ਫੋਲਡਰ ਖੋਲੋ
+Name[pl]=Otwórz folder systemowy mediów
+Name[pt]=Abrir a Pasta de Sistema do Dispositivo
+Name[pt_BR]=Abrir a Pasta de Mídias do Sistema
+Name[ru]=Открыть системную папку
+Name[sk]=Otvoriť systémový priečinok médií
+Name[sl]=Odpri sistemsko mapo z nosilci
+Name[sr]=Отвори системску фасциклу медијума
+Name[sr@Latn]=Otvori sistemsku fasciklu medijuma
+Name[sv]=Öppna mediumsystemkatalog
+Name[tr]=Aygıtın Sistem Dizinini Aç
+Name[uk]=Відкрити системну теку носія
+Name[vi]=Mở thư mục hệ thống vừa
+Name[zh_CN]=打开介质系统文件夹
+Name[zh_TW]=開啟媒體系統資料夾
+Exec=kio_media_realfolder %u
+
diff --git a/konq-plugins/microformat/Makefile.am b/konq-plugins/microformat/Makefile.am
new file mode 100644
index 0000000..d96b5c5
--- /dev/null
+++ b/konq-plugins/microformat/Makefile.am
@@ -0,0 +1,19 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = libmfkonqmficon.la
+
+libmfkonqmficon_la_SOURCES = konqmficon.cpp pluginbase.cpp
+libmfkonqmficon_la_LIBADD = -lkonq $(LIB_KHTML)
+libmfkonqmficon_la_LDFLAGS = -module $(KDE_PLUGIN) -avoid-version -no-undefined $(all_libraries)
+
+konqmficondir = $(kde_datadir)/khtml/kpartplugins
+konqmficon_DATA = mf_konqmficon.desktop mf_konqmficon.rc
+
+mficondir = $(kde_datadir)/microformat/pics
+mficon_DATA = microformat.png
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/mf_konqplugin.pot
diff --git a/konq-plugins/microformat/README b/konq-plugins/microformat/README
new file mode 100644
index 0000000..896256f
--- /dev/null
+++ b/konq-plugins/microformat/README
@@ -0,0 +1,14 @@
+Microformats
+------------
+
+Please see:
+
+http://developers.technorati.com/wiki/hCard
+http://developers.technorati.com/wiki/hCalendar
+http://developers.technorati.com/wiki/MicroFormat
+
+
+Also try:
+http://tantek.com/microformats/hcard-creator.html
+http://theryanking.com/microformats/hcalendar-creator.html
+
diff --git a/konq-plugins/microformat/hcard.png b/konq-plugins/microformat/hcard.png
new file mode 100644
index 0000000..b80213c
--- /dev/null
+++ b/konq-plugins/microformat/hcard.png
Binary files differ
diff --git a/konq-plugins/microformat/konqmficon.cpp b/konq-plugins/microformat/konqmficon.cpp
new file mode 100644
index 0000000..51fdd97
--- /dev/null
+++ b/konq-plugins/microformat/konqmficon.cpp
@@ -0,0 +1,323 @@
+/*
+ Copyright (C) 2004 Teemu Rytilahti <tpr@d5k.net>
+ Copyright (C) 2005 George Staikos <staikos@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+*/
+
+#include "konqmficon.h"
+
+#include <dcopref.h>
+#include <kdebug.h>
+#include <kgenericfactory.h>
+#include <kiconloader.h>
+#include <kparts/statusbarextension.h>
+#include <kstandarddirs.h>
+#include <kstatusbar.h>
+#include <kurllabel.h>
+
+#include <qcursor.h>
+#include <qstylesheet.h>
+#include <qtimer.h>
+#include <qtooltip.h>
+
+typedef KGenericFactory<KonqMFIcon> KonqMFIconFactory;
+K_EXPORT_COMPONENT_FACTORY(libmfkonqmficon,
+ KonqMFIconFactory("mfkonqmficon"))
+
+KonqMFIcon::KonqMFIcon(QObject *parent, const char *name, const QStringList &)
+: KParts::Plugin(parent, name), PluginBase(), m_part(0), m_mfIcon(0), m_statusBarEx(0), m_menu(0) {
+ KGlobal::locale()->insertCatalogue("mf_konqplugin");
+
+ m_part = dynamic_cast<KHTMLPart*>(parent);
+ if (!m_part) {
+ kdDebug() << "couldn't get part" << endl;
+ return;
+ }
+ QTimer::singleShot(0, this, SLOT(waitPartToLoad()));
+}
+
+
+void KonqMFIcon::waitPartToLoad() {
+ connect(m_part, SIGNAL(completed()), this, SLOT(addMFIcon()));
+ connect(m_part, SIGNAL(completed(bool)), this, SLOT(addMFIcon())); // to make pages with metarefresh to work
+ connect(m_part, SIGNAL(started(KIO::Job *)), this, SLOT(removeMFIcon()));
+}
+
+
+KonqMFIcon::~KonqMFIcon() {
+ KGlobal::locale()->removeCatalogue("mf_konqplugin");
+ delete m_menu;
+ m_menu = 0L;
+}
+
+
+static QString textForNode(DOM::Node node) {
+ QString rc;
+ DOM::NodeList nl = node.childNodes();
+ for (unsigned int i = 0; i < nl.length(); ++i) {
+ DOM::Node n = nl.item(i);
+ if (n.nodeType() == DOM::Node::TEXT_NODE) {
+ rc += n.nodeValue().string();
+ }
+ }
+ // FIXME: entries need to be escaped for vcard/vevent
+ return rc.stripWhiteSpace();
+}
+
+
+static QString extractAddress(DOM::Node node) {
+ QString rc = ";;";
+ QMap<QString,QString> entry;
+ DOM::NodeList nodes = node.childNodes();
+ unsigned int n = nodes.length();
+ for (unsigned int i = 0; i < n; ++i) {
+ DOM::Node node = nodes.item(i);
+ DOM::NamedNodeMap map = node.attributes();
+ for (unsigned int j = 0; j < map.length(); ++j) {
+ if (map.item(j).nodeName().string() != "class") {
+ continue;
+ }
+ QString a = map.item(j).nodeValue().string();
+ if (a == "street-address") {
+ entry["street-address"] = textForNode(node);
+ } else if (a == "locality") {
+ entry["locality"] = textForNode(node);
+ } else if (a == "region") {
+ entry["region"] = textForNode(node);
+ } else if (a == "postal-code") {
+ entry["postal-code"] = textForNode(node);
+ }
+ }
+ }
+
+ rc += entry["street-address"] + ";" + entry["locality"] + ";" + entry["region"] + ";" + entry["postal-code"] + ";" + entry["country"];
+ return rc.stripWhiteSpace();
+}
+
+
+void KonqMFIcon::extractCard(DOM::Node node) {
+ QString name, value;
+ DOM::NodeList nodes = node.childNodes();
+ unsigned int n = nodes.length();
+ value += "BEGIN:VCARD\nVERSION:3.0\n";
+ for (unsigned int i = 0; i < n; ++i) {
+ DOM::Node node = nodes.item(i);
+ DOM::NamedNodeMap map = node.attributes();
+ for (unsigned int j = 0; j < map.length(); ++j) {
+ if (map.item(j).nodeName().string() != "class") {
+ continue;
+ }
+ QStringList l = QStringList::split(' ', map.item(j).nodeValue().string());
+ for (QStringList::ConstIterator it = l.begin(); it != l.end(); ++it) {
+ if (*it == "photo") {
+ } else if (*it == "adr") {
+ value += "ADR:" + extractAddress(node) + "\n";
+ } else if (*it == "tel") {
+ value += "TEL;TYPE=VOICE:" + textForNode(node) + "\n";
+ } else if (*it == "fn") {
+ name = textForNode(node);
+ value += "FN:" + name + "\n";
+ } else if (*it == "url") {
+ DOM::Node at = node.attributes().getNamedItem("href");
+ if (!at.isNull()) {
+ value += "URL:" + at.nodeValue().string().stripWhiteSpace() + "\n";
+ }
+ } else if (*it == "email") {
+ DOM::Node at = node.attributes().getNamedItem("href");
+ if (!at.isNull()) {
+ QString v = at.nodeValue().string();
+ if (v.startsWith("mailto:")) {
+ v = v.mid(7);
+ }
+ value += "EMAIL:" + v.stripWhiteSpace() + "\n";
+ }
+ } else if (*it == "org") {
+ value += "ORG:" + textForNode(node) + "\n";
+ }
+ }
+ }
+ }
+
+ if (!name.isEmpty()) {
+ value += "END:VCARD\n";
+ _cards.append(qMakePair(name, value));
+ }
+}
+
+
+void KonqMFIcon::extractEvent(DOM::Node node) {
+ QString name, value = "BEGIN:VCALENDAR\nPRODID:-//Konqueror//EN\nVERSION:2.0\nBEGIN:VEVENT\n";
+ DOM::NodeList nodes = node.childNodes();
+ unsigned int n = nodes.length();
+ for (unsigned int i = 0; i < n; ++i) {
+ DOM::Node node = nodes.item(i);
+ DOM::NamedNodeMap map = node.attributes();
+ for (unsigned int j = 0; j < map.length(); ++j) {
+ if (map.item(j).nodeName().string() != "class") {
+ continue;
+ }
+ QStringList l = QStringList::split(' ', map.item(j).nodeValue().string());
+ for (QStringList::ConstIterator it = l.begin(); it != l.end(); ++it) {
+ if (*it == "url") {
+ DOM::Node at = node.attributes().getNamedItem("href");
+ if (!at.isNull()) {
+ value += "URL:" + at.nodeValue().string().stripWhiteSpace() + "\n";
+ }
+ } else if (*it == "dtstart") {
+ DOM::Node at = node.attributes().getNamedItem("title");
+ if (!at.isNull()) {
+ value += "DTSTART:" + at.nodeValue().string().stripWhiteSpace() + "\n";
+ }
+ } else if (*it == "dtend") {
+ DOM::Node at = node.attributes().getNamedItem("title");
+ if (!at.isNull()) {
+ value += "DTEND:" + at.nodeValue().string().stripWhiteSpace() + "\n";
+ }
+ } else if (*it == "summary") {
+ name = textForNode(node);
+ value += "SUMMARY:" + name + "\n";
+ } else if (*it == "location") {
+ value += "LOCATION:" + textForNode(node) + "\n";
+ }
+ }
+ }
+ }
+
+ if (!name.isEmpty()) {
+ value += "END:VEVENT\nEND:VCALENDAR\n";
+ _events.append(qMakePair(name, value));
+ }
+}
+
+
+bool KonqMFIcon::hasMicroFormat(DOM::NodeList nodes) {
+ bool ok = false;
+ unsigned int n = nodes.length();
+ for (unsigned int i = 0; i < n; ++i) {
+ DOM::Node node = nodes.item(i);
+ DOM::NamedNodeMap map = node.attributes();
+ for (unsigned int j = 0; j < map.length(); ++j) {
+ if (map.item(j).nodeName().string() != "class") {
+ continue;
+ }
+ if (map.item(j).nodeValue().string() == "vevent") {
+ ok = true;
+ extractEvent(node);
+ break;
+ }
+ if (map.item(j).nodeValue().string() == "vcard") {
+ ok = true;
+ extractCard(node);
+ break;
+ }
+ }
+ if (hasMicroFormat(node.childNodes())) {
+ ok = true;
+ }
+ }
+ return ok;
+}
+
+
+bool KonqMFIcon::mfFound() {
+ _events.clear();
+ _cards.clear();
+ return hasMicroFormat(m_part->document().childNodes());
+}
+
+
+void KonqMFIcon::contextMenu() {
+ delete m_menu;
+ m_menu = new KPopupMenu(m_part->widget());
+ m_menu->insertTitle(i18n("Microformats"));
+ connect(m_menu, SIGNAL(activated(int)), this, SLOT(addMF(int)));
+ int id = 0;
+ for (QValueList<QPair<QString, QString> >::ConstIterator it = _events.begin(); it != _events.end(); ++it) {
+ m_menu->insertItem(SmallIcon("bookmark_add"), (*it).first, id);
+ id++;
+ }
+ for (QValueList<QPair<QString, QString> >::ConstIterator it = _cards.begin(); it != _cards.end(); ++it) {
+ m_menu->insertItem(SmallIcon("bookmark_add"), (*it).first, id);
+ id++;
+ }
+ m_menu->insertSeparator();
+ m_menu->insertItem(SmallIcon("bookmark_add"), i18n("Import All Microformats"), this, SLOT(addMFs()), 0, 50000 );
+ m_menu->popup(QCursor::pos());
+}
+
+
+void KonqMFIcon::addMFIcon() {
+ if (!mfFound() || m_mfIcon) {
+ return;
+ }
+
+ m_statusBarEx = KParts::StatusBarExtension::childObject(m_part);
+ if (!m_statusBarEx) {
+ return;
+ }
+
+ m_mfIcon = new KURLLabel(m_statusBarEx->statusBar());
+ m_mfIcon->setFixedHeight(instance()->iconLoader()->currentSize(KIcon::Small));
+ m_mfIcon->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
+ m_mfIcon->setUseCursor(false);
+ //FIXME hackish
+ m_mfIcon->setPixmap(QPixmap(locate("data", "microformat/pics/microformat.png")));
+
+ QToolTip::remove(m_mfIcon);
+ QToolTip::add(m_mfIcon, i18n("This site has a microformat entry", "This site has %n microformat entries", _events.count() + _cards.count()));
+
+ m_statusBarEx->addStatusBarItem(m_mfIcon, 0, true);
+
+ connect(m_mfIcon, SIGNAL(leftClickedURL()), this, SLOT(contextMenu()));
+}
+
+
+void KonqMFIcon::removeMFIcon() {
+ _events.clear();
+ _cards.clear();
+ if (m_mfIcon) {
+ m_statusBarEx->removeStatusBarItem(m_mfIcon);
+ delete m_mfIcon;
+ m_mfIcon = 0;
+ }
+
+ // Close the popup if it's open, otherwise we crash
+ delete m_menu;
+ m_menu = 0L;
+}
+
+
+void KonqMFIcon::addMF(int id) {
+ if (id < int(_events.count())) {
+ } else if (id < int(_cards.count())) {
+ id -= _cards.count() - 1;
+ addVCardViaDCOP(_cards[id].second);
+ }
+}
+
+
+void KonqMFIcon::addMFs() {
+ int n = _events.count() + _cards.count();
+ for (int i = 0; i < n; ++i) {
+ addMF(i);
+ }
+}
+
+#include "konqmficon.moc"
diff --git a/konq-plugins/microformat/konqmficon.h b/konq-plugins/microformat/konqmficon.h
new file mode 100644
index 0000000..819bb2e
--- /dev/null
+++ b/konq-plugins/microformat/konqmficon.h
@@ -0,0 +1,70 @@
+/*
+ Copyright (C) 2004 Teemu Rytilahti <tpr@d5k.net>
+ Copyright (C) 2005 George Staikos <staikos@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+*/
+
+#ifndef KONQFEEDICON_H
+#define KONQFEEDICON_H
+
+#include <khtml_part.h>
+#include <kparts/plugin.h>
+#include <kpopupmenu.h>
+#include "pluginbase.h"
+
+/**
+@author Teemu Rytilahti
+*/
+class KURLLabel;
+class QStringList;
+
+namespace KParts {
+ class StatusBarExtension;
+}
+
+class KonqMFIcon : public KParts::Plugin, PluginBase {
+ Q_OBJECT
+ public:
+ KonqMFIcon(QObject *parent, const char *name, const QStringList &);
+
+ ~KonqMFIcon();
+
+ private:
+ bool mfFound();
+ bool hasMicroFormat(DOM::NodeList nodes);
+ void extractCard(DOM::Node node);
+ void extractEvent(DOM::Node node);
+
+ QGuardedPtr<KHTMLPart> m_part;
+ KURLLabel *m_mfIcon;
+ KParts::StatusBarExtension *m_statusBarEx;
+ QGuardedPtr<KPopupMenu> m_menu;
+ QValueList<QPair<QString, QString> > _events, _cards;
+
+ private slots:
+ void waitPartToLoad();
+ void contextMenu();
+ void addMFIcon();
+ void removeMFIcon();
+ void addMFs();
+ void addMF(int id);
+};
+
+#endif
diff --git a/konq-plugins/microformat/mf_konqmficon.desktop b/konq-plugins/microformat/mf_konqmficon.desktop
new file mode 100644
index 0000000..27edbc6
--- /dev/null
+++ b/konq-plugins/microformat/mf_konqmficon.desktop
@@ -0,0 +1,110 @@
+[Desktop Entry]
+Name=Konqueror Microformat Plugin
+Name[bg]=Приставка за Microformat (Konqueror)
+Name[br]=Lugent Microformat Konqueror
+Name[ca]=Connector de microformat pel Konqueror
+Name[cs]=Microformat modul pro Konqueror
+Name[da]=Konqueror mikroformat-plugin
+Name[de]=Konqueror-Modul für Microformat
+Name[el]=Πρόσθετο Microformat του Konqueror
+Name[eo]=Mikroformata kromaĵo por Konkeranto
+Name[es]=Complemento Microformato de Konqueror
+Name[et]=Konquerori Microformati plugin
+Name[eu]=Konqueror-en Microformat-en plugina
+Name[fa]=وصلۀ ریزقالب Konqueror
+Name[fi]=Konqueror mikromuotoliitännäinen
+Name[fr]=Module d'icône de flux pour Konqueror
+Name[fy]=Konqueror Microformat-plugin
+Name[ga]=Breiseán Micreafhormáid Konqueror
+Name[gl]=Plugin de Micro-formato de Konqueror
+Name[he]=תוסף Microformat עבור Konqueror
+Name[hr]=Konqueror Microformat dodatak
+Name[hu]=Konqueror Microformat-bővítőmodul
+Name[is]=Konqueror Microformat íforrit
+Name[it]=Plugin per il formato microformat di Konqueror
+Name[ja]=Konqueror マイクロフォーマット プラグイン
+Name[ka]=Konqueror მიკროფორმატის მოდული
+Name[kk]=Konqueror Microformat плагин модулі
+Name[km]=កម្មវិធី​ជំនួយ​ទ្រង់ទ្រាយ​មីក្រូ​របស់​ Konqueror
+Name[lt]=Konqueror mikroformatų priedai
+Name[mk]=Приклучок за микроформат на Konqueror
+Name[nb]=Mikroformat programtillegg for Konqueror
+Name[nds]=Mikroformaat-Moduul för Konqueror
+Name[ne]=कन्क्वेर सूक्ष्म ढाँचा प्लगइन
+Name[nl]=Konqueror Microformat-plugin
+Name[nn]=Programtillegg for mikroformat i Konqueror
+Name[pa]=ਕੋਨਕਿਊਰੋਰ ਮਾਈਕਰੋਫਾਰਮਿਟ ਪਲੱਗਇਨ
+Name[pl]=Wtyczka Mikroformatu dla Konquerora
+Name[pt]='Plugin' de Micro-formato do Konqueror
+Name[pt_BR]=Plug-in de fonte de notícias RSS do Konqueror
+Name[ru]=Микроформаты для Konqueror
+Name[sk]=Modul Konqueror microformat
+Name[sl]=Vstavek Konquerorja za Microformat
+Name[sr]=Прикључак Konqueror-а за микроформат
+Name[sr@Latn]=Priključak Konqueror-a za mikroformat
+Name[sv]=Konqueror-insticksprogram för mikroformat
+Name[tr]=Konqueror Besleme Simge Eklentisi
+Name[uk]=Втулок мікроформату для Konqueror
+Name[vi]=Bổ sung định dạng vi Konqueror
+Name[zh_CN]=Konqueror 微格式插件
+Name[zh_TW]=Konqueror Microformat 外掛程式
+Icon=akregator
+Comment=Displays icon in the statusbar when the page has a microformat
+Comment[bg]=Показване на икона в лентата за състоянието, когато страницата има умален формат
+Comment[ca]=Mostra la icona a la barra d'estat quan la pàgina té un microformat
+Comment[cs]=Zobrazí na panelu ikonku, pokud má stránka mikroformát
+Comment[da]=Viser ikon i statusfelt når siden har et mikroformat
+Comment[de]=Zeigt das Symbol in der Statusleiste, wenn die Seite ein Microformat hat
+Comment[el]=Εμφανίζει το εικονίδιο στη γραμμή κατάστασης όταν η σελίδα έχει microformat
+Comment[eo]=Montras piktogramon en la statolistelo kiam la paĝo enhavas mikroformaton
+Comment[es]=Muestra el icono en la barra de estado cuando la página tiene un microformato
+Comment[et]=Näitab olekuribal kanaliikooni, kui saidil on microformat
+Comment[eu]=Orriak mikroformatu bat badu ikono bat bistaratzen du egoera-barran
+Comment[fa]=وقتی صفحه دارای ریزقالب باشد، شمایل را در میله وضعیت نمایش می‌دهد
+Comment[fi]=Näyttää syötekuvakkeen tilapalkissa jos sivulla on mikromuoto
+Comment[fr]=Affiche une icône dans la barre d'état lorsque la page possède un microformat
+Comment[fy]=Toant in piktogram yn de tastânbalke as de side in mikroformaat hat.
+Comment[ga]=Taispeánann sé deilbhín sa bharra stádais nuair atá micreafhormáid ag an leathanach
+Comment[gl]=Mostra un ícone na barra de estado cando a páxina ten un micro-formato
+Comment[hr]=Prikazuje ikonu u traci stanja ako stranica posjeduje mikro-oblikovanje
+Comment[hu]=Ikont jelenít meg az állapotsorban, ha az oldalhoz található Microformat-információ
+Comment[is]=Sýnir táknmynd í stöðuslá þegar síða inniheldur microformat
+Comment[it]=Mostra l'icona nella barra di stato quando la pagina ha un microformat
+Comment[ja]=ページにマイクロフォーマットがある場合、ステータスバーにアイコンを表示します
+Comment[ka]=სტატუსის ველში ასახავს ხატულას როდესაც გვერდს გააჩნია მიკროფორმატი
+Comment[kk]=Бетте микроформат болса, күй-жай жолағында таңбашасын көрсету
+Comment[km]=បង្ហាញ​រូប​តំណាង​នៅ​ក្នុង​របារ​ស្ថានភាព ​នៅ​ពេល​ដែល​ទំព័រ​មាន​ទ្រង់ទ្រាយ​មីក្រូ
+Comment[lt]=Rodo ženkliuką būsenos juostoje kai puslapis turi mikroformatą
+Comment[mk]=Прикажува икона во статусната лента кога страницата има микроформат
+Comment[nb]=Viser ikon for nyhetskilde på statuslinja når nettstedet har etmikroformat
+Comment[nds]=Wiest en Lüttbild op den Statusbalken, wenn de Siet en Mikroformaat hett
+Comment[ne]=पृष्ठमा सूक्ष्म ढाँचा हुदाँ स्थितिपट्टीमा प्रतिमा प्रदर्शन गर्छ
+Comment[nl]=Toont een pictogram in de statusbalk als een pagina een microformaat bevat.
+Comment[nn]=Viser eit ikon på statuslinja når sida har eit mikroformat
+Comment[pl]=Wyświetla ikonę w pasku stanu, jeśli strona zawiera mikroformat
+Comment[pt]=Mostra um ícone na barra de estado quando a página tem um micro-formato
+Comment[pt_BR]=Mostra um ícone na barra de status quando a página possui uma fonte de notícias RSS
+Comment[ru]=Показать в строке состояния значок поддержки микроформата на странице
+Comment[sk]=Zobrazí ikonu v statovom riadku keď strana obsahuje microformat
+Comment[sl]=Ko stran vsebuje Microformat se v vrstici stanja prikaže ikona
+Comment[sr]=Приказује икону у статусној траци када страна има микроформат
+Comment[sr@Latn]=Prikazuje ikonu u statusnoj traci kada strana ima mikroformat
+Comment[sv]=Visar en ikon i statusraden när sidan har ett mikroformat
+Comment[tr]=Sayfaya özgü bir biçim olduğunda simgeyi durum çubuğunda göster
+Comment[uk]=Показує піктограму в рядку стану, коли сторінка має мікроформат
+Comment[uz]=Sahifada mikroformat boʻlsa, holat panelida nishonchani koʻrsatish
+Comment[uz@cyrillic]=Саҳифада микроформат бўлса, ҳолат панелида нишончани кўрсатиш
+Comment[vi]=Hiển thị biểu tượng trên thanh trạng thái khi trang có định dạng vi
+Comment[zh_CN]=当页面有微格式时在状态栏显示图标
+Comment[zh_TW]=當網頁有 microformat 時在狀態列顯示圖示
+Type=Service
+X-KDE-Library=libakregatorkonqfeedicon
+X-KDE-PluginInfo-Author=George Staikos
+X-KDE-PluginInfo-Email=staikos@kde.org
+X-KDE-PluginInfo-Name=konqmficon
+X-KDE-PluginInfo-Version=1.0.0
+X-KDE-PluginInfo-Category=Statusbar
+X-KDE-PluginInfo-Depends=
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=false
+X-KDE-ParentApp=konqueror
diff --git a/konq-plugins/microformat/mf_konqmficon.rc b/konq-plugins/microformat/mf_konqmficon.rc
new file mode 100644
index 0000000..466b14e
--- /dev/null
+++ b/konq-plugins/microformat/mf_konqmficon.rc
@@ -0,0 +1,3 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="konqmficon" library="libmfkonqmficon" version="1">
+</kpartplugin>
diff --git a/konq-plugins/microformat/microformat.png b/konq-plugins/microformat/microformat.png
new file mode 100644
index 0000000..0217918
--- /dev/null
+++ b/konq-plugins/microformat/microformat.png
Binary files differ
diff --git a/konq-plugins/microformat/microformat.svgz b/konq-plugins/microformat/microformat.svgz
new file mode 100644
index 0000000..5975616
--- /dev/null
+++ b/konq-plugins/microformat/microformat.svgz
Binary files differ
diff --git a/konq-plugins/microformat/pluginbase.cpp b/konq-plugins/microformat/pluginbase.cpp
new file mode 100644
index 0000000..9f73dd6
--- /dev/null
+++ b/konq-plugins/microformat/pluginbase.cpp
@@ -0,0 +1,43 @@
+/*
+ Copyright (C) 2004 Teemu Rytilahti <tpr@d5k.net>
+ Copyright (C) 2005 George Staikos <staikos@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+*/
+
+#include <kprocess.h>
+#include <dcopref.h>
+#include <klocale.h>
+
+#include "pluginbase.h"
+
+#include <kdebug.h>
+
+PluginBase::PluginBase() {
+}
+
+
+PluginBase::~PluginBase() {
+}
+
+
+void PluginBase::addVCardViaDCOP(const QString& card) {
+ DCOPRef("kaddressbook", "AddressBookServiceIface").send("importVCard", card);
+}
+
diff --git a/konq-plugins/microformat/pluginbase.h b/konq-plugins/microformat/pluginbase.h
new file mode 100644
index 0000000..e37ea36
--- /dev/null
+++ b/konq-plugins/microformat/pluginbase.h
@@ -0,0 +1,38 @@
+/*
+ Copyright (C) 2004 Teemu Rytilahti <tpr@d5k.net>
+ Copyright (C) 2005 George Staikos <staikos@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+*/
+
+#ifndef PLUGINBASE_H
+#define PLUGINBASE_H
+
+class QString;
+
+class PluginBase {
+ public:
+ PluginBase();
+ ~PluginBase();
+
+ public:
+ void addVCardViaDCOP(const QString& vcard);
+};
+
+#endif
diff --git a/konq-plugins/minitools/Makefile.am b/konq-plugins/minitools/Makefile.am
new file mode 100644
index 0000000..48f63e4
--- /dev/null
+++ b/konq-plugins/minitools/Makefile.am
@@ -0,0 +1,14 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+KDE_ICON = AUTO
+
+kde_module_LTLIBRARIES = libminitoolsplugin.la
+libminitoolsplugin_la_SOURCES = minitoolsplugin.cpp
+libminitoolsplugin_la_LIBADD = $(LIB_KHTML) -lkonq
+libminitoolsplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+pluginsdir = $(kde_datadir)/khtml/kpartplugins
+plugins_DATA = minitoolsplugin.rc minitoolsplugin.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/minitoolsplugin.pot
diff --git a/konq-plugins/minitools/cr16-action-minitools.png b/konq-plugins/minitools/cr16-action-minitools.png
new file mode 100644
index 0000000..5e76158
--- /dev/null
+++ b/konq-plugins/minitools/cr16-action-minitools.png
Binary files differ
diff --git a/konq-plugins/minitools/cr22-action-minitools.png b/konq-plugins/minitools/cr22-action-minitools.png
new file mode 100644
index 0000000..ced954c
--- /dev/null
+++ b/konq-plugins/minitools/cr22-action-minitools.png
Binary files differ
diff --git a/konq-plugins/minitools/cr32-action-minitools.png b/konq-plugins/minitools/cr32-action-minitools.png
new file mode 100644
index 0000000..028869c
--- /dev/null
+++ b/konq-plugins/minitools/cr32-action-minitools.png
Binary files differ
diff --git a/konq-plugins/minitools/cr48-action-minitools.png b/konq-plugins/minitools/cr48-action-minitools.png
new file mode 100644
index 0000000..aa335b2
--- /dev/null
+++ b/konq-plugins/minitools/cr48-action-minitools.png
Binary files differ
diff --git a/konq-plugins/minitools/minitoolsplugin.cpp b/konq-plugins/minitools/minitoolsplugin.cpp
new file mode 100644
index 0000000..53f109b
--- /dev/null
+++ b/konq-plugins/minitools/minitoolsplugin.cpp
@@ -0,0 +1,156 @@
+/*
+ Copyright (c) 2003 Alexander Kellett <lypanov@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License (LGPL) as published by the Free Software Foundation;
+ either version 2 of the License, or (at your option) any later
+ version.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qfile.h>
+
+#include <kdebug.h>
+#include <kaction.h>
+#include <kglobal.h>
+#include <kconfig.h>
+#include <kinstance.h>
+#include <khtml_part.h>
+#include <kgenericfactory.h>
+
+#include <kstandarddirs.h>
+
+#include <krun.h>
+#include <kservice.h>
+
+#include <kpopupmenu.h>
+#include <kbookmarkimporter.h>
+#include <kbookmarkmanager.h>
+
+#include "minitoolsplugin.h"
+
+typedef KGenericFactory<MinitoolsPlugin> MinitoolsPluginFactory;
+K_EXPORT_COMPONENT_FACTORY( libminitoolsplugin, MinitoolsPluginFactory("minitoolsplugin") )
+
+MinitoolsPlugin::MinitoolsPlugin(QObject* parent, const char* name, const QStringList &)
+ : KParts::Plugin(parent, name) {
+ m_part = (parent && parent->inherits( "KHTMLPart" )) ? static_cast<KHTMLPart*>(parent) : 0L;
+
+ m_pMinitoolsMenu = new KActionMenu(i18n("&Minitools"), "minitools", actionCollection(), "minitools");
+
+ m_pMinitoolsMenu->setDelayed(false);
+ m_pMinitoolsMenu->setEnabled(true);
+
+ connect(m_pMinitoolsMenu->popupMenu(), SIGNAL( aboutToShow() ),
+ this, SLOT( slotAboutToShow() ));
+}
+
+MinitoolsPlugin::~MinitoolsPlugin() {
+ ;
+}
+
+void MinitoolsPlugin::slotAboutToShow() {
+
+ m_minitoolsList.clear();
+ KXBELBookmarkImporterImpl importer;
+ connect(&importer, SIGNAL( newBookmark( const QString &, const QCString &, const QString &) ),
+ SLOT( newBookmarkCallback( const QString &, const QCString &, const QString & ) ));
+ connect(&importer, SIGNAL( endFolder() ),
+ SLOT( endFolderCallback() ));
+ QString filename = minitoolsFilename(true);
+ if (!filename.isEmpty() && QFile::exists(filename)) {
+ importer.setFilename(filename);
+ importer.parse();
+ }
+ filename = minitoolsFilename(false);
+ if (!filename.isEmpty() && QFile::exists(filename)) {
+ importer.setFilename(filename);
+ importer.parse();
+ }
+
+ m_pMinitoolsMenu->popupMenu()->clear();
+
+ int count = m_pMinitoolsMenu->popupMenu()->count(); // why not 0???
+ bool gotSep = true; // don't start with a sep
+
+ if (m_minitoolsList.count() > 0) {
+ MinitoolsList::ConstIterator e = m_minitoolsList.begin();
+ for( ; e != m_minitoolsList.end(); ++e ) {
+ if ( ((*e).first == "-")
+ && ((*e).second == "-")
+ ) {
+ if (!gotSep)
+ m_pMinitoolsMenu->popupMenu()->insertSeparator();
+ gotSep = true;
+ count++;
+ } else {
+ QString str = (*e).first;
+ // emsquieezzy thingy?
+ if (str.length() > 48) {
+ str.truncate(48);
+ str.append("...");
+ }
+ m_pMinitoolsMenu->popupMenu()->insertItem(
+ str, this,
+ SLOT(slotItemSelected(int)),
+ 0, ++count );
+ gotSep = false;
+ }
+ }
+ }
+
+ if (!gotSep) {
+ // don't have an extra sep
+ m_pMinitoolsMenu->popupMenu()->insertSeparator();
+ }
+
+ m_pMinitoolsMenu->popupMenu()
+ ->insertItem(i18n("&Edit Minitools"),
+ this, SLOT(slotEditBookmarks()),
+ 0, ++count );
+}
+
+void MinitoolsPlugin::newBookmarkCallback(
+ const QString & text, const QCString & url, const QString &
+) {
+ kdDebug(90150) << "MinitoolsPlugin::newBookmarkCallback" << text << url << endl;
+ m_minitoolsList.prepend(qMakePair(text,url));
+}
+
+void MinitoolsPlugin::endFolderCallback() {
+ kdDebug(90150) << "MinitoolsPlugin::endFolderCallback" << endl;
+ m_minitoolsList.prepend(qMakePair(QString("-"),QCString("-")));
+}
+
+QString MinitoolsPlugin::minitoolsFilename(bool local) {
+ return local ? locateLocal("data", QString::fromLatin1("konqueror/minitools.xml"))
+ : locateLocal("data", QString::fromLatin1("konqueror/minitools-global.xml"));
+}
+
+void MinitoolsPlugin::slotEditBookmarks() {
+ KBookmarkManager *manager = KBookmarkManager::managerForFile(minitoolsFilename(true));
+ manager->slotEditBookmarks();
+}
+
+void MinitoolsPlugin::slotItemSelected(int id) {
+ if (m_minitoolsList.count() == 0)
+ return;
+ QString tmp = m_minitoolsList[id-1].second;
+ QString script = KURL::decode_string(tmp.right(tmp.length() - 11)); // sizeof("javascript:")
+ connect(this, SIGNAL( executeScript(const QString &) ),
+ m_part, SLOT( executeScript(const QString &) ));
+ emit executeScript(script);
+ disconnect(this, SIGNAL( executeScript(const QString &) ), 0, 0);
+}
+
+#include "minitoolsplugin.moc"
diff --git a/konq-plugins/minitools/minitoolsplugin.desktop b/konq-plugins/minitools/minitoolsplugin.desktop
new file mode 100644
index 0000000..4f6894c
--- /dev/null
+++ b/konq-plugins/minitools/minitoolsplugin.desktop
@@ -0,0 +1,121 @@
+[Desktop Entry]
+X-KDE-Library=Minitools
+X-KDE-PluginInfo-Author=Alexander Kellett
+X-KDE-PluginInfo-Email=lypanov@kde.org
+X-KDE-PluginInfo-Name=Minitools
+X-KDE-PluginInfo-Version=3.3
+X-KDE-PluginInfo-Website=
+X-KDE-PluginInfo-Category=Tools
+X-KDE-PluginInfo-Depends=
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=true
+Icon=minitools
+Name=Mini-Tools
+Name[az]=Kiçik-Vasitələr
+Name[bg]=Мини инструменти
+Name[bs]=Mini-alati
+Name[ca]=Mini-eines
+Name[cs]=Mini nástroje
+Name[cy]=Mini-Offer
+Name[da]=Mini-værktøjer
+Name[de]=Mini-Dienstprogramme
+Name[el]=Μικρά εργαλεία
+Name[eo]=Iletoj
+Name[es]=Mini-herramientas
+Name[eu]=Mini-tresnak
+Name[fa]=ریزابزارها
+Name[fi]=Minityökalut
+Name[fr]=Mini-outils
+Name[fy]=Miny-Ark
+Name[ga]=Mion-Uirlisí
+Name[gl]=Mini-Ferramentas
+Name[hi]=मिनि-औज़ार
+Name[hr]=Mini-alati
+Name[hu]=Mini könyvjelzők
+Name[is]=Lítil tól
+Name[it]=Strumenti miniaturizzati
+Name[ja]=ミニツール
+Name[ka]=მინი-ხელსაწყოები
+Name[kk]=Шағын құралдар
+Name[km]=ឧបករណ៍​ខ្នាត​តូច
+Name[lt]=Mini įrankiai
+Name[mk]=Мини-алатки
+Name[ms]=Minialat
+Name[nb]=Mini-verktøy
+Name[nds]=Lüttwarktüüch
+Name[ne]=साना-उपकरण
+Name[nn]=Miniverktøy
+Name[pa]=ਮਿੰਨੀ-ਸੰਦ
+Name[pl]=Mini-narzędzia
+Name[pt]=Mini-Ferramentas
+Name[pt_BR]=Mini Ferramentas
+Name[ro]=Mini-unelte
+Name[ru]=Мини-утилиты
+Name[sk]=Mini-nástroje
+Name[sl]=Mini orodja
+Name[sr]=Мини алати
+Name[sr@Latn]=Mini alati
+Name[sv]=Miniverktyg
+Name[ta]=மிகச்சிறிய-கருவிகள்
+Name[tg]=Мини-асбобҳо
+Name[tr]=Küçük Araçlar
+Name[uk]=Міні-засоби
+Name[vi]=Công cụ nhỏ
+Name[zh_CN]=小工具
+Comment=Mini-Tools
+Comment[az]=Kiçik-Vasitələr
+Comment[bg]=Миниатюрни инструменти
+Comment[bs]=Mini-alati
+Comment[ca]=Mini-eines
+Comment[cs]=Mini nástroje
+Comment[cy]=Mini-Offer
+Comment[da]=Mini-værktøjer
+Comment[de]=Kleine Dienstprogramme
+Comment[el]=Μικρά εργαλεία
+Comment[eo]=Iletoj
+Comment[es]=Mini-herramientas
+Comment[et]=Mini-tööriistad
+Comment[eu]=Mini-tresnak
+Comment[fa]=ریزابزارها
+Comment[fi]=Minityökalut
+Comment[fr]=Mini-outils
+Comment[fy]=Miny-helpmiddels
+Comment[ga]=Mion-Uirlisí
+Comment[gl]=Mini-Ferramentas
+Comment[he]=מיני כלים
+Comment[hi]=मिनि-औज़ार
+Comment[hr]=Minijaturni alati
+Comment[hu]=Mini könyvjelzők
+Comment[is]=Lítil tól
+Comment[it]=Strumenti miniaturizzati
+Comment[ja]=ミニツール
+Comment[ka]=მინი-ხელსაწყოები
+Comment[kk]=Шағын құралдар
+Comment[km]=ឧបករណ៍​ខ្នាត​តូច
+Comment[lt]=Mini įrankiai
+Comment[mk]=Мини-алатки
+Comment[ms]=Minialat
+Comment[nb]=Mini-verktøy
+Comment[nds]=Lütte Warktüüch
+Comment[ne]=साना-उपकरण
+Comment[nl]=Mini-hulpmiddelen
+Comment[nn]=Miniverktøy
+Comment[pa]=ਮਿੰਨੀ-ਸੰਦ
+Comment[pl]=Mini-narzędzia
+Comment[pt]=Mini-Ferramentas
+Comment[pt_BR]=Mini Ferramentas
+Comment[ro]=Mini-unelte
+Comment[ru]=Мини-утилиты
+Comment[sk]=Mini-nástroje
+Comment[sl]=Mini orodja
+Comment[sr]=Мини-алати
+Comment[sr@Latn]=Mini-alati
+Comment[sv]=Miniverktyg
+Comment[ta]=மிகச்சிறியக்- கருவிகள்
+Comment[tg]=Мини-асбобҳо
+Comment[tr]=Küçük Araçlar
+Comment[uk]=Міні-засоби
+Comment[vi]=Công cụ nhỏ
+Comment[zh_CN]=小工具
+X-KDE-ParentApp=konqueror
+DocPath=konq-plugins/minitools/index.html
diff --git a/konq-plugins/minitools/minitoolsplugin.h b/konq-plugins/minitools/minitoolsplugin.h
new file mode 100644
index 0000000..7db1a77
--- /dev/null
+++ b/konq-plugins/minitools/minitoolsplugin.h
@@ -0,0 +1,66 @@
+/*
+ Copyright (c) 2003 Alexander Kellett <lypanov@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License (LGPL) as published by the Free Software Foundation;
+ either version 2 of the License, or (at your option) any later
+ version.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef __MINITOOLS_PLUGIN_H
+#define __MINITOOLS_PLUGIN_H
+
+#include <qmap.h>
+#include <qvaluelist.h>
+#include <qstringlist.h>
+
+#include <kurl.h>
+#include <klibloader.h>
+#include <kparts/plugin.h>
+
+class KHTMLPart;
+class KActionMenu;
+
+class MinitoolsPlugin : public KParts::Plugin {
+ Q_OBJECT
+
+public:
+ MinitoolsPlugin( QObject* parent, const char* name, const QStringList & );
+ ~MinitoolsPlugin();
+
+protected slots:
+ void slotAboutToShow();
+ void slotEditBookmarks();
+ void slotItemSelected(int);
+ void newBookmarkCallback( const QString &, const QCString &, const QString & );
+ void endFolderCallback( );
+
+signals:
+ void executeScript( const QString &script );
+
+private:
+ QString minitoolsFilename(bool local);
+
+ int m_selectedItem;
+
+ KHTMLPart* m_part;
+ KActionMenu* m_pMinitoolsMenu;
+
+ typedef QPair<QString,QCString> Minitool;
+ typedef QValueList<Minitool> MinitoolsList;
+
+ MinitoolsList m_minitoolsList;
+};
+
+#endif
diff --git a/konq-plugins/minitools/minitoolsplugin.rc b/konq-plugins/minitools/minitoolsplugin.rc
new file mode 100644
index 0000000..b5af77a
--- /dev/null
+++ b/konq-plugins/minitools/minitoolsplugin.rc
@@ -0,0 +1,11 @@
+<!DOCTYPE kpartplugin>
+<kpartplugin name="Minitools" library="libminitoolsplugin">
+<MenuBar>
+ <Menu name="tools"><Text>&amp;Tools</Text>
+ <Action name="minitools"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="extraToolBar"><text>Extra Toolbar</text>
+ <Action name="minitools"/>
+</ToolBar>
+</kpartplugin>
diff --git a/konq-plugins/rellinks/AUTHORS b/konq-plugins/rellinks/AUTHORS
new file mode 100644
index 0000000..0e65688
--- /dev/null
+++ b/konq-plugins/rellinks/AUTHORS
@@ -0,0 +1,3 @@
+Kevin Krammer <kevin.krammer@gmx.at> (author of sitelinks, merged project on 2004-01-28)
+Franck Qulain <shift@free.fr> (konq-rellinks)
+Anders Lund <anders@alweb.dk> (First version : rellinks)
diff --git a/konq-plugins/rellinks/ChangeLog b/konq-plugins/rellinks/ChangeLog
new file mode 100644
index 0000000..bc62fdf
--- /dev/null
+++ b/konq-plugins/rellinks/ChangeLog
@@ -0,0 +1,31 @@
+Mon Jan 21 00:31:29 CET 2002 - Anders Lund <anders@alweb.dk>
+ o Initial Creation (of the rellinks plugin)
+Sat May 17 14:46:33 CET 2003 - Franck Qulain <shift@free.fr>
+ o Rename it konqSiteNavBar for better understanding
+ o The plugin is now a full toolbar
+ o Add navigation buttons (home, up, prev, next,...)
+ o "Document" and "More" menus la Mozilla site navigation bar
+ o Toolip and contextuel help on most of the items
+ o Menu for Unclassified links
+Mon Jun 9 23:10:00 CET 2003 - Franck Qulain <shift@free.fr>
+ o Configuration Menu
+ o "When necessary" mode : show / hide toolbar only when necessary
+ o Configuration stored in .kde/share/config/konq_rellinksrc
+Wed Jun 18 22:05:00 CET 2003 - Franck Qulain <shift@free.fr>
+ o The name has changed to konq-rellinks after an interesting
+ discussion with Anders Lund.
+Fri Jan 30 16:23 CET 2004 - Kevin Krammer <kevin.krammer@gmx.at>
+ o Bugfix: enabling "more" menu instead of "document" when links
+ are "help", "made" or "copyright"
+ o Made "search" a top level action
+ o Polling for links while the page is loading. This presents
+ clickable actions as soon as possible, nice on slow connections or
+ in large documents.
+Sun Mar 21 16:23 CET 2004 - Franck Qulain <shift@free.fr>
+ o Support for "target" attribute
+ o Distinction between "rel" and "rev" relations
+Tue Jun 22 23:05 CET 2004 - Kevin Krammer <kevin.krammer@gmx.at>
+ o Move toolbar creation from XML GUI to code as a workaround
+ because KHTML loads the plugins before it initializes its
+ d pointer and so there is no way to get to either the view or
+ the toolbar in the plugin's contructor.
diff --git a/konq-plugins/rellinks/Makefile.am b/konq-plugins/rellinks/Makefile.am
new file mode 100644
index 0000000..aeec3fc
--- /dev/null
+++ b/konq-plugins/rellinks/Makefile.am
@@ -0,0 +1,12 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+kde_module_LTLIBRARIES = librellinksplugin.la
+librellinksplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+librellinksplugin_la_LIBADD = $(LIB_KPARTS) $(LIB_KHTML)
+librellinksplugin_la_SOURCES = plugin_rellinks.cpp
+plugins_DATA = plugin_rellinks.rc plugin_rellinks.desktop
+pluginsdir = $(kde_datadir)/khtml/kpartplugins
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/rellinks.pot
+
diff --git a/konq-plugins/rellinks/README b/konq-plugins/rellinks/README
new file mode 100644
index 0000000..e5f3324
--- /dev/null
+++ b/konq-plugins/rellinks/README
@@ -0,0 +1,13 @@
+What is Konq Rellinks ?
+=======================
+
+Konq Rellinks is an add-on for Konqueror, the official KDE browser.
+
+It allows you to access the relations defined in the header of the document. These relations can be links to other versions of the document, RSS backend, search page, copyright informations,.... For more informations about this, see "The 'link'-Element in (X)HTML" at http://www.subotnik.net/html/link.
+
+The look of the Rellinks add-on is similar to the "Site Navigation Toolbar" of the Mozilla browser (not Mozilla Firebird).
+
+More Info
+=========
+
+See http://shift.freezope.org/konq_rellinks \ No newline at end of file
diff --git a/konq-plugins/rellinks/TODO b/konq-plugins/rellinks/TODO
new file mode 100644
index 0000000..28f206b
--- /dev/null
+++ b/konq-plugins/rellinks/TODO
@@ -0,0 +1,20 @@
+Rellinks :
+=========
+
+* Support multiple same relations for all relations in a beautiful way
+ (as FireFox Link Toolbar Extension do) :
+ by transfoming buttons (KAction) in menus (KActionMenu) if more than one item is found for a relation ?
+* Possibility to configure keyboard shortcuts
+* Manage "rel" and "rev" differently
+* Manage "media"
+* Respect the specifications : A LinkTypes value refers to a space-separated list of link types. White space characters are not permitted within link types.
+* Send the referer when going to a link
+* Support target attribut ? (Cf. Mozilla link toolbar bug : http://mozdev.org/bugs/show_bug.cgi?id=5259)
+
+
+Rellinks website (http://shift.freezope.org/konq_rellinks) :
+============================================================
+
+* Add more testcasess
+* Add more documentation
+* Compare implementation with other browsers \ No newline at end of file
diff --git a/konq-plugins/rellinks/plugin_rellinks.cpp b/konq-plugins/rellinks/plugin_rellinks.cpp
new file mode 100644
index 0000000..212c37f
--- /dev/null
+++ b/konq-plugins/rellinks/plugin_rellinks.cpp
@@ -0,0 +1,618 @@
+/***************************************************************************
+ * Copyright (C) 2002, Anders Lund <anders@alweb.dk> *
+ * Copyright (C) 2003, 2004, Franck Qulain <shift@free.fr> *
+ * Copyright (C) 2004, Kevin Krammer <kevin.krammer@gmx.at> *
+ * Copyright (C) 2004, 2006, Oliviet Goffart <ogoffart @ kde.org> *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+
+
+
+// Qt includes
+#include <qapplication.h>
+#include <qtimer.h>
+
+// KDE include
+#include <dom/dom_doc.h>
+#include <dom/dom_element.h>
+#include <dom/dom_string.h>
+#include <dom/html_document.h>
+#include <kaction.h>
+#include <kdebug.h>
+#include <kgenericfactory.h>
+#include <khtml_part.h>
+#include <khtmlview.h>
+#include <kiconloader.h>
+#include <kinstance.h>
+#include <klocale.h>
+#include <kpopupmenu.h>
+#include <kshortcut.h>
+#include <ktoolbar.h>
+#include <kurl.h>
+
+// local includes
+#include "plugin_rellinks.h"
+
+
+/** Rellinks factory */
+typedef KGenericFactory<RelLinksPlugin> RelLinksFactory;
+#include <kdeversion.h>
+#if KDE_IS_VERSION(3,2,90)
+#include <kaboutdata.h>
+static const KAboutData aboutdata("rellinks", I18N_NOOP("Rellinks") , "1.0" );
+K_EXPORT_COMPONENT_FACTORY( librellinksplugin, RelLinksFactory(&aboutdata) )
+#else
+K_EXPORT_COMPONENT_FACTORY( librellinksplugin, RelLinksFactory("rellinks") )
+#endif
+
+/** Constructor of the plugin. */
+RelLinksPlugin::RelLinksPlugin(QObject *parent, const char *name, const QStringList &)
+ : KParts::Plugin( parent, name ),
+ m_part(0),
+ m_viewVisible(false)
+{
+
+ setInstance(RelLinksFactory::instance());
+
+ // ------------- Navigation links --------------
+ kaction_map["home"] = new KAction( i18n("&Top"), "2uparrow", KShortcut("Ctrl+Alt+T"), this, SLOT(goHome()), actionCollection(), "rellinks_top" );
+ kaction_map["home"]->setWhatsThis( i18n("<p>This link references a home page or the top of some hierarchy.</p>") );
+
+ kaction_map["up"] = new KAction( i18n("&Up"), "1uparrow", KShortcut("Ctrl+Alt+U"), this, SLOT(goUp()), actionCollection(), "rellinks_up" );
+ kaction_map["up"]->setWhatsThis( i18n("<p>This link references the immediate parent of the current document.</p>") );
+
+ bool isRTL = QApplication::reverseLayout();
+
+ kaction_map["begin"] = new KAction( i18n("&First"), isRTL ? "2rightarrow" : "2leftarrow", KShortcut("Ctrl+Alt+F"), this, SLOT(goFirst()), actionCollection(), "rellinks_first" );
+ kaction_map["begin"]->setWhatsThis( i18n("<p>This link type tells search engines which document is considered by the author to be the starting point of the collection.</p>") );
+
+ kaction_map["prev"] = new KAction( i18n("&Previous"), isRTL ? "1rightarrow" : "1leftarrow", KShortcut("Ctrl+Alt+P"), this, SLOT(goPrevious()), actionCollection(), "rellinks_previous" );
+ kaction_map["prev"]->setWhatsThis( i18n("<p>This link references the previous document in an ordered series of documents.</p>") );
+
+ kaction_map["next"] = new KAction( i18n("&Next"), isRTL ? "1leftarrow" : "1rightarrow", KShortcut("Ctrl+Alt+N"), this, SLOT(goNext()), actionCollection(), "rellinks_next" );
+ kaction_map["next"]->setWhatsThis( i18n("<p>This link references the next document in an ordered series of documents.</p>") );
+
+ kaction_map["last"] = new KAction( i18n("&Last"), isRTL ? "2leftarrow" : "2rightarrow", KShortcut("Ctrl+Alt+L"), this, SLOT(goLast()), actionCollection(), "rellinks_last" );
+ kaction_map["last"]->setWhatsThis( i18n("<p>This link references the end of a sequence of documents.</p>") );
+
+ // ------------ special items --------------------------
+ kaction_map["search"] = new KAction( i18n("&Search"), "filefind", KShortcut("Ctrl+Alt+S"), this, SLOT(goSearch()), actionCollection(), "rellinks_search" );
+ kaction_map["search"]->setWhatsThis( i18n("<p>This link references the search.</p>") );
+
+ // ------------ Document structure links ---------------
+ m_document = new KActionMenu( i18n("Document"), "contents", actionCollection(), "rellinks_document" );
+ m_document->setWhatsThis( i18n("<p>This menu contains the links referring the document information.</p>") );
+ m_document->setDelayed(false);
+
+ kaction_map["contents"] = new KAction( i18n("Table of &Contents"), "contents", KShortcut("Ctrl+Alt+C"), this, SLOT(goContents()), actionCollection(), "rellinks_toc" );
+ m_document->insert(kaction_map["contents"]);
+ kaction_map["contents"]->setWhatsThis( i18n("<p>This link references the table of contents.</p>") );
+
+ kactionmenu_map["chapter"] = new KActionMenu( i18n("Chapters"), "fileopen", actionCollection(), "rellinks_chapters" );
+ m_document->insert(kactionmenu_map["chapter"]);
+ connect( kactionmenu_map["chapter"]->popupMenu(), SIGNAL( activated( int ) ), this, SLOT(goChapter(int)));
+ kactionmenu_map["chapter"]->setWhatsThis( i18n("<p>This menu references the chapters of the document.</p>") );
+ kactionmenu_map["chapter"]->setDelayed(false);
+
+ kactionmenu_map["section"] = new KActionMenu( i18n("Sections"), "fileopen", actionCollection(), "rellinks_sections" );
+ m_document->insert(kactionmenu_map["section"]);
+ connect( kactionmenu_map["section"]->popupMenu(), SIGNAL( activated( int ) ), this, SLOT( goSection( int ) ) );
+ kactionmenu_map["section"]->setWhatsThis( i18n("<p>This menu references the sections of the document.</p>") );
+ kactionmenu_map["section"]->setDelayed(false);
+
+ kactionmenu_map["subsection"] = new KActionMenu( i18n("Subsections"), "fileopen", actionCollection(), "rellinks_subsections" );
+ m_document->insert(kactionmenu_map["subsection"]);
+ connect( kactionmenu_map["subsection"]->popupMenu(), SIGNAL( activated( int ) ), this, SLOT( goSubsection( int ) ) );
+ kactionmenu_map["subsection"]->setWhatsThis( i18n("<p>This menu references the subsections of the document.</p>") );
+ kactionmenu_map["subsection"]->setDelayed(false);
+
+ kactionmenu_map["appendix"] = new KActionMenu( i18n("Appendix"), "edit", actionCollection(), "rellinks_appendix" );
+ m_document->insert(kactionmenu_map["appendix"]);
+ connect( kactionmenu_map["appendix"]->popupMenu(), SIGNAL( activated( int ) ), this, SLOT( goAppendix( int ) ) );
+ kactionmenu_map["appendix"]->setWhatsThis( i18n("<p>This link references the appendix.</p>") );
+ kactionmenu_map["appendix"]->setDelayed(false);
+
+ kaction_map["glossary"] = new KAction( i18n("&Glossary"), "flag", KShortcut("Ctrl+Alt+G"), this, SLOT(goGlossary()), actionCollection(), "rellinks_glossary" );
+ m_document->insert(kaction_map["glossary"]);
+ kaction_map["glossary"]->setWhatsThis( i18n("<p>This link references the glossary.</p>") );
+
+ kaction_map["index"] = new KAction( i18n("&Index"), "info", KShortcut("Ctrl+Alt+I"), this, SLOT(goIndex()), actionCollection(), "rellinks_index" );
+ m_document->insert(kaction_map["index"]);
+ kaction_map["index"]->setWhatsThis( i18n("<p>This link references the index.</p>") );
+
+ // Other links
+ m_more = new KActionMenu( i18n("More"), "misc", actionCollection(), "rellinks_more" );
+ m_more->setWhatsThis( i18n("<p>This menu contains other important links.</p>") );
+ m_more->setDelayed(false);
+
+ kaction_map["help"] = new KAction( i18n("&Help"), "help", KShortcut("Ctrl+Alt+H"), this, SLOT(goHelp()), actionCollection(), "rellinks_help" );
+ m_more->insert(kaction_map["help"]);
+ kaction_map["help"]->setWhatsThis( i18n("<p>This link references the help.</p>") );
+
+ kaction_map["author"] = new KAction( i18n("&Authors"), "mail_new", KShortcut("Ctrl+Alt+A"), this, SLOT(goAuthor()), actionCollection(), "rellinks_authors" );
+ m_more->insert(kaction_map["author"]);
+ kaction_map["author"]->setWhatsThis( i18n("<p>This link references the author.</p>") );
+
+ kaction_map["copyright"] = new KAction( i18n("Copy&right"), "signature", KShortcut("Ctrl+Alt+R"), this, SLOT(goCopyright()), actionCollection(), "rellinks_copyright" );
+ m_more->insert(kaction_map["copyright"]);
+ kaction_map["copyright"]->setWhatsThis( i18n("<p>This link references the copyright.</p>") );
+
+ kactionmenu_map["bookmark"] = new KActionMenu( i18n("Bookmarks"), "bookmark_folder", actionCollection(), "rellinks_bookmarks" );
+ m_more->insert(kactionmenu_map["bookmark"]);
+ kactionmenu_map["bookmark"]->setWhatsThis( i18n("<p>This menu references the bookmarks.</p>") );
+ connect( kactionmenu_map["bookmark"]->popupMenu(), SIGNAL( activated( int ) ), this, SLOT( goBookmark( int ) ) );
+ kactionmenu_map["bookmark"]->setDelayed(false);
+
+ kactionmenu_map["alternate"] = new KActionMenu( i18n("Other Versions"), "attach", actionCollection(), "rellinks_other_versions" );
+ m_more->insert(kactionmenu_map["alternate"]);
+ kactionmenu_map["alternate"]->setWhatsThis( i18n("<p>This link references the alternate versions of this document.</p>") );
+ connect( kactionmenu_map["alternate"]->popupMenu(), SIGNAL( activated( int ) ), this, SLOT( goAlternate( int ) ) );
+ kactionmenu_map["alternate"]->setDelayed(false);
+
+ // Unclassified menu
+ m_links = new KActionMenu( i18n("Miscellaneous"), "rellinks", actionCollection(), "rellinks_links" );
+ kactionmenu_map["unclassified"] = m_links;
+ kactionmenu_map["unclassified"]->setWhatsThis( i18n("<p>Miscellaneous links.</p>") );
+ connect( kactionmenu_map["unclassified"]->popupMenu(), SIGNAL( activated( int ) ), this, SLOT( goAllElements( int ) ) );
+ kactionmenu_map["unclassified"]->setDelayed(false);
+
+ // We unactivate all the possible actions
+ disableAll();
+
+ // When the rendering of the HTML is done, we update the site navigation bar
+ m_part = dynamic_cast<KHTMLPart *>(parent);
+ if (!m_part)
+ return;
+
+ connect( m_part, SIGNAL( docCreated() ), this, SLOT( newDocument() ) );
+ connect( m_part, SIGNAL( completed() ), this, SLOT( loadingFinished() ) );
+
+ // create polling timer and connect it
+ m_pollTimer = new QTimer(this, "polling timer");
+ connect( m_pollTimer, SIGNAL( timeout() ), this, SLOT( updateToolbar() ) );
+
+ // delay access to our part's members until it has finished its initialisation
+ QTimer::singleShot(0, this, SLOT(delayedSetup()));
+}
+
+/** Destructor */
+RelLinksPlugin::~RelLinksPlugin() {
+}
+
+bool RelLinksPlugin::eventFilter(QObject *watched, QEvent* event) {
+ if (m_part == 0) return false;
+
+ if (watched == 0 || event == 0) return false;
+
+ if (watched == m_view)
+ {
+ switch (event->type())
+ {
+ case QEvent::Show:
+ m_viewVisible = true;
+ updateToolbar();
+ break;
+
+ case QEvent::Hide:
+ m_viewVisible = false;
+ updateToolbar();
+ break;
+
+ case QEvent::Close:
+ m_pollTimer->stop();
+ m_view->removeEventFilter(this);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ // we never filter an event, we just want to know about it
+ return false;
+}
+
+void RelLinksPlugin::delayedSetup()
+{
+ if (m_part == 0) return;
+
+ m_view = m_part->view();
+ m_view->installEventFilter(this);
+ m_viewVisible = m_view->isVisible();
+}
+
+void RelLinksPlugin::newDocument() {
+ // start calling upateToolbar periodically to get the new links as soon as possible
+
+ m_pollTimer->start(500);
+ //kdDebug(90210) << "newDocument()" << endl;
+
+ updateToolbar();
+}
+
+void RelLinksPlugin::loadingFinished() {
+ m_pollTimer->stop();
+ //kdDebug(90210) << "loadingFinished()" << endl;
+ updateToolbar();
+ guessRelations();
+}
+
+/* Update the site navigation bar */
+void RelLinksPlugin::updateToolbar() {
+
+ // If we have a part
+ if (!m_part)
+ return;
+
+ // We disable all
+ disableAll();
+
+ // get a list of LINK nodes in document
+ DOM::NodeList linkNodes = m_part->document().getElementsByTagName( "link" );
+
+ //kdDebug(90210) << "Rellinks: Link nodes =" << linkNodes.length() << endl;
+
+ bool showBar = false;
+ unsigned long nodeLength = linkNodes.length();
+
+ for ( unsigned int i=0; i < nodeLength; i++ ) {
+ // create a entry for each one
+ DOM::Element e( linkNodes.item( i ) );
+
+
+ // --- Retrieve of the relation type --
+
+ QString rel = e.getAttribute( "rel" ).string();
+ rel = rel.simplifyWhiteSpace();
+ if (rel.isEmpty()) {
+ // If the "rel" attribut is null then use the "rev" attribute...
+ QString rev = e.getAttribute( "rev" ).string();
+ rev = rev.simplifyWhiteSpace();
+ if (rev.isEmpty()) {
+ // if "rev" attribut is also empty => ignore
+ continue;
+ }
+ // Determine the "rel" equivalent of "rev" type
+ rel = transformRevToRel(rev);
+ }
+ // Determin the name used internally
+ QString lrel = getLinkType(rel.lower());
+ // relation to ignore
+ if (lrel.isEmpty()) continue;
+// kdDebug() << "lrel=" << lrel << endl;
+
+ // -- Retrieve of other usefull informations --
+
+ QString href = e.getAttribute( "href" ).string();
+ // if nowhere to go, ignore the link
+ if (href.isEmpty()) continue;
+ QString title = e.getAttribute( "title" ).string();
+ QString hreflang = e.getAttribute( "hreflang" ).string();
+
+ KURL ref( m_part->url(), href );
+ if ( title.isEmpty() )
+ title = ref.prettyURL();
+
+ // escape ampersand before settings as action title, otherwise the menu entry will interpret it as an
+ // accelerator
+ title.replace('&', "&&");
+
+ // -- Menus activation --
+
+ // Activation of "Document" menu ?
+ if (lrel == "contents" || lrel == "glossary" || lrel == "index" || lrel == "appendix") {
+ m_document->setEnabled(true);
+ }
+ // Activation of "More" menu ?
+ if (lrel == "help" || lrel == "author" || lrel == "copyright" ) {
+ m_more->setEnabled(true);
+ }
+
+ // -- Buttons or menu items activation / creation --
+ if (lrel == "bookmark" || lrel == "alternate") {
+ int id = kactionmenu_map[lrel]->popupMenu()->insertItem( title );
+ m_more->setEnabled(true);
+ kactionmenu_map[lrel]->setEnabled(true);
+ element_map[lrel][id] = e;
+
+ } else if (lrel == "appendix" || lrel == "chapter" || lrel == "section" || lrel == "subsection") {
+ int id = kactionmenu_map[lrel]->popupMenu()->insertItem( title );
+ m_document->setEnabled(true);
+ kactionmenu_map[lrel]->setEnabled(true);
+ element_map[lrel][id] = e;
+
+ } else {
+ // It is a unique action
+ element_map[lrel][0] = e;
+ if (kaction_map[lrel]) {
+ kaction_map[lrel]->setEnabled(true);
+ // Tooltip
+ if (hreflang.isEmpty()) {
+ kaction_map[lrel]->setToolTip( title );
+ } else {
+ kaction_map[lrel]->setToolTip( title + " [" + hreflang + "]");
+ }
+ } else {
+ // For the moment all the elements are reference in a separated menu
+ // TODO : reference the unknown ?
+ int id = kactionmenu_map["unclassified"]->popupMenu()->insertItem( lrel + " : " + title );
+ kactionmenu_map["unclassified"]->setEnabled(true);
+ element_map["unclassified"][id] = e;
+ }
+
+ }
+
+ showBar = true;
+ }
+}
+
+
+void RelLinksPlugin::guessRelations()
+{
+ m_part = dynamic_cast<KHTMLPart *>(parent());
+ if (!m_part || m_part->document().isNull() )
+ return;
+
+ //If the page already contains some link, that mean the webmaster is aware
+ //of the meaning of <link> so we can consider that if prev/next was possible
+ //they are already there.
+ if(!element_map.isEmpty())
+ return;
+
+ // - The number of didgit may not be more of 3, or this is certenly an id.
+ // - We make sure that the number is followed by a dot, a &, or the end, we
+ // don't want to match stuff like that: page.html?id=A14E12FD
+ // - We make also sure the number is not preceded dirrectly by others number
+ QRegExp rx("^(.*[=/?&][^=/?&.\\-0-9]*)([\\d]{1,3})([.&][^/0-9]{0,15})?$");
+
+
+ const QString zeros("0000");
+ QString url=m_part->url().url();
+ if(rx.search(url)!=-1)
+ {
+ uint val=rx.cap(2).toUInt();
+ uint lenval=rx.cap(2).length();
+ QString nval_str=QString::number(val+1);
+ //prepend by zeros if the original also contains zeros.
+ if(nval_str.length() < lenval && rx.cap(2)[0]=='0')
+ nval_str.prepend(zeros.left(lenval-nval_str.length()));
+
+ QString href=rx.cap(1)+ nval_str + rx.cap(3);
+ KURL ref( m_part->url(), href );
+ QString title = i18n("[Autodetected] %1").arg(ref.prettyURL());
+ DOM::Element e= m_part->document().createElement("link");
+ e.setAttribute("href",href);
+ element_map["next"][0] = e;
+ kaction_map["next"]->setEnabled(true);
+ kaction_map["next"]->setToolTip( title );
+
+ if(val>1)
+ {
+ nval_str=QString::number(val-1);
+ if(nval_str.length() < lenval && rx.cap(2)[0]=='0')
+ nval_str.prepend(zeros.left(lenval-nval_str.length()));
+ QString href=rx.cap(1)+ nval_str + rx.cap(3);
+ KURL ref( m_part->url(), href );
+ QString title = i18n("[Autodetected] %1").arg(ref.prettyURL());
+ e= m_part->document().createElement("link");
+ e.setAttribute("href",href);
+ element_map["prev"][0] = e;
+ kaction_map["prev"]->setEnabled(true);
+ kaction_map["prev"]->setToolTip( title );
+ }
+ }
+}
+
+
+/** Menu links */
+void RelLinksPlugin::goToLink(const QString & rel, int id) {
+ // have the KHTML part open it
+ KHTMLPart *part = dynamic_cast<KHTMLPart *>(parent());
+ if (!part)
+ return;
+
+ DOM::Element e = element_map[rel][id];
+ QString href = e.getAttribute("href").string();
+ KURL url( part->url(), href );
+ QString target = e.getAttribute("target").string();
+
+ // URL arguments
+ KParts::URLArgs args;
+ args.frameName = target;
+
+ // Add base url if not valid
+ if (url.isValid()) {
+ part->browserExtension()->openURLRequest(url, args);
+ } else {
+ KURL baseURL = part->baseURL();
+ QString endURL = url.prettyURL();
+ KURL realURL = KURL(baseURL, endURL);
+ part->browserExtension()->openURLRequest(realURL, args);
+ }
+
+}
+
+void RelLinksPlugin::goHome() {
+ goToLink("home");
+}
+
+void RelLinksPlugin::goUp() {
+ goToLink("up");
+}
+
+void RelLinksPlugin::goFirst() {
+ goToLink("begin");
+}
+
+void RelLinksPlugin::goPrevious() {
+ goToLink("prev");
+}
+
+void RelLinksPlugin::goNext() {
+ goToLink("next");
+}
+
+void RelLinksPlugin::goLast() {
+ goToLink("last");
+}
+
+void RelLinksPlugin::goContents() {
+ goToLink("contents");
+}
+
+void RelLinksPlugin::goIndex() {
+ goToLink("index");
+}
+
+void RelLinksPlugin::goGlossary() {
+ goToLink("glossary");
+}
+
+void RelLinksPlugin::goHelp() {
+ goToLink("help");
+}
+
+void RelLinksPlugin::goSearch() {
+ goToLink("search");
+}
+
+void RelLinksPlugin::goAuthor() {
+ goToLink("author");
+}
+
+
+void RelLinksPlugin::goCopyright() {
+ goToLink("copyright");
+}
+
+void RelLinksPlugin::goBookmark(int id) {
+ goToLink("bookmark", id);
+}
+
+void RelLinksPlugin::goChapter(int id) {
+ goToLink("chapter", id);
+}
+
+void RelLinksPlugin::goSection(int id) {
+ goToLink("section", id);
+}
+
+void RelLinksPlugin::goSubsection(int id) {
+ goToLink("subsection", id);
+}
+
+void RelLinksPlugin::goAppendix(int id) {
+ goToLink("appendix", id);
+}
+
+void RelLinksPlugin::goAlternate(int id) {
+ goToLink("alternate", id);
+}
+
+void RelLinksPlugin::goAllElements(int id) {
+ goToLink("unclassified", id);
+}
+
+void RelLinksPlugin::disableAll() {
+ element_map.clear();
+
+ // Clear actions
+ KActionMap::Iterator it;
+ for ( it = kaction_map.begin(); it != kaction_map.end(); ++it ) {
+ // If I don't test it crash :(
+ if (it.data()) {
+ it.data()->setEnabled(false);
+ it.data()->setToolTip(it.data()->text().remove('&'));
+ }
+ }
+
+ // Clear actions
+ KActionMenuMap::Iterator itmenu;
+ for ( itmenu = kactionmenu_map.begin(); itmenu != kactionmenu_map.end(); ++itmenu ) {
+ // If I don't test it crash :(
+ if (itmenu.data()) {
+ itmenu.data()->popupMenu()->clear();
+ itmenu.data()->setEnabled(false);
+ itmenu.data()->setToolTip(itmenu.data()->text().remove('&'));
+ }
+ }
+
+ // Unactivate menus
+ m_more->setEnabled(false);
+ m_document->setEnabled(false);
+
+}
+
+
+QString RelLinksPlugin::getLinkType(const QString &lrel) {
+ // Relations to ignore...
+ if (lrel.contains("stylesheet")
+ || lrel == "script"
+ || lrel == "icon"
+ || lrel == "shortcut icon"
+ || lrel == "prefetch" )
+ return QString::null;
+
+ // ...known relations...
+ if (lrel == "top" || lrel == "origin" || lrel == "start")
+ return "home";
+ if (lrel == "parent")
+ return "up";
+ if (lrel == "first")
+ return "begin";
+ if (lrel == "previous")
+ return "prev";
+ if (lrel == "child")
+ return "next";
+ if (lrel == "end")
+ return "last";
+ if (lrel == "toc")
+ return "contents";
+ if (lrel == "find")
+ return "search";
+ if (lrel == "alternative stylesheet")
+ return "alternate stylesheet";
+ if (lrel == "authors")
+ return "author";
+ if (lrel == "toc")
+ return "contents";
+
+ //...unknown relations or name that don't need to change
+ return lrel;
+}
+
+QString RelLinksPlugin::transformRevToRel(const QString &rev) {
+ QString altRev = getLinkType(rev);
+
+ // Known relations
+ if (altRev == "prev")
+ return getLinkType("next");
+ if (altRev == "next")
+ return getLinkType("prev");
+ if (altRev == "made")
+ return getLinkType("author");
+ if (altRev == "up")
+ return getLinkType("child");
+ if (altRev == "sibling")
+ return getLinkType("sibling");
+
+ //...unknown inverse relation => ignore for the moment
+ return QString::null;
+}
+
+#include "plugin_rellinks.moc"
diff --git a/konq-plugins/rellinks/plugin_rellinks.desktop b/konq-plugins/rellinks/plugin_rellinks.desktop
new file mode 100644
index 0000000..fba32e5
--- /dev/null
+++ b/konq-plugins/rellinks/plugin_rellinks.desktop
@@ -0,0 +1,120 @@
+[Desktop Entry]
+X-KDE-Library=rellinks
+X-KDE-PluginInfo-Author=Anders Lund, Franck Quélain, Kevin Krammer, Olivier Goffart
+X-KDE-PluginInfo-Email=anders@alweb.dk, shift@free.fr, kevin.krammer@gmx.at, ogoffart@kde.org
+X-KDE-PluginInfo-Name=rellinks
+X-KDE-PluginInfo-Version=3.3
+X-KDE-PluginInfo-Website=
+X-KDE-PluginInfo-Category=Tools
+X-KDE-PluginInfo-Depends=
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=false
+## TODO
+##Icon=rellinks
+Name=Document Relations Plugin
+Name[bg]=Приставка за връзки между документите
+Name[ca]=Connector de relacions entre documents
+Name[cs]=Modul vztahů v dokumentu
+Name[da]=Dokmentrelationer-plugin
+Name[de]=Dokumentbeziehungs-Modul
+Name[el]=Πρόσθετο συσχετίσεων εγγράφου
+Name[eo]=Dokumenta rilata kromaĵo
+Name[es]=Complemento de relaciones de documentos
+Name[et]=Dokumendi seoste plugin
+Name[eu]=Dokumentuen harreman plugina
+Name[fa]=وصلۀ روابط سند
+Name[fi]=Asiakirjojen suhteet sovelma
+Name[fr]=Module de relations entre documents
+Name[fy]=Dokumint Relaasjes plugin
+Name[gl]=Plugin de Relacións de Documento
+Name[he]=תוסף יחסי מסמך
+Name[hi]=दस्तावेज़ सम्बन्ध प्लग-इन
+Name[hr]=Dodatak za relacije dokumenata
+Name[hu]=Dokumentumkapcsolatok modul
+Name[is]=Skjalatengsla íforrit
+Name[it]=Relazioni tra documenti
+Name[ja]=ドキュメント関係プラグイン
+Name[ka]=დოკუმენტის კავშირთა მოდული
+Name[kk]=Құжаттың қатынастар плагин модулі
+Name[km]=កម្មវិធី​ជំនួយ​ទំនាក់ទំនង​ឯកសារ
+Name[lt]=Dokumentų sąsajų priedas
+Name[mk]=Приклучок за релации во документ
+Name[ms]=Plugin Kehubungan Dokumen
+Name[nb]=Programtillegg for dokumentrelasjoner
+Name[nds]=Dokmentbetöög-Moduul
+Name[ne]=कागजात सम्बन्धी प्लगइन
+Name[nl]=Documentrelatiesplugin
+Name[nn]=Programtillegg for dokumentrelasjonar
+Name[pa]=ਦਸਤਾਵੇਜ਼ ਸਬੰਧ ਪਲੱਗਇਨ
+Name[pl]=Wtyczka zależności w dokumencie
+Name[pt]='Plugin' de Relações de Documento
+Name[pt_BR]=Plug-in de Relações em Documentos
+Name[ru]=Модуль связей документов
+Name[sk]=Modul súvislosti dokumentov
+Name[sl]=Vstavek povezav dokumenta
+Name[sr]=Прикључак за односе међу документима
+Name[sr@Latn]=Priključak za odnose među dokumentima
+Name[sv]=Insticksprogram för dokumentförhållande
+Name[ta]=ஆவண சம்பந்தப்பட்ட சொருகுப்பொருள்
+Name[tg]=Модули санади робитаҳо
+Name[tr]=Dosya İlişkileri Eklentisi
+Name[uk]=Втулок зв'язку між документами
+Name[uz]=Hujjatlar orasidagi bogʻliqlik plagini
+Name[uz@cyrillic]=Ҳужжатлар орасидаги боғлиқлик плагини
+Name[vi]=Bổ sung quan hệ tài liệu
+Name[zh_CN]=文档关系插件
+Name[zh_TW]=文件關係外掛程式
+Comment=Document Relations plugin
+Comment[bg]=Приставка за връзки между документите
+Comment[ca]=Connector de relacions entre documents
+Comment[cs]=Modul vztahů v dokumentu
+Comment[da]=Dokumentrelationer-plugin
+Comment[de]=Dokumentbeziehungs-Modul
+Comment[el]=Πρόσθετο συσχετίσεων εγγράφου
+Comment[eo]=Dokumenta rilata kromaĵo
+Comment[es]=Complemento de relaciones de documentos
+Comment[et]=Dokumendi seoste plugin
+Comment[eu]=Dokumentuen harreman plugina
+Comment[fa]=وصلۀ روابط سند
+Comment[fi]=Asiakirjojen suhteet sovelma
+Comment[fr]=Module de relations entre documents
+Comment[fy]=Dokumint Relaasjes plugin
+Comment[gl]=Plugin de relacións do documento
+Comment[he]=תוסף יחסי מסמך
+Comment[hi]=दस्तावेज़ सम्बन्ध प्लग-इन
+Comment[hr]=Dodatak za relacije dokumenata
+Comment[hu]=Dokumentumkapcsolatok bővítőmodul
+Comment[is]=Skjalatengsla íforrit
+Comment[it]=Plugin per gestire le relazioni tra documenti
+Comment[ja]=ドキュメント関係プラグイン
+Comment[ka]=დოკუმენტის კავშირთა მოდული
+Comment[kk]=Құжаттың қатынастар плагин модулі
+Comment[km]=កម្មវិធី​ជំនួយ​ទំនាក់ទំនង​ឯកសារ
+Comment[lt]=Dokumentų sąsajų priedas
+Comment[mk]=Приклучок за релации во документ
+Comment[ms]=Plugin Kehubungan Dokumen
+Comment[nb]=Programtillegg for dokumentrelasjoner
+Comment[nds]=Dokmentbetöög-Moduul
+Comment[ne]=कागजात सम्बन्धी प्लगइन
+Comment[nl]=Documentrelatiesplugin
+Comment[nn]=Programtillegg for dokumentrelasjonar
+Comment[pa]=ਦਸਤਾਵੇਜ਼ ਸਬੰਧ ਪਲੱਗਇਨ
+Comment[pl]=Wtyczka zależności w dokumencie
+Comment[pt]='Plugin' de relações de documento
+Comment[pt_BR]=Plug-in para Relacionamentos entre Documentos
+Comment[ru]=Модуль связей документов
+Comment[sk]=Modul súvislosti dokumentov
+Comment[sl]=Vstavek povezav dokumenta
+Comment[sr]=Прикључак за односе међу документима
+Comment[sr@Latn]=Priključak za odnose među dokumentima
+Comment[sv]=Insticksprogram för dokumentförhållande
+Comment[ta]= =ஆவண சம்பந்தப்பட்ட சொருகுப்பொருள்
+Comment[tg]=Модули санади робитаҳо
+Comment[tr]=Dosya İlişkileri Eklentisi
+Comment[uk]=Втулок зв'язку між документами
+Comment[uz]=Hujjatlar orasidagi bogʻliqlik plagini
+Comment[uz@cyrillic]=Ҳужжатлар орасидаги боғлиқлик плагини
+Comment[vi]=Bổ sung quan hệ tài liệu
+Comment[zh_CN]=文档关系插件
+Comment[zh_TW]=文件關係外掛程式
+X-KDE-ParentApp=konqueror
diff --git a/konq-plugins/rellinks/plugin_rellinks.h b/konq-plugins/rellinks/plugin_rellinks.h
new file mode 100644
index 0000000..63260ce
--- /dev/null
+++ b/konq-plugins/rellinks/plugin_rellinks.h
@@ -0,0 +1,170 @@
+/***************************************************************************
+ * Copyright (C) 2002, Anders Lund <anders@alweb.dk> *
+ * Copyright (C) 2003, 2004, Franck Qulain <shift@free.fr> *
+ * Copyright (C) 2004, Kevin Krammer <kevin.krammer@gmx.at> *
+ * Copyright (C) 2004, 2005, Oliviet Goffart <ogoffart @ kde.org> *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+
+
+#ifndef _PLUGIN_RELLINKS_H_
+#define _PLUGIN_RELLINKS_H_
+
+/*
+ This plugin queries the current HTML document for LINK elements.
+
+ This plugin create a toolbar similar to the Site Navigation Bar of Mozilla
+*/
+
+// Qt includes
+#include <qmap.h>
+
+// KDE includes
+#include <kparts/plugin.h>
+#include <dom/dom_string.h>
+
+// type definitions
+typedef QMap<int,DOM::Element> DOMElementMap;
+typedef QMap<QString, KAction*> KActionMap;
+typedef QMap<QString, KActionMenu*> KActionMenuMap;
+
+// forward declarations
+class KActionMenu;
+class KHTMLPart;
+class KHTMLView;
+class KToolBar;
+class KURL;
+class QTimer;
+
+/**
+ * KPart plugin adding document relations toolbar to Konqueror
+ * @author Franck Qulain
+ * @author Anders Lund
+ */
+class RelLinksPlugin : public KParts::Plugin {
+ Q_OBJECT
+public:
+ /** Constructor */
+ RelLinksPlugin( QObject *parent, const char *name, const QStringList & );
+ /** Destructor */
+ virtual ~RelLinksPlugin();
+
+ bool eventFilter(QObject *watched, QEvent* event);
+
+private slots:
+ void delayedSetup();
+
+ /**
+ * KHTMLPart has created a new document, disable actions and
+ * start polling for links
+ */
+ void newDocument();
+
+ /**
+ * KHTMLPart has finished loading, stop the poller and
+ * parse the document a last time.
+ */
+ void loadingFinished();
+
+ /**
+ * Update the toolbar (Parse the document again)
+ */
+ void updateToolbar();
+
+
+ void goHome();
+ void goUp();
+ void goFirst();
+ void goPrevious();
+ void goNext();
+ void goLast();
+ void goContents();
+ void goIndex();
+ void goGlossary();
+ void goHelp();
+ void goSearch();
+ void goCopyright();
+ void goAuthor();
+
+ void goBookmark(int id);
+ void goChapter(int id);
+ void goSection(int id);
+ void goSubsection(int id);
+ void goAppendix(int id);
+ void goAlternate(int id);
+ void goAllElements(int id);
+
+private:
+
+ /**
+ * Try to guess some relations from the url, if the document doesn't contains relations
+ * example: http://example.com/page4.html
+ * the "next" relation will be set to page5.html
+ */
+ void guessRelations();
+
+ /**
+ * Function used to get link type of a relation.
+ * For example "prev" is of type "previous" and "toc" is of type "contents"
+ * If the relation must be ignored return NULL.
+ * If the relation is unknow return the input relation type.
+ * @param lrel Previous relation name
+ * @return New relation name
+ */
+ QString getLinkType(const QString &lrel);
+
+ /**
+ * Function used to return the "rel" equivalent of "rev" link type
+ * If the equivalent is not found return NULL
+ * @param rev Inverse relation name
+ * @return Equivalent relation name
+ */
+ QString transformRevToRel(const QString &rev) ;
+
+ /**
+ * Function used to disable all the item of the toolbar
+ */
+ void disableAll();
+
+ /**
+ * Go to the link
+ * @param rel Relation name
+ * @param id Identifier of the menu item
+ */
+ void goToLink(const QString & rel, int id=0);
+
+private:
+ KHTMLPart* m_part;
+ KHTMLView* m_view;
+ bool m_viewVisible;
+
+ KActionMenu *m_document;
+ KActionMenu *m_more;
+ KActionMenu *m_links;
+
+ /** Map of KAction */
+ KActionMap kaction_map;
+ /** Map of KActionMenu */
+ KActionMenuMap kactionmenu_map;
+
+ /** Map of all the link element which can be managed by rellinks */
+ QMap<QString,DOMElementMap> element_map;
+
+ QTimer* m_pollTimer;
+};
+
+#endif // _PLUGIN_RELLINKS_H_
diff --git a/konq-plugins/rellinks/plugin_rellinks.rc b/konq-plugins/rellinks/plugin_rellinks.rc
new file mode 100644
index 0000000..3c5dbcc
--- /dev/null
+++ b/konq-plugins/rellinks/plugin_rellinks.rc
@@ -0,0 +1,38 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="rellinks" library="librellinksplugin" version="3">
+<MenuBar>
+ <Menu name="tools"><Text>&amp;Tools</Text>
+ <Menu name="rellinksMenu"><Text>Document Relations</Text>
+ <Action name="rellinks_top"/>
+ <Action name="rellinks_up"/>
+ <Action name="rellinks_first"/>
+ <Action name="rellinks_previous"/>
+ <Action name="rellinks_next"/>
+ <Action name="rellinks_last"/>
+ <Action name="rellinks_search"/>
+ <Action name="rellinks_document"/>
+ <Action name="rellinks_more"/>
+ <Action name="rellinks_links"/>
+ </Menu>
+ </Menu>
+</MenuBar>
+
+
+<ToolBar name="rellinksToolBar" hidden="true"><Text>Document Relations</Text>
+ <Action name="rellinks_top"/>
+ <Action name="rellinks_up"/>
+ <Action name="rellinks_first"/>
+ <Action name="rellinks_previous"/>
+ <Action name="rellinks_next"/>
+ <Action name="rellinks_last"/>
+ <Action name="rellinks_search"/>
+ <Separator />
+ <Action name="rellinks_document"/>
+ <Separator />
+ <Action name="rellinks_more"/>
+ <Separator />
+ <Action name="rellinks_links"/>
+</ToolBar>
+
+
+</kpartplugin>
diff --git a/konq-plugins/rellinks/rellinks.kdevelop b/konq-plugins/rellinks/rellinks.kdevelop
new file mode 100644
index 0000000..5496bfc
--- /dev/null
+++ b/konq-plugins/rellinks/rellinks.kdevelop
@@ -0,0 +1,157 @@
+<?xml version = '1.0'?>
+<kdevelop>
+ <general>
+ <author>Franck Quélain</author>
+ <email>shift@free.fr</email>
+ <version>0.3</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ <projectdirectory>../..</projectdirectory>
+ <absoluteprojectpath>false</absoluteprojectpath>
+ <description/>
+ <ignoreparts/>
+ <secondaryLanguages/>
+ </general>
+ <kdevautoproject>
+ <general>
+ <activetarget>konq_plugins/rellinks/librellinksplugin.la</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>GccOptions</ccompiler>
+ <cxxcompiler>GppOptions</cxxcompiler>
+ <f77compiler>G77Options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full --prefix=/usr/local/kde</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ <topsourcedir/>
+ <cppflags/>
+ <ldflags/>
+ <ccompilerbinary/>
+ <cxxcompilerbinary/>
+ <f77compilerbinary/>
+ <cflags/>
+ <f77flags/>
+ </debug>
+ </configurations>
+ <make>
+ <envvars>
+ <envvar value="1" name="WANT_AUTOCONF_2_5" />
+ <envvar value="1" name="WANT_AUTOMAKE_1_6" />
+ </envvars>
+ <abortonerror>false</abortonerror>
+ <numberofjobs>1</numberofjobs>
+ <dontact>false</dontact>
+ <makebin/>
+ </make>
+ <run>
+ <directoryradio>executable</directoryradio>
+ <customdirectory>/</customdirectory>
+ <mainprogram/>
+ <programargs/>
+ <terminal>false</terminal>
+ <autocompile>true</autocompile>
+ <envvars/>
+ </run>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidenonlocation>false</hidenonlocation>
+ </groups>
+ <tree>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <showvcsfields>false</showvcsfields>
+ </tree>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>gtk</toc>
+ <toc>gnustep</toc>
+ <toc>python</toc>
+ <toc>php</toc>
+ <toc>perl</toc>
+ </ignoretocs>
+ <projectdoc>
+ <userdocDir>html/</userdocDir>
+ <apidocDir>html/</apidocDir>
+ </projectdoc>
+ <ignoreqt_xml/>
+ <ignoredoxygen/>
+ <ignorekdocs/>
+ <ignoredevhelp/>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ <programargs/>
+ <gdbpath/>
+ <configGdbScript/>
+ <runShellScript/>
+ <runGdbScript/>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ </display>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevcppsupport>
+ <references/>
+ <codecompletion>
+ <includeGlobalFunctions>true</includeGlobalFunctions>
+ <includeTypes>true</includeTypes>
+ <includeEnums>true</includeEnums>
+ <includeTypedefs>false</includeTypedefs>
+ <automaticCodeCompletion>true</automaticCodeCompletion>
+ <automaticArgumentsHint>true</automaticArgumentsHint>
+ <automaticHeaderCompletion>true</automaticHeaderCompletion>
+ <codeCompletionDelay>250</codeCompletionDelay>
+ <argumentsHintDelay>400</argumentsHintDelay>
+ <headerCompletionDelay>250</headerCompletionDelay>
+ </codecompletion>
+ </kdevcppsupport>
+ <cppsupportpart>
+ <filetemplates>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ </filetemplates>
+ </cppsupportpart>
+ <kdevcvsservice>
+ <recursivewhenupdate>true</recursivewhenupdate>
+ <prunedirswhenupdate>true</prunedirswhenupdate>
+ <createdirswhenupdate>true</createdirswhenupdate>
+ <recursivewhencommitremove>true</recursivewhencommitremove>
+ <revertoptions>-C</revertoptions>
+ </kdevcvsservice>
+</kdevelop>
diff --git a/konq-plugins/rellinks/rellinks.lsm b/konq-plugins/rellinks/rellinks.lsm
new file mode 100644
index 0000000..df11ae6
--- /dev/null
+++ b/konq-plugins/rellinks/rellinks.lsm
@@ -0,0 +1,16 @@
+Begin3
+Title: RelLinks -- Some description
+Version: 0.3
+Entered-date:
+Description:
+Keywords: KDE Qt
+Author: Franck Quélain <shift@free.fr>
+Maintained-by: Franck Quélain <shift@free.fr>
+Home-page:
+Alternate-site:
+Primary-site: ftp://ftp.kde.org/pub/kde/unstable/apps/utils
+ xxxxxx rellinks-0.3.tar.gz
+ xxx rellinks-0.3.lsm
+Platform: Linux. Needs KDE
+Copying-policy: GPL
+End
diff --git a/konq-plugins/searchbar/Makefile.am b/konq-plugins/searchbar/Makefile.am
new file mode 100644
index 0000000..3a4c1b5
--- /dev/null
+++ b/konq-plugins/searchbar/Makefile.am
@@ -0,0 +1,21 @@
+SUBDIRS = icons
+
+INCLUDES = $(all_includes)
+
+kde_module_LTLIBRARIES = libsearchbarplugin.la
+
+libsearchbarplugin_la_SOURCES = searchbar.cpp
+libsearchbarplugin_la_LIBADD = $(LIB_KHTML)
+libsearchbarplugin_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+
+pluginsdir = $(kde_datadir)/konqueror/kpartplugins
+plugins_DATA = searchbar.rc searchbar.desktop
+
+install-data-local: $(srcdir)/../uninstall.desktop
+ $(mkinstalldirs) $(DESTDIR)$(pluginsdir)
+ $(INSTALL_DATA) $(srcdir)/../uninstall.desktop $(DESTDIR)$(pluginsdir)/searchbarplugin.desktop
+
+METASOURCES = AUTO
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/searchbarplugin.pot
diff --git a/konq-plugins/searchbar/icons/Makefile.am b/konq-plugins/searchbar/icons/Makefile.am
new file mode 100644
index 0000000..131e26a
--- /dev/null
+++ b/konq-plugins/searchbar/icons/Makefile.am
@@ -0,0 +1,3 @@
+searchbariconsdir = $(kde_datadir)/konqueror/icons
+searchbaricons_ICON = AUTO
+
diff --git a/konq-plugins/searchbar/icons/cr16-action-google.png b/konq-plugins/searchbar/icons/cr16-action-google.png
new file mode 100644
index 0000000..03ae14a
--- /dev/null
+++ b/konq-plugins/searchbar/icons/cr16-action-google.png
Binary files differ
diff --git a/konq-plugins/searchbar/searchbar.cpp b/konq-plugins/searchbar/searchbar.cpp
new file mode 100644
index 0000000..51f5455
--- /dev/null
+++ b/konq-plugins/searchbar/searchbar.cpp
@@ -0,0 +1,556 @@
+/* This file is part of the KDE project
+ Copyright (C) 2004 Arend van Beelen jr. <arend@auton.nl>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <unistd.h>
+
+#include <dcopclient.h>
+#include <kapplication.h>
+#include <kaction.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kdesktopfile.h>
+#include <kgenericfactory.h>
+#include <kglobal.h>
+#include <khtml_part.h>
+#include <kiconloader.h>
+#include <klineedit.h>
+#include <klocale.h>
+#include <kmimetype.h>
+#include <kprocess.h>
+#include <kprotocolmanager.h>
+#include <kstandarddirs.h>
+#include <kurifilter.h>
+
+#include <kparts/mainwindow.h>
+#include <kparts/partmanager.h>
+
+#include <qpainter.h>
+#include <qpopupmenu.h>
+#include <qtimer.h>
+#include <qstyle.h>
+#include <qwhatsthis.h>
+#include "searchbar.h"
+
+typedef KGenericFactory<SearchBarPlugin> SearchBarPluginFactory;
+K_EXPORT_COMPONENT_FACTORY(libsearchbarplugin,
+ SearchBarPluginFactory("searchbarplugin"))
+
+
+SearchBarPlugin::SearchBarPlugin(QObject *parent, const char *name,
+ const QStringList &) :
+ KParts::Plugin(parent, name),
+ m_searchCombo(0),
+ m_searchMode(UseSearchProvider),
+ m_urlEnterLock(false)
+{
+ m_searchCombo = new SearchBarCombo(0L, "search combo");
+ m_searchCombo->setDuplicatesEnabled(false);
+ m_searchCombo->setMaxCount(5);
+ m_searchCombo->setFixedWidth(180);
+ m_searchCombo->setLineEdit(new KLineEdit(m_searchCombo));
+ m_searchCombo->lineEdit()->installEventFilter(this);
+
+ m_popupMenu = 0;
+
+ m_searchComboAction = new KWidgetAction(m_searchCombo, i18n("Search Bar"), 0,
+ 0, 0, actionCollection(), "toolbar_search_bar");
+ m_searchComboAction->setShortcutConfigurable(false);
+
+ connect(m_searchCombo, SIGNAL(activated(const QString &)),
+ SLOT(startSearch(const QString &)));
+ connect(m_searchCombo, SIGNAL(iconClicked()), SLOT(showSelectionMenu()));
+
+ QWhatsThis::add(m_searchCombo, i18n("Search Bar<p>"
+ "Enter a search term. Click on the icon to change search mode or provider."));
+
+ new KAction( i18n( "Focus Searchbar" ), CTRL+Key_S,
+ this, SLOT(focusSearchbar()),
+ actionCollection(), "focus_search_bar");
+
+ configurationChanged();
+
+ KParts::MainWindow *mainWin = static_cast<KParts::MainWindow*>(parent);
+
+ //Grab the part manager. Don't know of any other way, and neither does Tronical, so..
+ KParts::PartManager *partMan = static_cast<KParts::PartManager*>(mainWin->child(0, "KParts::PartManager"));
+ if (partMan)
+ {
+ connect(partMan, SIGNAL(activePartChanged(KParts::Part*)),
+ SLOT (partChanged (KParts::Part*)));
+ partChanged(partMan->activePart());
+ }
+}
+
+SearchBarPlugin::~SearchBarPlugin()
+{
+ KConfig *config = kapp->config();
+ config->setGroup("SearchBar");
+ config->writeEntry("Mode", (int) m_searchMode);
+ config->writeEntry("CurrentEngine", m_currentEngine);
+
+ delete m_searchCombo;
+ m_searchCombo = 0L;
+}
+
+QChar delimiter()
+{
+ KConfig config( "kuriikwsfilterrc", true, false );
+ config.setGroup( "General" );
+ return config.readNumEntry( "KeywordDelimiter", ':' );
+}
+
+bool SearchBarPlugin::eventFilter(QObject *o, QEvent *e)
+{
+ if( o==m_searchCombo->lineEdit() && e->type() == QEvent::KeyPress )
+ {
+ QKeyEvent *k = (QKeyEvent *)e;
+ if(k->state() & ControlButton)
+ {
+ if(k->key()==Key_Down)
+ {
+ nextSearchEntry();
+ return true;
+ }
+ if(k->key()==Key_Up)
+ {
+ previousSearchEntry();
+ return true;
+ }
+ }
+ }
+ return false;
+}
+
+void SearchBarPlugin::nextSearchEntry()
+{
+ if(m_searchMode == FindInThisPage)
+ {
+ m_searchMode = UseSearchProvider;
+ if(m_searchEngines.count())
+ {
+ m_currentEngine = *m_searchEngines.at(0);
+ }
+ else
+ {
+ m_currentEngine = "google";
+ }
+ }
+ else
+ {
+ QStringList::ConstIterator it = m_searchEngines.find(m_currentEngine);
+ it++;
+ if(it==m_searchEngines.end())
+ {
+ m_searchMode = FindInThisPage;
+ }
+ else
+ {
+ m_currentEngine = *it;
+ }
+ }
+ setIcon();
+}
+
+void SearchBarPlugin::previousSearchEntry()
+{
+ if(m_searchMode == FindInThisPage)
+ {
+ m_searchMode = UseSearchProvider;
+ if(m_searchEngines.count())
+ {
+ m_currentEngine = *m_searchEngines.fromLast();
+ }
+ else
+ {
+ m_currentEngine = "google";
+ }
+ }
+ else
+ {
+ QStringList::ConstIterator it = m_searchEngines.find(m_currentEngine);
+ if(it==m_searchEngines.begin())
+ {
+ m_searchMode = FindInThisPage;
+ }
+ else
+ {
+ it--;
+ m_currentEngine = *it;
+ }
+ }
+ setIcon();
+}
+
+void SearchBarPlugin::startSearch(const QString &search)
+{
+ if(m_urlEnterLock || search.isEmpty() || !m_part)
+ return;
+
+ if(m_searchMode == FindInThisPage)
+ {
+ m_part->findText(search, 0);
+ m_part->findTextNext();
+ }
+ else if(m_searchMode == UseSearchProvider)
+ {
+ m_urlEnterLock = true;
+ KService::Ptr service;
+ KURIFilterData data;
+ QStringList list;
+ list << "kurisearchfilter" << "kuriikwsfilter";
+
+ service = KService::serviceByDesktopPath(QString("searchproviders/%1.desktop").arg(m_currentEngine));
+ if (service) {
+ const QString searchProviderPrefix = *(service->property("Keys").toStringList().begin()) + delimiter();
+ data.setData( searchProviderPrefix + search );
+ }
+
+ if(!service || !KURIFilter::self()->filterURI(data, list))
+ {
+ data.setData( QString::fromLatin1( "google" ) + delimiter() + search );
+ KURIFilter::self()->filterURI( data, list );
+ }
+
+ if(KApplication::keyboardMouseState() & Qt::ControlButton)
+ {
+ KParts::URLArgs args;
+ args.setNewTab(true);
+ emit m_part->browserExtension()->createNewWindow( data.uri(), args );
+ }
+ else
+ {
+ emit m_part->browserExtension()->openURLRequest(data.uri());
+ }
+ }
+
+ if(m_searchCombo->text(0).isEmpty())
+ {
+ m_searchCombo->changeItem(m_searchIcon, search, 0);
+ }
+ else
+ {
+ if(m_searchCombo->findHistoryItem(search) == -1)
+ {
+ m_searchCombo->insertItem(m_searchIcon, search, 0);
+ }
+ }
+
+ m_searchCombo->setCurrentText("");
+ m_urlEnterLock = false;
+}
+
+void SearchBarPlugin::setIcon()
+{
+ QString hinttext;
+ if(m_searchMode == FindInThisPage)
+ {
+ m_searchIcon = SmallIcon("find");
+ hinttext = i18n("Find in This Page");
+ }
+ else
+ {
+ QString providername;
+ KService::Ptr service;
+ KURIFilterData data;
+ QStringList list;
+ list << "kurisearchfilter" << "kuriikwsfilter";
+
+ service = KService::serviceByDesktopPath(QString("searchproviders/%1.desktop").arg(m_currentEngine));
+ if (service) {
+ const QString searchProviderPrefix = *(service->property("Keys").toStringList().begin()) + delimiter();
+ data.setData( searchProviderPrefix + "some keyword" );
+ }
+
+ if (service && KURIFilter::self()->filterURI(data, list))
+ {
+ QString iconPath = locate("cache", KMimeType::favIconForURL(data.uri()) + ".png");
+ if(iconPath.isEmpty())
+ {
+ m_searchIcon = SmallIcon("enhanced_browsing");
+ }
+ else
+ {
+ m_searchIcon = QPixmap(iconPath);
+ }
+ providername = service->name();
+ }
+ else
+ {
+ m_searchIcon = SmallIcon("google");
+ providername = "Google";
+ }
+ hinttext = i18n("%1 Search").arg(providername);;
+ }
+ static_cast<KLineEdit*>(m_searchCombo->lineEdit())->setClickMessage(hinttext);
+
+ // Create a bit wider icon with arrow
+ QPixmap arrowmap = QPixmap(m_searchIcon.width()+5,m_searchIcon.height()+5);
+ arrowmap.fill(m_searchCombo->lineEdit()->backgroundColor());
+ QPainter p( &arrowmap );
+ p.drawPixmap(0, 2, m_searchIcon);
+ QStyle::SFlags arrowFlags = QStyle::Style_Default;
+ m_searchCombo->style().drawPrimitive(QStyle::PE_ArrowDown, &p, QRect(arrowmap.width()-6,
+ arrowmap.height()-6, 6, 5), m_searchCombo->colorGroup(), arrowFlags, QStyleOption() );
+ p.end();
+ m_searchIcon = arrowmap;
+
+ m_searchCombo->setIcon(m_searchIcon);
+}
+
+void SearchBarPlugin::showSelectionMenu()
+{
+ if(!m_popupMenu)
+ {
+ KService::Ptr service;
+ QPixmap icon;
+ KURIFilterData data;
+ QStringList list;
+ list << "kurisearchfilter" << "kuriikwsfilter";
+
+ m_popupMenu = new QPopupMenu(m_searchCombo, "search selection menu");
+ m_popupMenu->insertItem(SmallIcon("find"), i18n("Find in This Page"), this, SLOT(useFindInThisPage()), 0, 999);
+ m_popupMenu->insertSeparator();
+
+ int i=-1;
+ for (QStringList::ConstIterator it = m_searchEngines.begin(); it != m_searchEngines.end(); ++it )
+ {
+ i++;
+ service = KService::serviceByDesktopPath(QString("searchproviders/%1.desktop").arg(*it));
+ if(!service)
+ {
+ continue;
+ }
+ const QString searchProviderPrefix = *(service->property("Keys").toStringList().begin()) + delimiter();
+ data.setData( searchProviderPrefix + "some keyword" );
+
+ if(KURIFilter::self()->filterURI(data, list))
+ {
+ QString iconPath = locate("cache", KMimeType::favIconForURL(data.uri()) + ".png");
+ if(iconPath.isEmpty())
+ {
+ icon = SmallIcon("enhanced_browsing");
+ }
+ else
+ {
+ icon = QPixmap( iconPath );
+ }
+ m_popupMenu->insertItem(icon, service->name(), i);
+ }
+ }
+
+ m_popupMenu->insertSeparator();
+ m_popupMenu->insertItem(SmallIcon("enhanced_browsing"), i18n("Select Search Engines..."),
+ this, SLOT(selectSearchEngines()), 0, 1000);
+ connect(m_popupMenu, SIGNAL(activated(int)), SLOT(useSearchProvider(int)));
+ }
+ m_popupMenu->popup(m_searchCombo->mapToGlobal(QPoint(0, m_searchCombo->height() + 1)), 0);
+}
+
+void SearchBarPlugin::useFindInThisPage()
+{
+ m_searchMode = FindInThisPage;
+ setIcon();
+}
+
+void SearchBarPlugin::useSearchProvider(int id)
+{
+ if(id>900)
+ {
+ // Not a search engine entry selected
+ return;
+ }
+ m_searchMode = UseSearchProvider;
+ m_currentEngine = *m_searchEngines.at(id);
+ setIcon();
+}
+
+void SearchBarPlugin::selectSearchEngines()
+{
+ KProcess *process = new KProcess;
+
+ *process << "kcmshell" << "ebrowsing";
+
+ connect(process, SIGNAL(processExited(KProcess *)), SLOT(searchEnginesSelected(KProcess *)));
+
+ if(!process->start())
+ {
+ kdDebug(1202) << "Couldn't invoke kcmshell." << endl;
+ delete process;
+ }
+}
+
+void SearchBarPlugin::searchEnginesSelected(KProcess *process)
+{
+ if(!process || process->exitStatus() == 0)
+ {
+ KConfig *config = kapp->config();
+ config->setGroup("SearchBar");
+ config->writeEntry("CurrentEngine", m_currentEngine);
+ config->sync();
+ configurationChanged();
+ }
+ delete process;
+}
+
+void SearchBarPlugin::configurationChanged()
+{
+ KConfig *config = new KConfig("kuriikwsfilterrc");
+ config->setGroup("General");
+ QString engine = config->readEntry("DefaultSearchEngine", "google");
+
+ QStringList favoriteEngines;
+ favoriteEngines << "google" << "google_groups" << "google_news" << "webster" << "dmoz" << "wikipedia";
+ favoriteEngines = config->readListEntry("FavoriteSearchEngines", favoriteEngines);
+
+ delete m_popupMenu;
+ m_popupMenu = 0;
+ m_searchEngines.clear();
+ m_searchEngines << engine;
+ for (QStringList::ConstIterator it = favoriteEngines.begin(); it != favoriteEngines.end(); ++it )
+ if(*it!=engine)
+ m_searchEngines << *it;
+
+ delete config;
+ if(engine.isEmpty())
+ {
+ m_providerName = "Google";
+ }
+ else
+ {
+ KDesktopFile file("searchproviders/" + engine + ".desktop", true, "services");
+ m_providerName = file.readName();
+ }
+
+ config = kapp->config();
+ config->setGroup("SearchBar");
+ m_searchMode = (SearchModes) config->readNumEntry("Mode", (int) UseSearchProvider);
+ m_currentEngine = config->readEntry("CurrentEngine", engine);
+
+ if ( m_currentEngine.isEmpty() )
+ m_currentEngine = "google";
+
+ setIcon();
+}
+
+void SearchBarPlugin::partChanged(KParts::Part *newPart)
+{
+ m_part = ::qt_cast<KHTMLPart*>(newPart);
+
+ //Delay since when destroying tabs part 0 gets activated for a bit, before the proper part
+ QTimer::singleShot(0, this, SLOT(updateComboVisibility()));
+}
+
+void SearchBarPlugin::updateComboVisibility()
+{
+ if (m_part.isNull() || !m_searchComboAction->isPlugged())
+ {
+ m_searchCombo->setPluginActive(false);
+ m_searchCombo->hide();
+ }
+ else
+ {
+ m_searchCombo->setPluginActive(true);
+ m_searchCombo->show();
+ }
+}
+
+void SearchBarPlugin::focusSearchbar()
+{
+ QFocusEvent::setReason( QFocusEvent::Shortcut );
+ m_searchCombo->setFocus();
+ QFocusEvent::resetReason();
+}
+
+SearchBarCombo::SearchBarCombo(QWidget *parent, const char *name) :
+ KHistoryCombo(parent, name),
+ m_pluginActive(true)
+{
+ connect(this, SIGNAL(cleared()), SLOT(historyCleared()));
+}
+
+const QPixmap &SearchBarCombo::icon() const
+{
+ return m_icon;
+}
+
+void SearchBarCombo::setIcon(const QPixmap &icon)
+{
+ m_icon = icon;
+
+ if(count() == 0)
+ {
+ insertItem(m_icon, 0);
+ }
+ else
+ {
+ for(int i = 0; i < count(); i++)
+ {
+ changeItem(m_icon, text(i), i);
+ }
+ }
+}
+
+int SearchBarCombo::findHistoryItem(const QString &searchText)
+{
+ for(int i = 0; i < count(); i++)
+ {
+ if(text(i) == searchText)
+ {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+void SearchBarCombo::mousePressEvent(QMouseEvent *e)
+{
+ int x0 = QStyle::visualRect( style().querySubControlMetrics( QStyle::CC_ComboBox, this, QStyle::SC_ComboBoxEditField ), this ).x();
+
+ if(e->x() > x0 + 2 && e->x() < lineEdit()->x())
+ {
+ emit iconClicked();
+
+ e->accept();
+ }
+ else
+ {
+ KHistoryCombo::mousePressEvent(e);
+ }
+}
+
+void SearchBarCombo::historyCleared()
+{
+ setIcon(m_icon);
+}
+
+void SearchBarCombo::setPluginActive(bool pluginActive)
+{
+ m_pluginActive = pluginActive;
+}
+
+void SearchBarCombo::show()
+{
+ if(m_pluginActive)
+ {
+ KHistoryCombo::show();
+ }
+}
+
+#include "searchbar.moc"
diff --git a/konq-plugins/searchbar/searchbar.desktop b/konq-plugins/searchbar/searchbar.desktop
new file mode 100644
index 0000000..cbb2f57
--- /dev/null
+++ b/konq-plugins/searchbar/searchbar.desktop
@@ -0,0 +1,121 @@
+[Desktop Entry]
+Icon=google
+Type=Service
+X-KDE-Library=searchbar
+X-KDE-PluginInfo-Author=Arend van Beelen jr.
+X-KDE-PluginInfo-Email=arend@auton.nl
+X-KDE-PluginInfo-Name=searchbar
+X-KDE-PluginInfo-Version=1.0.0
+X-KDE-PluginInfo-Website=
+X-KDE-PluginInfo-Category=Extensions
+X-KDE-PluginInfo-Depends=
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=true
+Name=Search Bar Plugin
+Name[bg]=Приставка за търсене
+Name[br]=Lugent ar varenn glask
+Name[bs]=Dodatak za traku pretrage
+Name[ca]=Connector de barra de cerca
+Name[cs]=Modul vyhledávací lišty
+Name[da]=Søgelinje plugin
+Name[de]=Suchleisten-Modul
+Name[el]=Πρόσθετο γραμμής αναζήτησης
+Name[eo]=Serĉlistela kromaĵo
+Name[es]=Complemento de barra de búsqueda
+Name[et]=Otsimisriba plugin
+Name[eu]=Bilaketa-barra plugina
+Name[fa]=وصلۀ میلۀ جستجو
+Name[fi]=Etsintäpalkki-liitännäinen
+Name[fr]=Module de barre de recherche
+Name[fy]=Sykbalkeplugin
+Name[ga]=Breiseán Barra Cuardaigh
+Name[gl]=Plugin de Barra de Procura
+Name[he]=תוסף סרגל חיפוש
+Name[hi]=सर्च बार प्लगइन
+Name[hr]=Dodatak trake za pretraživanje
+Name[hu]=Keresősáv-bővítőmodul
+Name[is]=Leitarslár-íforrit
+Name[it]=Plugin per la barra di ricerca
+Name[ja]=検索バープラグイン
+Name[ka]=ძიების ველის მოდული
+Name[kk]=Іздеу панелінің плагин модулі
+Name[km]=កម្មវិធី​ជំនួយ​​របារ​ស្វែងរក
+Name[lt]=Paieškos juostos priedas
+Name[mk]=Приклучок за лента за барање
+Name[ms]=Plugin Bar Carian
+Name[nb]=Søkelinje-programtillegg
+Name[nds]=Söökbalken-Moduul
+Name[ne]=पट्टी प्लगइन खोज्नुहोस्
+Name[nl]=Zoekbalkplugin
+Name[nn]=Søkelinjeprogramtillegg
+Name[pa]=ਖੋਜ ਪੱਟੀ ਪਲੱਗਇਨ
+Name[pl]=Wtyczka paska wyszukiwania
+Name[pt]='Plugin' de Barra de Procura
+Name[pt_BR]=Plug-in de Barra de Busca
+Name[ru]=Модуль панели поиска
+Name[sk]=Modul pre vyhľadávací pruh
+Name[sl]=Vstavek iskalne vrstice
+Name[sr]=Прикључак претраживачке траке
+Name[sr@Latn]=Priključak pretraživačke trake
+Name[sv]=Sökradsinsticksprogram
+Name[ta]=பட்டி சொருகு சாதனத்தைத் தேடு
+Name[tg]=Модули панели ҷустуҷӯ
+Name[tr]=Arama Çubuğu Eklentisi
+Name[uk]=Втулок смужки пошуку
+Name[uz]=Qidirish paneli plagini
+Name[uz@cyrillic]=Қидириш панели плагини
+Name[vi]=Bổ sung thanh tìm
+Name[zh_CN]=搜索栏插件
+Name[zh_TW]=搜尋列外掛程式
+Comment=Presents you with a textbox for direct access to search engines like Google.
+Comment[bg]=Поле за търсене на в търсещите машини от сорта на Google
+Comment[bs]=Prikazuje tekstualno polja za direktan pristup pretraživačima kao što je Google.
+Comment[ca]=Presenta una àrea de text per accés directe a motors de cerca com Google.
+Comment[cs]=Textové pole pro přímý přístup k vyhledávání jako je Google.
+Comment[da]=Præsenterer dig for et tekstfelt med direkte adgang til søgemaskiner såsom Google.
+Comment[de]=Zeigt ein Eingabefeld für direkten Zugriff auf Suchmaschinen wie Google.
+Comment[el]=Σας παρουσιάζει ένα πεδίο κειμένου για απευθείας πρόσβαση σε μηχανές αναζήτησης όπως το Google.
+Comment[eo]=Elmontras al vi tekstoskatolon por senpera aliro al serĉiloj kiel Guglo.
+Comment[es]=Se muestra como un cuadro de texto con el que se tendrá acceso directo a motores de búsqueda del estilo de Google.
+Comment[et]=Pakub tekstikasti, mis võimaldab vahetult kasutada mitmesuguseid otsingumootoreid, näiteks Google.
+Comment[eu]=Google bezalako bilaketa motoreak zuzenean atzitzeko testu kutxa bat aurkezten dizu
+Comment[fa]=جعبه متنی را برای دستیابی مستقیم به موتورهای جستجو نظیر گوگل، به شما ارائه می‌کند.
+Comment[fi]=Lisää tekstilaatikon suoraan hakukoneen käyttöön kuten Google.
+Comment[fr]=Vous présente une zone de texte pour un accès direct aux moteurs de recherche comme Google.
+Comment[fy]=Levert in ynfierfjild wêrmei't jo direkte tagong krije ta sykmasines lykas Google.
+Comment[gl]=Dá-lle unha caixa de texto para aceder directamente a motores de procura como Google.
+Comment[he]= מציג לך שורת קלט לגישה ישירה אל מנועי חיפוש כמו Google
+Comment[hi]=गूगल जैसे सर्च इंजनों पर सीधे पहुँच के लिए आपको एक पाठ बक्सा प्रदान करता है.
+Comment[hr]=Pruža tekstualni okvir za izravan pristup tražilicama poput Google-a.
+Comment[hu]=Gyors hozzáférést biztosít az internetes keresők (pl. Google) szolgáltatásaihoz.
+Comment[is]=Birtir textabox sem er beintengt leitarvélum eins og Google.
+Comment[it]=Ti presenta una casella di testo per l'accesso diretto a dei motori di ricerca quali Google.
+Comment[ja]=Google のような検索エンジンへの直接アクセスのテキストボックスを提供します。
+Comment[ka]=წარმოგიდგენთ ტექსტურ ველს რომელის საძიებო სისტემასთანაა კავსირში, მაგ. Google.
+Comment[kk]=Google секілді іздеу тетіктеріне тікелей қатынау панелі.
+Comment[km]=បង្ហាញ​អ្នក​ដោយ​​​​ប្រអប់​អត្ថបទ​មួយ ​ដើម្បី​ចូល​ដំណើរ​​ការ​​ម៉ាស៊ីន​ស្វែង​រក ​ដូចជា Google ។​
+Comment[lt]=Pateikia teksto lauką tiesioginei prieigai prie paieškos sistemų, tokių, kaip Google.
+Comment[mk]=Ви дава текстуално поле за директен пристап до машини за пребарување како Google
+Comment[ms]=Mempersembahkan kepada anda buku teks untuk akses terus ke enjin cari seperti Google.
+Comment[nb]=Viser en tekstboks for direkte tilgang til søkemotorer som Google.
+Comment[nds]=Gifft Di en Textfeld för den Direkttogriep op Söökmaschinen, as t.B. "Google".
+Comment[ne]=तपाईँलाई गुगल जस्तै खोजी इन्जिनमा प्रत्यक्ष पहुँच प्राप्त गर्न पाठबाकस प्रस्तुत गर्छ ।
+Comment[nl]=Levert een invoerveld waarmee u directe toegang hebt tot zoekmachines zoals Google.
+Comment[nn]=Visar ein tekstboks for direkte tilgang til søkemotorar som Google.
+Comment[pl]=Pokazuje okienko umożliwiające bezpośrednie uruchamianie przeszukiwarek, takich jak Google.
+Comment[pt]=Dá-lhe uma caixa de texto para acesso directo a motores de procura com o Google.
+Comment[pt_BR]=Apresenta a você uma caixa de texto para o acesso direto a mecanismos de busca como o Google.
+Comment[ru]=Поле ввода для быстрого поиска в Google.
+Comment[sk]=Zobrazí textové pole pre priamy prístup k vyhľadávačom ako je Google.
+Comment[sl]=Poda besedilni okvir za neposreden odnos do iskalnih strežnikov, kot je Google.
+Comment[sr]=Приказује текстуално поље за директан приступ претраживачима као што је Google.
+Comment[sr@Latn]=Prikazuje tekstualno polje za direktan pristup pretraživačima kao što je Google.
+Comment[sv]=Visar en textruta för direktåtkomst av söktjänster som Google.
+Comment[ta]=கூகுலில் இருப்பது போன்று தேடு இயந்திரங்களின் நேரடியான அணுகலுக்கு ஒரு உரைப்பெட்டியுடன் வழங்கும்.
+Comment[tg]=Фосидаи хурди воридот барои ҷустуҷуйи тез дар Google.
+Comment[tr]=Bir metin kutusu ile sizin Google gibi arma motorlarına ulaşmanızı sağlar.
+Comment[uk]=Надає прямий доступ до пошукових систем таких, як Google.
+Comment[vi]=Hiển thị hộp nhập trực tiếp chuỗi tìm bằng Google v.v.
+Comment[zh_CN]=为您添加一个文本框,以便可直接访问像 Google 这样的搜索引擎。
+Comment[zh_TW]=提供您直接到像 Google 之類的搜尋引擎搜尋文字的方法
+X-KDE-ParentApp=konqueror
diff --git a/konq-plugins/searchbar/searchbar.h b/konq-plugins/searchbar/searchbar.h
new file mode 100644
index 0000000..3f03eb9
--- /dev/null
+++ b/konq-plugins/searchbar/searchbar.h
@@ -0,0 +1,168 @@
+/* This file is part of the KDE project
+ Copyright (C) 2004 Arend van Beelen jr. <arend@auton.nl>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SEARCHBAR_PLUGIN
+#define SEARCHBAR_PLUGIN
+
+#include <kcombobox.h>
+#include <klibloader.h>
+#include <kparts/plugin.h>
+#include <kparts/mainwindow.h>
+
+#include <qguardedptr.h>
+#include <qpixmap.h>
+#include <qstring.h>
+
+class KHTMLPart;
+class KProcess;
+class QPopupMenu;
+
+/**
+ * Combo box which catches mouse clicks on the pixmap.
+ */
+class SearchBarCombo : public KHistoryCombo
+{
+ Q_OBJECT
+
+ public:
+ /**
+ * Constructor.
+ */
+ SearchBarCombo(QWidget *parent, const char *name);
+
+ /**
+ * Returns the icon currently displayed in the combo box.
+ */
+ const QPixmap &icon() const;
+
+ /**
+ * Sets the icon displayed in the combo box.
+ */
+ void setIcon(const QPixmap &icon);
+
+ /**
+ * Finds a history item by its text.
+ * @return The item number, or -1 if the item is not found.
+ */
+ int findHistoryItem(const QString &text);
+
+ /**
+ * Sets whether the plugin is active. It can be inactive
+ * in case the current Konqueror part isn't a KHTML part.
+ */
+ void setPluginActive(bool pluginActive);
+
+ public slots:
+ virtual void show();
+
+ signals:
+ /**
+ * Emitted when the icon was clicked.
+ */
+ void iconClicked();
+
+ protected:
+ /**
+ * Captures mouse clicks and emits iconClicked() if the icon
+ * was clicked.
+ */
+ virtual void mousePressEvent(QMouseEvent *e);
+
+ private slots:
+ void historyCleared();
+
+ private:
+ QPixmap m_icon;
+ bool m_pluginActive;
+};
+
+/**
+ * Plugin that provides a search bar for Konqueror. This search bar is located
+ * next to the location bar and will show a small icon indicating the search
+ * provider it will use.
+ *
+ * @author Arend van Beelen jr. <arend@auton.nl>
+ * @version $Id$
+ */
+class SearchBarPlugin : public KParts::Plugin
+{
+ Q_OBJECT
+
+ public:
+ /** Possible search modes */
+ enum SearchModes { FindInThisPage = 0, UseSearchProvider };
+
+ SearchBarPlugin(QObject *parent, const char *name,
+ const QStringList &);
+ virtual ~SearchBarPlugin();
+
+ protected:
+ bool eventFilter(QObject *o, QEvent *e);
+
+ private slots:
+ /**
+ * Starts a search by putting the query URL from the selected
+ * search provider in the locationbar and calling goURL()
+ */
+ void startSearch(const QString &search);
+
+ /**
+ * Sets the icon to indicate which search engine is used.
+ */
+ void setIcon();
+
+ /**
+ * Opens the selection menu.
+ */
+ void showSelectionMenu();
+
+ void useFindInThisPage();
+ void useSearchProvider(int);
+ void selectSearchEngines();
+ void searchEnginesSelected(KProcess *process);
+ void configurationChanged();
+
+ /**
+ * We keep track of part activations to know when to show or hide ourselves
+ */
+ void partChanged(KParts::Part *newPart);
+
+ /**
+ * Show or hide the combo box
+ */
+ void updateComboVisibility();
+
+ void focusSearchbar();
+ private:
+ void nextSearchEntry();
+ void previousSearchEntry();
+
+ QGuardedPtr<KHTMLPart> m_part;
+ SearchBarCombo *m_searchCombo;
+ KWidgetAction *m_searchComboAction;
+ QPopupMenu *m_popupMenu;
+ QPixmap m_searchIcon;
+ SearchModes m_searchMode;
+ QString m_providerName;
+ bool m_urlEnterLock;
+ QString m_currentEngine;
+ QStringList m_searchEngines;
+};
+
+#endif // SEARCHBAR_PLUGIN
diff --git a/konq-plugins/searchbar/searchbar.lsm b/konq-plugins/searchbar/searchbar.lsm
new file mode 100644
index 0000000..94537f9
--- /dev/null
+++ b/konq-plugins/searchbar/searchbar.lsm
@@ -0,0 +1,13 @@
+Begin3
+Title: SearchBarPlugin
+Version: 0.1
+Entered-date: 08/02/2004
+Description: Puts an extra textbox for access to search engines like
+ Google next to Konqueror's location bar.
+Keywords: KDE Qt
+Author: Arend van Beelen jr. <arend@auton.nl>
+Maintained-by: Arend van Beelen jr. <arend@auton.nl>
+Home-page:
+Platform: Linux. Tested against Qt/KDE 3.2, might work with earlier versions.
+Copying-policy: GPL
+End
diff --git a/konq-plugins/searchbar/searchbar.rc b/konq-plugins/searchbar/searchbar.rc
new file mode 100644
index 0000000..c98fdb5
--- /dev/null
+++ b/konq-plugins/searchbar/searchbar.rc
@@ -0,0 +1,6 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="searchbar" library="libsearchbarplugin" version="3">
+<ToolBar fullWidth="true" name="locationToolBar" newline="true"><text>Search Toolbar</text>
+ <Action name="toolbar_search_bar" />
+</ToolBar>
+</kpartplugin>
diff --git a/konq-plugins/sidebar/Makefile.am b/konq-plugins/sidebar/Makefile.am
new file mode 100644
index 0000000..165352a
--- /dev/null
+++ b/konq-plugins/sidebar/Makefile.am
@@ -0,0 +1,5 @@
+if include_ARTS
+mediaplayer_subdir = mediaplayer
+endif
+
+SUBDIRS = $(mediaplayer_subdir) newsticker delicious metabar
diff --git a/konq-plugins/sidebar/delicious/Makefile.am b/konq-plugins/sidebar/delicious/Makefile.am
new file mode 100644
index 0000000..cb8eb48
--- /dev/null
+++ b/konq-plugins/sidebar/delicious/Makefile.am
@@ -0,0 +1,22 @@
+SUBDIRS = . pics
+
+METASOURCES = AUTO
+INCLUDES = -I$(kde_includes)/kio $(all_includes)
+
+################################
+# these are the headers for your project
+noinst_HEADERS = plugin.h mainWidget.h tagListItem.h bookmarkListItem.h
+
+kde_module_LTLIBRARIES = konqsidebar_delicious.la
+
+# the Part's source, library search path, and link libraries
+konqsidebar_delicious_la_SOURCES = plugin.cpp widget.ui mainWidget.cpp plugin.skel tagListItem.cpp \
+ bookmarkListItem.cpp
+konqsidebar_delicious_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+konqsidebar_delicious_la_LIBADD = $(LIB_KPARTS) $(LIB_KIO) -lkonqsidebarplugin
+
+globaladddir = $(kde_datadir)/konqsidebartng/add
+globaladd_DATA = delicious_add.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/konqsidebar_delicious.pot
diff --git a/konq-plugins/sidebar/delicious/bookmarkListItem.cpp b/konq-plugins/sidebar/delicious/bookmarkListItem.cpp
new file mode 100644
index 0000000..f4bd8f5
--- /dev/null
+++ b/konq-plugins/sidebar/delicious/bookmarkListItem.cpp
@@ -0,0 +1,72 @@
+//////////////////////////////////////////////////////////////////////////
+// bookmarkListItem.cpp //
+// //
+// Copyright (C) 2005 Lukas Tinkl <lukas@kde.org> //
+// //
+// This program is free software; you can redistribute it and/or //
+// modify it under the terms of the GNU General Public License //
+// as published by the Free Software Foundation; either version 2 //
+// of the License, or (at your option) any later version. //
+// //
+// This program 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 the //
+// GNU General Public License for more details. //
+// //
+// You should have received a copy of the GNU General Public License //
+// along with this program; if not, write to the Free Software //
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA //
+// 02111-1307, USA. //
+//////////////////////////////////////////////////////////////////////////
+
+#include "bookmarkListItem.h"
+
+#include <kglobal.h>
+#include <klocale.h>
+
+BookmarkListItem::BookmarkListItem( QListView *parent, const QString & url, const QString & desc, time_t time )
+ : KListViewItem( parent ), m_desc( desc )
+{
+ m_url = KURL::fromPathOrURL( url );
+ m_dateTime.setTime_t( time );
+}
+
+int BookmarkListItem::compare( QListViewItem * i, int col, bool ascending ) const
+{
+ if ( col == 1 )
+ {
+ QDateTime them = static_cast<BookmarkListItem *>( i )->date();
+ if ( m_dateTime < them )
+ return -1;
+ else if ( m_dateTime > them )
+ return 1;
+ else
+ return 0;
+ }
+ return QListViewItem::compare( i, col, ascending );
+}
+
+QString BookmarkListItem::text( int column ) const
+{
+ if ( column == 0 )
+ return m_desc;
+ else if ( column == 1 )
+ return KGlobal::locale()->formatDateTime( m_dateTime );
+
+ return QString::null;
+}
+
+KURL BookmarkListItem::url() const
+{
+ return m_url;
+}
+
+QDateTime BookmarkListItem::date() const
+{
+ return m_dateTime;
+}
+
+QString BookmarkListItem::desc() const
+{
+ return m_desc;
+}
diff --git a/konq-plugins/sidebar/delicious/bookmarkListItem.h b/konq-plugins/sidebar/delicious/bookmarkListItem.h
new file mode 100644
index 0000000..9188fcd
--- /dev/null
+++ b/konq-plugins/sidebar/delicious/bookmarkListItem.h
@@ -0,0 +1,51 @@
+//////////////////////////////////////////////////////////////////////////
+// bookmarkListItem.h //
+// //
+// Copyright (C) 2005 Lukas Tinkl <lukas@kde.org> //
+// //
+// This program is free software; you can redistribute it and/or //
+// modify it under the terms of the GNU General Public License //
+// as published by the Free Software Foundation; either version 2 //
+// of the License, or (at your option) any later version. //
+// //
+// This program 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 the //
+// GNU General Public License for more details. //
+// //
+// You should have received a copy of the GNU General Public License //
+// along with this program; if not, write to the Free Software //
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA //
+// 02111-1307, USA. //
+//////////////////////////////////////////////////////////////////////////
+
+#ifndef _BOOKMARKLISTITEM_H_
+#define _BOOKMARKLISTITEM_H_
+
+#include <qdatetime.h>
+
+#include <klistview.h>
+#include <kurl.h>
+
+#include <time.h>
+
+class QString;
+
+class BookmarkListItem: public KListViewItem
+{
+public:
+ BookmarkListItem( QListView *parent, const QString & url, const QString & desc, time_t time );
+ KURL url() const;
+ QDateTime date() const;
+ QString desc() const;
+
+protected:
+ virtual int compare( QListViewItem * i, int col, bool ascending ) const;
+ virtual QString text( int column ) const;
+
+ KURL m_url;
+ QString m_desc;
+ QDateTime m_dateTime;
+};
+
+#endif
diff --git a/konq-plugins/sidebar/delicious/delicious_add.desktop b/konq-plugins/sidebar/delicious/delicious_add.desktop
new file mode 100644
index 0000000..b2e3e07
--- /dev/null
+++ b/konq-plugins/sidebar/delicious/delicious_add.desktop
@@ -0,0 +1,57 @@
+[Desktop Entry]
+Type=Link
+URL=
+Icon=konqsidebar_delicious
+Name=del.icio.us Bookmarks
+Name[bg]=Отметки del.icio.us
+Name[br]=Sinedoù del.icio.us
+Name[ca]=Punts del.icio.us
+Name[cs]=del.icio.us záložky
+Name[da]=del.icio.us Bogmærker
+Name[de]=Lesezeichen von del.icio.us
+Name[el]=Σελιδοδείκτες del.icio.us
+Name[eo]=del.icio.us legosignoj
+Name[es]=Marcadores del.icio.us
+Name[et]=del.icio.us järjehoidjad
+Name[eu]=del.icio.us laster-markak
+Name[fa]=چوب الفهای del.icio.us
+Name[fi]=del.icio.us kirjanmerkit
+Name[fr]=Signets del.icio.us
+Name[fy]=del.icio.us-blêdwizers
+Name[ga]=Leabharmharcanna del.icio.us
+Name[gl]=Favoritos del.icio.us
+Name[he]=סימניות של del.icio.us
+Name[hr]=del.icio.us oznake
+Name[hu]=Del.icio.us könyvjelzők
+Name[is]=del.icio.us bókamerki
+Name[it]=Segnalibri di del.icio.us
+Name[ja]=del.icio.us ブックマーク
+Name[ka]=del.icio.us სანიშნეები
+Name[kk]=del.icio.us бетбелгілері
+Name[km]=​ចំណាំ del.icio.us
+Name[lt]=del.icio.us žymelės
+Name[mk]=Обележувачи за del.icio.us
+Name[nb]=del.icio.us bokmerker
+Name[nds]="del.icio.us"-Leestekens
+Name[ne]=del.icio.us पुस्तकचिनोहरू
+Name[nl]=del.icio.us-bladwijzers
+Name[nn]=del.icio.us-bokmerke
+Name[pa]=del.icio.us ਬੁੱਕਮਾਰਕ
+Name[pl]=Zakładki del.icio.us
+Name[pt]=Favoritos del.icio.us
+Name[pt_BR]=Favorito do del.icio.us
+Name[ru]=Закладки del.icio.us
+Name[sk]=del.icio.us záložky
+Name[sl]=Zaznamki del.icio.us
+Name[sr]=ук.ус.ни маркери
+Name[sr@Latn]=uk.us.ni markeri
+Name[sv]=del.icio.us bokmärken
+Name[tr]=del.icio.us Yer İmleri
+Name[uk]=Закладки del.icio.us
+Name[uz]=del.icio.us xatchoʻplari
+Name[uz@cyrillic]=del.icio.us хатчўплари
+Name[vi]=Dấu nhớ del.icio.us
+Name[zh_CN]=del.icio.us 书签
+Open=false
+X-KDE-KonqSidebarAddModule=konqsidebar_delicious
+X-KDE-KonqSidebarUniversal=true
diff --git a/konq-plugins/sidebar/delicious/mainWidget.cpp b/konq-plugins/sidebar/delicious/mainWidget.cpp
new file mode 100644
index 0000000..759e348
--- /dev/null
+++ b/konq-plugins/sidebar/delicious/mainWidget.cpp
@@ -0,0 +1,354 @@
+// -*- Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4; -*-
+//////////////////////////////////////////////////////////////////////////
+// mainWidget.cpp //
+// //
+// Copyright (C) 2005 Lukas Tinkl <lukas@kde.org> //
+// //
+// This program is free software; you can redistribute it and/or //
+// modify it under the terms of the GNU General Public License //
+// as published by the Free Software Foundation; either version 2 //
+// of the License, or (at your option) any later version. //
+// //
+// This program 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 the //
+// GNU General Public License for more details. //
+// //
+// You should have received a copy of the GNU General Public License //
+// along with this program; if not, write to the Free Software //
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA //
+// 02111-1307, USA. //
+//////////////////////////////////////////////////////////////////////////
+
+#include "mainWidget.h"
+#include "tagListItem.h"
+#include "bookmarkListItem.h"
+
+#include <qlistview.h>
+#include <qdom.h>
+#include <qpopupmenu.h>
+#include <qpushbutton.h>
+#include <qtimer.h>
+#include <qdatetime.h>
+
+#include <kdebug.h>
+#include <kio/job.h>
+#include <krfcdate.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+#include <kconfig.h>
+#include <kinputdialog.h>
+
+MainWidget::MainWidget( KConfig * config, QWidget * parent )
+ : MainWidget_base( parent ), m_config( config )
+{
+ loadTags();
+
+ KIconLoader * il = KGlobal::iconLoader();
+
+ btnRefreshTags->setIconSet( il->loadIconSet( "reload", KIcon::Small ) );
+ btnRefreshBookmarks->setIconSet( il->loadIconSet( "reload", KIcon::Small ) );
+ btnNew->setIconSet( il->loadIconSet( "bookmark_add", KIcon::Small ) );
+
+ connect( ( QWidget * ) btnRefreshTags, SIGNAL( clicked() ),
+ this, SLOT( slotGetTags() ) );
+
+ connect( ( QWidget * ) btnRefreshBookmarks, SIGNAL( clicked() ),
+ this, SLOT( slotGetBookmarks() ) );
+
+ connect( ( QWidget * ) btnNew, SIGNAL( clicked() ),
+ this, SLOT( slotNewBookmark() ) );
+
+ connect( lvBookmarks, SIGNAL( executed( QListViewItem * ) ),
+ this, SLOT( slotBookmarkExecuted( QListViewItem * ) ) );
+ connect( lvBookmarks, SIGNAL( mouseButtonClicked ( int, QListViewItem *, const QPoint &, int ) ),
+ this, SLOT( slotBookmarkClicked( int, QListViewItem *, const QPoint &, int ) ) );
+
+ connect( lvTags, SIGNAL( contextMenuRequested( QListViewItem *, const QPoint &, int ) ),
+ this, SLOT( slotTagsContextMenu( QListViewItem *, const QPoint &, int ) ) );
+
+ connect( lvBookmarks, SIGNAL( contextMenuRequested( QListViewItem *, const QPoint &, int ) ),
+ this, SLOT( slotBookmarksContextMenu( QListViewItem *, const QPoint &, int ) ) );
+
+ m_updateTimer = new QTimer( this );
+ connect( m_updateTimer, SIGNAL( timeout() ), SLOT( slotGetBookmarks() ) );
+
+ slotGetTags();
+}
+
+MainWidget::~MainWidget()
+{
+ saveTags();
+}
+
+void MainWidget::setCurrentURL( const KURL & url )
+{
+ m_currentURL = url;
+}
+
+void MainWidget::slotGetTags()
+{
+ kdDebug() << k_funcinfo << endl;
+
+ KIO::StoredTransferJob * job = KIO::storedGet( "http://del.icio.us/api/tags/get" );
+ connect( job, SIGNAL( result( KIO::Job * ) ),
+ this, SLOT( slotFillTags( KIO::Job * ) ) );
+}
+
+void MainWidget::slotFillTags( KIO::Job * job )
+{
+ kdDebug() << k_funcinfo << endl;
+
+ if ( job->error() )
+ {
+ job->showErrorDialog( this );
+ return;
+ }
+
+ lvTags->clear();
+ m_tags.clear();
+
+ // fill lvTags with job->data()
+ QDomDocument doc;
+ doc.setContent( static_cast<KIO::StoredTransferJob *>( job )->data() );
+ QDomNodeList tags = doc.elementsByTagName( "tag" );
+ for ( uint i = 0; i < tags.length(); ++i )
+ {
+ QDomElement tag = tags.item( i ).toElement();
+ if ( !tag.isNull() )
+ {
+ TagListItem *item = new TagListItem( lvTags, tag.attribute( "tag" ), tag.attribute( "count" ).toInt() );
+ m_tags.append( tag.attribute( "tag" ) );
+ connect( item, SIGNAL( signalItemChecked( TagListItem * ) ), SLOT( itemToggled() ) );
+ }
+ }
+}
+
+void MainWidget::slotGetBookmarks()
+{
+ KURL url( "http://del.icio.us/api/posts/recent" );
+ url.setQuery( "tag=" + checkedTags().join( " " ) );
+
+ kdDebug() << k_funcinfo << url.url() << endl;
+
+ KIO::StoredTransferJob * job = KIO::storedGet( url );
+ connect( job, SIGNAL( result( KIO::Job * ) ),
+ this, SLOT( slotFillBookmarks( KIO::Job * ) ) );
+}
+
+void MainWidget::slotFillBookmarks( KIO::Job * job )
+{
+ kdDebug() << k_funcinfo << endl;
+
+ if ( job->error() )
+ {
+ job->showErrorDialog( this );
+ return;
+ }
+
+ lvBookmarks->clear();
+
+ // fill lvBookmarks with job->data()
+ QDomDocument doc;
+ doc.setContent( static_cast<KIO::StoredTransferJob *>( job )->data() );
+ QDomNodeList posts = doc.elementsByTagName( "post" );
+
+ for ( uint i = 0; i < posts.length(); ++i )
+ {
+ QDomElement post = posts.item( i ).toElement();
+ if ( !post.isNull() )
+ {
+ new BookmarkListItem( lvBookmarks, post.attribute( "href" ), post.attribute( "description" ),
+ KRFCDate::parseDateISO8601( post.attribute( "time" ) ) );
+ }
+ }
+}
+
+QStringList MainWidget::checkedTags() const
+{
+ QListViewItemIterator it( lvTags, QListViewItemIterator::Visible | QListViewItemIterator::Checked );
+
+ QStringList tmp;
+
+ while ( it.current() )
+ {
+ tmp.append( it.current()->text( 0 ) );
+ ++it;
+ }
+
+ return tmp;
+}
+
+void MainWidget::slotBookmarkExecuted( QListViewItem * item )
+{
+ BookmarkListItem * bookmark = static_cast<BookmarkListItem *>( item );
+ if ( bookmark )
+ {
+ kdDebug() << k_funcinfo << "Clicked bookmark URL: " << bookmark->url() << endl;
+ emit signalURLClicked( bookmark->url() );
+ }
+}
+
+void MainWidget::slotBookmarkClicked( int button, QListViewItem * item, const QPoint &, int )
+{
+ BookmarkListItem * bookmark = static_cast<BookmarkListItem *>( item );
+ if ( bookmark && button == Qt::MidButton ) // handle middle click
+ {
+ kdDebug() << k_funcinfo << "Middle clicked bookmark URL: " << bookmark->url() << endl;
+ emit signalURLMidClicked( bookmark->url() );
+ }
+}
+
+QStringList MainWidget::tags() const
+{
+ return m_tags;
+}
+
+QStringList MainWidget::bookmarks() const
+{
+ QListViewItemIterator it( lvBookmarks );
+
+ QStringList tmp;
+
+ while ( it.current() )
+ {
+ tmp.append( static_cast<BookmarkListItem *>( it.current() )->url().url() );
+ ++it;
+ }
+
+ return tmp;
+}
+
+void MainWidget::slotTagsContextMenu( QListViewItem *, const QPoint & pos, int )
+{
+ if ( lvTags->childCount() == 0 )
+ return;
+
+ QPopupMenu * tagMenu = new QPopupMenu( this );
+ Q_CHECK_PTR( tagMenu );
+
+ tagMenu->insertItem( i18n( "Check All" ), this, SLOT( slotCheckAllTags() ) );
+ tagMenu->insertItem( i18n( "Uncheck All" ), this, SLOT( slotUncheckAllTags() ) );
+ tagMenu->insertItem( i18n( "Toggle All" ), this, SLOT( slotToggleTags() ) );
+ tagMenu->insertSeparator();
+ tagMenu->insertItem( KGlobal::iconLoader()->loadIconSet( "edit", KIcon::Small ),
+ i18n( "Rename Tag..." ), this, SLOT( slotRenameTag() ) );
+
+ tagMenu->exec( pos );
+}
+
+void MainWidget::slotCheckAllTags()
+{
+ QListViewItemIterator it( lvTags );
+ while ( it.current() )
+ {
+ QCheckListItem * item = static_cast<QCheckListItem *>( *it );
+ if ( item )
+ item->setOn( true );
+ ++it;
+ }
+}
+
+void MainWidget::slotUncheckAllTags()
+{
+ QListViewItemIterator it( lvTags );
+ while ( it.current() )
+ {
+ QCheckListItem * item = static_cast<QCheckListItem *>( *it );
+ if ( item )
+ item->setOn( false );
+ ++it;
+ }
+}
+
+void MainWidget::slotToggleTags()
+{
+ QListViewItemIterator it( lvTags );
+ while ( it.current() )
+ {
+ QCheckListItem * item = static_cast<QCheckListItem *>( *it );
+ if ( item )
+ item->setOn( !item->isOn() );
+ ++it;
+ }
+}
+
+void MainWidget::itemToggled()
+{
+ m_updateTimer->start( 2000, true );
+}
+
+void MainWidget::slotNewBookmark()
+{
+ emit signalURLClicked( "http://del.icio.us/post/?url=" + m_currentURL.url() );
+}
+
+void MainWidget::saveTags()
+{
+ m_config->writeEntry( "Tags", m_tags );
+}
+
+void MainWidget::loadTags()
+{
+ m_tags = m_config->readListEntry( "Tags" );
+}
+
+void MainWidget::slotRenameTag()
+{
+ TagListItem * tag = static_cast<TagListItem *>( lvTags->currentItem() );
+ if ( tag )
+ {
+ QString oldName = tag->name();
+ QString newName = KInputDialog::getText( i18n( "Rename Tag" ), i18n( "Provide a new name for tag '%1':" ).arg( oldName ) );
+ if ( !newName.isEmpty() )
+ {
+ KURL url( "http://del.icio.us/api/tags/rename" );
+ url.addQueryItem( "old", oldName );
+ url.addQueryItem( "new", newName );
+ KIO::get( url ); // rename the tag
+
+ tag->setName( newName );
+ }
+ }
+}
+
+void MainWidget::slotBookmarksContextMenu( QListViewItem *, const QPoint & pos, int )
+{
+ if ( lvBookmarks->childCount() == 0 )
+ return;
+
+ QPopupMenu * menu = new QPopupMenu( this );
+ Q_CHECK_PTR( menu );
+
+ menu->insertItem( KGlobal::iconLoader()->loadIconSet( "editdelete", KIcon::Small ),
+ i18n( "Delete Bookmark" ), this, SLOT( slotDeleteBookmark() ) );
+
+ menu->exec( pos );
+}
+
+void MainWidget::slotDeleteBookmark()
+{
+ BookmarkListItem * bookmark = static_cast<BookmarkListItem *>( lvBookmarks->currentItem() );
+ if ( bookmark )
+ {
+ int result = KMessageBox::warningContinueCancel( this, i18n( "Do you really want to remove the bookmark\n%1?" ).arg( bookmark->desc() ),
+ i18n( "Delete Bookmark" ), KStdGuiItem::del() );
+
+ if ( result == KMessageBox::Continue )
+ {
+ KURL url( "http://del.icio.us/api/posts/delete" );
+ url.addQueryItem( "url", bookmark->url().url() );
+ kdDebug() << k_funcinfo << url << endl;
+ KIO::get( url );
+
+ delete bookmark;
+
+ slotGetTags(); // re-read the tags
+ }
+ }
+}
+
+#include "mainWidget.moc"
diff --git a/konq-plugins/sidebar/delicious/mainWidget.h b/konq-plugins/sidebar/delicious/mainWidget.h
new file mode 100644
index 0000000..5970524
--- /dev/null
+++ b/konq-plugins/sidebar/delicious/mainWidget.h
@@ -0,0 +1,175 @@
+// -*- Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4; -*-
+//////////////////////////////////////////////////////////////////////////
+// mainWidget.h //
+// //
+// Copyright (C) 2005 Lukas Tinkl <lukas@kde.org> //
+// //
+// This program is free software; you can redistribute it and/or //
+// modify it under the terms of the GNU General Public License //
+// as published by the Free Software Foundation; either version 2 //
+// of the License, or (at your option) any later version. //
+// //
+// This program 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 the //
+// GNU General Public License for more details. //
+// //
+// You should have received a copy of the GNU General Public License //
+// along with this program; if not, write to the Free Software //
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA //
+// 02111-1307, USA. //
+//////////////////////////////////////////////////////////////////////////
+
+#ifndef _MAINWIDGET_H_
+#define _MAINWIDGET_H_
+
+#include "widget.h"
+
+#include <kio/jobclasses.h>
+#include <kparts/browserextension.h>
+
+class QStringList;
+class KURL;
+class KConfig;
+
+/**
+ * Main widget of the del.icio.us bookmarks panel
+ */
+class MainWidget: public MainWidget_base
+{
+ Q_OBJECT
+public:
+ MainWidget( KConfig * config, QWidget * parent );
+ ~MainWidget();
+
+ /**
+ * @return all the tags user has
+ * (used in the DCOP iface)
+ */
+ QStringList tags() const;
+
+ /**
+ * @return all the (currently visible) bookmark (URLs)
+ * (used in the DCOP iface)
+ */
+ QStringList bookmarks() const;
+
+ /**
+ * Set the internal URL to @p url
+ */
+ void setCurrentURL( const KURL & url );
+
+public slots:
+ /**
+ * Show a dialog for adding a new bookmark
+ */
+ void slotNewBookmark();
+
+private slots:
+ /**
+ * Start the job to get the list of tags
+ */
+ void slotGetTags();
+
+ /**
+ * Fill the Tags listview with job->data()
+ * (parses the XML returned by the server)
+ */
+ void slotFillTags( KIO::Job * job );
+
+ /**
+ * Start the job to get the list of bookmarks
+ * for checked tags
+ */
+ void slotGetBookmarks();
+
+ /**
+ * Fill the Bookmarks listview with job->data()
+ * (parses the XML returned by the server)
+ */
+ void slotFillBookmarks( KIO::Job * job );
+
+ /**
+ * Handle clicking on a bookmark (KDE mode)
+ */
+ void slotBookmarkExecuted( QListViewItem * item );
+
+ /**
+ * Handle middle clicking a bookmark
+ */
+ void slotBookmarkClicked( int button, QListViewItem * item, const QPoint & pnt, int col );
+
+ /**
+ * Popup a tag context menu over @p item and position @pos
+ */
+ void slotTagsContextMenu( QListViewItem * item, const QPoint & pos, int col );
+
+ /**
+ * Popup a bookmark context menu over @p item and position @pos
+ */
+ void slotBookmarksContextMenu( QListViewItem * item, const QPoint & pos, int col );
+
+ /**
+ * Put a checkmark before all tags
+ */
+ void slotCheckAllTags();
+
+ /**
+ * Cancel the checkmark before all tags
+ */
+ void slotUncheckAllTags();
+
+ /**
+ * Toggle the checkmark before all tags
+ */
+ void slotToggleTags();
+
+ /**
+ * Starts a singleshot timer once an item (tag) has been toggled. Timer will update bookmarks.
+ */
+ void itemToggled();
+
+ /**
+ * Display a dialog box that allows renaming of tags
+ */
+ void slotRenameTag();
+
+ /**
+ * Delete the selected bookmark
+ */
+ void slotDeleteBookmark();
+
+signals:
+ /**
+ * Emit a signal to the plugin interface that a @p url has been left-clicked
+ */
+ void signalURLClicked( const KURL & url, const KParts::URLArgs & args = KParts::URLArgs() );
+
+ /**
+ * Emit a signal to the plugin interface that a @p url has been mid-clicked
+ */
+ void signalURLMidClicked( const KURL & url, const KParts::URLArgs & args = KParts::URLArgs() );
+
+private:
+ /**
+ * @return list of checked tags
+ */
+ QStringList checkedTags() const;
+
+ /**
+ * Save the tag list to the config file
+ */
+ void saveTags();
+
+ /**
+ * Load the tag list from the config file
+ */
+ void loadTags();
+
+ QTimer *m_updateTimer;
+ KURL m_currentURL;
+ QStringList m_tags;
+ KConfig * m_config;
+};
+
+#endif
diff --git a/konq-plugins/sidebar/delicious/pics/Makefile.am b/konq-plugins/sidebar/delicious/pics/Makefile.am
new file mode 100644
index 0000000..e5515a8
--- /dev/null
+++ b/konq-plugins/sidebar/delicious/pics/Makefile.am
@@ -0,0 +1 @@
+KDE_ICON = AUTO
diff --git a/konq-plugins/sidebar/delicious/pics/cr16-app-konqsidebar_delicious.png b/konq-plugins/sidebar/delicious/pics/cr16-app-konqsidebar_delicious.png
new file mode 100644
index 0000000..f28df92
--- /dev/null
+++ b/konq-plugins/sidebar/delicious/pics/cr16-app-konqsidebar_delicious.png
Binary files differ
diff --git a/konq-plugins/sidebar/delicious/plugin.cpp b/konq-plugins/sidebar/delicious/plugin.cpp
new file mode 100644
index 0000000..cd400aa
--- /dev/null
+++ b/konq-plugins/sidebar/delicious/plugin.cpp
@@ -0,0 +1,108 @@
+//////////////////////////////////////////////////////////////////////////
+// plugin.cpp //
+// //
+// Copyright (C) 2005 Lukas Tinkl <lukas@kde.org> //
+// //
+// This program is free software; you can redistribute it and/or //
+// modify it under the terms of the GNU General Public License //
+// as published by the Free Software Foundation; either version 2 //
+// of the License, or (at your option) any later version. //
+// //
+// This program 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 the //
+// GNU General Public License for more details. //
+// //
+// You should have received a copy of the GNU General Public License //
+// along with this program; if not, write to the Free Software //
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA //
+// 02111-1307, USA. //
+//////////////////////////////////////////////////////////////////////////
+
+#include "plugin.h"
+
+#include <qstring.h>
+
+#include <kapplication.h>
+#include <klocale.h>
+#include <kglobal.h>
+
+KonqSidebarDelicious::KonqSidebarDelicious( KInstance *instance, QObject *parent,
+ QWidget *widgetParent, QString &desktopName_,
+ const char* name )
+ : KonqSidebarPlugin( instance, parent, widgetParent, desktopName_, name ),
+ DCOPObject( "sidebar-delicious" )
+
+{
+ m_widget = new MainWidget( instance->config(), widgetParent );
+ connect( m_widget, SIGNAL( signalURLClicked( const KURL &, const KParts::URLArgs & ) ),
+ this, SIGNAL( openURLRequest( const KURL &, const KParts::URLArgs & ) ) );
+ connect( m_widget, SIGNAL( signalURLMidClicked( const KURL &, const KParts::URLArgs & ) ),
+ this, SIGNAL( createNewWindow( const KURL &, const KParts::URLArgs & ) ) );
+}
+
+KonqSidebarDelicious::~KonqSidebarDelicious()
+{
+
+}
+
+void * KonqSidebarDelicious::provides( const QString & )
+{
+ return 0;
+}
+
+QWidget * KonqSidebarDelicious::getWidget()
+{
+ return m_widget;
+}
+
+void KonqSidebarDelicious::handleURL( const KURL & url )
+{
+ m_widget->setCurrentURL( url );
+}
+
+bool KonqSidebarDelicious::universalMode()
+{
+ return true;
+}
+
+extern "C"
+{
+ KDE_EXPORT void* create_konqsidebar_delicious( KInstance *instance, QObject *par, QWidget *widp,
+ QString &desktopname, const char *name )
+ {
+ KGlobal::locale()->insertCatalogue( "konqsidebar_delicious" );
+ return new KonqSidebarDelicious( instance, par, widp, desktopname, name );
+ }
+}
+
+extern "C"
+{
+ KDE_EXPORT bool add_konqsidebar_delicious( QString* fn, QString* /*param*/, QMap<QString,QString> *map )
+ {
+ map->insert("Type", "Link");
+ map->insert("Icon", "konqsidebar_delicious");
+ map->insert("Name", i18n( "del.icio.us Bookmarks" ) );
+ map->insert("Open", "false");
+ map->insert("X-KDE-KonqSidebarModule", "konqsidebar_delicious");
+ fn->setLatin1("delicious%1.desktop");
+ return true;
+ }
+}
+
+QStringList KonqSidebarDelicious::tags() const
+{
+ return m_widget->tags();
+}
+
+QStringList KonqSidebarDelicious::bookmarks() const
+{
+ return m_widget->bookmarks();
+}
+
+void KonqSidebarDelicious::newBookmark()
+{
+ m_widget->slotNewBookmark();
+}
+
+#include "plugin.moc"
diff --git a/konq-plugins/sidebar/delicious/plugin.h b/konq-plugins/sidebar/delicious/plugin.h
new file mode 100644
index 0000000..96f7082
--- /dev/null
+++ b/konq-plugins/sidebar/delicious/plugin.h
@@ -0,0 +1,85 @@
+//////////////////////////////////////////////////////////////////////////
+// plugin.h //
+// //
+// Copyright (C) 2005 Lukas Tinkl <lukas@kde.org> //
+// //
+// This program is free software; you can redistribute it and/or //
+// modify it under the terms of the GNU General Public License //
+// as published by the Free Software Foundation; either version 2 //
+// of the License, or (at your option) any later version. //
+// //
+// This program 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 the //
+// GNU General Public License for more details. //
+// //
+// You should have received a copy of the GNU General Public License //
+// along with this program; if not, write to the Free Software //
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA //
+// 02111-1307, USA. //
+//////////////////////////////////////////////////////////////////////////
+
+#ifndef _PLUGIN_H_
+#define _PLUGIN_H_
+
+#include "mainWidget.h"
+
+#include <konqsidebarplugin.h>
+#include <kparts/part.h>
+#include <kparts/factory.h>
+#include <kparts/browserextension.h>
+#include <kinstance.h>
+#include <dcopobject.h>
+
+class QString;
+
+/**
+ * @brief del.icio.us bookmarks plugin
+ * @author Lukas Tinkl <lukas@kde.org>
+ */
+class KonqSidebarDelicious: public KonqSidebarPlugin, DCOPObject
+{
+ Q_OBJECT
+ K_DCOP
+public:
+ KonqSidebarDelicious( KInstance * instance, QObject * parent, QWidget * widgetParent,
+ QString & desktopName_, const char * name = 0 );
+ ~KonqSidebarDelicious();
+ virtual void * provides( const QString & );
+ /**
+ * @return the main widget
+ */
+ virtual QWidget * getWidget();
+
+k_dcop:
+ QStringList tags() const;
+ QStringList bookmarks() const;
+ void newBookmark();
+
+protected:
+ /**
+ * Called when the shell's @p url changes
+ */
+ virtual void handleURL( const KURL & url );
+
+ /**
+ * @return true if we are in universal (e.g. desktop) mode
+ */
+ bool universalMode();
+
+signals:
+ /**
+ * Emitted in order to open @p url in the shell app
+ */
+ void openURLRequest( const KURL & url, const KParts::URLArgs & args = KParts::URLArgs() );
+
+ /**
+ * Emitted in order to open @p url in the shell app's new window
+ */
+ void createNewWindow( const KURL & url, const KParts::URLArgs & args = KParts::URLArgs() );
+
+private:
+ MainWidget * m_widget;
+};
+
+#endif
diff --git a/konq-plugins/sidebar/delicious/tagListItem.cpp b/konq-plugins/sidebar/delicious/tagListItem.cpp
new file mode 100644
index 0000000..866cc09
--- /dev/null
+++ b/konq-plugins/sidebar/delicious/tagListItem.cpp
@@ -0,0 +1,78 @@
+//////////////////////////////////////////////////////////////////////////
+// tagListItem.cpp //
+// //
+// Copyright (C) 2005 Lukas Tinkl <lukas@kde.org> //
+// //
+// This program is free software; you can redistribute it and/or //
+// modify it under the terms of the GNU General Public License //
+// as published by the Free Software Foundation; either version 2 //
+// of the License, or (at your option) any later version. //
+// //
+// This program 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 the //
+// GNU General Public License for more details. //
+// //
+// You should have received a copy of the GNU General Public License //
+// along with this program; if not, write to the Free Software //
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA //
+// 02111-1307, USA. //
+//////////////////////////////////////////////////////////////////////////
+
+#include "tagListItem.h"
+
+TagListItem::TagListItem( QListView * parent, const QString & tagName, int count )
+ : QCheckListItem( parent, tagName, QCheckListItem::CheckBox ), m_name( tagName ), m_count( count )
+{
+}
+
+// virtual
+void TagListItem::stateChange( bool state )
+{
+ QCheckListItem::stateChange( state );
+ emit signalItemChecked( this );
+}
+
+// virtual
+int TagListItem::compare( QListViewItem * i, int col, bool ascending ) const
+{
+ if ( col == 1 )
+ {
+ int them = static_cast<TagListItem *>( i )->count();
+ if ( m_count < them )
+ return -1;
+ else if ( m_count > them )
+ return 1;
+ else
+ return 0;
+ }
+ return QCheckListItem::compare( i, col, ascending );
+}
+
+int TagListItem::count() const
+{
+ return m_count;
+}
+
+// virtual
+QString TagListItem::text( int column ) const
+{
+ if ( column == 0 )
+ return m_name;
+ else if ( column == 1 )
+ return QString::number( m_count );
+ else
+ return QString::null;
+}
+
+QString TagListItem::name() const
+{
+ return m_name;
+}
+
+void TagListItem::setName( const QString & name )
+{
+ m_name = name;
+}
+
+#include "tagListItem.moc"
diff --git a/konq-plugins/sidebar/delicious/tagListItem.h b/konq-plugins/sidebar/delicious/tagListItem.h
new file mode 100644
index 0000000..0bc293e
--- /dev/null
+++ b/konq-plugins/sidebar/delicious/tagListItem.h
@@ -0,0 +1,50 @@
+//////////////////////////////////////////////////////////////////////////
+// tagListItem.h //
+// //
+// Copyright (C) 2005 Lukas Tinkl <lukas@kde.org> //
+// //
+// This program is free software; you can redistribute it and/or //
+// modify it under the terms of the GNU General Public License //
+// as published by the Free Software Foundation; either version 2 //
+// of the License, or (at your option) any later version. //
+// //
+// This program 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 the //
+// GNU General Public License for more details. //
+// //
+// You should have received a copy of the GNU General Public License //
+// along with this program; if not, write to the Free Software //
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA //
+// 02111-1307, USA. //
+//////////////////////////////////////////////////////////////////////////
+
+#ifndef _TAGLISTITEM_H_
+#define _TAGLISTITEM_H_
+
+#include <qobject.h>
+#include <qlistview.h>
+
+class TagListItem: public QObject, public QCheckListItem
+{
+ Q_OBJECT
+public:
+ TagListItem( QListView * parent, const QString & tagName, int count = 1 );
+ int count() const;
+ QString name() const;
+ void setName( const QString & name );
+
+protected:
+ virtual void stateChange( bool state );
+ virtual int compare( QListViewItem * i, int col, bool ascending ) const;
+ virtual QString text( int column ) const;
+
+signals:
+ void signalItemChecked( TagListItem * );
+
+private:
+ QString m_name;
+ int m_count;
+};
+
+#endif
diff --git a/konq-plugins/sidebar/delicious/widget.ui b/konq-plugins/sidebar/delicious/widget.ui
new file mode 100644
index 0000000..daccbe9
--- /dev/null
+++ b/konq-plugins/sidebar/delicious/widget.ui
@@ -0,0 +1,165 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>MainWidget_base</class>
+<author>Lukáš Tinkl &lt;lukas@kde.org&gt;</author>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>Form1</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>411</width>
+ <height>595</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QSplitter">
+ <property name="name">
+ <cstring>splitter3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox2</cstring>
+ </property>
+ <property name="title">
+ <string>Tags</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>btnRefreshTags</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Refresh Tags</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Refresh the list of tags</string>
+ </property>
+ </widget>
+ <widget class="QListView">
+ <column>
+ <property name="text">
+ <string>Tag</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Count</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>lvTags</cstring>
+ </property>
+ <property name="showSortIndicator">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Bookmarks</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton" row="1" column="0">
+ <property name="name">
+ <cstring>btnRefreshBookmarks</cstring>
+ </property>
+ <property name="text">
+ <string>Refresh &amp;Bookmarks</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Refresh the list of bookmarks according to the selected tags</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>btnNew</cstring>
+ </property>
+ <property name="text">
+ <string>Post &amp;New...</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Post a new bookmark</string>
+ </property>
+ </widget>
+ <widget class="KListView" row="0" column="0" rowspan="1" colspan="2">
+ <column>
+ <property name="text">
+ <string>Description</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Date</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>lvBookmarks</cstring>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="showSortIndicator">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ <property name="itemsMovable">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </widget>
+ </vbox>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klistview.h</includehint>
+</includehints>
+</UI>
diff --git a/konq-plugins/sidebar/mediaplayer/AUTHORS b/konq-plugins/sidebar/mediaplayer/AUTHORS
new file mode 100644
index 0000000..12b5dc2
--- /dev/null
+++ b/konq-plugins/sidebar/mediaplayer/AUTHORS
@@ -0,0 +1,13 @@
+konqsidebarmediaplayer:
+Joseph Wenninger <jowenn@kde.org>
+
+
+
+For the parts I took from kaboodle/noatun/...:
+
+Neil Stevens <multivac@fcmail.com>
+Charles Samuels <charles@kde.org>
+Stefan Schimanski <1Stein@gmx.de>
+Malte Starostik <malte@kde.org>
+Stefan Westerfeld <stefan@space.twc.de>
+Nikolas Zimmermann <wildfox@kde.org>
diff --git a/konq-plugins/sidebar/mediaplayer/COPYING b/konq-plugins/sidebar/mediaplayer/COPYING
new file mode 100644
index 0000000..5714d40
--- /dev/null
+++ b/konq-plugins/sidebar/mediaplayer/COPYING
@@ -0,0 +1,12 @@
+There are some licenses involved in this small plugin:
+1) konqsidebarplugin.h: LGPL
+2) player.*, engine.* are taken from noatun/kaboodle/arts and have there own licenes.
+ Look in these projects for their licenses (At the time I write this I think they are licencesed under the BSD
+ license)
+
+3) All other files are copyrighted under the GPL
+
+
+Joseph Wenninger <jowenn@kde.org>
+
+June 23rd 2001
diff --git a/konq-plugins/sidebar/mediaplayer/Makefile.am b/konq-plugins/sidebar/mediaplayer/Makefile.am
new file mode 100644
index 0000000..12ba913
--- /dev/null
+++ b/konq-plugins/sidebar/mediaplayer/Makefile.am
@@ -0,0 +1,33 @@
+# this has all of the subdirectories that make will recurse into. if
+# there are none, comment this out
+SUBDIRS = . pics
+
+# set the include path for X, qt and KDE
+INCLUDES = -I$(kde_includes)/kio -I$(kde_includes)/arts $(all_includes)
+
+# these are the headers for your project
+noinst_HEADERS =
+# let automoc handle all of the meta source files (moc)
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = konqsidebar_mediaplayer.la
+
+# the Part's source, library search path, and link libraries
+konqsidebar_mediaplayer_la_SOURCES = mediawidget_skel.ui engine.cpp player.cpp mediawidget.cpp mediaplayer.cpp controls.cpp
+konqsidebar_mediaplayer_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+konqsidebar_mediaplayer_la_LIBADD = $(LIB_KPARTS) $(LIB_KFILE) -lkonqsidebarplugin -lqtmcop -lkmedia2_idl -lsoundserver_idl -lartskde
+
+globaladddir = $(kde_datadir)/konqsidebartng/add
+globaladd_DATA = mplayer_add.desktop
+
+appsdir = $(kde_appsdir)/.hidden
+apps_DATA = mediaplayerplugin.desktop
+
+mediawidget_skel.ui: mediawidget_skel_designer.ui
+ perl -p -e "s/QSlider/L33tSlider/" mediawidget_skel_designer.ui >mediawidget_skel.ui
+
+extendedclean:
+ rm mediawidget_skel.*
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/konqsidebar_mediaplayer.pot
diff --git a/konq-plugins/sidebar/mediaplayer/controls.cpp b/konq-plugins/sidebar/mediaplayer/controls.cpp
new file mode 100644
index 0000000..76671d5
--- /dev/null
+++ b/konq-plugins/sidebar/mediaplayer/controls.cpp
@@ -0,0 +1,138 @@
+/*****************************************************************
+
+Copyright (c) 2000-2001 the noatun authors. See file AUTHORS.
+
+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 BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIAB\ILITY, 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.
+
+******************************************************************/
+
+#include "controls.h"
+
+L33tSlider::L33tSlider(QWidget * parent, const char * name) :
+ QSlider(parent,name), pressed(false)
+{}
+L33tSlider::L33tSlider(Orientation o, QWidget * parent, const char * name) :
+ QSlider(o,parent,name), pressed(false)
+{}
+L33tSlider::L33tSlider(int minValue, int maxValue, int pageStep, int value,
+ Orientation o, QWidget * parent, const char * name) :
+ QSlider(minValue, maxValue, pageStep, value, o, parent,name), pressed(false)
+{}
+
+bool L33tSlider::currentlyPressed() const
+{
+ return pressed;
+}
+
+void L33tSlider::setValue(int i)
+{
+ if (!pressed)
+ QSlider::setValue(i);
+}
+
+void L33tSlider::mousePressEvent(QMouseEvent*e)
+{
+ if (e->button()!=RightButton)
+ {
+ pressed=true;
+ QSlider::mousePressEvent(e);
+ }
+}
+
+void L33tSlider::mouseReleaseEvent(QMouseEvent*e)
+{
+ pressed=false;
+ QSlider::mouseReleaseEvent(e);
+ emit userChanged(value());
+}
+
+void L33tSlider::wheelEvent(QWheelEvent *e)
+{
+ QSlider::wheelEvent(e);
+ int newValue = value();
+
+ if(newValue < minValue())
+ newValue = minValue();
+ else if(newValue > maxValue())
+ newValue = maxValue();
+
+ setValue(newValue);
+ emit userChanged(newValue);
+}
+
+SliderAction::SliderAction(const QString& text, int accel, const QObject *receiver,
+ const char *member, QObject* parent, const char* name )
+ : KAction( text, accel, parent, name )
+{
+ m_receiver = receiver;
+ m_member = member;
+}
+
+int SliderAction::plug( QWidget *w, int index )
+{
+ if (!w->inherits("KToolBar")) return -1;
+
+ KToolBar *toolBar = (KToolBar *)w;
+ int id = KAction::getToolButtonID();
+
+ //Create it.
+ m_slider=new L33tSlider(0, 1000, 100, 0, Horizontal, toolBar);
+ m_slider->setMinimumWidth(10);
+ toolBar->insertWidget(id, 10, m_slider, index );
+
+
+ addContainer( toolBar, id );
+ connect( toolBar, SIGNAL( destroyed() ), this, SLOT( slotDestroyed() ) );
+ toolBar->setItemAutoSized( id, true );
+
+ if (w->inherits( "KToolBar" ))
+ connect(toolBar, SIGNAL(moved(KToolBar::BarPosition)), this, SLOT(toolbarMoved(KToolBar::BarPosition)));
+
+ emit plugged();
+
+ return containerCount() - 1;
+}
+
+void SliderAction::toolbarMoved(KToolBar::BarPosition)
+{
+// I wish this worked :)
+return;
+/*
+ if (pos == KToolBar::Left || pos == KToolBar::Right)
+ {
+ m_slider->setOrientation(Vertical);
+ m_slider->setFixedWidth(m_slider->height());
+ }
+ else
+ {
+ m_slider->setOrientation(Horizontal);
+ m_slider->resize(m_slider->height(), m_slider->height());
+ }
+*/
+}
+
+void SliderAction::unplug( QWidget *w )
+{
+ KToolBar *toolBar = (KToolBar *)w;
+ int idx = findContainer( w );
+
+ toolBar->removeItem( itemId( idx ) );
+ removeContainer( idx );
+}
+
+#include "controls.moc"
diff --git a/konq-plugins/sidebar/mediaplayer/controls.h b/konq-plugins/sidebar/mediaplayer/controls.h
new file mode 100644
index 0000000..d05a977
--- /dev/null
+++ b/konq-plugins/sidebar/mediaplayer/controls.h
@@ -0,0 +1,93 @@
+/*****************************************************************
+
+Copyright (c) 2000-2001 the noatun authors. See file AUTHORS.
+
+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 BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIAB\ILITY, 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.
+
+******************************************************************/
+
+#ifndef __CONTROLS_H
+#define __CONTROLS_H
+
+#include <qguardedptr.h>
+
+#include <kaction.h>
+#include <ktoolbar.h>
+#include <qslider.h>
+#include <qstringlist.h>
+
+class QComboBox;
+class QLabel;
+
+/**
+ * A slider that can be moved around while being
+ * changed internally
+ **/
+class L33tSlider : public QSlider
+{
+Q_OBJECT
+public:
+ L33tSlider(QWidget * parent, const char * name=0);
+ L33tSlider(Orientation, QWidget * parent, const char * name=0);
+ L33tSlider(int minValue, int maxValue, int pageStep, int value,
+ Orientation, QWidget * parent, const char * name=0);
+
+ bool currentlyPressed() const;
+signals:
+ /**
+ * emmited only when the user changes the value by hand
+ **/
+ void userChanged(int value);
+
+public slots:
+ virtual void setValue(int);
+protected:
+ virtual void mousePressEvent(QMouseEvent*);
+ virtual void mouseReleaseEvent(QMouseEvent*);
+ virtual void wheelEvent(QWheelEvent *e);
+
+private:
+ bool pressed;
+};
+
+/**
+ * A slider for your toolbar
+ **/
+class SliderAction : public KAction
+{
+Q_OBJECT
+public:
+ SliderAction(const QString& text, int accel, const QObject *receiver,
+ const char *member, QObject* parent, const char* name );
+ virtual int plug( QWidget *w, int index = -1 );
+ virtual void unplug( QWidget *w );
+ QSlider* slider() const { return m_slider; }
+
+signals:
+ void plugged();
+
+public slots:
+ void toolbarMoved(KToolBar::BarPosition pos);
+private:
+ QGuardedPtr<QSlider> m_slider;
+ QStringList m_items;
+ const QObject *m_receiver;
+ const char *m_member;
+};
+
+#endif
diff --git a/konq-plugins/sidebar/mediaplayer/engine.cpp b/konq-plugins/sidebar/mediaplayer/engine.cpp
new file mode 100644
index 0000000..cdb9486
--- /dev/null
+++ b/konq-plugins/sidebar/mediaplayer/engine.cpp
@@ -0,0 +1,207 @@
+/*****************************************************************
+
+Copyright (c) 2000-2001 the noatun authors. See file AUTHORS.
+
+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 BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIAB\ILITY, 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.
+
+******************************************************************/
+
+extern "C"
+{
+#include <sys/wait.h>
+}
+
+#include <kconfig.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kmimetype.h>
+#include <kstandarddirs.h>
+#include <kurl.h>
+#include <qtimer.h>
+#include <qfile.h>
+#include <qdir.h>
+
+#include <connect.h>
+#include <dynamicrequest.h>
+#include <flowsystem.h>
+#include <kartsdispatcher.h>
+#include <kartsserver.h>
+#include <kplayobjectfactory.h>
+#include <soundserver.h>
+
+#include "engine.h"
+#include <string.h>
+
+using namespace std;
+
+class Engine::EnginePrivate
+{
+public:
+ EnginePrivate()
+ : playobj(0)
+ , dispatcher()
+ , server()
+ {
+ }
+
+ ~EnginePrivate()
+ {
+ delete playobj;
+ }
+
+ KDE::PlayObject *playobj;
+ KArtsDispatcher dispatcher;
+ KArtsServer server;
+ KURL file;
+};
+
+Engine::Engine(QObject *parent)
+ : QObject(parent)
+ , d(new EnginePrivate)
+{
+}
+
+Engine::~Engine()
+{
+ stop();
+ delete d;
+}
+
+bool Engine::load(const KURL &file)
+{
+ if(file.path().length())
+ {
+ d->file = file;
+ return reload();
+ }
+ else return false;
+}
+
+bool Engine::reload(void)
+{
+ // Only You can prevent memory leaks
+ delete d->playobj;
+ d->playobj = 0;
+
+ KDE::PlayObjectFactory factory(d->server.server());
+ d->playobj = factory.createPlayObject(d->file, true);
+
+ needReload = false;
+
+ return !d->playobj->isNull();
+}
+
+void Engine::play()
+{
+ if(d->playobj)
+ {
+ switch(d->playobj->state())
+ {
+ case Arts::posIdle:
+ if(needReload)
+ reload();
+ d->playobj->play();
+ break;
+ case Arts::posPaused:
+ d->playobj->play();
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+void Engine::pause()
+{
+ if(d->playobj && !d->playobj->isNull())
+ d->playobj->pause();
+}
+
+void Engine::stop()
+{
+ if(d->playobj && !d->playobj->isNull())
+ {
+ d->playobj->halt();
+ needReload = true;
+ }
+}
+
+// pass time in msecs
+void Engine::seek(unsigned long msec)
+{
+ Arts::poTime t;
+
+ t.ms = (long) msec % 1000;
+ t.seconds = (long) ((long)msec - t.ms) / 1000;
+
+ if(d->playobj && !d->playobj->isNull())
+ d->playobj->seek(t);
+}
+
+// return position in milliseconds
+long Engine::position()
+{
+ if(!d->playobj || d->playobj->isNull()) return 0;
+
+ Arts::poTime time(d->playobj->currentTime());
+ return (time.ms + (time.seconds*1000));
+}
+
+// return track-length in milliseconds
+unsigned long Engine::length()
+{
+ if(!d->playobj || d->playobj->isNull()) return 0;
+
+ Arts::poTime time(d->playobj->overallTime());
+ return (time.ms + (time.seconds*1000));
+}
+
+KMediaPlayer::Player::State Engine::state()
+{
+ if(!d->playobj || d->playobj->isNull()) return KMediaPlayer::Player::Empty;
+
+ switch(d->playobj->state())
+ {
+ case Arts::posIdle:
+ return KMediaPlayer::Player::Stop;
+ break;
+ case Arts::posPlaying:
+ return KMediaPlayer::Player::Play;
+ break;
+ case Arts::posPaused:
+ return KMediaPlayer::Player::Pause;
+ break;
+ default:
+ return KMediaPlayer::Player::Stop;
+ break;
+ }
+}
+
+bool Engine::seekable(void)
+{
+ if(!d->playobj || d->playobj->isNull()) return false;
+ return d->playobj->capabilities() & Arts::capSeek;
+}
+
+Arts::PlayObject Engine::playObject() const
+{
+ return d->playobj ? d->playobj->object() : Arts::PlayObject::null();
+}
+
+#include "engine.moc"
diff --git a/konq-plugins/sidebar/mediaplayer/engine.h b/konq-plugins/sidebar/mediaplayer/engine.h
new file mode 100644
index 0000000..1a5638f
--- /dev/null
+++ b/konq-plugins/sidebar/mediaplayer/engine.h
@@ -0,0 +1,97 @@
+/*****************************************************************
+
+Copyright (c) 2000-2001 the noatun authors. See file AUTHORS.
+
+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 BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIAB\ILITY, 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.
+
+******************************************************************/
+
+#ifndef _ENGINE_H
+#define _ENGINE_H
+
+#include <qobject.h>
+#include <kmedia2.h>
+#include <kmediaplayer/player.h>
+#include <kurl.h>
+
+namespace Arts
+{
+class PlayObject;
+class SoundServerV2;
+}
+
+/**
+ * Handles all playing, connecting to aRts.
+ * Does almost everything related to multimedia.
+ * Most interfacing should be done with Player
+ **/
+class Engine : public QObject
+{
+Q_OBJECT
+
+public:
+ Engine(QObject *parent=0);
+ ~Engine();
+
+ Arts::PlayObject playObject() const;
+
+public slots:
+ /**
+ * Load a file
+ **/
+ bool load(const KURL &file);
+
+ /**
+ * Pause while playing
+ **/
+ void pause();
+
+ /**
+ * Start
+ **/
+ void play();
+
+ /**
+ * stops, and unloads
+ **/
+ void stop();
+
+ /**
+ * skips to a time
+ **/
+ void seek(unsigned long msec);
+
+public:
+ KMediaPlayer::Player::State state();
+ long position(); // NOT unsigned
+ unsigned long length();
+
+ /**
+ * returns if the current track is seekable
+ */
+ bool seekable(void);
+
+private:
+ bool reload(void);
+ bool needReload;
+
+ class EnginePrivate;
+ EnginePrivate *d;
+};
+
+#endif
diff --git a/konq-plugins/sidebar/mediaplayer/mediaplayer.cpp b/konq-plugins/sidebar/mediaplayer/mediaplayer.cpp
new file mode 100644
index 0000000..ce8d1af
--- /dev/null
+++ b/konq-plugins/sidebar/mediaplayer/mediaplayer.cpp
@@ -0,0 +1,74 @@
+/***************************************************************************
+ mediaplayer.cpp - The real sidebar plugin
+ -------------------
+ begin : Sat June 23 13:35:30 CEST 2001
+ copyright : (C) 2001 Joseph Wenninger
+ email : jowenn@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "mediaplayer.h"
+#include <klocale.h>
+#include "mediaplayer.moc"
+#include <kdebug.h>
+#include <ksimpleconfig.h>
+#include <kconfig.h>
+#include <kstandarddirs.h>
+#include <kmessagebox.h>
+#include <kglobal.h>
+#include <kdemacros.h>
+#include "mediawidget.h"
+
+KonqSidebar_MediaPlayer::KonqSidebar_MediaPlayer(KInstance *instance,QObject *parent,QWidget *widgetParent, QString &desktopName_, const char* name):
+ KonqSidebarPlugin(instance,parent,widgetParent,desktopName_,name)
+ {
+ widget=new KSB_MediaWidget(widgetParent);
+ }
+
+
+KonqSidebar_MediaPlayer::~KonqSidebar_MediaPlayer(){;}
+
+void* KonqSidebar_MediaPlayer::provides(const QString &) {return 0;}
+
+void KonqSidebar_MediaPlayer::emitStatusBarText (const QString &) {;}
+
+QWidget *KonqSidebar_MediaPlayer::getWidget(){return widget;}
+
+void KonqSidebar_MediaPlayer::handleURL(const KURL &/*url*/)
+ {
+ }
+
+
+
+
+extern "C"
+{
+ KDE_EXPORT void* create_konqsidebar_mediaplayer(KInstance *instance,QObject *par,QWidget *widp,QString &desktopname,const char *name)
+ {
+ KGlobal::locale()->insertCatalogue("konqsidebar_mediaplayer");
+ return new KonqSidebar_MediaPlayer(instance,par,widp,desktopname,name);
+ }
+}
+
+extern "C"
+{
+ KDE_EXPORT bool add_konqsidebar_mediaplayer(QString* fn, QString* /*param*/, QMap<QString,QString> *map)
+ {
+ map->insert("Type","Link");
+ map->insert("Icon","konqsidebar_mediaplayer");
+ map->insert("Name",i18n("Media Player"));
+ map->insert("Open","false");
+ map->insert("X-KDE-KonqSidebarModule","konqsidebar_mediaplayer");
+ fn->setLatin1("mplayer%1.desktop");
+ return true;
+ }
+}
+
diff --git a/konq-plugins/sidebar/mediaplayer/mediaplayer.h b/konq-plugins/sidebar/mediaplayer/mediaplayer.h
new file mode 100644
index 0000000..c563e20
--- /dev/null
+++ b/konq-plugins/sidebar/mediaplayer/mediaplayer.h
@@ -0,0 +1,43 @@
+/***************************************************************************
+ mediaplayer.h - The real sidebar plugin
+ -------------------
+ begin : Sat June 23 13:35:30 CEST 2001
+ copyright : (C) 2001 Joseph Wenninger
+ email : jowenn@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _konq_sidebar_mediaplayer_h_
+#define _konq_sidebar_mediaplayer_h_
+#include <konqsidebarplugin.h>
+#include <kparts/part.h>
+#include <kparts/factory.h>
+#include <kparts/browserextension.h>
+
+class KSB_MediaWidget;
+
+class KonqSidebar_MediaPlayer: public KonqSidebarPlugin
+ {
+ Q_OBJECT
+ public:
+ KonqSidebar_MediaPlayer(KInstance *instance,QObject *parent,QWidget *widgetParent, QString &desktopName_, const char* name=0);
+ ~KonqSidebar_MediaPlayer();
+ virtual void *provides(const QString &);
+ void emitStatusBarText (const QString &);
+ virtual QWidget *getWidget();
+ protected:
+ virtual void handleURL(const KURL &url);
+ private:
+ KSB_MediaWidget *widget;
+ };
+
+
+#endif
diff --git a/konq-plugins/sidebar/mediaplayer/mediaplayerplugin.desktop b/konq-plugins/sidebar/mediaplayer/mediaplayerplugin.desktop
new file mode 100644
index 0000000..110fd36
--- /dev/null
+++ b/konq-plugins/sidebar/mediaplayer/mediaplayerplugin.desktop
@@ -0,0 +1,115 @@
+[Desktop Entry]
+Name=Mediaplayer
+Name[ar]=مشغل الوسائط المتعددة
+Name[az]=Mediya çalğıcısı
+Name[bg]=Медия плеър
+Name[br]=Soner liesvedia
+Name[ca]=Reproductor Multimèdia
+Name[cs]=Přehrávač médií
+Name[cy]=Chwaraewr Cyfryngau
+Name[da]=Medieafspiller
+Name[de]=Medienabspieler
+Name[el]=Αναπαραγωγέας μέσων
+Name[eo]=Medioludilo
+Name[es]=Reproductor de medios
+Name[et]=Meediafailide mängija
+Name[eu]=Multimedia-erreproduzigailua
+Name[fa]=پخش‌کنندۀ رسانه
+Name[fi]=Mediasoitin
+Name[fr]=Lecteur multimédia
+Name[fy]=Mediaspiler
+Name[he]=נגן מדיה
+Name[hi]=मीडिया-प्लेयर
+Name[hr]=Medijski program
+Name[hu]=Médialejátszó
+Name[is]=Margmiðlunarspilari
+Name[it]=Multimedia
+Name[ja]=メディアプレーヤ
+Name[kk]=Медиа ойнатқышы
+Name[km]=កម្មវិធី​ចាក់​មេឌៀ
+Name[mk]=Медијаплеер
+Name[nb]=Mediaspiller
+Name[nds]=Medienafspeler
+Name[ne]=मिडियाप्लेएर
+Name[nl]=Mediaspeler
+Name[nn]=Mediespelar
+Name[nso]=Sebapadi sa Media
+Name[pa]=ਮੀਡਿਆਪਲੇਅਰ
+Name[pl]=Odtwarzacz multimedialny
+Name[pt_BR]=Reprodutor de Mídia
+Name[ro]=Redare multimedia
+Name[ru]=Медиаплеер
+Name[sk]=Prehrávač médií
+Name[sv]=Mediaspelare
+Name[ta]=ஊடக இயக்கி
+Name[tg]=Медиаплеер
+Name[tr]=Çokluortam oynatıcı
+Name[uz]=Media-pleyer
+Name[uz@cyrillic]=Медиа-плейер
+Name[vi]=Bộ phát nhạc/ảnh
+Name[xh]=Umdlali wosasazo lwendaba
+Name[zh_CN]=媒体播放器
+Name[zh_TW]=媒體播放器
+Comment=Mediaplayer plugin in Konqueror's navigation panel
+Comment[ar]=ملحق يشغل الوسائط المتعددة في لوحة التنقل في كونكيورر
+Comment[az]=Konqueror-un naviqasiya panelindəki mediya çalğıcı əlavəsi
+Comment[bg]=Навигационен панел за плеър за мултимедийни файлове
+Comment[bs]=Mediaplayer dodatak za Konqueror-ov navigatorski panel
+Comment[ca]=Connector del reproductor multimèdia en el plafó de navegació de Konqueror
+Comment[cs]=Přehrávací modul pro postranní lištu Konqueroru
+Comment[cy]=Ategyn chwarae cyfryngau yn y panel morlywio Konqueror
+Comment[da]=Medieafspiller-plugin i Konquerors navigationspanel
+Comment[de]=Medienabspieler-Modul im Navigationsbereich von Konqueror
+Comment[el]=Πρόσθετο αναπαραγωγέα μέσων στο πλαίσιο πλοήγησης του Konqueror
+Comment[eo]=Medioludila kromaĵo en foliuma panelo de Konkeranto
+Comment[es]=Complemento del reproductor de medios en el panel de navegación de Konqueror
+Comment[et]=Meediafailide mängija plugin Konquerori navigeerimispaneelil
+Comment[eu]=Konquerorren arakatze paneleko multimedia-erreproduzigailuaren plugina
+Comment[fa]=وصلۀ پخش‌کنندۀ رسانه در تابلوی ناوش Konqueror
+Comment[fi]=Mediasoitinsovelma Konquerorin navigaatiopaneeliin
+Comment[fr]=Le module de lecteur multimédia pour la barre de navigation de Konqueror
+Comment[fy]=Mediaspiler-plugin foar Konqueror's navigaasjepaneel
+Comment[ga]=Breiseán Mediaplayer i bpainéal nascleanúna Konqueror
+Comment[gl]=Un plugin de reproduición multimédia no painel de navegación de Konqueror
+Comment[he]=תוסף נגן מדיה ללוח הניווט של Konqueror
+Comment[hi]=कॉन्करर के नेविगेशन फलक में मीडियाप्लेयर प्लगइन
+Comment[hr]=Medijski dodatak u navigacijskoj ploči Konquerora
+Comment[hu]=Médialejátszó bővítőmodul a Konqueror navigációs paneljéhez
+Comment[is]=Margmiðlunareining fyrir spjaldið í Konqueror
+Comment[it]=Plugin multimediale nella barra di navigazione di Konqueror
+Comment[ja]=Konqueror のナビゲーションパネル内のメディアプレーヤプラグイン
+Comment[ka]=Mediaplayer მოდული Konqueror-ის ნავიგაციის პანელზე
+Comment[kk]=Konqueror панеліндегі медиа ойнатқыш плагин модулі
+Comment[km]=កម្មវិធី​ជំនួយ​របស់​​កម្មវិធី​ចាក់​មេឌៀ​​នៅ​ក្នុង​បន្ទះ​​រុក​រក​របស់​ Konqueror
+Comment[lt]=Mediaplayer priedas Konqueror navigacijos pulte
+Comment[mk]=Приклучок за медијаплеер во панелот за навигација на Konqueror
+Comment[ms]=Plugin Mediaplayer dalam panel Pandu Arah Konqueror
+Comment[nb]=Mediaspiller-modul til Konquerors navigasjonspanel
+Comment[nds]=Medienafspeler-Moduul för dat Sietpaneel vun Konqueror
+Comment[ne]=कन्क्वेररको नेभिगेसन प्यानलको मिडियाप्लेएर प्लगइन
+Comment[nl]=Mediaspeler-plugin voor Konqueror's navigatiepaneel
+Comment[nn]=Mediespelar-programtillegg til navigasjonspanelet i Konqueror
+Comment[pl]=Wtyczka odtwarzacza multimediów w panelu nawigacyjnym Konquerora
+Comment[pt]=Um 'plugin' de reprodução multimédia no painel de navegação do Konqueror
+Comment[pt_BR]=plug-ins do reprodutor de mídia no painel de navegação do Konqueror
+Comment[ro]=Modul de redare multimedia în panoul de navigare Konqueror
+Comment[ru]=Модуль Konqueror для проигрывания мультимедиа
+Comment[sk]=Mediaplayer modul v navigačnom panely Konquerora
+Comment[sl]=Vstavek večpredstavnostnega predvajalnika v Konquerorjevi navigacijski plošči
+Comment[sr]=Прикључак за медија плејер у Konqueror-овом навигационом панелу
+Comment[sr@Latn]=Priključak za medija plejer u Konqueror-ovom navigacionom panelu
+Comment[sv]=Instickprogram för mediaspelare i Konquerors sidopanel
+Comment[ta]=கான்கொரர்ரின் நாவிகேஷன் பலகத்தில் உள்ள ஊடக இயக்கி சொருகுப்பொருள்
+Comment[tg]=Модули Konqueror барои бозӣ кардани мултимедиа
+Comment[tr]=Konqueror çokluortam oynatıcısı
+Comment[uk]=Втулок програвача в панелі навігації Konqueror
+Comment[uz]=Konqueror yon paneli uchun multimediya fayllarini oʻynash vositasi
+Comment[uz@cyrillic]=Konqueror ён панели учун мультимедия файлларини ўйнаш воситаси
+Comment[vi]=Bổ sung phát nhạc/ảnh trên bảng duyệt qua Konqueror
+Comment[xh]=Umdlali wosasazo lwendaba zeplagi yangaphakathi seqela lenjongo ethile lolawulo lwe Konqueror
+Comment[zh_CN]=Konqueror 的导航面板中的媒体播放器插件
+Comment[zh_TW]=在 Konqueror 導覽面板上的媒體播放器外掛程式
+Icon=konqsidebar_mediaplayer
+X-KDE-ParentApp=konqueror
+X-KDE-KonqSidebarUniversal=true
+DocPath=konq-plugins/mediaplayer/index.html
diff --git a/konq-plugins/sidebar/mediaplayer/mediawidget.cpp b/konq-plugins/sidebar/mediaplayer/mediawidget.cpp
new file mode 100644
index 0000000..c460c3c
--- /dev/null
+++ b/konq-plugins/sidebar/mediaplayer/mediawidget.cpp
@@ -0,0 +1,169 @@
+/***************************************************************************
+ mediawidget.cpp - The main widget
+ -------------------
+ begin : Sat June 23 13:35:30 CEST 2001
+ copyright : (C) 2001 Joseph Wenninger
+ email : jowenn@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "mediawidget.h"
+#include "mediawidget.moc"
+#include "player.h"
+
+#include <kdebug.h>
+#include <kurl.h>
+#include <kurldrag.h>
+#include <klocale.h>
+
+#include <qlabel.h>
+#include <qwidget.h>
+#include <qpushbutton.h>
+#include <qlcdnumber.h>
+#include <qpopupmenu.h>
+#include <qslider.h>
+#include <qtooltip.h>
+
+KSB_MediaWidget::KSB_MediaWidget(QWidget *parent):KSB_MediaWidget_skel(parent)
+{
+ player = new Player(this);
+ empty();
+
+ QFont labelFont = time->font();
+ labelFont.setPointSize(18);
+ labelFont.setBold(true);
+ time->setFont(labelFont);
+
+ connect(Play, SIGNAL(clicked()), player, SLOT(play()));
+ connect(Pause, SIGNAL(clicked()), player, SLOT(pause()));
+ connect(Stop, SIGNAL(clicked()), player, SLOT(stop()));
+
+ connect(player, SIGNAL(timeout()), this, SLOT(playerTimeout()));
+ connect(player, SIGNAL(finished()), this, SLOT(playerFinished()));
+ connect(player, SIGNAL(playing()), this, SLOT(playing()));
+ connect(player, SIGNAL(paused()), this, SLOT(paused()));
+ connect(player, SIGNAL(stopped()), this, SLOT(stopped()));
+ connect(player, SIGNAL(empty()), this, SLOT(empty()));
+
+ connect(Position, SIGNAL(userChanged(int)), this, SLOT(skipToWrapper(int)));
+ connect(this, SIGNAL(skipTo(unsigned long)), player, SLOT(skipTo(unsigned long)));
+ setAcceptDrops(true);
+
+ pretty="";
+ needLengthUpdate=false;
+
+ QToolTip::add(Play,i18n("Play"));
+ QToolTip::add(Pause,i18n("Pause"));
+ QToolTip::add(Stop,i18n("Stop"));
+}
+
+void KSB_MediaWidget::skipToWrapper(int second)
+{
+ emit skipTo((unsigned long)(second*1000));
+}
+
+void KSB_MediaWidget::dragEnterEvent ( QDragEnterEvent * e)
+{
+ e->accept(KURLDrag::canDecode(e));
+}
+
+void KSB_MediaWidget::dropEvent ( QDropEvent * e)
+{
+ m_kuri_list.clear();
+ if (KURLDrag::decode(e, m_kuri_list))
+ {
+ playerFinished();
+ }
+}
+
+
+void KSB_MediaWidget::playerTimeout()
+{
+ if(player->current().isEmpty())
+ return;
+
+ if(Position->currentlyPressed())
+ return;
+
+// update the scrollbar length
+ if(player->getLength())
+ {
+ int range = (int)(player->getLength() / 1000);
+ Position->setRange(0, range);
+ if (needLengthUpdate)
+ {
+ int counter = player->lengthString().length() - (player->lengthString().find("/")+1);
+ QString length=player->lengthString().right(counter);
+ needLengthUpdate=false;
+ }
+ }
+ else
+ {
+ Position->setRange(0, 1);
+ }
+ // set the position
+ Position->setValue((int)(player->getTime() / 1000));
+
+ // update the time label
+ // catch files with duration > 99mins correctly
+ time->setText(player->lengthString());
+}
+
+void KSB_MediaWidget::playerFinished()
+{
+ if( m_kuri_list.count() > 0 )
+ {
+ KURL kurl = m_kuri_list.first();
+ m_kuri_list.remove( kurl );
+ bool validFile = player->openFile( kurl );
+ if (validFile) {
+ currentFile->setText( kurl.fileName() );
+ player->play();
+ needLengthUpdate=true;
+ pretty=kurl.prettyURL();
+ } else {
+ currentFile->setText( i18n("Not a sound file") );
+ playerFinished();
+ }
+ }
+}
+
+void KSB_MediaWidget::playing()
+{
+ Play->setEnabled(false);
+ Pause->setEnabled(true);
+ Stop->setEnabled(true);
+}
+
+void KSB_MediaWidget::paused()
+{
+ Play->setEnabled(true);
+ Pause->setEnabled(false);
+ Stop->setEnabled(true);
+}
+
+void KSB_MediaWidget::stopped()
+{
+ Position->setValue(0);
+ time->setText("00:00/00:00");
+ Play->setEnabled(true);
+ Pause->setEnabled(false);
+ Stop->setEnabled(false);
+}
+
+void KSB_MediaWidget::empty()
+{
+ Position->setValue(0);
+ time->setText("00:00/00:00");
+ Play->setEnabled(false);
+ Pause->setEnabled(false);
+ Stop->setEnabled(false);
+}
diff --git a/konq-plugins/sidebar/mediaplayer/mediawidget.h b/konq-plugins/sidebar/mediaplayer/mediawidget.h
new file mode 100644
index 0000000..ff2137b
--- /dev/null
+++ b/konq-plugins/sidebar/mediaplayer/mediawidget.h
@@ -0,0 +1,57 @@
+/***************************************************************************
+ mediawidget.h - The main widget
+ -------------------
+ begin : Sat June 23 13:35:30 CEST 2001
+ copyright : (C) 2001 Joseph Wenninger
+ email : jowenn@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _MEDIAWIDGET_H_
+#define _MEDIAWIDGET_H_
+
+#include <kurl.h>
+#include "mediawidget_skel.h"
+
+class KSB_MediaWidget: public KSB_MediaWidget_skel
+{
+ Q_OBJECT
+public:
+ KSB_MediaWidget(QWidget *parent);
+ ~KSB_MediaWidget(){;}
+
+private:
+ class Player *player;
+ QString pretty;
+ bool needLengthUpdate;
+ KURL::List m_kuri_list;
+
+protected:
+ virtual void dragEnterEvent ( QDragEnterEvent * );
+ virtual void dropEvent ( QDropEvent * );
+
+private slots:
+ void playerTimeout();
+ void playerFinished();
+ void playing();
+ void paused();
+ void stopped();
+ void empty();
+
+public slots:
+ void skipToWrapper(int);
+
+signals:
+ void skipTo(unsigned long);
+
+};
+
+#endif
diff --git a/konq-plugins/sidebar/mediaplayer/mediawidget_skel.ui b/konq-plugins/sidebar/mediaplayer/mediawidget_skel.ui
new file mode 100644
index 0000000..8780a72
--- /dev/null
+++ b/konq-plugins/sidebar/mediaplayer/mediawidget_skel.ui
@@ -0,0 +1,340 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>KSB_MediaWidget_skel</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KSB_MediaWidget_skel</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>277</width>
+ <height>151</height>
+ </rect>
+ </property>
+ <property name="layoutMargin" stdset="0">
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout6</cstring>
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>1</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer5_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>Play</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image0</pixmap>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>Pause</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image1</pixmap>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>Stop</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image2</pixmap>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="L33tSlider">
+ <property name="name">
+ <cstring>Position</cstring>
+ </property>
+ <property name="maxValue">
+ <number>1000</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QFrame">
+ <property name="name">
+ <cstring>Frame3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Raised</enum>
+ </property>
+ <property name="layoutMargin" stdset="0">
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>time</cstring>
+ </property>
+ <property name="text">
+ <cstring>00:00/00:00</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer6_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QFrame">
+ <property name="name">
+ <cstring>Frame4</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Raised</enum>
+ </property>
+ <property name="layoutMargin" stdset="0">
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>currentFile</cstring>
+ </property>
+ <property name="text">
+ <cstring>Drag sound files here</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer6_3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer17</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="394">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022230543251d2e253d856405bffcbc54105b19c856360003b0141ac02ba68c4d4c199b98323631656c62cad8c494891423ce0ee2dc4c6418208bd55a7301009c7f45ef</data>
+ </image>
+ <image name="image1">
+ <data format="XPM.GZ" length="394">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022230543251d2e253d856405bffcbc54105b19c856360003b0141aa08698b2b23294189c6254f36fad351700741b45ad</data>
+ </image>
+ <image name="image2">
+ <data format="XPM.GZ" length="394">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022230543251d2e253d856405bffcbc54105b19c856360003b0141aa0869832140c5631aaf9b7d69a0b00046344fd</data>
+ </image>
+ <image name="image3">
+ <data format="XPM.GZ" length="394">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022230543251d2e253d856405bffcbc54105b19c856360003b0141aa08d98321280ab431682eb45124298871042b2032e846c2f4c8846fe4013abb5e602007fec45ef</data>
+ </image>
+</images>
+<includes>
+ <include location="global" impldecl="in declaration">controls.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/konq-plugins/sidebar/mediaplayer/mediawidget_skel_designer.ui b/konq-plugins/sidebar/mediaplayer/mediawidget_skel_designer.ui
new file mode 100644
index 0000000..a88dfde
--- /dev/null
+++ b/konq-plugins/sidebar/mediaplayer/mediawidget_skel_designer.ui
@@ -0,0 +1,340 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>KSB_MediaWidget_skel</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>KSB_MediaWidget_skel</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>277</width>
+ <height>151</height>
+ </rect>
+ </property>
+ <property name="layoutMargin" stdset="0">
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout6</cstring>
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>1</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer5_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>Play</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image0</pixmap>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>Pause</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image1</pixmap>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>Stop</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image2</pixmap>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QSlider">
+ <property name="name">
+ <cstring>Position</cstring>
+ </property>
+ <property name="maxValue">
+ <number>1000</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QFrame">
+ <property name="name">
+ <cstring>Frame3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Raised</enum>
+ </property>
+ <property name="layoutMargin" stdset="0">
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>time</cstring>
+ </property>
+ <property name="text">
+ <cstring>00:00/00:00</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer6_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QFrame">
+ <property name="name">
+ <cstring>Frame4</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Raised</enum>
+ </property>
+ <property name="layoutMargin" stdset="0">
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>currentFile</cstring>
+ </property>
+ <property name="text">
+ <cstring>Drag sound files here</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer6_3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer17</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="394">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022230543251d2e253d856405bffcbc54105b19c856360003b0141ac02ba68c4d4c199b98323631656c62cad8c494891423ce0ee2dc4c6418208bd55a7301009c7f45ef</data>
+ </image>
+ <image name="image1">
+ <data format="XPM.GZ" length="394">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022230543251d2e253d856405bffcbc54105b19c856360003b0141aa08698b2b23294189c6254f36fad351700741b45ad</data>
+ </image>
+ <image name="image2">
+ <data format="XPM.GZ" length="394">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022230543251d2e253d856405bffcbc54105b19c856360003b0141aa0869832140c5631aaf9b7d69a0b00046344fd</data>
+ </image>
+ <image name="image3">
+ <data format="XPM.GZ" length="394">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade6523234530022230543251d2e253d856405bffcbc54105b19c856360003b0141aa08d98321280ab431682eb45124298871042b2032e846c2f4c8846fe4013abb5e602007fec45ef</data>
+ </image>
+</images>
+<includes>
+ <include location="global" impldecl="in declaration">controls.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/konq-plugins/sidebar/mediaplayer/mplayer_add.desktop b/konq-plugins/sidebar/mediaplayer/mplayer_add.desktop
new file mode 100644
index 0000000..1632ec4
--- /dev/null
+++ b/konq-plugins/sidebar/mediaplayer/mplayer_add.desktop
@@ -0,0 +1,61 @@
+[Desktop Entry]
+Type=Link
+URL=
+Icon=konqsidebar_mediaplayer
+Name=Media Player
+Name[bg]=Медия плеър
+Name[br]=Soner liesvedia
+Name[ca]=Reproductor Multimèdia
+Name[cs]=Přehrávač médií
+Name[cy]=Chwaraewr Cyfryngau
+Name[da]=Medieafspiller
+Name[de]=Medienabspieler
+Name[el]=Αναπαραγωγέας μέσων
+Name[eo]=Medioludilo
+Name[es]=Reproductor de medios
+Name[et]=Meediafailide mängija
+Name[eu]=Multimedia erreproduzigailua
+Name[fa]=پخش‌کنندۀ رسانه
+Name[fi]=Mediasoitin
+Name[fr]=Lecteur multimédia
+Name[fy]=Mediaspiler
+Name[ga]=Seinnteoir Meán
+Name[gl]=Reprodutor Multimédia
+Name[he]=נגן מדיה
+Name[hi]=मीडिया-प्लेयर
+Name[hr]=Multimedijski program
+Name[hu]=Médialejátszó
+Name[is]=Margmiðlunarspilari
+Name[it]=Lettore multimediale
+Name[ja]=メディアプレーヤ
+Name[ka]=მედია დამკვრელი
+Name[kk]=Медиа ойнатқышы
+Name[km]=កម្មវិធី​ចាក់​មេឌៀ
+Name[lt]=Media grotuvas
+Name[mk]=Медијаплеер
+Name[nb]=Mediaspiller
+Name[nds]=Medienafspeler
+Name[ne]=मिडिया प्लेएर
+Name[nl]=Mediaspeler
+Name[nn]=Mediespelar
+Name[pa]=ਮੀਡਿਆ ਪਲੇਅਰ
+Name[pl]=Odtwarzacz multimedialny
+Name[pt]=Reprodutor Multimédia
+Name[pt_BR]=Reprodutor de Mídia
+Name[ru]=Медиаплеер
+Name[sk]=Prehrávač médií
+Name[sl]=Večpredstavnostni predvajalnik
+Name[sv]=Mediaspelare
+Name[ta]=ஊடகங்கள் இயக்கி
+Name[tg]=Медиаплеер
+Name[tr]=Çokluortam Oynatıcı
+Name[uk]=Медіа-програвач
+Name[uz]=Media-pleyer
+Name[uz@cyrillic]=Медиа-плейер
+Name[vi]=Bộ phát nhạc và ảnh
+Name[zh_CN]=媒体播放器
+Name[zh_TW]=媒體播放器
+
+Open=false
+X-KDE-KonqSidebarAddModule=konqsidebar_mediaplayer
+X-KDE-KonqSidebarUniversal=true
diff --git a/konq-plugins/sidebar/mediaplayer/pics/Makefile.am b/konq-plugins/sidebar/mediaplayer/pics/Makefile.am
new file mode 100644
index 0000000..e5515a8
--- /dev/null
+++ b/konq-plugins/sidebar/mediaplayer/pics/Makefile.am
@@ -0,0 +1 @@
+KDE_ICON = AUTO
diff --git a/konq-plugins/sidebar/mediaplayer/pics/cr16-app-konqsidebar_mediaplayer.png b/konq-plugins/sidebar/mediaplayer/pics/cr16-app-konqsidebar_mediaplayer.png
new file mode 100644
index 0000000..71e4dd5
--- /dev/null
+++ b/konq-plugins/sidebar/mediaplayer/pics/cr16-app-konqsidebar_mediaplayer.png
Binary files differ
diff --git a/konq-plugins/sidebar/mediaplayer/pics/cr22-app-konqsidebar_mediaplayer.png b/konq-plugins/sidebar/mediaplayer/pics/cr22-app-konqsidebar_mediaplayer.png
new file mode 100644
index 0000000..838cf9d
--- /dev/null
+++ b/konq-plugins/sidebar/mediaplayer/pics/cr22-app-konqsidebar_mediaplayer.png
Binary files differ
diff --git a/konq-plugins/sidebar/mediaplayer/pics/cr32-app-konqsidebar_mediaplayer.png b/konq-plugins/sidebar/mediaplayer/pics/cr32-app-konqsidebar_mediaplayer.png
new file mode 100644
index 0000000..87ac58b
--- /dev/null
+++ b/konq-plugins/sidebar/mediaplayer/pics/cr32-app-konqsidebar_mediaplayer.png
Binary files differ
diff --git a/konq-plugins/sidebar/mediaplayer/pics/cr48-app-konqsidebar_mediaplayer.png b/konq-plugins/sidebar/mediaplayer/pics/cr48-app-konqsidebar_mediaplayer.png
new file mode 100644
index 0000000..509c022
--- /dev/null
+++ b/konq-plugins/sidebar/mediaplayer/pics/cr48-app-konqsidebar_mediaplayer.png
Binary files differ
diff --git a/konq-plugins/sidebar/mediaplayer/pics/lo32-app-konqsidebar_mediaplayer.png b/konq-plugins/sidebar/mediaplayer/pics/lo32-app-konqsidebar_mediaplayer.png
new file mode 100644
index 0000000..db177a9
--- /dev/null
+++ b/konq-plugins/sidebar/mediaplayer/pics/lo32-app-konqsidebar_mediaplayer.png
Binary files differ
diff --git a/konq-plugins/sidebar/mediaplayer/player.cpp b/konq-plugins/sidebar/mediaplayer/player.cpp
new file mode 100644
index 0000000..360f8e8
--- /dev/null
+++ b/konq-plugins/sidebar/mediaplayer/player.cpp
@@ -0,0 +1,180 @@
+/*****************************************************************
+
+Copyright (c) 2000-2001 the noatun authors. See file AUTHORS.
+
+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 BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIAB\ILITY, 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.
+
+******************************************************************/
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kurl.h>
+#include <kmediaplayer/player.h>
+
+#include "engine.h"
+#include "player.h"
+
+Player::Player(QObject *parent)
+ : QObject(parent)
+ , position(0)
+ , unfinished(false)
+{
+ mEngine = new Engine;
+ mLooping = false;
+ connect(&ticker, SIGNAL(timeout()), SLOT(tickerTimeout()));
+ ticker.start(500);
+ stop();
+}
+
+Player::~Player()
+{
+ delete mEngine;
+}
+
+bool Player::isPlaying()const
+{
+ return mEngine->state() == KMediaPlayer::Player::Play;
+}
+
+bool Player::isPaused()const
+{
+ return mEngine->state() == KMediaPlayer::Player::Pause;
+}
+
+bool Player::isStopped()const
+{
+ return mEngine->state() == KMediaPlayer::Player::Stop || mEngine->state() == KMediaPlayer::Player::Empty;
+}
+
+void Player::handleButtons()
+{
+ switch(mEngine->state())
+ {
+ case KMediaPlayer::Player::Play:
+ emit playing();
+ break;
+ case KMediaPlayer::Player::Pause:
+ emit paused();
+ break;
+ case KMediaPlayer::Player::Stop:
+ emit stopped();
+ break;
+ case KMediaPlayer::Player::Empty:
+ emit empty();
+ break;
+ }
+}
+
+void Player::stop(void)
+{
+ unfinished = false;
+ position = 0;
+ mEngine->stop();
+}
+
+void Player::play()
+{
+ mEngine->play();
+}
+
+void Player::pause()
+{
+ if(mEngine->state() == KMediaPlayer::Player::Play)
+ {
+ mEngine->pause();
+ }
+}
+
+// skip to a certain time in the track
+void Player::skipTo(unsigned long msec)
+{
+ if(!mCurrent.isEmpty())
+ mEngine->seek(msec);
+}
+
+void Player::tickerTimeout()
+{
+ position = mEngine->position();
+ mLength = mEngine->length();
+
+ handleButtons();
+
+ if(mEngine->state() == KMediaPlayer::Player::Stop && unfinished)
+ {
+ if(mLooping)
+ {
+ play();
+ }
+ else
+ {
+ stop();
+ emit finished();
+ }
+ }
+ else if(mEngine->state() != KMediaPlayer::Player::Stop)
+ {
+ emit timeout();
+ unfinished = true;
+ }
+
+}
+
+QString Player::lengthString(long _position)
+{
+ if(_position == -1) _position = position;
+
+ int posSecs = (int)(_position / 1000);
+ int posSeconds = posSecs % 60;
+ int posMinutes = (posSecs - posSeconds) / 60;
+
+ int totSecs = (int)(mLength / 1000);
+ int totSeconds = totSecs % 60;
+ int totMinutes = (totSecs - totSeconds) / 60;
+
+ QString result;
+ result.sprintf("%.2d:%.2d/%.2d:%.2d", posMinutes, posSeconds, totMinutes, totSeconds);
+ return result;
+}
+
+bool Player::openFile(const KURL &f)
+{
+ stop();
+ mCurrent = f;
+
+ bool work = mEngine->load(mCurrent);
+
+ if(!work)
+ {
+ mCurrent = KURL();
+ return false;
+ }
+ else
+ {
+ emit opened(mCurrent);
+ tickerTimeout();
+ return true;
+ }
+}
+
+void Player::setLooping(bool b)
+{
+ mLooping = b;
+ emit loopingChange(mLooping);
+}
+
+#include "player.moc"
diff --git a/konq-plugins/sidebar/mediaplayer/player.h b/konq-plugins/sidebar/mediaplayer/player.h
new file mode 100644
index 0000000..6acf146
--- /dev/null
+++ b/konq-plugins/sidebar/mediaplayer/player.h
@@ -0,0 +1,178 @@
+/*****************************************************************
+
+Copyright (c) 2000-2001 the noatun authors. See file AUTHORS.
+
+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 BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIAB\ILITY, 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.
+
+******************************************************************/
+
+#ifndef PLAYER_H
+#define PLAYER_H
+
+#include <qobject.h>
+#include <qtimer.h>
+#include <kurl.h>
+
+class Engine;
+
+/**
+ * This class has slots for all the common media player buttons
+ **/
+class Player : public QObject
+{
+Q_OBJECT
+
+friend class KaboodlePart;
+public:
+ Player(QObject *parent = 0);
+ ~Player();
+
+ /**
+ * returns a string with the time that can
+ * be used in the UI:
+ * CC:CC/LL:LL (mm:ss)
+ **/
+ QString lengthString(long _position = -1);
+
+ bool looping(void) const { return mLooping; }
+
+ /**
+ * the position in milliseconds
+ **/
+ long getTime() const { return position; }
+
+ /**
+ * the track-length in milliseconds
+ **/
+ unsigned long getLength() const { return mLength; }
+
+ /**
+ * true if we're playing
+ **/
+ bool isPlaying()const;
+
+ /**
+ * true if paused
+ **/
+ bool isPaused()const;
+
+ /**
+ * true if stopped
+ **/
+ bool isStopped()const;
+
+ /**
+ * get the current opened URL
+ * this may be empty
+ **/
+ KURL current() const { return mCurrent; }
+
+ /**
+ * Change the file to have open
+ * @return true if file is playable, false otherwise
+ */
+ bool openFile(const KURL &f);
+
+public slots:
+ /**
+ * force the playing/paused/stopped/playlist shown signals to
+ * be sent out
+ **/
+ void handleButtons();
+
+ /**
+ * stop playing
+ **/
+ void stop(void);
+
+ /**
+ * start playing
+ **/
+ void play();
+
+ /**
+ * pause playing
+ **/
+ void pause();
+
+ /**
+ * skip to the position
+ **/
+ void skipTo(unsigned long msec);
+
+ /**
+ * Set whether to restart playing when the playing is done
+ */
+ void setLooping(bool);
+
+signals:
+ /**
+ * Tells you to update display information
+ **/
+ void timeout();
+
+ /**
+ * State is to Empty
+ */
+ void empty();
+
+ /**
+ * State is to Stopped
+ */
+ void stopped();
+
+ /**
+ * State is to Playing
+ */
+ void playing();
+
+ /**
+ * State is to Paused
+ */
+ void paused();
+
+ /**
+ * The file ended, and looping was off
+ */
+ void finished();
+
+ void loopingChange(bool);
+
+ /**
+ * The current URL changed
+ */
+ void opened(const KURL &);
+
+private slots:
+ void tickerTimeout();
+
+protected:
+ Engine *engine()const { return mEngine; }
+
+private:
+ Engine *mEngine;
+ QTimer ticker;
+ long position;
+ bool mLooping;
+ unsigned long mLength;
+ KURL mCurrent;
+ bool unfinished;
+};
+
+#endif
+
diff --git a/konq-plugins/sidebar/metabar/AUTHORS b/konq-plugins/sidebar/metabar/AUTHORS
new file mode 100644
index 0000000..01255ff
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/AUTHORS
@@ -0,0 +1 @@
+Florian Roth <florian@synatic.net>
diff --git a/konq-plugins/sidebar/metabar/COPYING b/konq-plugins/sidebar/metabar/COPYING
new file mode 100644
index 0000000..5b6e7c6
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/konq-plugins/sidebar/metabar/ChangeLog b/konq-plugins/sidebar/metabar/ChangeLog
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/ChangeLog
diff --git a/konq-plugins/sidebar/metabar/Doxyfile b/konq-plugins/sidebar/metabar/Doxyfile
new file mode 100644
index 0000000..323c79e
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/Doxyfile
@@ -0,0 +1,275 @@
+# Doxyfile 1.4.1-KDevelop
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME = metabar.kdevelop
+PROJECT_NUMBER = 0.1
+OUTPUT_DIRECTORY =
+CREATE_SUBDIRS = NO
+OUTPUT_LANGUAGE = English
+USE_WINDOWS_ENCODING = NO
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ABBREVIATE_BRIEF = "The $name class" \
+ "The $name widget" \
+ "The $name file" \
+ is \
+ provides \
+ specifies \
+ contains \
+ represents \
+ a \
+ an \
+ the
+ALWAYS_DETAILED_SEC = NO
+INLINE_INHERITED_MEMB = NO
+FULL_PATH_NAMES = YES
+STRIP_FROM_PATH = /home/florian/metabar_widget/debug/src/
+STRIP_FROM_INC_PATH =
+SHORT_NAMES = NO
+JAVADOC_AUTOBRIEF = NO
+MULTILINE_CPP_IS_BRIEF = NO
+DETAILS_AT_TOP = NO
+INHERIT_DOCS = YES
+DISTRIBUTE_GROUP_DOC = NO
+TAB_SIZE = 8
+ALIASES =
+OPTIMIZE_OUTPUT_FOR_C = NO
+OPTIMIZE_OUTPUT_JAVA = NO
+SUBGROUPING = YES
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL = NO
+EXTRACT_PRIVATE = NO
+EXTRACT_STATIC = NO
+EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_METHODS = NO
+HIDE_UNDOC_MEMBERS = NO
+HIDE_UNDOC_CLASSES = NO
+HIDE_FRIEND_COMPOUNDS = NO
+HIDE_IN_BODY_DOCS = NO
+INTERNAL_DOCS = NO
+CASE_SENSE_NAMES = YES
+HIDE_SCOPE_NAMES = NO
+SHOW_INCLUDE_FILES = YES
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = YES
+SORT_BRIEF_DOCS = NO
+SORT_BY_SCOPE_NAME = NO
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS =
+MAX_INITIALIZER_LINES = 30
+SHOW_USED_FILES = YES
+SHOW_DIRECTORIES = YES
+FILE_VERSION_FILTER =
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET = NO
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = YES
+WARN_IF_DOC_ERROR = YES
+WARN_NO_PARAMDOC = NO
+WARN_FORMAT = "$file:$line: $text"
+WARN_LOGFILE =
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT = /home/florian/metabar
+FILE_PATTERNS = *.c \
+ *.cc \
+ *.cxx \
+ *.cpp \
+ *.c++ \
+ *.java \
+ *.ii \
+ *.ixx \
+ *.ipp \
+ *.i++ \
+ *.inl \
+ *.h \
+ *.hh \
+ *.hxx \
+ *.hpp \
+ *.h++ \
+ *.idl \
+ *.odl \
+ *.cs \
+ *.php \
+ *.php3 \
+ *.inc \
+ *.m \
+ *.mm \
+ *.dox \
+ *.C \
+ *.CC \
+ *.C++ \
+ *.II \
+ *.I++ \
+ *.H \
+ *.HH \
+ *.H++ \
+ *.CS \
+ *.PHP \
+ *.PHP3 \
+ *.M \
+ *.MM \
+ *.C \
+ *.H \
+ *.tlh \
+ *.diff \
+ *.patch \
+ *.moc \
+ *.xpm \
+ *.dox
+RECURSIVE = yes
+EXCLUDE =
+EXCLUDE_SYMLINKS = NO
+EXCLUDE_PATTERNS =
+EXAMPLE_PATH =
+EXAMPLE_PATTERNS = *
+EXAMPLE_RECURSIVE = NO
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_PATTERNS =
+FILTER_SOURCE_FILES = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER = NO
+INLINE_SOURCES = NO
+STRIP_CODE_COMMENTS = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION = YES
+VERBATIM_HEADERS = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX = NO
+COLS_IN_ALPHA_INDEX = 5
+IGNORE_PREFIX =
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML = YES
+HTML_OUTPUT = html
+HTML_FILE_EXTENSION = .html
+HTML_HEADER =
+HTML_FOOTER =
+HTML_STYLESHEET =
+HTML_ALIGN_MEMBERS = YES
+GENERATE_HTMLHELP = NO
+CHM_FILE =
+HHC_LOCATION =
+GENERATE_CHI = NO
+BINARY_TOC = NO
+TOC_EXPAND = NO
+DISABLE_INDEX = NO
+ENUM_VALUES_PER_LINE = 4
+GENERATE_TREEVIEW = NO
+TREEVIEW_WIDTH = 250
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX = YES
+LATEX_OUTPUT = latex
+LATEX_CMD_NAME = latex
+MAKEINDEX_CMD_NAME = makeindex
+COMPACT_LATEX = NO
+PAPER_TYPE = a4wide
+EXTRA_PACKAGES =
+LATEX_HEADER =
+PDF_HYPERLINKS = NO
+USE_PDFLATEX = NO
+LATEX_BATCHMODE = NO
+LATEX_HIDE_INDICES = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF = NO
+RTF_OUTPUT = rtf
+COMPACT_RTF = NO
+RTF_HYPERLINKS = NO
+RTF_STYLESHEET_FILE =
+RTF_EXTENSIONS_FILE =
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN = NO
+MAN_OUTPUT = man
+MAN_EXTENSION = .3
+MAN_LINKS = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML = yes
+XML_OUTPUT = xml
+XML_SCHEMA =
+XML_DTD =
+XML_PROGRAMLISTING = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD = NO
+PERLMOD_LATEX = NO
+PERLMOD_PRETTY = YES
+PERLMOD_MAKEVAR_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = NO
+EXPAND_ONLY_PREDEF = NO
+SEARCH_INCLUDES = YES
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED =
+EXPAND_AS_DEFINED =
+SKIP_FUNCTION_MACROS = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+TAGFILES =
+GENERATE_TAGFILE = metabar.tag
+ALLEXTERNALS = NO
+EXTERNAL_GROUPS = YES
+PERL_PATH = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS = YES
+HIDE_UNDOC_RELATIONS = YES
+HAVE_DOT = NO
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = YES
+GROUP_GRAPHS = YES
+UML_LOOK = NO
+TEMPLATE_RELATIONS = NO
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+CALL_GRAPH = NO
+GRAPHICAL_HIERARCHY = YES
+DIRECTORY_GRAPH = YES
+DOT_IMAGE_FORMAT = png
+DOT_PATH =
+DOTFILE_DIRS =
+MAX_DOT_GRAPH_WIDTH = 1024
+MAX_DOT_GRAPH_HEIGHT = 1024
+MAX_DOT_GRAPH_DEPTH = 1000
+DOT_TRANSPARENT = NO
+DOT_MULTI_TARGETS = NO
+GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+SEARCHENGINE = NO
diff --git a/konq-plugins/sidebar/metabar/INSTALL b/konq-plugins/sidebar/metabar/INSTALL
new file mode 100644
index 0000000..02a4a07
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/INSTALL
@@ -0,0 +1,167 @@
+Basic Installation
+==================
+
+ These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+ The file `configure.in' is used to create `configure' by a program
+called `autoconf'. You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes a while. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 4. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. You can give `configure'
+initial values for variables by setting them in the environment. Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+ CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+ env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory. After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on. Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+ CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+ If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+ Use and save the results of the tests in FILE instead of
+ `./config.cache'. Set FILE to `/dev/null' to disable caching, for
+ debugging `configure'.
+
+`--help'
+ Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made.
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--version'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
+
diff --git a/konq-plugins/sidebar/metabar/Makefile.am b/konq-plugins/sidebar/metabar/Makefile.am
new file mode 100644
index 0000000..af437a6
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = src
diff --git a/konq-plugins/sidebar/metabar/NEWS b/konq-plugins/sidebar/metabar/NEWS
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/NEWS
diff --git a/konq-plugins/sidebar/metabar/README b/konq-plugins/sidebar/metabar/README
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/README
diff --git a/konq-plugins/sidebar/metabar/TODO b/konq-plugins/sidebar/metabar/TODO
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/TODO
diff --git a/konq-plugins/sidebar/metabar/config.h.in b/konq-plugins/sidebar/metabar/config.h.in
new file mode 100644
index 0000000..978129e
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/config.h.in
@@ -0,0 +1,244 @@
+/* config.h.in. Generated from configure.in by autoheader. */
+
+/* Define to 1 if you have the <Carbon/Carbon.h> header file. */
+#undef HAVE_CARBON_CARBON_H
+
+/* Define if you have the CoreAudio API */
+#undef HAVE_COREAUDIO
+
+/* Define to 1 if you have the <crt_externs.h> header file. */
+#undef HAVE_CRT_EXTERNS_H
+
+/* Defines if your system has the crypt function */
+#undef HAVE_CRYPT
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define if you have libjpeg */
+#undef HAVE_LIBJPEG
+
+/* Define if you have libpng */
+#undef HAVE_LIBPNG
+
+/* Define if you have a working libpthread (will enable threaded code) */
+#undef HAVE_LIBPTHREAD
+
+/* Define if you have libz */
+#undef HAVE_LIBZ
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define if your system needs _NSGetEnviron to set up the environment */
+#undef HAVE_NSGETENVIRON
+
+/* Define if you have res_init */
+#undef HAVE_RES_INIT
+
+/* Define if you have the res_init prototype */
+#undef HAVE_RES_INIT_PROTO
+
+/* Define if you have a STL implementation by SGI */
+#undef HAVE_SGI_STL
+
+/* Define to 1 if you have the `snprintf' function. */
+#undef HAVE_SNPRINTF
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define if you have strlcat */
+#undef HAVE_STRLCAT
+
+/* Define if you have the strlcat prototype */
+#undef HAVE_STRLCAT_PROTO
+
+/* Define if you have strlcpy */
+#undef HAVE_STRLCPY
+
+/* Define if you have the strlcpy prototype */
+#undef HAVE_STRLCPY_PROTO
+
+/* Define to 1 if you have the <sys/bitypes.h> header file. */
+#undef HAVE_SYS_BITYPES_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#undef HAVE_VSNPRINTF
+
+/* Suffix for lib directories */
+#undef KDELIBSUFF
+
+/* Define a safe value for MAXPATHLEN */
+#undef KDEMAXPATHLEN
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* The size of a `char *', as computed by sizeof. */
+#undef SIZEOF_CHAR_P
+
+/* The size of a `int', as computed by sizeof. */
+#undef SIZEOF_INT
+
+/* The size of a `long', as computed by sizeof. */
+#undef SIZEOF_LONG
+
+/* The size of a `short', as computed by sizeof. */
+#undef SIZEOF_SHORT
+
+/* The size of a `size_t', as computed by sizeof. */
+#undef SIZEOF_SIZE_T
+
+/* The size of a `unsigned long', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_LONG
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Version number of package */
+#undef VERSION
+
+/* Defined if compiling without arts */
+#undef WITHOUT_ARTS
+
+/* Define to 1 if your processor stores words with the most significant byte
+ first (like Motorola and SPARC, unlike Intel and VAX). */
+#undef WORDS_BIGENDIAN
+
+/*
+ * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system
+ * headers and I'm too lazy to write a configure test as long as only
+ * unixware is related
+ */
+#ifdef _UNIXWARE
+#define HAVE_BOOLEAN
+#endif
+
+
+
+/*
+ * AIX defines FD_SET in terms of bzero, but fails to include <strings.h>
+ * that defines bzero.
+ */
+
+#if defined(_AIX)
+#include <strings.h>
+#endif
+
+
+
+#if defined(HAVE_NSGETENVIRON) && defined(HAVE_CRT_EXTERNS_H)
+# include <sys/time.h>
+# include <crt_externs.h>
+# define environ (*_NSGetEnviron())
+#endif
+
+
+
+#if !defined(HAVE_RES_INIT_PROTO)
+#ifdef __cplusplus
+extern "C" {
+#endif
+int res_init(void);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+
+
+#if !defined(HAVE_STRLCAT_PROTO)
+#ifdef __cplusplus
+extern "C" {
+#endif
+unsigned long strlcat(char*, const char*, unsigned long);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+
+
+#if !defined(HAVE_STRLCPY_PROTO)
+#ifdef __cplusplus
+extern "C" {
+#endif
+unsigned long strlcpy(char*, const char*, unsigned long);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+
+
+/*
+ * On HP-UX, the declaration of vsnprintf() is needed every time !
+ */
+
+#if !defined(HAVE_VSNPRINTF) || defined(hpux)
+#if __STDC__
+#include <stdarg.h>
+#include <stdlib.h>
+#else
+#include <varargs.h>
+#endif
+#ifdef __cplusplus
+extern "C"
+#endif
+int vsnprintf(char *str, size_t n, char const *fmt, va_list ap);
+#ifdef __cplusplus
+extern "C"
+#endif
+int snprintf(char *str, size_t n, char const *fmt, ...);
+#endif
+
+
+
+#if defined(__SVR4) && !defined(__svr4__)
+#define __svr4__ 1
+#endif
+
+
+/* type to use in place of socklen_t if not defined */
+#undef kde_socklen_t
+
+/* type to use in place of socklen_t if not defined (deprecated, use
+ kde_socklen_t) */
+#undef ksize_t
diff --git a/konq-plugins/sidebar/metabar/configure.in.in b/konq-plugins/sidebar/metabar/configure.in.in
new file mode 100644
index 0000000..d2a3d40
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/configure.in.in
@@ -0,0 +1,5 @@
+#MIN_CONFIG(3.2.0)
+
+AM_INIT_AUTOMAKE(metabar, 0.1)
+AC_C_BIGENDIAN
+AC_CHECK_KDEMAXPATHLEN
diff --git a/konq-plugins/sidebar/metabar/metabar.kdevelop b/konq-plugins/sidebar/metabar/metabar.kdevelop
new file mode 100644
index 0000000..e87e8d9
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/metabar.kdevelop
@@ -0,0 +1,213 @@
+<?xml version = '1.0'?>
+<kdevelop>
+ <general>
+ <author>Florian Roth</author>
+ <email>florian@synatic.net</email>
+ <version>0.1</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ <keyword>Kicker</keyword>
+ </keywords>
+ <ignoreparts/>
+ <projectdirectory>.</projectdirectory>
+ <absoluteprojectpath>false</absoluteprojectpath>
+ <description/>
+ <versioncontrol>kdevsubversion</versioncontrol>
+ </general>
+ <kdevautoproject>
+ <general>
+ <activetarget>src/konqsidebar_metabar.la</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ </general>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full --prefix=`kde-config --prefix`</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ <envvars/>
+ <topsourcedir/>
+ <cppflags/>
+ <ldflags/>
+ <ccompilerbinary/>
+ <cxxcompilerbinary/>
+ <f77compilerbinary/>
+ <cflags/>
+ <f77flags/>
+ </debug>
+ </configurations>
+ <make>
+ <envvars>
+ <envvar value="1" name="WANT_AUTOCONF_2_5" />
+ <envvar value="1" name="WANT_AUTOMAKE_1_6" />
+ </envvars>
+ <abortonerror>true</abortonerror>
+ <numberofjobs>1</numberofjobs>
+ <dontact>false</dontact>
+ <makebin/>
+ <prio>0</prio>
+ </make>
+ <run>
+ <directoryradio>executable</directoryradio>
+ <customdirectory>/</customdirectory>
+ <mainprogram/>
+ <programargs/>
+ <terminal>false</terminal>
+ <autocompile>true</autocompile>
+ <envvars/>
+ </run>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidenonlocation>false</hidenonlocation>
+ </groups>
+ <tree>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <showvcsfields>false</showvcsfields>
+ </tree>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>opengl</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>stl</toc>
+ <toc>sw</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>w3c-svg</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ <programargs/>
+ <gdbpath/>
+ <configGdbScript/>
+ <runShellScript/>
+ <runGdbScript/>
+ <breakonloadinglibs>true</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ </general>
+ <display>
+ <staticmembers>false</staticmembers>
+ <demanglenames>true</demanglenames>
+ <outputradix>10</outputradix>
+ </display>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen-Dokumentation</docsystem>
+ <docurl>sidebar.tag</docurl>
+ <usermanualurl/>
+ </projectdoc>
+ </kdevdocumentation>
+ <substmap>
+ <APPNAME>sidebar</APPNAME>
+ <APPNAMELC>sidebar</APPNAMELC>
+ <APPNAMESC>Sidebar</APPNAMESC>
+ <APPNAMEUC>SIDEBAR</APPNAMEUC>
+ <AUTHOR>Florian Roth</AUTHOR>
+ <EMAIL>florian@synatic.net</EMAIL>
+ <LICENSE>GPL</LICENSE>
+ <LICENSEFILE>COPYING</LICENSEFILE>
+ <VERSION>0.1</VERSION>
+ <YEAR>2005</YEAR>
+ <dest>/home/florian/sidebar</dest>
+ </substmap>
+ <cppsupportpart>
+ <filetemplates>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ </filetemplates>
+ </cppsupportpart>
+ <kdevcppsupport>
+ <codecompletion>
+ <includeGlobalFunctions>true</includeGlobalFunctions>
+ <includeTypes>true</includeTypes>
+ <includeEnums>true</includeEnums>
+ <includeTypedefs>false</includeTypedefs>
+ <automaticCodeCompletion>true</automaticCodeCompletion>
+ <automaticArgumentsHint>true</automaticArgumentsHint>
+ <automaticHeaderCompletion>true</automaticHeaderCompletion>
+ <codeCompletionDelay>250</codeCompletionDelay>
+ <argumentsHintDelay>400</argumentsHintDelay>
+ <headerCompletionDelay>250</headerCompletionDelay>
+ </codecompletion>
+ <creategettersetter>
+ <prefixGet/>
+ <prefixSet>set</prefixSet>
+ <prefixVariable>m_,_</prefixVariable>
+ <parameterName>theValue</parameterName>
+ <inlineGet>true</inlineGet>
+ <inlineSet>true</inlineSet>
+ </creategettersetter>
+ <references/>
+ <designerintegration>
+ <qtdesigner>
+ <implementation class="ThemeEditor" path="src/editor/themeeditor.ui" implementationpath="src/editor/themeeditor.h" />
+ <implementation class="ThemeEditor" path="src/editor/themeeditorui.ui" implementationpath="src/editor/themeeditor.h" />
+ </qtdesigner>
+ </designerintegration>
+ </kdevcppsupport>
+ <ctagspart>
+ <customArguments/>
+ <customTagfilePath/>
+ </ctagspart>
+</kdevelop>
diff --git a/konq-plugins/sidebar/metabar/metabar.kdevses b/konq-plugins/sidebar/metabar/metabar.kdevses
new file mode 100644
index 0000000..f28c20e
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/metabar.kdevses
@@ -0,0 +1,47 @@
+<?xml version = '1.0' encoding = 'UTF-8'?>
+<!DOCTYPE KDevPrjSession>
+<KDevPrjSession>
+ <DocsAndViews NumberOfDocuments="8" >
+ <Doc0 NumberOfViews="1" URL="file:///home/florian/metabar/metabar/src/metabarwidget.cpp" >
+ <View0 Type="Source" />
+ </Doc0>
+ <Doc1 NumberOfViews="1" URL="file:///home/florian/metabar/metabar/src/metabarwidget.h" >
+ <View0 line="84" Type="Source" />
+ </Doc1>
+ <Doc2 NumberOfViews="1" URL="file:///home/florian/metabar/metabar/src/configdialog.cpp" >
+ <View0 line="109" Type="Source" />
+ </Doc2>
+ <Doc3 NumberOfViews="1" URL="file:///home/florian/metabar/metabar/src/configdialog.h" >
+ <View0 line="69" Type="Source" />
+ </Doc3>
+ <Doc4 NumberOfViews="1" URL="file:///home/florian/metabar/metabar/src/protocolplugin.cpp" >
+ <View0 line="69" Type="Source" />
+ </Doc4>
+ <Doc5 NumberOfViews="1" URL="file:///home/florian/metabar/metabar/src/defaultplugin.cpp" >
+ <View0 line="343" Type="Source" />
+ </Doc5>
+ <Doc6 NumberOfViews="1" URL="file:///home/florian/metabar/metabar/src/httpplugin.cpp" >
+ <View0 line="76" Type="Source" />
+ </Doc6>
+ <Doc7 NumberOfViews="1" URL="file:///home/florian/metabar/metabar/src/httpplugin.h" >
+ <View0 line="22" Type="Source" />
+ </Doc7>
+ </DocsAndViews>
+ <pluginList>
+ <kdevdebugger>
+ <breakpointList/>
+ </kdevdebugger>
+ <kdevbookmarks>
+ <bookmarks/>
+ </kdevbookmarks>
+ <kdevsubversion>
+ <subversion recurseresolve="1" recurserelocate="1" recursemerge="1" recursecommit="1" base="" recursepropget="1" recurseswitch="1" recurseupdate="1" recursepropset="1" recursediff="1" recurserevert="1" forcemove="1" recursecheckout="1" forceremove="1" recurseadd="1" recurseproplist="1" forcemerge="1" />
+ </kdevsubversion>
+ <kdevvalgrind>
+ <executable path="" params="" />
+ <valgrind path="" params="" />
+ <calltree path="calltree" params="" />
+ <kcachegrind path="/usr/kde/3.4/bin/kcachegrind" />
+ </kdevvalgrind>
+ </pluginList>
+</KDevPrjSession>
diff --git a/konq-plugins/sidebar/metabar/src/Makefile.am b/konq-plugins/sidebar/metabar/src/Makefile.am
new file mode 100644
index 0000000..cd18deb
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/Makefile.am
@@ -0,0 +1,28 @@
+INCLUDES = $(all_includes) -I$(kde_includes)/dom
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = konqsidebar_metabar.la
+
+KDE_ICON = AUTO
+
+konqsidebar_metabar_la_SOURCES = metabar.cpp metabarwidget.cpp configdialog.cpp \
+ serviceloader.cpp defaultplugin.cpp protocolplugin.cpp settingsplugin.cpp \
+ remoteplugin.cpp httpplugin.cpp metabarfunctions.cpp
+konqsidebar_metabar_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) -lkonqsidebarplugin
+konqsidebar_metabar_la_LIBADD = $(LIB_KIO) $(LIB_KHTML) $(LIB_KPARTS)
+
+metabar_entrydir = $(kde_datadir)/konqsidebartng/entries
+metabar_entry_DATA = metabar.desktop
+metabar_adddir = $(kde_datadir)/konqsidebartng/add
+metabar_add_DATA = metabar_add.desktop
+metabar_datadir = $(kde_datadir)/metabar
+metabar_data_DATA = iconsrc
+metabar_themedir = $(kde_datadir)/metabar/themes/default
+metabar_theme_DATA = default.css layout.html
+
+noinst_HEADERS = metabarwidget.h protocolplugin.h defaultplugin.h \
+ settingsplugin.h remoteplugin.h httpplugin.h metabarfunctions.h
+
+messages:
+ $(XGETTEXT) *.cpp *.h -o $(podir)/konqsidebar_metabar.pot
+
diff --git a/konq-plugins/sidebar/metabar/src/configdialog.cpp b/konq-plugins/sidebar/metabar/src/configdialog.cpp
new file mode 100644
index 0000000..a6ee429
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/configdialog.cpp
@@ -0,0 +1,611 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Florian Roth *
+ * florian@synatic.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+
+#include <qgroupbox.h>
+#include <qlayout.h>
+#include <qtabwidget.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qdir.h>
+#include <qfileinfo.h>
+#include <qmap.h>
+#include <qcstring.h>
+#include <qdatastream.h>
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kicondialog.h>
+#include <kapplication.h>
+#include <kiconloader.h>
+#include <kstandarddirs.h>
+#include <kfiledialog.h>
+#include <ktar.h>
+#include <karchive.h>
+#include <dcopref.h>
+#include <dcopclient.h>
+
+#include "configdialog.h"
+
+LinkEntry::LinkEntry(QString name, QString url, QString icon){
+ LinkEntry::name = name;
+ LinkEntry::url = url;
+ LinkEntry::icon = icon;
+}
+
+ActionListItem::ActionListItem(QListBox *listbox, const QString &action, const QString &text, const QPixmap &pixmap) : QListBoxPixmap(listbox, pixmap)
+{
+ setAction(action);
+ setText(text);
+}
+
+ConfigDialog::ConfigDialog(QWidget *parent, const char *name) : QDialog(parent, name)
+{
+ topWidgetName = parent->topLevelWidget()->name();
+ config = new KConfig("metabarrc");
+ iconConfig = new KConfig(locate("data", "metabar/iconsrc"));
+
+ setCaption(i18n("Configuration - Metabar"));
+ setIcon(SmallIcon("metabar"));
+
+ ok = new KPushButton(KStdGuiItem::ok(), this);
+ connect(ok, SIGNAL(clicked()), this, SLOT(accept()));
+
+ cancel = new KPushButton(KStdGuiItem::cancel(), this);
+ connect(cancel, SIGNAL(clicked()), this, SLOT(reject()));
+
+ QTabWidget *tab = new QTabWidget(this);
+
+ //general page
+ config->setGroup("General");
+ QWidget *general = new QWidget;
+
+ QGroupBox *entries_group = new QGroupBox(2, Qt::Horizontal, i18n("Items"), general);
+ entries_group->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
+
+ QLabel *entries_label = new QLabel(i18n("Open with:"), entries_group);
+ max_entries = new KIntSpinBox(entries_group);
+ max_entries->setMinValue(1);
+ max_entries->setMaxValue(99);
+ max_entries->setLineStep(1);
+ max_entries->setValue(config->readNumEntry("MaxEntries", 3));
+ entries_label->setBuddy(max_entries);
+
+ QLabel *actions_label = new QLabel(i18n("Actions:"), entries_group);
+ max_actions = new KIntSpinBox(entries_group);
+ max_actions->setMinValue(1);
+ max_actions->setMaxValue(99);
+ max_actions->setLineStep(1);
+ max_actions->setValue(config->readNumEntry("MaxActions", 3));
+ actions_label->setBuddy(max_actions);
+
+
+ QGroupBox *appearance_group = new QGroupBox(1, Qt::Horizontal, i18n("Appearance"), general);
+ appearance_group->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
+
+ animate = new QCheckBox(i18n("Animate resize"), appearance_group);
+ animate->setChecked(config->readBoolEntry("AnimateResize", false));
+
+ servicemenus = new QCheckBox(i18n("Show service menus"), appearance_group);
+ servicemenus->setChecked(config->readBoolEntry("ShowServicemenus", true));
+
+ showframe = new QCheckBox(i18n("Show frame"), appearance_group);
+ showframe->setChecked(config->readBoolEntry("ShowFrame", true));
+
+ QGroupBox *theme_group = new QGroupBox(2, Qt::Horizontal, i18n("Themes"), general);
+ theme_group->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
+
+ themes = new KComboBox(theme_group);
+ themes->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+
+ install_theme = new KPushButton(i18n("Install New Theme..."), theme_group);
+ install_theme->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
+ connect(install_theme, SIGNAL(clicked()), this, SLOT(installTheme()));
+
+ loadThemes();
+
+ //link page
+ QWidget *links = new QWidget;
+
+ link_create = new KPushButton(i18n("New..."), links);
+ connect(link_create, SIGNAL(clicked()), this, SLOT(createLink()));
+
+ link_delete = new KPushButton(i18n("Delete"), links);
+ connect(link_delete, SIGNAL(clicked()), this, SLOT(deleteLink()));
+
+ link_edit = new KPushButton(i18n("Edit..."), links);
+ connect(link_edit, SIGNAL(clicked()), this, SLOT(editLink()));
+
+ link_up = new KPushButton(links);
+ link_up->setIconSet(SmallIconSet("up"));
+ link_up->setEnabled(false);
+ connect(link_up, SIGNAL(clicked()), this, SLOT(moveLinkUp()));
+
+ link_down = new KPushButton(links);
+ link_down->setIconSet(SmallIconSet("down"));
+ link_down->setEnabled(false);
+ connect(link_down, SIGNAL(clicked()), this, SLOT(moveLinkDown()));
+
+ link_list = new KListView(links);
+ link_list->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ link_list->setSorting(-1);
+ link_list->setItemsMovable(TRUE);
+ link_list->addColumn(i18n("Name"));
+ link_list->addColumn(i18n("Address"));
+ connect(link_list, SIGNAL(doubleClicked(QListViewItem*)), this, SLOT(editLink(QListViewItem*)));
+ connect(link_list, SIGNAL(selectionChanged()), SLOT(updateArrows()));
+
+ QWidget *actionPage = new QWidget;
+
+ actionSelector = new KActionSelector(actionPage);
+ loadAvailableActions();
+
+ tab->addTab(general, i18n("General"));
+ tab->addTab(actionPage, i18n("Actions"));
+ tab->addTab(links, i18n("Links"));
+
+ //layout
+ QGridLayout *general_layout = new QGridLayout(general, 2, 2, 5, 5);
+ general_layout->addWidget(entries_group, 0, 0);
+ general_layout->addWidget(appearance_group, 0, 1);
+ general_layout->addMultiCellWidget(theme_group, 1, 1, 0, 1);
+ general_layout->addItem(new QSpacerItem(10, 10, QSizePolicy::Minimum, QSizePolicy::Expanding), 2, 0);
+ //general_layout->addItem(new QSpacerItem(10, 10, QSizePolicy::Minimum, QSizePolicy::Expanding), 0, 2);
+
+ QVBoxLayout *link_button_layout = new QVBoxLayout(0, 0, 5);
+ link_button_layout->addWidget(link_create);
+ link_button_layout->addWidget(link_edit);
+ link_button_layout->addWidget(link_delete);
+ link_button_layout->addItem(new QSpacerItem(10, 10, QSizePolicy::Minimum, QSizePolicy::Expanding));
+ link_button_layout->addWidget(link_up);
+ link_button_layout->addWidget(link_down);
+
+ QHBoxLayout *link_layout = new QHBoxLayout(links, 5, 5);
+ link_layout->addWidget(link_list);
+ link_layout->addLayout(link_button_layout);
+
+ QHBoxLayout *action_layout = new QHBoxLayout(actionPage, 5, 5);
+ action_layout->addWidget(actionSelector);
+
+ QHBoxLayout *bottom_layout = new QHBoxLayout(0, 5, 5);
+ bottom_layout->addItem(new QSpacerItem(10, 10, QSizePolicy::Expanding, QSizePolicy::Minimum));
+ bottom_layout->addWidget(ok);
+ bottom_layout->addWidget(cancel);
+
+ QVBoxLayout *main_layout = new QVBoxLayout(this, 5, 5);
+ main_layout->addWidget(tab);
+ main_layout->addLayout(bottom_layout);
+
+ //load config
+ config->setGroup("General");
+
+ QStringList _links = config->readListEntry("Links");
+
+ for(QStringList::Iterator it = _links.begin(); it != _links.end(); ++it){
+ config->setGroup("Link_" + (*it));
+
+ QString icon_str = config->readEntry("Icon", "folder");
+ QPixmap icon(icon_str);
+ if(icon.isNull()){
+ icon = SmallIcon(icon_str);
+ }
+
+ QListViewItem *item = new QListViewItem(link_list, link_list->lastItem(), config->readEntry("Name"), config->readEntry("URL"));
+ item->setPixmap(0, icon);
+
+ linkList.insert(item, new LinkEntry(config->readEntry("Name"), config->readEntry("URL"), icon_str));
+ }
+
+ config->setGroup("General");
+ QStringList actions = config->readListEntry("Actions");
+ for(QStringList::Iterator it = actions.begin(); it != actions.end(); ++it){
+ if((*it).startsWith("metabar/")){
+ if((*it).right((*it).length() - 8) == "share"){
+ QString text = i18n("Share");
+
+ ActionListItem *item = new ActionListItem(actionSelector->selectedListBox(), *it, text, SmallIcon("network"));
+
+ QListBoxItem *avItem = actionSelector->availableListBox()->findItem(text, Qt::ExactMatch);
+ if(avItem){
+ delete avItem;
+ }
+ }
+ }
+ else{
+ DCOPRef action(kapp->dcopClient()->appId(), QCString(topWidgetName).append("/action/").append((*it).utf8()));
+
+ QString text = action.call("plainText()");
+ QString icon = iconConfig->readEntry(*it, action.call("icon()"));
+
+ ActionListItem *item = new ActionListItem(actionSelector->selectedListBox(), QString(*it), text, SmallIcon(icon));
+
+ QListBoxItem *avItem = actionSelector->availableListBox()->findItem(text, Qt::ExactMatch);
+ if(avItem){
+ delete avItem;
+ }
+ }
+ }
+
+ resize(400, 300);
+}
+
+ConfigDialog::~ConfigDialog()
+{
+ delete config;
+ delete iconConfig;
+}
+
+void ConfigDialog::accept()
+{
+ QStringList groups = config->groupList();
+ for(QStringList::Iterator it = groups.begin(); it != groups.end(); ++it){
+ if((*it).startsWith("Link_")){
+ config->deleteGroup(*it);
+ }
+ }
+
+ QStringList links;
+ QPtrDictIterator<LinkEntry> it(linkList);
+
+ QListViewItem *item = link_list->firstChild();
+ while(item) {
+ LinkEntry *entry = linkList[item];
+ config->setGroup("Link_" + entry->name);
+ config->writeEntry("Name", entry->name);
+ config->writeEntry("URL", entry->url);
+ config->writeEntry("Icon", entry->icon);
+
+ links.append(entry->name);
+
+ item = item->nextSibling();
+ }
+
+ QStringList actions;
+ QListBox *box = actionSelector->selectedListBox();
+
+ for(int i = 0; i < box->numRows(); i++){
+ ActionListItem *item = static_cast<ActionListItem*>(box->item(i));
+ if(item){
+ actions.append(item->action());
+ }
+ }
+
+ config->setGroup("General");
+ config->writeEntry("Links", links);
+ config->writeEntry("Actions", actions);
+ config->writeEntry("Theme", themes->currentText());
+
+ config->writeEntry("MaxEntries", max_entries->value());
+ config->writeEntry("MaxActions", max_actions->value());
+
+ config->writeEntry("AnimateResize", animate->isChecked());
+ config->writeEntry("ShowServicemenus", servicemenus->isChecked());
+ config->writeEntry("ShowFrame", showframe->isChecked());
+
+ config->sync();
+
+ QDialog::accept();
+}
+
+void ConfigDialog::createLink()
+{
+ QDialog *main = new QDialog(this);
+ main->setCaption(i18n("Create Link"));
+ main->setIcon(SmallIcon("metabar"));
+
+ KPushButton *ok = new KPushButton(KStdGuiItem::ok(), main);
+ connect(ok, SIGNAL(clicked()), main, SLOT(accept()));
+
+ KPushButton *cancel = new KPushButton(KStdGuiItem::cancel(), main);
+ connect(cancel, SIGNAL(clicked()), main, SLOT(reject()));
+
+ QLineEdit *name = new QLineEdit(i18n("New link"), main);
+ QLineEdit *url = new QLineEdit("file:/", main);
+
+ KIconButton *icon = new KIconButton(main);
+ icon->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
+ icon->setIconType(KIcon::Small, KIcon::Any);
+ icon->setStrictIconSize(true);
+ icon->setIcon("folder");
+
+ QHBoxLayout *bottom_layout = new QHBoxLayout(0, 0, 5);
+ bottom_layout->addItem(new QSpacerItem(10, 10, QSizePolicy::Expanding, QSizePolicy::Minimum));
+ bottom_layout->addWidget(ok);
+ bottom_layout->addWidget(cancel);
+
+ QGridLayout *layout = new QGridLayout(0, 2, 3, 0, 5);
+ layout->addMultiCellWidget(icon, 0, 1, 0, 0);
+ layout->addWidget(new QLabel(i18n("Name:"), main), 0, 1);
+ layout->addWidget(name, 0, 2);
+ layout->addWidget(new QLabel(i18n("URL:"), main), 1, 1);
+ layout->addWidget(url, 1, 2);
+
+ QVBoxLayout *main_layout = new QVBoxLayout(main, 5, 5);
+ main_layout->addLayout(layout);
+ main_layout->addItem(new QSpacerItem(10, 10, QSizePolicy::Minimum, QSizePolicy::Expanding));
+ main_layout->addLayout(bottom_layout);
+
+ main->resize(300, main->sizeHint().height());
+
+ if(main->exec() == QDialog::Accepted){
+ QString name_str = name->text();
+ QString url_str = url->text();
+ QString icon_str = icon->icon();
+
+ if(!name_str.isEmpty() && !url_str.isEmpty()){
+ if(icon_str.isEmpty()){
+ icon_str = kapp->iconLoader()->iconPath("folder", KIcon::Small);
+ }
+
+ QPixmap icon(icon_str);
+ if(icon.isNull()){
+ icon = SmallIcon(icon_str);
+ }
+
+ QListViewItem *item = new QListViewItem(link_list, link_list->lastItem(), name_str, url_str);
+ item->setPixmap(0, icon);
+
+ linkList.insert(item, new LinkEntry(name_str, url_str, icon_str));
+ updateArrows();
+ }
+ }
+
+ delete main;
+}
+
+void ConfigDialog::deleteLink()
+{
+ QListViewItem *item = link_list->selectedItem();
+ if(item){
+ linkList.remove(item);
+ delete item;
+ updateArrows();
+ }
+}
+
+void ConfigDialog::editLink()
+{
+ QListViewItem *item = link_list->selectedItem();
+ editLink(item);
+}
+
+void ConfigDialog::editLink(QListViewItem *item)
+{
+ if(item){
+ QDialog *main = new QDialog(this);
+ main->setCaption(i18n("Edit Link"));
+ main->setIcon(SmallIcon("metabar"));
+
+ KPushButton *ok = new KPushButton(KStdGuiItem::ok(), main);
+ connect(ok, SIGNAL(clicked()), main, SLOT(accept()));
+
+ KPushButton *cancel = new KPushButton(KStdGuiItem::cancel(), main);
+ connect(cancel, SIGNAL(clicked()), main, SLOT(reject()));
+
+ QLineEdit *name = new QLineEdit(linkList[item]->name, main);
+ QLineEdit *url = new QLineEdit(linkList[item]->url, main);
+
+ KIconButton *icon = new KIconButton(main);
+ icon->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
+ icon->setIconType(KIcon::Small, KIcon::Any);
+ icon->setStrictIconSize(true);
+ icon->setIcon(linkList[item]->icon);
+
+ QHBoxLayout *bottom_layout = new QHBoxLayout(0, 0, 5);
+ bottom_layout->addItem(new QSpacerItem(10, 10, QSizePolicy::Expanding, QSizePolicy::Minimum));
+ bottom_layout->addWidget(ok);
+ bottom_layout->addWidget(cancel);
+
+ QGridLayout *layout = new QGridLayout(0, 2, 3, 0, 5);
+ layout->addMultiCellWidget(icon, 0, 1, 0, 0);
+ layout->addWidget(new QLabel(i18n("Name:"), main), 0, 1);
+ layout->addWidget(name, 0, 2);
+ layout->addWidget(new QLabel(i18n("URL:"), main), 1, 1);
+ layout->addWidget(url, 1, 2);
+
+ QVBoxLayout *main_layout = new QVBoxLayout(main, 5, 5);
+ main_layout->addLayout(layout);
+ main_layout->addItem(new QSpacerItem(10, 10, QSizePolicy::Minimum, QSizePolicy::Expanding));
+ main_layout->addLayout(bottom_layout);
+
+ main->resize(300, main->sizeHint().height());
+
+ if(main->exec() == QDialog::Accepted){
+ QString name_str = name->text();
+ QString url_str = url->text();
+ QString icon_str = icon->icon();
+
+ if(!name_str.isEmpty() && !url_str.isEmpty()){
+ if(icon_str.isEmpty()){
+ icon_str = kapp->iconLoader()->iconPath("folder", KIcon::Small);
+ }
+
+ QPixmap icon(icon_str);
+ if(icon.isNull()){
+ icon = SmallIcon(icon_str);
+ }
+
+ linkList[item]->name = name_str;
+ linkList[item]->url = url_str;
+ linkList[item]->icon = icon_str;
+
+ item->setText(0, name_str);
+ item->setText(1, url_str);
+ item->setPixmap(0, icon);
+ }
+ }
+
+ delete main;
+ }
+}
+
+void ConfigDialog::moveLinkUp()
+{
+ QListViewItem *item = link_list->selectedItem();
+ if(item){
+ if(link_list->itemIndex(item) > 0){
+
+ QListViewItem *after;
+ QListViewItem *above = item->itemAbove();
+ if(above){
+ after = above->itemAbove();
+ }
+
+ QString name = linkList[item]->name;
+ QString url = linkList[item]->url;
+ QString icon_str = linkList[item]->icon;
+
+ QPixmap icon(icon_str);
+ if(icon.isNull()){
+ icon = SmallIcon(icon_str);
+ }
+
+ delete linkList[item];
+ linkList.remove(item);
+ delete item;
+
+ QListViewItem *newItem = new QListViewItem(link_list, after, name, url);
+ newItem->setPixmap(0, icon);
+ link_list->setSelected(newItem, TRUE);
+
+ linkList.insert(newItem, new LinkEntry(name, url, icon_str));
+ updateArrows();
+ }
+ }
+}
+
+void ConfigDialog::moveLinkDown()
+{
+ QListViewItem *item = link_list->selectedItem();
+ if(item){
+ if(link_list->itemIndex(item) < linkList.count() - 1){
+
+ QListViewItem *after = item->itemBelow();
+
+ QString name = linkList[item]->name;
+ QString url = linkList[item]->url;
+ QString icon_str = linkList[item]->icon;
+
+ QPixmap icon(icon_str);
+ if(icon.isNull()){
+ icon = SmallIcon(icon_str);
+ }
+
+ delete linkList[item];
+ linkList.remove(item);
+ delete item;
+
+ QListViewItem *newItem = new QListViewItem(link_list, after, name, url);
+ newItem->setPixmap(0, icon);
+ link_list->setSelected(newItem, TRUE);
+
+ linkList.insert(newItem, new LinkEntry(name, url, icon_str));
+ updateArrows();
+ }
+ }
+}
+
+void ConfigDialog::loadAvailableActions()
+{
+ QListBox *box = actionSelector->availableListBox();
+
+ QByteArray data, replyData;
+ QCString replyType;
+
+ if(DCOPClient::mainClient()->call(kapp->dcopClient()->appId(), topWidgetName, "actionMap()", data, replyType, replyData)){
+ if(replyType == "QMap<QCString,DCOPRef>"){
+ QMap<QCString,DCOPRef> actionMap;
+
+ QDataStream reply(replyData, IO_ReadOnly);
+ reply >> actionMap;
+
+ iconConfig->setGroup("Icons");
+
+ QMap<QCString,DCOPRef>::Iterator it;
+ for(it = actionMap.begin(); it != actionMap.end(); ++it){
+ DCOPRef action = it.data();
+
+ QString text = action.call("plainText()");
+ QCString cname = action.call("name()");
+ QString icon = iconConfig->readEntry(QString(cname), action.call("icon()"));
+
+ ActionListItem *item = new ActionListItem(box, QString(cname), text, SmallIcon(icon));
+ }
+ }
+ }
+
+ //metabar's own actions
+ ActionListItem *item = new ActionListItem(box, "metabar/share", i18n("Share"), SmallIcon("network"));
+}
+
+void ConfigDialog::updateArrows()
+{
+ link_up->setEnabled( link_list->childCount()>1 && link_list->currentItem()!=link_list->firstChild() );
+ link_down->setEnabled( link_list->childCount()>1 && link_list->currentItem()!=link_list->lastItem() );
+}
+
+void ConfigDialog::loadThemes()
+{
+ themes->clear();
+
+ QString theme = config->readEntry("Theme", "default");
+ bool foundTheme = false;
+
+ QStringList dirs = kapp->dirs()->findDirs("data", "metabar/themes");
+ for(QStringList::Iterator it = dirs.begin(); it != dirs.end(); ++it){
+ QStringList theme_list = QDir(*it).entryList(QDir::Dirs);
+
+ theme_list.remove(".");
+ theme_list.remove("..");
+ themes->insertStringList(theme_list);
+
+ if(theme_list.find(theme) != theme_list.end()){
+ foundTheme = true;
+ }
+ }
+
+ if(foundTheme){
+ themes->setCurrentText(theme);
+ }
+ else{
+ themes->insertItem(theme);
+ }
+}
+
+void ConfigDialog::installTheme()
+{
+ QString file = KFileDialog::getOpenFileName();
+ if(file.isNull() && file.isEmpty()) return;
+
+ QString themedir = locateLocal("data", "metabar/themes");
+ if(themedir.isNull()) return;
+
+ KTar archive(file);
+ archive.open(IO_ReadOnly);
+ kapp->processEvents();
+
+ const KArchiveDirectory* rootDir = archive.directory();
+ rootDir->copyTo(themedir);
+
+ archive.close();
+ loadThemes();
+}
+
+#include "configdialog.moc"
diff --git a/konq-plugins/sidebar/metabar/src/configdialog.h b/konq-plugins/sidebar/metabar/src/configdialog.h
new file mode 100644
index 0000000..872bd8b
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/configdialog.h
@@ -0,0 +1,114 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Florian Roth *
+ * florian@synatic.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+#ifndef _CONFIGDIALOG_H_
+#define _CONFIGDIALOG_H_
+
+#include <qdialog.h>
+#include <kpushbutton.h>
+#include <klistview.h>
+#include <knuminput.h>
+#include <kconfig.h>
+#include <qptrdict.h>
+#include <qlistbox.h>
+#include <kactionselector.h>
+#include <qcheckbox.h>
+#include <kcombobox.h>
+
+class LinkEntry{
+ public:
+ LinkEntry(QString name, QString url, QString icon);
+
+ ~LinkEntry(){}
+
+ QString name;
+ QString url;
+ QString icon;
+};
+
+class ConfigDialog : public QDialog
+{
+ Q_OBJECT
+
+ public:
+ ConfigDialog(QWidget *parent = 0, const char *name = 0);
+ ~ConfigDialog();
+
+ protected:
+ KPushButton *ok;
+ KPushButton *cancel;
+
+ KPushButton *link_create;
+ KPushButton *link_delete;
+ KPushButton *link_edit;
+ KPushButton *link_up;
+ KPushButton *link_down;
+
+ KPushButton *install_theme;
+
+ KIntSpinBox *max_entries;
+ KIntSpinBox *max_actions;
+
+ QCheckBox *animate;
+ QCheckBox *servicemenus;
+ QCheckBox *showframe;
+
+ KListView *link_list;
+
+ KComboBox *themes;
+
+ QCString topWidgetName;
+
+ KActionSelector *actionSelector;
+
+ QPtrDict<LinkEntry> linkList;
+
+ KConfig *config;
+ KConfig *iconConfig;
+
+ protected slots:
+ void accept();
+ void createLink();
+ void deleteLink();
+ void editLink();
+ void editLink(QListViewItem *item);
+ void moveLinkUp();
+ void moveLinkDown();
+ void updateArrows();
+ void installTheme();
+
+ private:
+ void loadAvailableActions();
+ void loadThemes();
+};
+
+class ActionListItem : public QListBoxPixmap
+{
+ public:
+ ActionListItem(QListBox *listbox, const QString &action, const QString &text, const QPixmap &pixmap);
+ ~ActionListItem(){}
+
+ const QString action() { return act; }
+ void setAction(const QString act){ ActionListItem::act = act; }
+
+ private:
+ QString act;
+};
+
+#endif
diff --git a/konq-plugins/sidebar/metabar/src/default.css b/konq-plugins/sidebar/metabar/src/default.css
new file mode 100644
index 0000000..0bae4ab
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/default.css
@@ -0,0 +1,64 @@
+body {
+ background-color: window;
+ font-family: sans-serif;
+ font-size: 11px;
+ color: windowtext;
+}
+
+.frame {
+ background-color: threedface;
+ margin-bottom: 10px;
+ position: relative;
+
+}
+
+li {
+ list-style-type: none;
+ overflow: hidden;
+}
+
+li ul {
+ margin: 0px;
+ padding: 0px;
+ height: 20px;
+ white-space: nowrap;
+}
+
+a {
+ display: block;
+ padding-top: 5px;
+ padding-left: 24px;
+ background-position: 4px 2px;
+ background-repeat: no-repeat;
+
+ text-decoration: none;
+ color: buttontext;
+
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+a.title {
+ font-weight: bold;
+ border-bottom: solid 1px threeddarkshadow;
+ cursor: pointer;
+ height: 15px;
+ background-repeat: none;
+}
+
+a.infotitle {
+ font-weight: bold;
+ padding-left: 5px;
+ cursor: pointer;
+}
+
+.preview {
+ padding: 5px;
+ text-align: center;
+}
+
+ul.info {
+ padding-left: 5px;
+} \ No newline at end of file
diff --git a/konq-plugins/sidebar/metabar/src/defaultplugin.cpp b/konq-plugins/sidebar/metabar/src/defaultplugin.cpp
new file mode 100644
index 0000000..6c8dec3
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/defaultplugin.cpp
@@ -0,0 +1,458 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Florian Roth *
+ * florian@synatic.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include "defaultplugin.h"
+#include "metabarwidget.h"
+
+#include <kurl.h>
+#include <kstandarddirs.h>
+#include <kicontheme.h>
+#include <khtmlview.h>
+#include <klocale.h>
+#include <kapplication.h>
+#include <kdesktopfile.h>
+#include <ktrader.h>
+#include <krun.h>
+#include <kfilemetainfo.h>
+#include <kconfig.h>
+#include <kimageio.h>
+#include <kdebug.h>
+#include <kmdcodec.h>
+
+#include <kio/previewjob.h>
+
+#include <dcopclient.h>
+#include <dcopref.h>
+
+#include <qdir.h>
+#include <qfile.h>
+#include <qrect.h>
+#include <qpoint.h>
+#include <qbuffer.h>
+
+#include <dom_string.h>
+#include <html_image.h>
+
+#define EVENT_TYPE DOM::DOMString("click")
+#define MODIFICATION 1
+
+DefaultPlugin::DefaultPlugin(KHTMLPart* html, MetabarFunctions *functions, const char *name) : ProtocolPlugin (html, functions, name)
+{
+ services = new ServiceLoader(m_html->view(), "serviceloader");
+
+ preview_job = 0;
+}
+
+DefaultPlugin::~DefaultPlugin()
+{
+}
+
+void DefaultPlugin::killJobs(){
+ if(preview_job){
+ preview_job->kill();
+ preview_job = 0;
+ }
+}
+
+void DefaultPlugin::deactivate()
+{
+ m_functions->hide("actions");
+ m_functions->hide("open");
+ m_functions->hide("info");
+ m_functions->hide("preview");
+}
+
+void DefaultPlugin::loadActions(DOM::HTMLElement node)
+{
+ KFileItem *item = m_items.getFirst();
+ KURL url = item->url();
+
+ KConfig config("metabarrc", true, false);
+ config.setGroup("General");
+
+ KConfig iconConfig(locate("data", "metabar/iconsrc"));
+ iconConfig.setGroup("Icons");
+
+ DOM::DOMString innerHTML;
+
+ QStringList actions = config.readListEntry("Actions");
+ int maxActions = config.readNumEntry("MaxActions", 5);
+ int actionCount = 0;
+
+ for(QStringList::Iterator it = actions.begin(); it != actions.end(); ++it){
+ if((*it).startsWith("metabar/")){
+ if((*it).right((*it).length() - 8) == "share"){
+ MetabarWidget::addEntry(innerHTML, i18n("Share"), "action://" + *it, "network", QString::null, actionCount < maxActions ? QString::null : QString("hiddenaction"), actionCount >= maxActions);
+ actionCount++;
+ }
+ }
+ else{
+ DCOPRef action(kapp->dcopClient()->appId(), QCString(m_html->view()->topLevelWidget()->name()).append("/action/").append((*it).utf8()));
+
+ if(!action.isNull()){
+ if(action.call("enabled()")){
+ QString text = action.call("plainText()");
+ QString icon = iconConfig.readEntry(*it, action.call("icon()"));
+
+ MetabarWidget::addEntry(innerHTML, text, "action://" + *it, icon, QString::null, actionCount < maxActions ? QString::null : QString("hiddenaction"), actionCount >= maxActions);
+ actionCount++;
+ }
+ }
+ }
+ }
+
+ config.setGroup("General");
+ if(config.readBoolEntry("ShowServicemenus", true)){
+ services->loadServices(*(m_items.getFirst()), innerHTML, actionCount);
+ }
+
+ if(actionCount == 0) {
+ m_functions->hide("actions");
+ }
+ else{
+ if(actionCount > maxActions){
+ MetabarWidget::addEntry(innerHTML, i18n("More"), "more://hiddenaction", "1downarrow", "hiddenaction");
+ }
+
+ node.setInnerHTML(innerHTML);
+ m_functions->show("actions");
+ }
+}
+
+void DefaultPlugin::loadApplications(DOM::HTMLElement node)
+{
+ if(m_items.count() == 1){
+ KFileItem *item = m_items.getFirst();
+ KURL url = item->url();
+
+ QDir dir(url.path());
+ dir = dir.canonicalPath();
+
+ if(item->isDir() || dir.isRoot()){
+ m_functions->hide("open");
+ node.setInnerHTML(DOM::DOMString());
+ }
+ else{
+ DOM::DOMString innerHTML;
+
+ if(KDesktopFile::isDesktopFile(item->url().path())){ //Desktop file
+ KDesktopFile desktop(url.path(), TRUE);
+
+ if(desktop.hasApplicationType ()){
+ MetabarWidget::addEntry(innerHTML, i18n("Run %1").arg(desktop.readName()), "desktop://" + url.path(), desktop.readIcon());
+
+ m_functions->show("open");
+ }
+
+ else{
+ m_functions->hide("open");
+ }
+ }
+ else{ //other files
+ KTrader::OfferList offers;
+
+ offers = KTrader::self()->query(item->mimetype(), "Type == 'Application'");
+ if(!offers.isEmpty()){
+ KConfig config("metabarrc", true, false);
+ config.setGroup("General");
+
+ int id = 0;
+ int max = config.readNumEntry("MaxEntries", 5);
+
+ runMap.clear();
+ KTrader::OfferList::ConstIterator it = offers.begin();
+
+ for(; it != offers.end(); it++){
+ QString nam;
+ nam.setNum(id);
+
+ bool hide = id >= max;
+ MetabarWidget::addEntry(innerHTML, (*it)->name(), "exec://" + nam, (*it)->icon(), QString::null, hide ? QString("hiddenapp") : QString::null, hide);
+
+ runMap.insert(id, *it);
+ id++;
+ }
+
+ if(id > max){
+ MetabarWidget::addEntry(innerHTML, i18n("More"), "more://hiddenapp", "1downarrow", "hiddenapp");
+ }
+ }
+ else{
+ MetabarWidget::addEntry(innerHTML, i18n("Choose Application"), "openwith:///", "run");
+ }
+ }
+
+ node.setInnerHTML(innerHTML);
+
+ m_functions->show("open");
+ }
+ }
+ else{
+ m_functions->hide("open");
+ }
+}
+
+void DefaultPlugin::loadInformation(DOM::HTMLElement node)
+{
+ if(m_items.count() == 1){
+ KFileItem *item = m_items.getFirst();
+ KFileItem *that = const_cast<KFileItem *>(item);
+
+ DOM::DOMString innerHTML;
+ innerHTML += "<ul class=\"info\"><b>" + i18n("Type") + ": </b>";
+ innerHTML += that->determineMimeType()->comment();
+ innerHTML += "</ul><ul class=\"info\"><b>" + i18n("Size") + ": </b>";
+ innerHTML += KIO::convertSize(item->size());
+ innerHTML += "</ul><ul class=\"info\"><b>" + i18n("User") + ": </b>";
+ innerHTML += item->user();
+ innerHTML += "</ul><ul class=\"info\"><b>" + i18n("Group") + ": </b>";
+ innerHTML += item->group();
+ innerHTML += "</ul><ul class=\"info\"><b>" + i18n("Permissions") + ": </b>";
+ innerHTML += (item->permissionsString());
+ innerHTML += "</ul><ul class=\"info\"><b>" + i18n("Modified") + ": </b>";
+ innerHTML += item->timeString(KIO::UDS_MODIFICATION_TIME);
+ innerHTML += "</ul><ul class=\"info\"><b>" + i18n("Accessed") + ": </b>";
+ innerHTML += item->timeString(KIO::UDS_ACCESS_TIME);
+ innerHTML += "</ul>";
+
+ if(item->isLink()){
+ innerHTML += "<ul class=\"info\"><b>" + i18n("Linktarget") + ": </b>";
+ innerHTML += item->linkDest();
+ innerHTML += "</ul>";
+ }
+
+ if(!item->isDir()){
+ const KFileMetaInfo &metaInfo = item->metaInfo();
+ if(metaInfo.isValid()){
+ QStringList groups = metaInfo.supportedGroups();
+
+ int id = 0;
+ QString nam;
+
+ for(QStringList::ConstIterator it = groups.begin(); it != groups.end(); ++it){
+ KFileMetaInfoGroup group = metaInfo.group(*it);
+ if(group.isValid()){
+ nam.setNum(id);
+
+ innerHTML += "<ul class=\"info\"><a class=\"infotitle\" id=\"info_" + nam + "\" href=\"more://info_" + nam + "\">" + group.translatedName() + "</a></ul>";
+
+ QStringList keys = group.supportedKeys();
+
+ for(QStringList::ConstIterator it = keys.begin(); it != keys.end(); ++it){
+ const KFileMetaInfoItem metaInfoItem = group.item(*it);
+
+ if(metaInfoItem.isValid()){
+
+ innerHTML += "<ul class=\"info\" style=\"display:none\"><b name=\"info_" + nam + "\">" + metaInfoItem.translatedKey() + ": </b>";
+ innerHTML += metaInfoItem.string();
+ innerHTML += "</ul>";
+ }
+ }
+
+ id++;
+ }
+ }
+ }
+ }
+
+ node.setInnerHTML(innerHTML);
+ }
+ else{
+ KIO::filesize_t size = 0;
+ int files = 0;
+ int dirs = 0;
+
+ for(KFileItemListIterator it(m_items); it.current(); ++it){
+ size += (*it)->size();
+
+ if((*it)->isDir()){
+ dirs++;
+ }
+ else{
+ files++;
+ }
+ }
+
+ DOM::DOMString innerHTML;
+ innerHTML += "<ul class=\"info\"><b>" + i18n("Size") + ": </b>";
+ innerHTML += KIO::convertSize(size);
+ innerHTML += "</ul><ul class=\"info\"><b>" + i18n("Files") + ": </b>";
+ innerHTML += QString().setNum(files);
+ innerHTML += "</ul><ul class=\"info\"><b>" + i18n("Folders") + ": </b>";
+ innerHTML += QString().setNum(dirs);
+ innerHTML += "</ul><ul class=\"info\"><b>" + i18n("Total Entries") + ": </b>";
+ innerHTML += QString().setNum(m_items.count());
+ innerHTML += "</ul>";
+ node.setInnerHTML(innerHTML);
+ }
+ m_functions->show("info");
+}
+
+void DefaultPlugin::loadPreview(DOM::HTMLElement node)
+{
+ if(m_items.count() == 1){
+ KFileItem *item = m_items.getFirst();
+ KURL url = item->url();
+
+ QDir dir(url.path());
+ dir = dir.canonicalPath();
+
+ if(item->isDir() || dir.isRoot()){
+ m_functions->hide("preview");
+ }
+ else{
+ if(item->mimetype().startsWith("audio/")){
+ DOM::DOMString innerHTML("<ul><a class=\"previewdesc\" href=\"preview:///\">");
+ innerHTML += i18n("Click to start preview");
+ innerHTML += "</a></ul>";
+ node.setInnerHTML(innerHTML);
+
+ //m_functions->show("preview");
+ }
+ else{
+ DOM::DOMString innerHTML("<ul style=\"text-align-center\"><nobr>");
+ innerHTML += i18n("Creating preview");
+ innerHTML += "</nobr></ul>";
+ node.setInnerHTML(innerHTML);
+
+ //m_functions->show("preview");
+
+ preview_job = KIO::filePreview(KURL::List(url), m_html->view()->width() - 30);
+
+ connect(preview_job, SIGNAL(gotPreview(const KFileItem*, const QPixmap&)), this, SLOT(slotSetPreview(const KFileItem*, const QPixmap&)));
+ connect(preview_job, SIGNAL(failed(const KFileItem *)), this, SLOT(slotPreviewFailed(const KFileItem *)));
+ connect(preview_job, SIGNAL(result(KIO::Job *)), this, SLOT(slotJobFinished(KIO::Job *)));
+ }
+
+ m_functions->show("preview");
+ }
+ }
+ else{
+ m_functions->hide("preview");
+ }
+}
+
+void DefaultPlugin::loadBookmarks(DOM::HTMLElement node)
+{
+ m_functions->hide("bookmarks");
+}
+
+void DefaultPlugin::slotSetPreview(const KFileItem *item, const QPixmap &pix)
+{
+ DOM::HTMLDocument doc = m_html->htmlDocument();
+ DOM::HTMLElement node = doc.getElementById("preview");
+
+ QByteArray data;
+ QBuffer buffer(data);
+ buffer.open(IO_WriteOnly);
+ pix.save(&buffer, "PNG");
+
+ QString src = QString::fromLatin1("data:image/png;base64,%1").arg(KCodecs::base64Encode(data));
+ bool media = item->mimetype().startsWith("video/");
+
+ DOM::DOMString innerHTML;
+
+ innerHTML += QString("<ul style=\"height: %1px\"><a class=\"preview\"").arg(pix.height() + 15);
+
+ if(media){
+ innerHTML += " href=\"preview:///\"";
+ }
+ innerHTML +="><img id=\"previewimage\" src=\"";
+ innerHTML += src;
+ innerHTML += "\" width=\"";
+ innerHTML += QString().setNum(pix.width());
+ innerHTML += "\" height=\"";
+ innerHTML += QString().setNum(pix.height());
+ innerHTML += "\" /></a></ul>";
+
+ if(media){
+ innerHTML += "<ul><a class=\"previewdesc\" href=\"preview:///\">" + i18n("Click to start preview") + "</a></ul>";
+ }
+
+ node.setInnerHTML(innerHTML);
+
+ //script.append("adjustPreviewSize(" + height_str + ");");
+ m_functions->show("preview");
+ m_functions->adjustSize("preview");
+}
+
+void DefaultPlugin::slotPreviewFailed(const KFileItem *item)
+{
+ DOM::HTMLDocument doc = m_html->htmlDocument();
+ DOM::HTMLElement preview = static_cast<DOM::HTMLElement>(doc.getElementById("preview_image"));
+ if(!preview.isNull()){
+ preview.setAttribute(DOM::DOMString("src"), DOM::DOMString());
+ }
+
+ m_functions->hide("preview");
+}
+
+void DefaultPlugin::slotJobFinished(KIO::Job *job)
+{
+ if(preview_job && job == preview_job){
+ preview_job = 0;
+ }
+}
+
+bool DefaultPlugin::handleRequest(const KURL &url)
+{
+ QString protocol = url.protocol();
+
+ if(protocol == "exec"){
+ int id = url.host().toInt();
+
+ QMap<int,KService::Ptr>::Iterator it = runMap.find(id);
+ if(it != runMap.end()){
+
+ KFileItem *item = m_items.getFirst();
+ if(item){
+ KRun::run( **it, KURL::List(item->url()));
+ return true;
+ }
+ }
+ }
+
+ else if(protocol == "service"){
+ QString name = url.url().right(url.url().length() - 10);
+
+ services->runAction(name);
+ return true;
+ }
+
+ else if(protocol == "servicepopup"){
+ QString id = url.host();
+
+ DOM::HTMLDocument doc = m_html->htmlDocument();
+ DOM::HTMLElement node = static_cast<DOM::HTMLElement>(doc.getElementById("popup" + id));
+
+ if(!node.isNull()){
+ QRect rect = node.getRect();
+ QPoint p = m_html->view()->mapToGlobal(rect.bottomLeft());
+
+ services->showPopup(id, p);
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+#include "defaultplugin.moc"
diff --git a/konq-plugins/sidebar/metabar/src/defaultplugin.h b/konq-plugins/sidebar/metabar/src/defaultplugin.h
new file mode 100644
index 0000000..15b2e73
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/defaultplugin.h
@@ -0,0 +1,64 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Florian Roth *
+ * florian@synatic.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef _DEFAULT_PLUGIN_H_
+#define _DEFAULT_PLUGIN_H_
+
+#include "protocolplugin.h"
+#include "serviceloader.h"
+
+#include <kio/previewjob.h>
+
+#include <qdict.h>
+#include <qmap.h>
+
+class DefaultPlugin : public ProtocolPlugin
+{
+ Q_OBJECT
+
+ public:
+ DefaultPlugin(KHTMLPart* html, MetabarFunctions *functions, const char *name = 0);
+ ~DefaultPlugin();
+
+ void deactivate();
+ bool handleRequest(const KURL &url);
+
+ protected:
+ void killJobs();
+
+ void loadActions(DOM::HTMLElement node);
+ void loadApplications(DOM::HTMLElement node);
+ void loadInformation(DOM::HTMLElement node);
+ void loadPreview(DOM::HTMLElement node);
+ void loadBookmarks(DOM::HTMLElement node);
+
+ private:
+ QMap<int,KService::Ptr> runMap;
+ KIO::PreviewJob *preview_job;
+
+ ServiceLoader *services;
+
+ private slots:
+ void slotSetPreview(const KFileItem*, const QPixmap&);
+ void slotPreviewFailed(const KFileItem *item);
+ void slotJobFinished(KIO::Job *item);
+};
+
+#endif
diff --git a/konq-plugins/sidebar/metabar/src/hi128-app-metabar.png b/konq-plugins/sidebar/metabar/src/hi128-app-metabar.png
new file mode 100644
index 0000000..1ee89bf
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/hi128-app-metabar.png
Binary files differ
diff --git a/konq-plugins/sidebar/metabar/src/hi16-app-metabar.png b/konq-plugins/sidebar/metabar/src/hi16-app-metabar.png
new file mode 100644
index 0000000..c47b0b0
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/hi16-app-metabar.png
Binary files differ
diff --git a/konq-plugins/sidebar/metabar/src/hi32-app-metabar.png b/konq-plugins/sidebar/metabar/src/hi32-app-metabar.png
new file mode 100644
index 0000000..c0d6213
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/hi32-app-metabar.png
Binary files differ
diff --git a/konq-plugins/sidebar/metabar/src/hi48-app-metabar.png b/konq-plugins/sidebar/metabar/src/hi48-app-metabar.png
new file mode 100644
index 0000000..763ec38
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/hi48-app-metabar.png
Binary files differ
diff --git a/konq-plugins/sidebar/metabar/src/hi64-app-metabar.png b/konq-plugins/sidebar/metabar/src/hi64-app-metabar.png
new file mode 100644
index 0000000..89fa615
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/hi64-app-metabar.png
Binary files differ
diff --git a/konq-plugins/sidebar/metabar/src/hisc-app-metabar.svgz b/konq-plugins/sidebar/metabar/src/hisc-app-metabar.svgz
new file mode 100644
index 0000000..6b955f5
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/hisc-app-metabar.svgz
Binary files differ
diff --git a/konq-plugins/sidebar/metabar/src/httpplugin.cpp b/konq-plugins/sidebar/metabar/src/httpplugin.cpp
new file mode 100644
index 0000000..aec402a
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/httpplugin.cpp
@@ -0,0 +1,119 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Florian Roth *
+ * florian@synatic.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include "metabarwidget.h"
+#include "httpplugin.h"
+
+#include <kbookmark.h>
+#include <kstandarddirs.h>
+#include <kapplication.h>
+#include <kicontheme.h>
+#include <khtmlview.h>
+#include <kurl.h>
+#include <klocale.h>
+
+#include <dcopref.h>
+#include <dcopclient.h>
+
+#include <qregexp.h>
+#include <qfile.h>
+
+#include <dom_node.h>
+#include <html_inline.h>
+
+HTTPPlugin::HTTPPlugin(KHTMLPart* html, MetabarFunctions *functions, const char *name) : ProtocolPlugin (html, functions, name)
+{
+}
+
+HTTPPlugin::~HTTPPlugin()
+{
+ //delete bookmarkManager;
+}
+
+void HTTPPlugin::deactivate()
+{
+ m_functions->hide("actions");
+ m_functions->hide("info");
+}
+
+void HTTPPlugin::killJobs()
+{
+}
+
+void HTTPPlugin::loadInformation(DOM::HTMLElement node)
+{
+ /*DOM::DOMString innerHTML;
+ innerHTML += "<form action=\"find:///\" method=\"GET\">";
+ innerHTML += "<ul>";
+ innerHTML += i18n("Keyword");
+ innerHTML += " <input onFocus=\"this.value = ''\" type=\"text\" name=\"find\" id=\"find_text\" value=\"";
+ innerHTML += i18n("Web search");
+ innerHTML += "\"></ul>";
+ innerHTML += "<ul><input type=\"submit\" id=\"find_button\" value=\"";
+ innerHTML += i18n("Find");
+ innerHTML += "\"></ul>";
+ innerHTML += "</form>";
+
+ node.setInnerHTML(innerHTML);
+ m_functions->show("info");*/
+
+ m_functions->hide("info");
+}
+
+void HTTPPlugin::loadActions(DOM::HTMLElement node)
+{
+ m_functions->hide("actions");
+}
+
+void HTTPPlugin::loadApplications(DOM::HTMLElement node)
+{
+ m_functions->hide("open");
+}
+
+void HTTPPlugin::loadPreview(DOM::HTMLElement node)
+{
+ m_functions->hide("preview");
+}
+
+void HTTPPlugin::loadBookmarks(DOM::HTMLElement node)
+{
+ m_functions->hide("bookmarks");
+}
+
+bool HTTPPlugin::handleRequest(const KURL &url)
+{
+ if(url.protocol() == "find"){
+ QString keyword = url.queryItem("find");
+ QString type = url.queryItem("type");
+
+ if(!keyword.isNull() && !keyword.isEmpty()){
+ KURL url("http://www.google.com/search");
+ url.addQueryItem("q", keyword);
+
+ DCOPRef ref(kapp->dcopClient()->appId(), m_html->view()->topLevelWidget()->name());
+ DCOPReply reply = ref.call("openURL", url.url());
+ }
+
+ return true;
+ }
+ return false;
+}
+
+#include "httpplugin.moc"
diff --git a/konq-plugins/sidebar/metabar/src/httpplugin.h b/konq-plugins/sidebar/metabar/src/httpplugin.h
new file mode 100644
index 0000000..c840e8f
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/httpplugin.h
@@ -0,0 +1,51 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Florian Roth *
+ * florian@synatic.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef _HTTP_PLUGIN_H_
+#define _HTTP_PLUGIN_H_
+
+#include "protocolplugin.h"
+
+#include <kdirwatch.h>
+#include <kbookmarkmanager.h>
+
+#include <dom_string.h>
+
+class HTTPPlugin : public ProtocolPlugin
+{
+ Q_OBJECT
+
+ public:
+ HTTPPlugin(KHTMLPart* html, MetabarFunctions *functions, const char *name = 0);
+ ~HTTPPlugin();
+
+ bool handleRequest(const KURL &url);
+ void deactivate();
+
+ protected:
+ void loadActions(DOM::HTMLElement node);
+ void loadApplications(DOM::HTMLElement node);
+ void loadPreview(DOM::HTMLElement node);
+ void loadBookmarks(DOM::HTMLElement node);
+ void loadInformation(DOM::HTMLElement node);
+ void killJobs();
+};
+
+#endif
diff --git a/konq-plugins/sidebar/metabar/src/iconsrc b/konq-plugins/sidebar/metabar/src/iconsrc
new file mode 100644
index 0000000..a30f532
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/iconsrc
@@ -0,0 +1,4 @@
+[Icons]
+rename=edit
+konq_create_dir=folder_new
+properties=messagebox_info \ No newline at end of file
diff --git a/konq-plugins/sidebar/metabar/src/layout.html b/konq-plugins/sidebar/metabar/src/layout.html
new file mode 100644
index 0000000..6bae311
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/layout.html
@@ -0,0 +1,48 @@
+<html>
+<head>
+<title></title>
+
+</head>
+
+<body>
+
+<div class="frame">
+ <div class="head"><a i18n image="wizard" class="title" onClick="this.blur();" href="function://toggle/actions">Actions</a></div>
+ <li id="actions" expanded="true" style="height:0px">
+ </li>
+</div>
+
+<div class="frame">
+ <div class="head"><a i18n image="run" class="title" onClick="this.blur();" href="function://toggle/open">Open With</a></div>
+ <li id="open" expanded="true" style="height:0px">
+ </li>
+</div>
+
+<div class="frame">
+ <div class="head"><a i18n image="bookmark" class="title" onClick="this.blur();" href="function://toggle/bookmarks">Bookmarks</a></div>
+ <li id="bookmarks" expanded="true" style="height:0px">
+ </li>
+</div>
+
+<div class="frame">
+ <div class="head"><a i18n image="browser" class="title" onClick="this.blur();" href="function://toggle/links">Links</a></div>
+ <li id="links" expanded="true" style="height:0px">
+ </li>
+</div>
+
+<div class="frame">
+ <div class="head"><a i18n image="messagebox_info" class="title" onClick="this.blur();" href="function://toggle/info">Information</a></div>
+<li id="info" expanded="true" style="height:0px">
+</li>
+</div>
+
+<div class="frame">
+ <div class="head"><a i18n image="player_play" class="title" onClick="this.blur();" href="function://toggle/preview">Preview</a></div>
+ <li id="preview" expanded="true" style="height:0px">
+ </li>
+</div>
+
+
+</body>
+
+</html>
diff --git a/konq-plugins/sidebar/metabar/src/metabar.cpp b/konq-plugins/sidebar/metabar/src/metabar.cpp
new file mode 100644
index 0000000..8181a11
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/metabar.cpp
@@ -0,0 +1,59 @@
+#include <kinstance.h>
+#include <qstring.h>
+#include <kimageio.h>
+#include <klocale.h>
+
+#include "metabarwidget.h"
+#include "metabar.h"
+#include "metabar.moc"
+
+Metabar::Metabar(KInstance *inst,QObject *parent,QWidget *widgetParent, QString &desktopName, const char* name):
+ KonqSidebarPlugin(inst,parent,widgetParent,desktopName,name)
+{
+ KImageIO::registerFormats();
+ KGlobal::locale()->insertCatalogue( "konqsidebar_metabar" );
+
+ widget = new MetabarWidget(widgetParent, "metabarwidget");
+}
+
+
+Metabar::~Metabar()
+{
+}
+
+void Metabar::handleURL(const KURL &url)
+{
+ const KFileItem *item = new KFileItem(KFileItem::Unknown, KFileItem::Unknown, url, true);
+ KFileItemList list;
+ list.append(item);
+
+ widget->setFileItems(list);
+}
+
+void Metabar::handlePreview(const KFileItemList &items)
+{
+ widget->setFileItems(items);
+}
+
+
+extern "C" {
+ bool add_konqsidebar_metabar(QString* fn, QString* param, QMap<QString,QString> *map) {
+ Q_UNUSED(param);
+
+ map->insert("Type", "Link");
+ map->insert("Icon", "metabar");
+ map->insert("Name", "Metabar");
+ map->insert("Open", "true");
+ map->insert("X-KDE-KonqSidebarModule","konqsidebar_metabar");
+ fn->setLatin1("metabar%1.desktop");
+ return true;
+ }
+}
+
+extern "C"
+{
+ void* create_konqsidebar_metabar(KInstance *instance,QObject *par,QWidget *widp,QString &desktopname,const char *name)
+ {
+ return new Metabar(instance,par,widp,desktopname,name);
+ }
+}
diff --git a/konq-plugins/sidebar/metabar/src/metabar.desktop b/konq-plugins/sidebar/metabar/src/metabar.desktop
new file mode 100644
index 0000000..9ea7917
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/metabar.desktop
@@ -0,0 +1,81 @@
+[Desktop Entry]
+Type=Link
+URL=
+Icon=metabar
+Comment=A konqueror navigation panel plugin called Metabar
+Comment[bg]=Приставка за навигация в браузъра Konqueror
+Comment[ca]=Un connector del plafó de navegació del konqueror anomenat Metabar
+Comment[cs]=Navigační panel pro Konqueror - Metabar
+Comment[da]=Et navigationspanel-plugin for konqueror der hedder Metabar
+Comment[de]=Metabar - Ein Modul für den Navigationsbereich von Konqueror
+Comment[el]=Ένα πρόσθετο πίνακα πλοήγησης του konqueror που ονομάζεται γραμμή μεταδεδομένων
+Comment[en_GB]=A Konqueror navigation panel plugin called Metabar
+Comment[eo]=Foliuma panela kromaĵo por Konkeranto nomata Metabar
+Comment[es]=Un complemento del panel de navegación de konqueror llamado metabarra
+Comment[et]=Konquerori navigeerimispaneeli plugin Metabar
+Comment[eu]=Metabar izeneko Konqueror-en arakatze-panelaren plugina
+Comment[fa]=وصلۀ تابلوی ناوش konqueror که فرامیله نام دارد
+Comment[fi]=Konquerorin Metabar-niminen selauspaneelin liitännäinen
+Comment[fr]=Un module pour le panneau de navigation de Konqueror appelé Metabar
+Comment[fy]=In plugin foar Konqueror's navigaasjebalke, neamd Metabalke
+Comment[ga]=Breiseán i bpainéal nascleanúna Konqueror darb ainm Metabar
+Comment[gl]=Un plugin de navegación para konqueror chamado Metabar
+Comment[hr]=Dodatak navigacijske ploče za Konqueror, zvan Metabar
+Comment[hu]=Metabar, egy navigációs bővítőmodul a Konqueror böngészőhöz
+Comment[is]=Konqueror leiðarstýrispjald íforrit sem kallast Metabar
+Comment[it]=Plugin di navigazione di Konqueror chiamato Metabar
+Comment[ja]=Konqueror メタバー ナビゲーションパネルプラグイン
+Comment[ka]=konqueror ნავიგაციის მოდული სახელად Metabar
+Comment[kk]=Metabar деген Konqueror панелінің плагин модулі
+Comment[km]=កម្មវិធី​ជំនួយ​បន្ទះ​​រុករក​​របស់ konqueror ​បាន​ហៅ​​របារ​មេតា
+Comment[lt]=Metabar - Konqueror navigacijos pulto priedas
+Comment[mk]=Приклучок за панел за навигација во konqueror наречен Metabar
+Comment[nb]=Et Konqueror programtillegg for navigasjonspanel, kalt Metabar
+Comment[nds]=En Sietpaneelmoduul för Konqueror, nöömt "Metabar"
+Comment[ne]=मेटाबार भनिने एउटा कन्क्वेरर नेभिगेसन प्यानल प्लगइन
+Comment[nl]=Een plugin voor Konqueror's navigatiebalk, genaamd Metabalk
+Comment[nn]=Eit programtillegg som gir Konqueror eit navigasjonpanel
+Comment[pl]=Panel nawigacyjny Metabar dla Konquerora
+Comment[pt]=Um 'plugin' de navegação do konqueror chamado Metabar
+Comment[pt_BR]=Um plugin de navegação para o Konqueror chamado de Metabar
+Comment[ru]=Панель сведений Konqueror
+Comment[sk]=Modul navigačného panelu pre Konqueror nazývaný Metabar
+Comment[sl]=Vstavek za Konqueror z navigacijskim pasom Metabar
+Comment[sr]=Прикључак за навигациону таблу konqueror-а назван Метапалета
+Comment[sr@Latn]=Priključak za navigacionu tablu konqueror-a nazvan Metapaleta
+Comment[sv]=Ett sidopanelinsticksprogram för Konqueror kallad Metarad
+Comment[tr]=Metabar isimli Konqueror gezinme paneli eklentisi
+Comment[uk]=Втулок навігаційної панелі для konqueror - Metabar
+Comment[vi]=Bổ sung bảng duyệt qua Konqueror tên Siêu Thanh
+Comment[zh_CN]=称为 Metabar 的 Konqueror 导航面板插件
+Comment[zh_TW]=叫做 Metabar 的 Konqueror 導覽面板外掛程式
+Name=metabar
+Name[de]=Metabar
+Name[el]=Γραμμή μεταδεδομένων
+Name[es]=metabarra
+Name[et]=Metabar
+Name[fa]=فرامیله
+Name[fi]=metapalkki
+Name[fr]=Metabar
+Name[fy]=metabalke
+Name[hu]=Metabar
+Name[ja]=メタバー
+Name[km]=របារ​មេតា
+Name[ne]=मेटाबार
+Name[nl]=metabalk
+Name[pa]=ਮੈਟਾ-ਪੱਟੀ
+Name[pl]=Metabar
+Name[pt_BR]=MetaBar
+Name[ru]=Сведения
+Name[sk]=Metabar
+Name[sl]=Metabar
+Name[sr]=метапалета
+Name[sr@Latn]=metapaleta
+Name[sv]=Metarad
+Name[tr]=Metabar
+Name[vi]=siêu thanh
+Name[zh_CN]=Metabar
+
+Open=false
+X-KDE-KonqSidebarModule=konqsidebar_metabar
+
diff --git a/konq-plugins/sidebar/metabar/src/metabar.h b/konq-plugins/sidebar/metabar/src/metabar.h
new file mode 100644
index 0000000..6d43592
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/metabar.h
@@ -0,0 +1,32 @@
+#ifndef METABAR_H
+#define METABAR_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <konqsidebarplugin.h>
+#include <qstring.h>
+#include <kconfig.h>
+
+
+class Metabar : public KonqSidebarPlugin
+{
+ Q_OBJECT
+
+ public:
+ Metabar(KInstance *inst,QObject *parent,QWidget *widgetParent, QString &desktopName, const char* name=0);
+ ~Metabar();
+
+ virtual QWidget *getWidget(){ return widget; }
+ virtual void *provides(const QString &) { return 0; }
+
+ protected:
+ MetabarWidget *widget;
+
+ void handleURL(const KURL &url);
+ void handlePreview(const KFileItemList &items);
+
+};
+
+#endif
diff --git a/konq-plugins/sidebar/metabar/src/metabar_add.desktop b/konq-plugins/sidebar/metabar/src/metabar_add.desktop
new file mode 100644
index 0000000..e7003e9
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/metabar_add.desktop
@@ -0,0 +1,70 @@
+[Desktop Entry]
+Comment=A konqueror navigation panel plugin called Metabar
+Comment[bg]=Приставка за навигация в браузъра Konqueror
+Comment[ca]=Un connector del plafó de navegació del konqueror anomenat Metabar
+Comment[cs]=Navigační panel pro Konqueror - Metabar
+Comment[da]=Et navigationspanel-plugin for konqueror der hedder Metabar
+Comment[de]=Metabar - Ein Modul für den Navigationsbereich von Konqueror
+Comment[el]=Ένα πρόσθετο πίνακα πλοήγησης του konqueror που ονομάζεται γραμμή μεταδεδομένων
+Comment[en_GB]=A Konqueror navigation panel plugin called Metabar
+Comment[eo]=Foliuma panela kromaĵo por Konkeranto nomata Metabar
+Comment[es]=Un complemento del panel de navegación de konqueror llamado metabarra
+Comment[et]=Konquerori navigeerimispaneeli plugin Metabar
+Comment[eu]=Metabar izeneko Konqueror-en arakatze-panelaren plugina
+Comment[fa]=وصلۀ تابلوی ناوش konqueror که فرامیله نام دارد
+Comment[fi]=Konquerorin Metabar -niminen selauspaneelin liitännäinen
+Comment[fr]=Un module pour le panneau de navigation de Konqueror appelé Metabar
+Comment[fy]=In plugin foar Konqueror's navigaasjebalke, neamd Metabalke
+Comment[ga]=Breiseán i bpainéal nascleanúna Konqueror darb ainm Metabar
+Comment[gl]=Un plugin de navegación para konqueror chamado Metabar
+Comment[hr]=Dodatak navigacijske trake za Konqueror, nazvan Metabar
+Comment[hu]=Metabar, egy navigációs bővítőmodul a Konqueror böngészőhöz
+Comment[is]=Konqueror leiðarstýrispjald íforrit sem kallast Metabar
+Comment[it]=Plugin di navigazione di Konqueror chiamato Metabar
+Comment[ja]=Konqueror メタバー ナビゲーションパネルプラグイン
+Comment[ka]=konqueror ნავიგაციის მოდული სახელად Metabar
+Comment[kk]=Metabar деген Konqueror панелінің плагин модулі
+Comment[km]=កម្មវិធី​ជំនួយ​បន្ទះ​​រុករក​របស់ konqueror បាន​​ហៅ​របារ​មេតា
+Comment[lt]=Metabar - Konqueror navigacijos pulto priedas
+Comment[mk]=Приклучок за панел за навигација во konqueror наречен Metabar
+Comment[nb]=Et Konqueror programtillegg for navigasjonspanel, kalt Metabar
+Comment[nds]=En Sietpaneel för Konqueror, nöömt "Metabar"
+Comment[ne]=मेटाबार भनिने एउटा कन्क्वेरर नेभिगेसन प्यानल प्लगइन
+Comment[nl]=Een plugin voor Konqueror's navigatiebalk, genaamd Metabalk
+Comment[nn]=Eit programtillegg som gir Konqueror eit navigasjonspanel
+Comment[pl]=Wtyczka panelu nawigacyjnego Metabar dla Konquerora
+Comment[pt]=Um 'plugin' de navegação do konqueror chamado Metabar
+Comment[pt_BR]=Um plugin de navegação para o Konqueror chamado de MetaBar
+Comment[ru]=Панель сведений Konqueror
+Comment[sk]=Modul navigačného panelu pre Konqueror nazývaný Metabar
+Comment[sl]=Vstavek za Konqueror z navigacijskim pasom Metabar
+Comment[sr]=Прикључак за навигациону таблу konqueror-а назван Метапалета
+Comment[sr@Latn]=Priključak za navigacionu tablu konqueror-a nazvan Metapaleta
+Comment[sv]=Ett sidopanelinsticksprogram för Konqueror kallad Metarad
+Comment[tr]=Metabar isimli Konqueror gezinme paneli eklentisi
+Comment[uk]=Втулок навігаційної панелі для konqueror - Metabar
+Comment[vi]=Bổ sung bảng duyệt qua Konqueror tên Siêu Thanh
+Comment[zh_CN]=称为 Metabar 的 Konqueror 导航面板插件
+Comment[zh_TW]=叫做 Metabar 的 Konqueror 導覽面板外掛程式
+Icon=metabar
+Name=Metabar
+Name[el]=Γραμμή μεταδεδομένων
+Name[eo]=MetaCrawler
+Name[es]=Metabarra
+Name[fa]=فرامیله
+Name[fy]=Metabalke
+Name[ja]=メタバー
+Name[km]=របារ​មេតា
+Name[ne]=मेटाबार
+Name[nl]=Metabalk
+Name[pa]=ਮੈਟਾ-ਪੱਟੀ
+Name[pt_BR]=MetaBar
+Name[ru]=Сведения
+Name[sr]=Метапалета
+Name[sr@Latn]=Metapaleta
+Name[sv]=Metarad
+Name[vi]=Siêu Thanh
+Open=false
+Type=Link
+URL=
+X-KDE-KonqSidebarAddModule=konqsidebar_metabar
diff --git a/konq-plugins/sidebar/metabar/src/metabarfunctions.cpp b/konq-plugins/sidebar/metabar/src/metabarfunctions.cpp
new file mode 100644
index 0000000..2d16e29
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/metabarfunctions.cpp
@@ -0,0 +1,242 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Florian Roth *
+ * florian@synatic.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include "metabarfunctions.h"
+
+#include <html_element.h>
+#include <html_document.h>
+#include <css_value.h>
+
+#include <kconfig.h>
+
+#include <qrect.h>
+
+#define CSS_PRIORITY "important"
+#define RESIZE_SPEED 5
+#define RESIZE_STEP 2
+
+MetabarFunctions::MetabarFunctions(KHTMLPart *html, QObject *parent, const char* name) : QObject(parent, name), m_html(html)
+{
+ timer = new QTimer(this);
+ connect(timer, SIGNAL(timeout()), this, SLOT(animate()));
+}
+
+MetabarFunctions::~MetabarFunctions()
+{
+ if(timer->isActive()){
+ timer->stop();
+ }
+}
+
+void MetabarFunctions::handleRequest(const KURL &url)
+{
+ QString function = url.host();
+ QStringList params = QStringList::split(',', url.filename());
+
+ if(function == "toggle"){
+ if(params.size() == 1){
+ toggle(params.first());
+ }
+ }
+
+ else if(function == "adjustSize"){
+ if(params.size() == 1){
+ adjustSize(params.first());
+ }
+ }
+
+ else if(function == "show"){
+ if(params.size() == 1){
+ show(params.first());
+ }
+ }
+
+ else if(function == "hide"){
+ if(params.size() == 1){
+ hide(params.first());
+ }
+ }
+}
+
+void MetabarFunctions::toggle(DOM::DOMString item)
+{
+ DOM::HTMLDocument doc = m_html->htmlDocument();
+ DOM::HTMLElement node = static_cast<DOM::HTMLElement>(doc.getElementById(item));
+
+ if(!node.isNull()){
+ DOM::NodeList children = node.childNodes();
+ DOM::CSSStyleDeclaration style = node.style();
+ DOM::DOMString expanded = node.getAttribute("expanded");
+
+ bool isExpanded = expanded == "true";
+
+ int height = 0;
+ if(!isExpanded){
+ height = getHeight(node);
+ }
+
+ DOM::DOMString att = isExpanded ? "false" : "true";
+ node.setAttribute("expanded", att);
+
+ KConfig config("metabarrc");
+ config.setGroup("General");
+
+ if(config.readBoolEntry("AnimateResize", false)){
+ resizeMap[item.string()] = height;
+
+ if(!timer->isActive()){
+ timer->start(RESIZE_SPEED);
+ }
+ }
+ else{
+ style.setProperty("height", QString("%1px").arg(height), CSS_PRIORITY);
+ }
+ }
+}
+
+void MetabarFunctions::adjustSize(DOM::DOMString item)
+{
+ DOM::HTMLDocument doc = m_html->htmlDocument();
+ DOM::HTMLElement node = static_cast<DOM::HTMLElement>(doc.getElementById(item));
+
+ if(!node.isNull()){
+ DOM::NodeList children = node.childNodes();
+ DOM::CSSStyleDeclaration style = node.style();
+ DOM::DOMString expanded = node.getAttribute("expanded");
+
+ bool isExpanded = expanded == "true";
+
+ if(isExpanded){
+ int height = getHeight(node);
+
+ KConfig config("metabarrc");
+ config.setGroup("General");
+
+ if(config.readBoolEntry("AnimateResize", false)){
+ resizeMap[item.string()] = height;
+
+ if(!timer->isActive()){
+ timer->start(RESIZE_SPEED);
+ }
+ }
+ else{
+ style.setProperty("height", QString("%1px").arg(height), CSS_PRIORITY);
+ }
+ }
+ }
+}
+
+void MetabarFunctions::animate()
+{
+ QMap<QString, int>::Iterator it;
+ for(it = resizeMap.begin(); it != resizeMap.end(); ++it ) {
+ QString id = it.key();
+ int height = it.data();
+ int currentHeight = 0;
+
+ DOM::HTMLDocument doc = m_html->htmlDocument();
+ DOM::HTMLElement node = static_cast<DOM::HTMLElement>(doc.getElementById(id));
+ DOM::CSSStyleDeclaration style = node.style();
+
+ QString currentHeightString = style.getPropertyValue("height").string();
+ if(currentHeightString.endsWith("px")){
+ currentHeight = currentHeightString.left(currentHeightString.length() - 2).toInt();
+ }
+
+ if(currentHeight == height){
+ resizeMap.remove(id);
+
+ if(resizeMap.isEmpty()){
+ timer->stop();
+ }
+ }
+ else{
+ int diff = kAbs(currentHeight - height);
+ int changeValue = RESIZE_STEP;
+
+ if(diff < RESIZE_STEP){
+ changeValue = diff;
+ }
+
+ int change = currentHeight < height ? changeValue : -changeValue;
+ style.setProperty("height", QString("%1px").arg(currentHeight + change), CSS_PRIORITY);
+ doc.updateRendering();
+ }
+ }
+}
+
+void MetabarFunctions::show(DOM::DOMString item)
+{
+ DOM::HTMLDocument doc = m_html->htmlDocument();
+ DOM::HTMLElement node = static_cast<DOM::HTMLElement>(doc.getElementById(item));
+ if(!node.isNull()){
+ DOM::HTMLElement parent = static_cast<DOM::HTMLElement>(node.parentNode());
+
+ DOM::CSSStyleDeclaration style = parent.style();
+ style.setProperty("display", "block", CSS_PRIORITY);
+ }
+}
+
+void MetabarFunctions::hide(DOM::DOMString item)
+{
+ DOM::HTMLDocument doc = m_html->htmlDocument();
+ DOM::HTMLElement node = static_cast<DOM::HTMLElement>(doc.getElementById(item));
+ if(!node.isNull()){
+ DOM::HTMLElement parent = static_cast<DOM::HTMLElement>(node.parentNode());
+
+ DOM::CSSStyleDeclaration style = parent.style();
+ style.setProperty("display", "none", CSS_PRIORITY);
+ }
+}
+
+int MetabarFunctions::getHeight(DOM::HTMLElement &element)
+{
+ int height = 0;
+ DOM::NodeList children = element.childNodes();
+ for(uint i = 0; i < children.length(); i++){
+ DOM::HTMLElement node = static_cast<DOM::HTMLElement>(children.item(i));
+ DOM::CSSStyleDeclaration style = node.style();
+
+ DOM::DOMString css_height = style.getPropertyValue("height");
+ if(!css_height.isNull()){
+ height += css_height.string().left(css_height.string().length() - 2).toInt();
+ }
+ else{
+ int h = 0;
+ if(!node.isNull()){
+ h = node.getRect().height();
+ }
+
+ DOM::DOMString display = style.getPropertyValue("display");
+ if(display == "none"){
+ h = 0;
+ }
+ else if(h == 0){
+ h = 20;
+ }
+
+ height += h;
+ }
+ }
+
+ return height;
+}
+
+#include "metabarfunctions.moc"
diff --git a/konq-plugins/sidebar/metabar/src/metabarfunctions.h b/konq-plugins/sidebar/metabar/src/metabarfunctions.h
new file mode 100644
index 0000000..1c01998
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/metabarfunctions.h
@@ -0,0 +1,59 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Florian Roth *
+ * florian@synatic.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef METABAR_FUNCTIONS_H
+#define METABAR_FUNCTIONS_H
+
+#include <dom_string.h>
+
+#include <qtimer.h>
+#include <qmap.h>
+
+#include <kurl.h>
+#include <khtml_part.h>
+
+class MetabarFunctions : public QObject
+{
+ Q_OBJECT
+
+ public:
+ MetabarFunctions(KHTMLPart *html, QObject *parent = 0, const char* name=0);
+ ~MetabarFunctions();
+
+ void toggle(DOM::DOMString item);
+ void adjustSize(DOM::DOMString item);
+ void hide(DOM::DOMString item);
+ void show(DOM::DOMString item);
+ void handleRequest(const KURL &url);
+
+ protected:
+ KHTMLPart *m_html;
+
+ private:
+ QTimer *timer;
+
+ QMap<QString, int> resizeMap;
+ int getHeight(DOM::HTMLElement &element);
+
+ private slots:
+ void animate();
+};
+
+#endif
diff --git a/konq-plugins/sidebar/metabar/src/metabarwidget.cpp b/konq-plugins/sidebar/metabar/src/metabarwidget.cpp
new file mode 100644
index 0000000..f794353
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/metabarwidget.cpp
@@ -0,0 +1,592 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Florian Roth *
+ * florian@synatic.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include "metabarwidget.h"
+#include "configdialog.h"
+
+#include "defaultplugin.h"
+#include "settingsplugin.h"
+#include "remoteplugin.h"
+#include "httpplugin.h"
+
+#include <qwidget.h>
+#include <qlayout.h>
+#include <qdir.h>
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qvaluelist.h>
+#include <qurl.h>
+#include <qbuffer.h>
+
+#include <khtmlview.h>
+#include <kapplication.h>
+#include <kstandarddirs.h>
+#include <kurl.h>
+#include <kdebug.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <kicontheme.h>
+#include <ktrader.h>
+#include <klocale.h>
+#include <krun.h>
+#include <kdesktopfile.h>
+#include <kpropertiesdialog.h>
+#include <kaction.h>
+#include <kactioncollection.h>
+#include <kshortcut.h>
+#include <kmimetype.h>
+#include <kcmoduleinfo.h>
+#include <kmdcodec.h>
+
+#include <kparts/browserextension.h>
+
+#include <dom2_events.h>
+#include <dom2_views.h>
+#include <dom_doc.h>
+#include <dom_element.h>
+#include <dom_string.h>
+#include <html_element.h>
+#include <html_misc.h>
+#include <html_image.h>
+#include <css_value.h>
+
+#include <dcopref.h>
+#include <dcopclient.h>
+
+#define EVENT_TYPE DOM::DOMString("click")
+#define ACTIVATION 1
+
+MetabarWidget::MetabarWidget(QWidget *parent, const char *name) : QWidget(parent, name)
+{
+ skip = false;
+ loadComplete = false;
+
+ currentItems = new KFileItemList;
+ currentItems->setAutoDelete(true);
+
+ config = new KConfig("metabarrc");
+
+ dir_watch = new KDirWatch();
+ connect(dir_watch, SIGNAL(dirty(const QString&)), this, SLOT(slotUpdateCurrentInfo(const QString&)));
+ connect(dir_watch, SIGNAL(created(const QString&)), this, SLOT(slotUpdateCurrentInfo(const QString&)));
+ connect(dir_watch, SIGNAL(deleted(const QString&)), this, SLOT(slotDeleteCurrentInfo(const QString&)));
+
+ html = new KHTMLPart(this, "metabarhtmlpart");
+ html->setJScriptEnabled(true);
+ html->setPluginsEnabled(true);
+ html->setCaretVisible(false);
+ html->setDNDEnabled(false);
+ html->setJavaEnabled(false);
+ html->view()->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ html->view()->hide();
+
+ connect(html->browserExtension(), SIGNAL(openURLRequest( const KURL &, const KParts::URLArgs & )), this, SLOT(handleURLRequest(const KURL &, const KParts::URLArgs &)));
+ connect(html, SIGNAL(completed()), this, SLOT(loadCompleted()));
+ connect(html, SIGNAL(popupMenu(const QString &, const QPoint &)), this, SLOT(slotShowPopup(const QString&, const QPoint &)));
+
+ functions = new MetabarFunctions(html, this);
+
+ currentPlugin = 0;
+ defaultPlugin = new DefaultPlugin(html, functions);
+ HTTPPlugin *httpPlugin = new HTTPPlugin(html, functions);
+
+ //plugins.setAutoDelete(true);
+ plugins.insert("settings", new SettingsPlugin(html, functions));
+ plugins.insert("remote", new RemotePlugin(html, functions));
+ //plugins.insert("trash", new TrashPlugin(html, functions));
+ plugins.insert("http", httpPlugin);
+ plugins.insert("https", httpPlugin);
+
+ QVBoxLayout *layout = new QVBoxLayout(this);
+ layout->addWidget(html->view());
+
+ popup = new KPopupMenu(0);
+ KAction *configAction = new KAction(i18n("Configure %1...").arg("Metabar"), "configure", KShortcut(), this, SLOT(slotShowConfig()), html->actionCollection(), "configure");
+ configAction->plug(popup);
+
+ KAction *reloadAction = new KAction(i18n("Reload Theme"), "reload", KShortcut(), this, SLOT(setTheme()), html->actionCollection(), "reload");
+ reloadAction->plug(popup);
+
+ setTheme();
+}
+
+MetabarWidget::~MetabarWidget()
+{
+ config->sync();
+ delete config;
+
+ delete dir_watch;
+ delete currentItems;
+}
+
+void MetabarWidget::setFileItems(const KFileItemList &items, bool check)
+{
+ if(!loadComplete){
+ return;
+ }
+
+ if(skip){
+ skip = false;
+ return;
+ }
+
+ if(check){
+ int count = items.count();
+
+ KURL url(getCurrentURL());
+
+ KFileItem *newItem = items.getFirst();
+ KFileItem *oldItem = currentItems->getFirst();
+
+ if(count == 0){
+ if(oldItem){
+ if(oldItem->url() == url){
+ return;
+ }
+ }
+
+ currentItems->clear();
+ currentItems->append(new KFileItem(S_IFDIR, KFileItem::Unknown, url, true));
+ }
+
+ else if(count == 1){
+ if(newItem){
+ if(newItem->url().isEmpty()){
+ return;
+ }
+
+ if(currentItems->count() == items.count() && oldItem){
+ if(newItem->url() == oldItem->url()){
+ return;
+ }
+ }
+ }
+
+ currentItems = new KFileItemList(items);
+ }
+
+ else{
+ if(currentItems && *currentItems == items){
+ return;
+ }
+ currentItems = new KFileItemList(items);
+ }
+ }
+ else{
+ currentItems = new KFileItemList(items);
+ }
+
+ if(currentPlugin){
+ currentPlugin->deactivate();
+ }
+
+ QString protocol = currentItems->getFirst()->url().protocol();
+ currentPlugin = plugins[protocol];
+
+ if(!currentPlugin){
+ currentPlugin = defaultPlugin;
+ }
+
+ ProtocolPlugin::activePlugin = currentPlugin;
+ currentPlugin->setFileItems(*currentItems);
+}
+
+QString MetabarWidget::getCurrentURL()
+{
+ DCOPRef ref(kapp->dcopClient()->appId(), this->topLevelWidget()->name());
+ DCOPReply reply = ref.call("currentURL()");
+
+ if (reply.isValid()) {
+ QString url;
+ reply.get(url, "QString");
+
+ if(!url.isNull() && !url.isEmpty()){
+ return url;
+ }
+ }
+ return 0;
+}
+
+void MetabarWidget::openURL(const QString &url)
+{
+ DCOPRef ref(kapp->dcopClient()->appId(), this->topLevelWidget()->name());
+ DCOPReply reply = ref.call("openURL", url);
+}
+
+void MetabarWidget::openTab(const QString &url)
+{
+ DCOPRef ref(kapp->dcopClient()->appId(), this->topLevelWidget()->name());
+ DCOPReply reply = ref.call("newTab", url);
+}
+
+void MetabarWidget::callAction(const QString &action)
+{
+ DCOPRef ref(kapp->dcopClient()->appId(), QString(this->topLevelWidget()->name()).append("/action/").append(action).utf8());
+ if(ref.call("enabled()")){
+ ref.call("activate()");
+ }
+}
+
+void MetabarWidget::loadLinks()
+{
+ config->setGroup("General");
+ QStringList links = config->readListEntry("Links");
+
+ if(links.count() == 0){
+ functions->hide("links");
+ }
+ else{
+ functions->show("links");
+
+ DOM::HTMLDocument doc = html->htmlDocument();
+ DOM::HTMLElement node = doc.getElementById("links");
+
+ if(!node.isNull()){
+ DOM::DOMString innerHTML;
+
+ for(QStringList::Iterator it = links.begin(); it != links.end(); ++it){
+ config->setGroup("Link_" + (*it));
+ addEntry(innerHTML, config->readEntry("Name"), config->readEntry("URL"), config->readEntry("Icon", "folder"));
+ }
+
+ node.setInnerHTML(innerHTML);
+ }
+
+ functions->adjustSize("links");
+ }
+}
+
+void MetabarWidget::loadCompleted()
+{
+ DOM::HTMLDocument doc = html->htmlDocument();
+
+ DOM::NodeList i18n_a_list = doc.getElementsByTagName("a");
+ for(uint i = 0; i < i18n_a_list.length(); i++){
+ DOM::HTMLElement node = static_cast<DOM::HTMLElement>(i18n_a_list.item(i));
+ if(!node.isNull()){
+ if(node.hasAttribute("i18n")){
+ QString text = node.innerText().string();
+ node.setInnerText(DOM::DOMString(i18n(text.utf8().data())));
+ }
+
+ if(node.hasAttribute("image")){
+ QString icon = node.getAttribute("image").string();
+ QString url = getIconPath(icon);
+ QString style = QString("background-image: url(%1);").arg(url);
+
+ node.setAttribute("style", style);
+ }
+ }
+ }
+
+ DOM::NodeList i18n_ul_list = doc.getElementsByTagName("ul");
+ for(uint i = 0; i < i18n_ul_list.length(); i++){
+ DOM::HTMLElement node = static_cast<DOM::HTMLElement>(i18n_ul_list.item(i));
+ if(!node.isNull()){
+ if(node.hasAttribute("i18n")){
+ QString text = node.innerText().string();
+ node.setInnerText(DOM::DOMString(i18n(text.utf8().data())));
+ }
+ }
+ }
+
+ config->setGroup("General");
+ QString file = locate("data", QString("metabar/themes/%1/default.css").arg(config->readEntry("Theme", "default")));
+ if(file.isNull()){
+ file = locate("data", QString("metabar/themes/default/default.css"));
+ }
+
+ QFile cssfile(file);
+ if(cssfile.open(IO_ReadOnly)){
+ QTextStream stream( &cssfile );
+ QString tmp = stream.read();
+ cssfile.close();
+
+ tmp.replace("./", KURL::fromPathOrURL(file).directory(false));
+ html->setUserStyleSheet(tmp);
+ }
+
+ loadComplete = true;
+ html->view()->setFrameShape(config->readBoolEntry("ShowFrame", true) ? QFrame::StyledPanel : QFrame::NoFrame);
+ html->view()->show();
+
+ if(currentItems && !currentItems->isEmpty()){
+ setFileItems(*currentItems, false);
+ }
+ else{
+ QString url = getCurrentURL();
+ KFileItem *item = new KFileItem(KFileItem::Unknown, KFileItem::Unknown, KURL(url), true);
+ KFileItemList list;
+ list.append(item);
+ setFileItems(list, false);
+ }
+
+ loadLinks();
+}
+
+void MetabarWidget::handleURLRequest(const KURL &url, const KParts::URLArgs &args)
+{
+ if(!currentPlugin){
+ return;
+ }
+
+ QString protocol = url.protocol();
+
+ if(currentPlugin->handleRequest(url)){
+ return;
+ }
+
+ if(protocol == "desktop"){
+ QString path = url.path();
+
+ if(KDesktopFile::isDesktopFile(path)){
+ KRun::run(new KDesktopFile(path, true), KURL::List());
+ }
+ }
+
+ else if(protocol == "kcmshell"){
+ QString module = url.path().remove('/');
+
+ KRun::runCommand("kcmshell " + module);
+ }
+
+ else if(protocol == "action"){
+ QString action = url.url().right(url.url().length() - 9);
+ if(action.startsWith("metabar/")){
+ QString newact = action.right(action.length() - 8);
+
+ if(newact == "share"){
+ slotShowSharingDialog();
+ }
+ }
+ else{
+ callAction(action);
+ }
+ }
+
+ else if(protocol == "preview"){
+ if(currentItems && !currentItems->isEmpty()){
+ KFileItem *item = currentItems->getFirst();
+
+ DOM::HTMLDocument doc = html->htmlDocument();
+ DOM::HTMLElement node = static_cast<DOM::HTMLElement>(doc.getElementById("preview"));
+ DOM::HTMLImageElement image = static_cast<DOM::HTMLImageElement>(doc.getElementById("previewimage"));
+
+ if(!node.isNull()){
+ skip = true; //needed to prevent some weired reload
+
+ DOM::DOMString innerHTML;
+ innerHTML += QString("<ul style=\"width: %1px; height: %1px\">").arg(image.width(), image.height());
+ innerHTML += "<object class=\"preview\" type=\"";
+ innerHTML += item->mimetype();
+ innerHTML += "\" data=\"";
+ innerHTML += item->url().url();
+ innerHTML += "\" width=\"";
+ innerHTML += QString().setNum(image.width());
+ innerHTML += "\" height=\"";
+ innerHTML += QString().setNum(image.height());
+ innerHTML += "\" /></ul>";
+ node.setInnerHTML(innerHTML);
+ }
+ }
+ }
+
+ else if(protocol == "more"){
+ QString name = url.host();
+
+ DOM::HTMLDocument doc = html->htmlDocument();
+ DOM::NodeList list = doc.getElementsByName(name);
+ DOM::HTMLElement element = static_cast<DOM::HTMLElement>(doc.getElementById(name));
+ bool showMore = true;
+
+ for(uint i = 0; i < list.length(); i++){
+ DOM::HTMLElement node = static_cast<DOM::HTMLElement>(list.item(i));
+ if(!node.isNull()){
+ DOM::HTMLElement parent = static_cast<DOM::HTMLElement>(node.parentNode());
+ DOM::CSSStyleDeclaration style = parent.style();
+ DOM::DOMString display = style.getPropertyValue("display");
+ DOM::DOMString newDisplay = display == "none" ? "block" : "none";
+
+ style.setProperty("display", newDisplay, "important");
+
+ showMore = display == "block";
+ }
+ }
+
+ if(element.id().string().startsWith("hidden")){
+ QString style = QString("background-image: url(%1);").arg(getIconPath(showMore ? "1downarrow" : "1uparrow"));
+ element.setInnerText( showMore ? i18n("More") : i18n("Less") );
+ element.setAttribute("style", style);
+ }
+
+ DOM::HTMLElement parent = static_cast<DOM::HTMLElement>(element.parentNode().parentNode());
+ functions->adjustSize(parent.id());
+ }
+
+ else if(protocol == "function"){
+ functions->handleRequest(url);
+ }
+
+ else if(protocol == "configure"){
+ slotShowConfig();
+ }
+
+ else if(protocol == "openwith"){
+ if(currentItems && !currentItems->isEmpty()){
+ KFileItem *item = currentItems->getFirst();
+
+ KRun::displayOpenWithDialog(KURL::List(item->url()), false);
+ }
+ }
+
+ else{
+ if(args.newTab()){
+ openTab(url.url());
+ }
+ else{
+ openURL(url.url());
+ }
+ }
+}
+
+QString MetabarWidget::getIconPath(const QString &name)
+{
+ QPixmap icon = SmallIcon(name);
+
+ QByteArray data;
+ QBuffer buffer(data);
+ buffer.open(IO_WriteOnly);
+ icon.save(&buffer, "PNG");
+
+ return QString::fromLatin1("data:image/png;base64,%1").arg(KCodecs::base64Encode(data));
+}
+
+void MetabarWidget::slotShowSharingDialog()
+{
+ if(currentItems && currentItems->count() == 1){
+ KPropertiesDialog *dialog = new KPropertiesDialog(currentItems->first(), 0, 0, true);
+ dialog->showFileSharingPage();
+ }
+}
+
+void MetabarWidget::slotShowConfig()
+{
+ ConfigDialog *config_dialog = new ConfigDialog(this);
+ if(config_dialog->exec() == QDialog::Accepted){
+ config->reparseConfiguration();
+
+ setFileItems(*currentItems, false);
+ loadLinks();
+
+ setTheme();
+
+ html->view()->setFrameShape(config->readBoolEntry("ShowFrame", true) ? QFrame::StyledPanel : QFrame::NoFrame);
+ }
+
+ delete config_dialog;
+}
+
+void MetabarWidget::slotShowPopup(const QString &url, const QPoint &point)
+{
+ popup->exec(point);
+}
+
+void MetabarWidget::slotUpdateCurrentInfo(const QString &path)
+{
+ if(currentItems){
+ KFileItem *item = new KFileItem(KFileItem::Unknown, KFileItem::Unknown, KURL(path), true);
+
+ if(currentItems->count() == 1){
+ currentItems->clear();
+ currentItems->append(item);
+ }
+
+ setFileItems(*currentItems, false);
+ }
+}
+
+void MetabarWidget::slotDeleteCurrentInfo(const QString&)
+{
+ if(currentItems && currentItems->count() == 1){
+ QString url = getCurrentURL();
+ KURL currentURL;
+
+ if(currentItems){
+ currentURL = currentItems->getFirst()->url();
+ }
+
+ if(!currentURL.isEmpty() && KURL(url) != currentURL){
+ if(dir_watch->contains(currentURL.path())){
+ dir_watch->removeDir(currentURL.path());
+ }
+ dir_watch->addDir(url);
+
+ KFileItem *item = new KFileItem(KFileItem::Unknown, KFileItem::Unknown, url, true);
+
+ currentItems->clear();
+ currentItems->append(item);
+
+ setFileItems(*currentItems, false);
+ }
+ }
+}
+
+void MetabarWidget::addEntry(DOM::DOMString &html, const QString name, const QString url, const QString icon, const QString id, const QString nameatt, bool hidden)
+{
+ html += "<ul";
+
+ if(hidden){
+ html += " style=\"display: none;\"";
+ }
+
+ html += "><a";
+
+ if(!id.isNull() && !id.isEmpty()){
+ html += " id=\"";
+ html += id;
+ html += "\"";
+ }
+
+ if(!nameatt.isNull() && !nameatt.isEmpty()){
+ html += " name=\"";
+ html += nameatt;
+ html += "\"";
+ }
+
+ html += " href=\"";
+ html += url;
+ html += "\" onClick=\"this.blur();\" style=\"background-image: url(";
+ html += getIconPath(icon);
+ html += ");\">";
+ html += name;
+ html += "</a></ul>";
+}
+
+void MetabarWidget::setTheme()
+{
+ loadComplete = false;
+
+ config->setGroup("General");
+ QString file = locate("data", QString("metabar/themes/%1/layout.html").arg(config->readEntry("Theme", "default")));
+
+ html->openURL(KURL(file));
+}
+
+#include "metabarwidget.moc"
diff --git a/konq-plugins/sidebar/metabar/src/metabarwidget.h b/konq-plugins/sidebar/metabar/src/metabarwidget.h
new file mode 100644
index 0000000..a0acb41
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/metabarwidget.h
@@ -0,0 +1,88 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Florian Roth *
+ * florian@synatic.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef METABAR_WIDGET_H
+#define METABAR_WIDGET_H
+
+#include <khtml_part.h>
+
+#include <kconfig.h>
+#include <kfileitem.h>
+#include <kurl.h>
+#include <kservice.h>
+#include <kpopupmenu.h>
+#include <kdirwatch.h>
+
+#include <qmap.h>
+
+#include "protocolplugin.h"
+#include "metabarfunctions.h"
+
+class MetabarWidget : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ MetabarWidget(QWidget *parent = 0, const char* name=0);
+ ~MetabarWidget();
+
+ void setFileItems(const KFileItemList &items, bool check = true);
+
+ static QString getIconPath(const QString &name);
+ static void addEntry(DOM::DOMString &html, const QString name, const QString url, const QString icon, const QString id = QString::null, const QString nameatt = QString::null, bool hidden = false);
+
+ private:
+ KFileItemList *currentItems;
+ KConfig *config;
+
+ KHTMLPart *html;
+
+ ProtocolPlugin *currentPlugin;
+ ProtocolPlugin *defaultPlugin;
+
+ MetabarFunctions *functions;
+
+ KDirWatch *dir_watch;
+ KPopupMenu *popup;
+
+ QDict<ProtocolPlugin> plugins;
+
+ bool skip;
+ bool loadComplete;
+
+ void callAction(const QString &action);
+ void openURL(const QString &url);
+ void openTab(const QString &url);
+ void loadLinks();
+
+ QString getCurrentURL();
+
+ private slots:
+ void loadCompleted();
+ void slotShowSharingDialog();
+ void slotShowConfig();
+ void slotShowPopup(const QString &url, const QPoint &pos);
+ void handleURLRequest(const KURL &url, const KParts::URLArgs &args);
+ void slotUpdateCurrentInfo(const QString &path);
+ void slotDeleteCurrentInfo(const QString &path);
+ void setTheme();
+};
+
+#endif
diff --git a/konq-plugins/sidebar/metabar/src/protocolplugin.cpp b/konq-plugins/sidebar/metabar/src/protocolplugin.cpp
new file mode 100644
index 0000000..10fd784
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/protocolplugin.cpp
@@ -0,0 +1,157 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Florian Roth *
+ * florian@synatic.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include "protocolplugin.h"
+
+#include <qbuffer.h>
+
+#include <kimageio.h>
+#include <kmdcodec.h>
+#include <kiconloader.h>
+#include <klocale.h>
+
+#include <html_document.h>
+#include <html_image.h>
+
+ProtocolPlugin* ProtocolPlugin::activePlugin = 0;
+
+ProtocolPlugin::ProtocolPlugin(KHTMLPart *html, MetabarFunctions *functions, const char* name) : QObject(html, name), m_html(html), m_functions(functions)
+{
+}
+
+ProtocolPlugin::~ProtocolPlugin()
+{
+}
+
+void ProtocolPlugin::setFileItems(const KFileItemList &items)
+{
+ m_items = items;
+
+ killJobs();
+
+ DOM::HTMLDocument doc = m_html->htmlDocument();
+ DOM::HTMLElement actions = doc.getElementById("actions");
+ DOM::HTMLElement applications = doc.getElementById("open");
+ DOM::HTMLElement info = doc.getElementById("info");
+ DOM::HTMLElement preview = doc.getElementById("preview");
+ DOM::HTMLElement bookmarks = doc.getElementById("bookmarks");
+
+ DOM::HTMLImageElement icon = (DOM::HTMLImageElement) doc.getElementById("icon");
+ DOM::HTMLElement name = doc.getElementById("name");
+ DOM::HTMLElement type = doc.getElementById("type");
+ DOM::HTMLElement size = doc.getElementById("size");
+
+ if(!icon.isNull()){
+ QPixmap pix;
+ if(m_items.count() == 1){
+ pix = m_items.getFirst()->pixmap(KIcon::SizeLarge);
+ }
+ else{
+ pix = DesktopIcon("kmultiple", KIcon::SizeLarge);
+ }
+
+ QByteArray data;
+ QBuffer buffer(data);
+ buffer.open(IO_WriteOnly);
+ pix.save(&buffer, "PNG");
+ QString icondata = QString::fromLatin1("data:image/png;base64,%1").arg(KCodecs::base64Encode(data));
+
+ icon.setSrc(icondata);
+ }
+
+ if(!name.isNull()){
+ if(m_items.count() == 1){
+ name.setInnerText(m_items.getFirst()->name());
+ }
+ else{
+ name.setInnerText(i18n("%1 Elements").arg(m_items.count()));
+ }
+ }
+
+ if(!type.isNull()){
+ if(m_items.count() == 1){
+ KFileItem *item = m_items.getFirst();
+ KFileItem *that = const_cast<KFileItem *>(item);
+
+ type.setInnerText(that->determineMimeType()->comment());
+ }
+ else{
+ int files = 0;
+ int dirs = 0;
+
+ for(KFileItemListIterator it(m_items); it.current(); ++it){
+ if((*it)->isDir()){
+ dirs++;
+ }
+ else{
+ files++;
+ }
+ }
+
+ type.setInnerText(i18n("%1 Folders, %2 Files").arg(dirs).arg(files));
+ }
+
+
+ }
+
+ if(!size.isNull()){
+ KIO::filesize_t s = 0;
+
+ for(KFileItemListIterator it(m_items); it.current(); ++it){
+ s += (*it)->size();
+ }
+
+ size.setInnerText(KIO::convertSize(s));
+ }
+
+ if(!actions.isNull()){
+ loadActions(actions);
+ m_functions->adjustSize("actions");
+ }
+
+ if(!applications.isNull()){
+ loadApplications(applications);
+ m_functions->adjustSize("open");
+ }
+
+ if(!info.isNull()){
+ loadInformation(info);
+ m_functions->adjustSize("info");
+ }
+
+ if(!preview.isNull()){
+ loadPreview(preview);
+ m_functions->adjustSize("preview");
+ }
+
+ if(!bookmarks.isNull()){
+ loadBookmarks(bookmarks);
+ m_functions->adjustSize("bookmarks");
+ }
+
+ doc.updateRendering();
+}
+
+bool ProtocolPlugin::isActive()
+{
+ return activePlugin == this;
+}
+
+#include "protocolplugin.moc"
diff --git a/konq-plugins/sidebar/metabar/src/protocolplugin.h b/konq-plugins/sidebar/metabar/src/protocolplugin.h
new file mode 100644
index 0000000..9202df3
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/protocolplugin.h
@@ -0,0 +1,60 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Florian Roth *
+ * florian@synatic.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef _PROTOCOL_PLUGIN_H
+#define _PROTOCOL_PLUGIN_H
+
+#include <kfileitem.h>
+#include <khtml_part.h>
+
+#include <html_element.h>
+
+#include "metabarfunctions.h"
+
+class ProtocolPlugin : public QObject{
+ Q_OBJECT
+
+ public:
+ static ProtocolPlugin* activePlugin;
+
+ ProtocolPlugin(KHTMLPart *html, MetabarFunctions *functions, const char* name = 0);
+ ~ProtocolPlugin();
+
+ void setFileItems(const KFileItemList &items);
+ bool isActive();
+
+ virtual bool handleRequest(const KURL &url) = 0;
+ virtual void deactivate() = 0;
+
+ protected:
+ virtual void killJobs() = 0;
+
+ virtual void loadActions(DOM::HTMLElement node) = 0;
+ virtual void loadApplications(DOM::HTMLElement node) = 0;
+ virtual void loadInformation(DOM::HTMLElement node) = 0;
+ virtual void loadPreview(DOM::HTMLElement node) = 0;
+ virtual void loadBookmarks(DOM::HTMLElement node) = 0;
+
+ KFileItemList m_items;
+ KHTMLPart *m_html;
+ MetabarFunctions *m_functions;
+};
+
+#endif
diff --git a/konq-plugins/sidebar/metabar/src/remoteplugin.cpp b/konq-plugins/sidebar/metabar/src/remoteplugin.cpp
new file mode 100644
index 0000000..6d9a2dc
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/remoteplugin.cpp
@@ -0,0 +1,52 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Florian Roth *
+ * florian@synatic.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include "remoteplugin.h"
+
+#include <kservice.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+
+RemotePlugin::RemotePlugin(KHTMLPart* html, MetabarFunctions *functions, const char *name) : DefaultPlugin (html, functions, name)
+{
+}
+
+RemotePlugin::~RemotePlugin()
+{
+}
+
+void RemotePlugin::loadActions(DOM::HTMLElement node)
+{
+ KService::Ptr service = KService::serviceByDesktopName("knetattach");
+
+ if(service && service->isValid()){
+ DOM::DOMString innerHTML;
+ MetabarWidget::addEntry(innerHTML, i18n("Add a Network Folder"), "desktop://" + locate("apps", service->desktopEntryPath()), "wizard");
+ node.setInnerHTML(innerHTML);
+
+ m_functions->show("actions");
+ }
+
+ else{
+ m_functions->hide("actions");
+ }
+}
+
+#include "remoteplugin.moc"
diff --git a/konq-plugins/sidebar/metabar/src/remoteplugin.h b/konq-plugins/sidebar/metabar/src/remoteplugin.h
new file mode 100644
index 0000000..f77bbfd
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/remoteplugin.h
@@ -0,0 +1,37 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Florian Roth *
+ * florian@synatic.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef _REMOTE_PLUGIN_H_
+#define _REMOTE_PLUGIN_H_
+
+#include "defaultplugin.h"
+
+class RemotePlugin : public DefaultPlugin
+{
+ Q_OBJECT
+
+ public:
+ RemotePlugin(KHTMLPart* html, MetabarFunctions *functions, const char *name = 0);
+ ~RemotePlugin();
+
+ void loadActions(DOM::HTMLElement node);
+};
+
+#endif
diff --git a/konq-plugins/sidebar/metabar/src/serviceloader.cpp b/konq-plugins/sidebar/metabar/src/serviceloader.cpp
new file mode 100644
index 0000000..7c7e544
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/serviceloader.cpp
@@ -0,0 +1,213 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Florian Roth *
+ * florian@synatic.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include "serviceloader.h"
+
+#include <qdir.h>
+#include <qvaluelist.h>
+#include <qptrlist.h>
+
+#include <dcopclient.h>
+
+#include <kapplication.h>
+#include <kdebug.h>
+#include <kactioncollection.h>
+#include <kiconloader.h>
+#include <kaction.h>
+#include <kshortcut.h>
+#include <ksimpleconfig.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+
+
+ServiceLoader::ServiceLoader(QWidget *parent, const char *name) : QObject(parent, name)
+{
+ popups.setAutoDelete(true);
+}
+
+ServiceLoader::~ServiceLoader()
+{
+}
+
+void ServiceLoader::loadServices(const KFileItem item, DOM::DOMString &html, int &count)
+{
+ popups.clear();
+
+ KURL url = item.url();
+ QString mimeType = item.mimetype();
+ QString mimeGroup = mimeType.left(mimeType.find('/'));
+
+ urlList.clear();
+ urlList.append(url);
+
+ QStringList dirs = KGlobal::dirs()->findDirs( "data", "konqueror/servicemenus/" );
+ KConfig config("metabarrc", true, false);
+ config.setGroup("General");
+ int maxActions = config.readNumEntry("MaxActions");
+ bool matchAll = false; // config.readBoolEntry("MatchAll");
+
+ int id = 0;
+ QString idString;
+
+ for(QStringList::Iterator dit = dirs.begin(); dit != dirs.end(); ++dit){
+ idString.setNum(id);
+
+ QDir dir(*dit);
+ QStringList entries = dir.entryList("*.desktop", QDir::Files);
+
+ for(QStringList::Iterator eit = entries.begin(); eit != entries.end(); ++eit){
+ KSimpleConfig cfg( *dit + *eit, true );
+ cfg.setDesktopGroup();
+
+ if(cfg.hasKey("X-KDE-ShowIfRunning" )){
+ const QString app = cfg.readEntry( "X-KDE-ShowIfRunning" );
+ if(!kapp->dcopClient()->isApplicationRegistered(app.utf8())){
+ continue;
+ }
+ }
+
+ if(cfg.hasKey("X-KDE-Protocol")){
+ const QString protocol = cfg.readEntry( "X-KDE-Protocol" );
+ if(protocol != url.protocol()){
+ continue;
+ }
+ }
+
+ else if(url.protocol() == "trash"){
+ continue;
+ }
+
+ if(cfg.hasKey("X-KDE-Require")){
+ const QStringList capabilities = cfg.readListEntry( "X-KDE-Require" );
+ if (capabilities.contains( "Write" )){
+ continue;
+ }
+ }
+
+ if ( cfg.hasKey( "Actions" ) && cfg.hasKey( "ServiceTypes" ) ){
+ const QStringList types = cfg.readListEntry( "ServiceTypes" );
+ const QStringList excludeTypes = cfg.readListEntry( "ExcludeServiceTypes" );
+ bool ok = false;
+
+ for (QStringList::ConstIterator it = types.begin(); it != types.end() && !ok; ++it){
+ bool checkTheMimetypes = false;
+
+ if(matchAll){
+ // first check if we have an all mimetype
+ if (*it == "all/all" || *it == "allfiles"){
+ checkTheMimetypes = true;
+ }
+
+ // next, do we match all files?
+ if (!ok && !item.isDir() && *it == "all/allfiles"){
+ checkTheMimetypes = true;
+ }
+ }
+
+ // if we have a mimetype, see if we have an exact or a type globbed match
+ if(!ok && (!mimeType.isEmpty() && *it == mimeType) ||
+ (!mimeGroup.isEmpty() && ((*it).right(1) == "*" && (*it).left((*it).find('/')) == mimeGroup)))
+ {
+ checkTheMimetypes = true;
+ }
+
+ if(checkTheMimetypes){
+ ok = true;
+
+ for(QStringList::ConstIterator itex = excludeTypes.begin(); itex != excludeTypes.end(); ++itex){
+ if( ((*itex).right(1) == "*" && (*itex).left((*itex).find('/')) == mimeGroup) ||
+ ((*itex) == mimeType))
+ {
+ ok = false;
+ break;
+ }
+ }
+ }
+ }
+ if (ok){
+ const QString priority = cfg.readEntry("X-KDE-Priority");
+ const QString submenuName = cfg.readEntry( "X-KDE-Submenu" );
+ bool usePopup = false;
+ KPopupMenu *popup;
+
+ if(!submenuName.isEmpty()){
+ usePopup = true;
+
+ if(popups[submenuName]){
+ popup = popups[submenuName];
+ }
+ else{
+ MetabarWidget::addEntry(html, submenuName, "servicepopup://" + idString, "1rightarrow", "popup" + idString, count < maxActions ? QString::null : QString("hiddenaction"), count >= maxActions);
+
+ popup = new KPopupMenu();
+ popups.insert(idString, popup);
+
+ count++;
+ }
+ }
+
+ QValueList<KDEDesktopMimeType::Service> list = KDEDesktopMimeType::userDefinedServices( *dit + *eit, url.isLocalFile());
+
+ for (QValueList<KDEDesktopMimeType::Service>::iterator it = list.begin(); it != list.end(); ++it){
+
+ if(usePopup){
+ KAction *action = new KAction((*it).m_strName, (*it).m_strIcon, KShortcut(), this, SLOT(runAction()), popup, idString.utf8());
+ action->plug(popup);
+ }
+ else{
+ MetabarWidget::addEntry(html, (*it).m_strName, "service://" + idString, (*it).m_strIcon, QString::null, count < maxActions ? QString::null : QString("hiddenaction"), count >= maxActions);
+ count++;
+ }
+
+ services.insert(idString, *it);
+ id++;
+ idString.setNum(id);
+ }
+ }
+ }
+ }
+ }
+}
+
+void ServiceLoader::runAction()
+{
+ KDEDesktopMimeType::Service s = services[sender()->name()];
+ if(!s.isEmpty()){
+ KDEDesktopMimeType::executeService(urlList, s);
+ }
+}
+
+void ServiceLoader::runAction(const QString& name)
+{
+ KDEDesktopMimeType::Service s = services[name];
+ if(!s.isEmpty()){
+ KDEDesktopMimeType::executeService(urlList, s);
+ }
+}
+
+void ServiceLoader::showPopup(const QString &popup, const QPoint &point)
+{
+ KPopupMenu *p = popups[popup];
+ if(p){
+ p->exec(point);
+ }
+}
+
+#include "serviceloader.moc"
diff --git a/konq-plugins/sidebar/metabar/src/serviceloader.h b/konq-plugins/sidebar/metabar/src/serviceloader.h
new file mode 100644
index 0000000..293ae6b
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/serviceloader.h
@@ -0,0 +1,59 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Florian Roth *
+ * florian@synatic.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef _SERVICELOADER_H_
+#define _SERVICELOADER_H_
+
+#include <qstring.h>
+#include <qdict.h>
+#include <qmap.h>
+#include <qwidget.h>
+
+#include <kpopupmenu.h>
+#include <kfileitem.h>
+#include <kmimetype.h>
+#include <kurl.h>
+
+#include <dom_string.h>
+
+#include "metabarwidget.h"
+
+class ServiceLoader : public QObject
+{
+ Q_OBJECT
+
+ public:
+ ServiceLoader(QWidget *parent, const char *name = 0);
+ ~ServiceLoader();
+
+ void loadServices(const KFileItem item, DOM::DOMString &html, int &count);
+ void runAction(const QString &name);
+ void showPopup(const QString &popup, const QPoint &point);
+
+ private:
+ QDict<KPopupMenu> popups;
+ QMap<QString,KDEDesktopMimeType::Service> services;
+ KURL::List urlList;
+
+ private slots:
+ void runAction();
+};
+
+#endif
diff --git a/konq-plugins/sidebar/metabar/src/settingsplugin.cpp b/konq-plugins/sidebar/metabar/src/settingsplugin.cpp
new file mode 100644
index 0000000..1fb9e50
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/settingsplugin.cpp
@@ -0,0 +1,201 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Florian Roth *
+ * florian@synatic.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include "metabarwidget.h"
+#include "settingsplugin.h"
+
+#include <kcmoduleinfo.h>
+#include <kservice.h>
+#include <klocale.h>
+
+#include <html_document.h>
+#include <html_element.h>
+#include <dom_string.h>
+
+SettingsPlugin::SettingsPlugin(KHTMLPart* html, MetabarFunctions *functions, const char *name) : ProtocolPlugin (html, functions, name)
+{
+ list_job = 0;
+}
+
+SettingsPlugin::~SettingsPlugin()
+{
+}
+
+void SettingsPlugin::killJobs()
+{
+ if(list_job){
+ list_job->kill();
+ list_job = 0;
+ }
+}
+
+void SettingsPlugin::deactivate()
+{
+ m_functions->hide("actions");
+ m_functions->hide("info");
+}
+
+void SettingsPlugin::loadActions(DOM::HTMLElement node)
+{
+ KURL url = m_items.getFirst()->url();
+
+ if(url.path().endsWith("/")){
+ list_job = KIO::listDir(url, true, false);
+ connect(list_job, SIGNAL(entries(KIO::Job *, const KIO::UDSEntryList &)), this, SLOT(slotGotEntries(KIO::Job *, const KIO::UDSEntryList &)));
+ connect(list_job, SIGNAL(result(KIO::Job *)), this, SLOT(slotJobFinished(KIO::Job *)));
+
+ m_functions->show("actions");
+ }
+ else{
+ QString path = url.path();
+ QString name = url.filename();
+
+ KService::Ptr service = KService::serviceByStorageId(name);
+ if(service && service->isValid()){
+ KCModuleInfo kcminfo(service);
+
+ DOM::DOMString innerHTML;
+ MetabarWidget::addEntry(innerHTML, i18n("Run"), "kcmshell:/" + name, kcminfo.icon());
+ node.setInnerHTML(innerHTML);
+
+ m_functions->show("actions");
+ }
+ else{
+ m_functions->hide("actions");
+ }
+ }
+}
+
+void SettingsPlugin::loadInformation(DOM::HTMLElement node)
+{
+ KURL url = m_items.getFirst()->url();
+ if(url.path().endsWith("/")){
+ m_functions->hide("info");
+ }
+ else{
+ QString path = url.path();
+ QString name = url.filename();
+
+ KService::Ptr service = KService::serviceByStorageId(name);
+ if(service && service->isValid()){
+ KCModuleInfo kcminfo(service);
+
+ bool needsRoot = kcminfo.needsRootPrivileges();
+
+ DOM::DOMString innerHTML;
+ innerHTML += "<ul class=\"info\"><b>" + i18n("Name") + ": </b>";
+ innerHTML += kcminfo.moduleName();
+ innerHTML += "</ul><ul class=\"info\"><b>" + i18n("Comment") + ": </b>";
+ innerHTML += kcminfo.comment();
+ innerHTML += "</ul>";
+
+ if(needsRoot){
+ innerHTML += "<ul class=\"info\"><b>";
+ innerHTML += i18n("Needs root privileges");
+ innerHTML += "</b></ul>";
+ }
+ node.setInnerHTML(innerHTML);
+
+ m_functions->show("info");
+ }
+ else{
+ m_functions->hide("info");
+ }
+ }
+}
+
+void SettingsPlugin::loadApplications(DOM::HTMLElement node)
+{
+ m_functions->hide("open");
+}
+
+void SettingsPlugin::loadPreview(DOM::HTMLElement node)
+{
+ m_functions->hide("preview");
+}
+
+void SettingsPlugin::loadBookmarks(DOM::HTMLElement node)
+{
+ m_functions->hide("bookmarks");
+}
+
+bool SettingsPlugin::handleRequest(const KURL &)
+{
+ return false;
+}
+
+void SettingsPlugin::slotGotEntries(KIO::Job *job, const KIO::UDSEntryList &list)
+{
+ if(!job){
+ return;
+ }
+
+ DOM::HTMLDocument doc = m_html->htmlDocument();
+ DOM::HTMLElement node = doc.getElementById("actions");
+ DOM::DOMString innerHTML;
+
+ KIO::UDSEntryList::ConstIterator it = list.begin();
+ KIO::UDSEntryList::ConstIterator it_end = list.end();
+ for(; it != it_end; ++it){
+ QString name;
+ QString icon;
+ QString url;
+ long type;
+
+ KIO::UDSEntry::ConstIterator atomit = (*it).begin();
+ KIO::UDSEntry::ConstIterator atomit_end = (*it).end();
+ for(; atomit != atomit_end; ++atomit){
+ if((*atomit).m_uds == KIO::UDS_NAME){
+ name = (*atomit).m_str;
+ }
+ else if((*atomit).m_uds == KIO::UDS_ICON_NAME){
+ icon = (*atomit).m_str;
+ }
+ else if((*atomit).m_uds == KIO::UDS_URL){
+ url = (*atomit).m_str;
+ }
+
+ else if((*atomit).m_uds == KIO::UDS_FILE_TYPE){
+ type = (*atomit).m_long;
+ }
+ }
+
+ kdDebug() << url << endl;
+
+ if(type == S_IFREG){
+ url = "kcmshell:/" + KURL(url).filename();
+ }
+
+ MetabarWidget::addEntry(innerHTML, name, url, icon);
+ }
+
+ node.setInnerHTML(innerHTML);
+}
+
+void SettingsPlugin::slotJobFinished(KIO::Job *job)
+{
+ if(list_job && job == list_job){
+ list_job = 0;
+
+ m_functions->adjustSize("actions");
+ }
+}
+
+#include "settingsplugin.moc"
diff --git a/konq-plugins/sidebar/metabar/src/settingsplugin.h b/konq-plugins/sidebar/metabar/src/settingsplugin.h
new file mode 100644
index 0000000..27f1097
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/src/settingsplugin.h
@@ -0,0 +1,56 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Florian Roth *
+ * florian@synatic.net *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program 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 the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef _SETTINGS_PLUGIN_H_
+#define _SETTINGS_PLUGIN_H_
+
+#include "protocolplugin.h"
+
+#include <kio/jobclasses.h>
+#include <kio/job.h>
+
+class SettingsPlugin : public ProtocolPlugin
+{
+ Q_OBJECT
+
+ public:
+ SettingsPlugin(KHTMLPart* html, MetabarFunctions *functions, const char *name = 0);
+ ~SettingsPlugin();
+
+ void deactivate();
+ bool handleRequest(const KURL &url);
+
+ protected:
+ void killJobs();
+ void loadActions(DOM::HTMLElement node);
+ void loadApplications(DOM::HTMLElement node);
+ void loadInformation(DOM::HTMLElement node);
+ void loadPreview(DOM::HTMLElement node);
+ void loadBookmarks(DOM::HTMLElement node);
+
+ private:
+ KIO::ListJob *list_job;
+
+ private slots:
+ void slotGotEntries(KIO::Job *job, const KIO::UDSEntryList &list);
+ void slotJobFinished(KIO::Job *job);
+};
+
+#endif
diff --git a/konq-plugins/sidebar/metabar/stamp-h.in b/konq-plugins/sidebar/metabar/stamp-h.in
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/konq-plugins/sidebar/metabar/stamp-h.in
diff --git a/konq-plugins/sidebar/newsticker/Makefile.am b/konq-plugins/sidebar/newsticker/Makefile.am
new file mode 100644
index 0000000..4dc9fae
--- /dev/null
+++ b/konq-plugins/sidebar/newsticker/Makefile.am
@@ -0,0 +1,36 @@
+SUBDIRS = . pics
+
+AM_CPPFLAGS = $(all_includes)
+METASOURCES = AUTO
+
+
+
+################################
+# these are the headers for your project
+noinst_HEADERS = nspanel.h nsstacktabwidget.h sidebar_news.h norsswidget.h
+
+kde_module_LTLIBRARIES = konq_sidebarnews.la
+
+# the Part's source, library search path, and link libraries
+konq_sidebarnews_la_SOURCES = sidebar_news.cpp sidebar_news.skel nsstacktabwidget.cpp \
+ nspanel.cpp nspanel.skel norsswidget.cpp \
+ sidebarsettings.kcfgc \
+ configfeedsbase.ui configfeeds.cpp
+konq_sidebarnews_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+konq_sidebarnews_la_LIBADD = $(LIB_KPARTS) $(LIB_KFILE) -lkonqsidebarplugin
+
+
+globaladddir = $(kde_datadir)/konqsidebartng/add
+globaladd_DATA = news_add.desktop
+
+kde_kcfg_DATA = konq_sidebarnews.kcfg
+
+
+
+############################
+#
+# i18n
+#
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/konqsidebar_news.pot
+
diff --git a/konq-plugins/sidebar/newsticker/README b/konq-plugins/sidebar/newsticker/README
new file mode 100644
index 0000000..65d15e6
--- /dev/null
+++ b/konq-plugins/sidebar/newsticker/README
@@ -0,0 +1,38 @@
+Konqsidebarnews is based on the rss DCOP service in
+kdenetwork/dcoprss. So you most likely you want to
+install it before using the sidebar applet.
+
+
+
+TODO
+====
+
+- better handling of starting up rssservice
+
+- less crashes (check for stupid user input, etc...)
+
+- cleanly recover from a crashing dcop service
+
+- documentation
+
+- accessibility aware UI
+
+- integration with kdenetwork/knewsticker
+
+
+
+THANKS TO
+=========
+
+- Joseph Wenningen (jowenn@kde.org)
+ idea and original code
+
+- Frerich Raabe (raabe@kde.org)
+ for kdenonbeta/librss where all the magic happens
+
+- Ian Reinhard Geiser (geiseri@kde.org)
+ for maintaining the DCOP service
+
+
+---
+Marcus Camen <mcamen@mcamen.de>
diff --git a/konq-plugins/sidebar/newsticker/configfeeds.cpp b/konq-plugins/sidebar/newsticker/configfeeds.cpp
new file mode 100644
index 0000000..c682ab3
--- /dev/null
+++ b/konq-plugins/sidebar/newsticker/configfeeds.cpp
@@ -0,0 +1,38 @@
+// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 8; -*-
+
+/***************************************************************************
+ configfeeds.cpp
+ Copyright: Marcus Camen <mcamen@mcamen.de>
+ Copyright: Nathan Toone <nathan@toonetown.com>
+***************************************************************************/
+
+/*
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "sidebarsettings.h"
+#include "configfeeds.h"
+
+
+namespace KSB_News {
+
+ConfigFeeds::ConfigFeeds(QWidget* parent, const char* name) : ConfigFeedsBase(parent, name)
+{
+}
+
+} // namespace KSB_News
+
+#include "configfeeds.moc"
diff --git a/konq-plugins/sidebar/newsticker/configfeeds.h b/konq-plugins/sidebar/newsticker/configfeeds.h
new file mode 100644
index 0000000..555b4f5
--- /dev/null
+++ b/konq-plugins/sidebar/newsticker/configfeeds.h
@@ -0,0 +1,53 @@
+// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 8; -*-
+
+/***************************************************************************
+ configfeeds.h
+ Copyright: Marcus Camen <mcamen@mcamen.de>
+ Copyright: Nathan Toone <nathan@toonetown.com>
+***************************************************************************/
+
+/*
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _konq_sidebar_news_configfeedsh_
+#define _konq_sidebar_news_configfeedsh_
+
+#include "configfeedsbase.h"
+
+
+//
+//
+// ATM this is just a noop wrapper
+//
+//
+
+
+namespace KSB_News {
+
+ class ConfigFeeds : public ConfigFeedsBase {
+
+ Q_OBJECT
+
+ public:
+ ConfigFeeds(QWidget* parent, const char* name = 0);
+
+ };
+
+} // namespace KSB_News
+
+
+#endif
diff --git a/konq-plugins/sidebar/newsticker/configfeedsbase.ui b/konq-plugins/sidebar/newsticker/configfeedsbase.ui
new file mode 100644
index 0000000..8389747
--- /dev/null
+++ b/konq-plugins/sidebar/newsticker/configfeedsbase.ui
@@ -0,0 +1,26 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>ConfigFeedsBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>ConfigFeedsBase</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KEditListBox">
+ <property name="name">
+ <cstring>kcfg_Sources</cstring>
+ </property>
+ <property name="title">
+ <string>RSS Feeds</string>
+ </property>
+ </widget>
+ </vbox>
+</widget>
+<layoutdefaults spacing="6" margin="0"/>
+<includehints>
+ <includehint>keditlistbox.h</includehint>
+ <includehint>klineedit.h</includehint>
+</includehints>
+</UI>
diff --git a/konq-plugins/sidebar/newsticker/konq_sidebarnews.kcfg b/konq-plugins/sidebar/newsticker/konq_sidebarnews.kcfg
new file mode 100644
index 0000000..7641ab2
--- /dev/null
+++ b/konq-plugins/sidebar/newsticker/konq_sidebarnews.kcfg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+ <kcfgfile name="konq_sidebarnewsrc"/>
+
+ <group name="RSS sources">
+ <entry name="Sources" type="StringList">
+ <label>List of RSS Sources</label>
+ <default>http://www.kde.org/dotkdeorg.rdf</default>
+ </entry>
+ </group>
+
+</kcfg>
diff --git a/konq-plugins/sidebar/newsticker/news_add.desktop b/konq-plugins/sidebar/newsticker/news_add.desktop
new file mode 100644
index 0000000..989abf3
--- /dev/null
+++ b/konq-plugins/sidebar/newsticker/news_add.desktop
@@ -0,0 +1,44 @@
+[Desktop Entry]
+Type=Link
+URL=
+Icon=konqsidebar_news
+Name=Newsticker
+Name[bs]=News Ticker
+Name[ca]=Teletip de notícies
+Name[da]=Nyhedstelegraf
+Name[eo]=Novaĵprezentilo
+Name[es]=Teletipo de noticias
+Name[et]=Uudistejälgija
+Name[fi]=Uutisnäyttäjä
+Name[fr]=Téléscripteur de nouvelles
+Name[gl]=Notícias
+Name[he]=מציג חדשות
+Name[hi]=न्यूज़टिकर
+Name[hr]=Obavijesti o novostima
+Name[hu]=Hírmegjelenítő
+Name[is]=Fréttastrimill
+Name[it]=NewsTicker
+Name[ja]=ニュースティッカー
+Name[ka]=სიახლეთა მიმღები
+Name[lt]=Naujienų pranešiklis
+Name[nb]=Nyhetstelegraf
+Name[nds]=Narichtentelegraaf
+Name[ne]=न्यूजटिकर
+Name[nn]=Nyhendetelegraf
+Name[pa]=ਖ਼ਬਰਸਾਰ
+Name[pl]=Pasek wiadomości
+Name[pt]=Notícias
+Name[pt_BR]=Mostrador de Notícias
+Name[ru]=Индикатор новостей
+Name[sk]=Sledovanie správ
+Name[sl]=Prikazovalnik novic
+Name[sv]=Nyhetsövervakare
+Name[ta]=புதிய நகரும் செய்தி
+Name[tr]=Haber Bandı
+Name[uk]=Стрічка новин
+Name[vi]=Bộ theo dõi tin tức
+Name[zh_CN]=新闻点点通
+Open=false
+X-KDE-KonqSidebarAddModule=konq_sidebarnews
+X-KDE-KonqSidebarUniversal=true
+TryExec=rssservice
diff --git a/konq-plugins/sidebar/newsticker/norsswidget.cpp b/konq-plugins/sidebar/newsticker/norsswidget.cpp
new file mode 100644
index 0000000..d4c803a
--- /dev/null
+++ b/konq-plugins/sidebar/newsticker/norsswidget.cpp
@@ -0,0 +1,100 @@
+// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 8; -*-
+
+/***************************************************************************
+ norsswidget.cpp
+ Copyright: Marcus Camen <mcamen@mcamen.de>
+***************************************************************************/
+
+/*
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qlayout.h>
+#include <qsizepolicy.h>
+#include <dcopref.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kpushbutton.h>
+#include <kdebug.h>
+#include <kconfigdialog.h>
+#include "sidebarsettings.h"
+#include "configfeeds.h"
+#include "norsswidget.h"
+
+
+namespace KSB_News {
+
+ NoRSSWidget::NoRSSWidget(QWidget *parent, const char *name)
+ : QWidget(parent, name) {
+
+ QVBoxLayout *topLayout = new QVBoxLayout(this);
+
+ topLayout->addStretch();
+
+ KPushButton *btn = new KPushButton(i18n("&Configure"), this);
+ btn->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum);
+ connect(btn, SIGNAL(clicked()), this, SLOT(slotBtnClicked()));
+ topLayout->addWidget(btn, 0, Qt::AlignHCenter);
+
+ topLayout->addStretch();
+ }
+
+
+ void NoRSSWidget::slotBtnClicked() {
+ // An instance of your dialog could be already created and could be
+ // cached, in which case you want to display the cached dialog
+ // instead of creating another one
+ if (KConfigDialog::showDialog("settings"))
+ return;
+
+ // KConfigDialog didn't find an instance of this dialog, so lets create it
+ m_confdlg = new KConfigDialog(this, "settings", SidebarSettings::self(),
+ KDialogBase::Plain,
+ KDialogBase::Ok|KDialogBase::Cancel|KDialogBase::Default,
+ KDialogBase::Ok,
+ true);
+ ConfigFeeds *conf_widget = new ConfigFeeds(0, "feedcfgdlg");
+ m_confdlg->addPage(conf_widget, i18n("RSS Settings"), "pixmap_name");
+
+ // User edited the configuration - update your local copies of the
+ // configuration data
+ connect(m_confdlg, SIGNAL(settingsChanged()), this,
+ SLOT(slotConfigure_okClicked()));
+
+ m_confdlg->show();
+ }
+
+
+ void NoRSSWidget::slotConfigure_okClicked() {
+ DCOPRef rss_document("rssservice", "RSSService");
+
+ // read list of sources
+ QStringList m_our_rsssources = SidebarSettings::sources();
+
+ // add new sources
+ QStringList::iterator it;
+ for (it = m_our_rsssources.begin(); it != m_our_rsssources.end(); ++it) {
+ rss_document.call("add", ( *it ));
+ }
+
+ // save configuration to disk
+ SidebarSettings::setSources(m_our_rsssources);
+ SidebarSettings::writeConfig();
+ }
+
+} // namespace KSB_News
+
+#include "norsswidget.moc"
diff --git a/konq-plugins/sidebar/newsticker/norsswidget.h b/konq-plugins/sidebar/newsticker/norsswidget.h
new file mode 100644
index 0000000..cebac3b
--- /dev/null
+++ b/konq-plugins/sidebar/newsticker/norsswidget.h
@@ -0,0 +1,51 @@
+// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 8; -*-
+
+/***************************************************************************
+ Copyright: norsswidget.h
+ Marcus Camen <mcamen@mcamen.de>
+***************************************************************************/
+
+/*
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _NORSSWIDGET_H_
+#define _NORSSWIDGET_H_
+
+
+class KConfigDialog;
+
+
+namespace KSB_News {
+
+ class NoRSSWidget : public QWidget {
+ Q_OBJECT
+
+ public:
+ NoRSSWidget(QWidget *parent = 0, const char *name = 0);
+
+ private slots:
+ void slotBtnClicked();
+ void slotConfigure_okClicked();
+
+ private:
+ KConfigDialog *m_confdlg;
+ };
+
+
+} // namespace KSB_News
+
+#endif
diff --git a/konq-plugins/sidebar/newsticker/nspanel.cpp b/konq-plugins/sidebar/newsticker/nspanel.cpp
new file mode 100644
index 0000000..8086b35
--- /dev/null
+++ b/konq-plugins/sidebar/newsticker/nspanel.cpp
@@ -0,0 +1,181 @@
+// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 8; -*-
+
+/***************************************************************************
+ Copyright: nspanel.cpp
+ Marcus Camen <mcamen@mcamen.de>
+***************************************************************************/
+
+/*
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qlistview.h>
+#include <qfontmetrics.h>
+#include <qtimer.h>
+#include <kdebug.h>
+#include <klistbox.h>
+#include "nspanel.h"
+
+
+namespace KSB_News {
+
+////////////////////////////////////////////////////////////////
+// ListBox including ToolTip for item
+////////////////////////////////////////////////////////////////
+ TTListBox::TTListBox(QWidget *parent, const char *name, WFlags f)
+ : KListBox(parent, name, f),
+ QToolTip(this) {
+ }
+
+ void TTListBox::clear() {
+ KListBox::clear();
+ }
+
+ void TTListBox::maybeTip(const QPoint &point) {
+ QListBoxItem *item = itemAt(point);
+ if (item) {
+ QString text = item->text();
+ if (!text.isEmpty()) {
+ // Show ToolTip only if necessary
+ QFontMetrics fm(fontMetrics());
+ int textWidth = fm.width(text);
+ int widgetSpace = visibleWidth();
+ if ((textWidth > widgetSpace) || (contentsX() > 0))
+ tip(itemRect(item), text);
+ }
+ }
+ }
+
+
+
+ NSPanel::NSPanel(QObject *parent, const char *name, const QString &key,
+ DCOPRef *rssservice)
+ :QObject(parent, name)
+ ,DCOPObject(QString(QString("sidebar-newsticker-")+key).latin1())
+ ,m_listbox()
+ ,m_pixmap()
+{
+ kdDebug(90140) << "NSPanel: CTOR " << key << " " << rssservice << endl;
+
+ m_rssservice = rssservice;
+ m_key = key;
+ m_rssdocument = m_rssservice->call("document(QString)", m_key);
+ m_isValid = false;
+
+ connectDCOPSignal("rssservice", m_rssdocument.obj(),
+ "documentUpdated(DCOPRef)",
+ "emitDocumentUpdated(DCOPRef)", false);
+ connectDCOPSignal("rssservice", m_rssdocument.obj(),
+ "documentUpdated(DCOPRef)",
+ "emitTitleUpdated(DCOPRef)", false);
+ connectDCOPSignal("rssservice", m_rssdocument.obj(),
+ "pixmapUpdated(DCOPRef)",
+ "emitPixmapUpdated(DCOPRef)", false);
+
+ // updating of RSS documents
+ m_timeoutinterval = 10 * 60 * 1000; // 10 mins
+ m_timer = new QTimer(this);
+ connect(m_timer, SIGNAL(timeout()), this, SLOT(refresh()));
+ m_timer->start(m_timeoutinterval);
+ refresh();
+ }
+
+
+ void NSPanel::refresh() {
+ m_rssdocument.call("refresh()");
+ }
+
+
+ NSPanel::~NSPanel() {
+ }
+
+
+ void NSPanel::setTitle(const QString &tit) {
+ m_title = tit;
+ }
+
+
+ void NSPanel::setListbox(TTListBox *lb) {
+ m_listbox = lb;
+ }
+
+
+ void NSPanel::setPixmap(const QPixmap &pm) {
+ m_pixmap = pm;
+ }
+
+
+ TTListBox *NSPanel::listbox() const {
+ return m_listbox;
+ }
+
+
+ QPixmap NSPanel::pixmap() {
+ return m_pixmap;
+ }
+
+
+ QString NSPanel::key() const {
+ return m_key;
+ }
+
+ QString NSPanel::title() const {
+ return m_title;
+ }
+
+ QStringList NSPanel::articles() {
+ return m_articles;
+ }
+
+ QStringList NSPanel::articleLinks() {
+ return m_articlelinks;
+ }
+
+ bool NSPanel::isValid() const {
+ return m_isValid;
+ }
+
+
+ void NSPanel::emitDocumentUpdated(DCOPRef /*dcopref*/) {
+ kdDebug(90140) << "NSPanel::emitDocumentUpdated" << endl;
+
+ m_articles.clear();
+ m_articlelinks.clear();
+ m_count = m_rssdocument.call("count()");
+ QString temp = m_rssdocument.call("title()");
+ m_title = temp;
+ m_isValid = true;
+ for (int idx = 0; idx < m_count; ++idx) {
+ DCOPRef rss_article = m_rssdocument.call("article(int)", idx);
+ m_articles.append(rss_article.call("title()"));
+ m_articlelinks.append(rss_article.call("link()"));
+ }
+
+ emit documentUpdated(this);
+ }
+
+ void NSPanel::emitPixmapUpdated(DCOPRef /*dcopref*/) {
+ if (m_rssdocument.call("pixmapValid()")) {
+ QPixmap tmp = m_rssdocument.call("pixmap()");
+ m_pixmap = tmp;
+
+ emit pixmapUpdated(this);
+ }
+ }
+
+} // namespace KSB_News
+
+#include "nspanel.moc"
diff --git a/konq-plugins/sidebar/newsticker/nspanel.h b/konq-plugins/sidebar/newsticker/nspanel.h
new file mode 100644
index 0000000..0f30152
--- /dev/null
+++ b/konq-plugins/sidebar/newsticker/nspanel.h
@@ -0,0 +1,109 @@
+// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 8; -*-
+
+/***************************************************************************
+ Copyright: nspanel.h
+ Marcus Camen <mcamen@mcamen.de>
+***************************************************************************/
+
+/*
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _konq_sidebar_news_nspanelh_
+#define _konq_sidebar_news_nspanelh_
+
+#include <qstring.h>
+#include <qpixmap.h>
+#include <qtooltip.h>
+#include <dcopref.h>
+#include <dcopobject.h>
+#include <kio/job.h>
+#include <klistbox.h>
+
+
+class QBuffer;
+class QTimer;
+
+namespace KSB_News {
+
+////////////////////////////////////////////////////////////////
+// ListBox including ToolTip for item
+////////////////////////////////////////////////////////////////
+ class TTListBox : public KListBox, QToolTip {
+ public:
+ TTListBox (QWidget *parent = 0, const char *name = 0, WFlags f = 0);
+ void clear();
+
+ protected:
+ virtual void maybeTip(const QPoint &);
+ };
+
+
+
+ class NSPanel : public QObject, public DCOPObject {
+ Q_OBJECT
+ K_DCOP
+
+ public:
+ NSPanel(QObject *parent, const char *name, const QString &key,
+ DCOPRef *rssservice);
+ ~NSPanel();
+
+ void setTitle(const QString &tit);
+ void setListbox(TTListBox *lb);
+ void setPixmap(const QPixmap &pm);
+ void setPixmapBuffer(QBuffer *buf);
+ void setJob(KIO::Job *kio_job);
+
+ TTListBox *listbox() const;
+ QPixmap pixmap();
+ QString key() const;
+ QString title() const;
+ QStringList articles();
+ QStringList articleLinks();
+ bool isValid() const;
+
+ k_dcop:
+ virtual void emitDocumentUpdated(DCOPRef);
+ virtual void emitPixmapUpdated(DCOPRef);
+
+ private:
+ DCOPRef *m_rssservice;
+ DCOPRef m_rssdocument;
+ QString m_key;
+ QString m_title;
+ TTListBox *m_listbox;
+ QPixmap m_pixmap;
+ int m_count;
+ QStringList m_articles; // TODO: use proper container
+ QStringList m_articlelinks; // TODO: use proper container
+ int m_timeoutinterval;
+ QTimer *m_timer;
+ bool m_isValid;
+
+ signals:
+ void documentUpdated(NSPanel *);
+ void pixmapUpdated(NSPanel *);
+
+ public slots:
+ void refresh();
+
+ };
+
+
+} // namespace KSB_News
+
+#endif
diff --git a/konq-plugins/sidebar/newsticker/nsstacktabwidget.cpp b/konq-plugins/sidebar/newsticker/nsstacktabwidget.cpp
new file mode 100644
index 0000000..74aa07e
--- /dev/null
+++ b/konq-plugins/sidebar/newsticker/nsstacktabwidget.cpp
@@ -0,0 +1,365 @@
+// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 8; -*-
+
+/***************************************************************************
+ nsstacktabwidget.cpp - description
+ -------------------
+ begin : Sat 07.09.2002
+ copyright : (C) 2002-2004 Marcus Camen
+ email : mcamen@mcamen.de
+***************************************************************************/
+
+/*
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qpushbutton.h>
+#include <qlayout.h>
+#include <qscrollview.h>
+#include <qptrdict.h>
+#include <qsizepolicy.h>
+#include <qtooltip.h>
+#include <qcursor.h>
+#include <qimage.h>
+#include <kdebug.h>
+#include <kaboutdata.h>
+#include <kaboutapplication.h>
+#include <kpopupmenu.h>
+#include <kiconloader.h>
+#include <kstringhandler.h>
+#include <kapplication.h>
+#include <kbugreport.h>
+#include <kstdguiitem.h>
+#include <kconfigdialog.h>
+#include "sidebarsettings.h"
+#include "configfeeds.h"
+#include "nsstacktabwidget.h"
+
+
+namespace KSB_News {
+
+ NSStackTabWidget::NSStackTabWidget(QWidget *parent, const char *name,
+ QPixmap appIcon) : QWidget(parent, name) {
+ currentPage = 0;
+ layout = new QVBoxLayout(this);
+
+ pagesheader.setAutoDelete(TRUE);
+ pages.setAutoDelete(TRUE);
+
+ // about dialog
+ m_aboutdata = new KAboutData("konq_sidebarnews",
+ I18N_NOOP("Newsticker"),
+ KDE::versionString(),
+ I18N_NOOP("RSS Feed Viewer"),
+ KAboutData::License_LGPL,
+ I18N_NOOP("(c) 2002-2004, the Sidebar Newsticker developers"));
+ m_aboutdata->addAuthor("Marcus Camen", I18N_NOOP("Maintainer"),
+ "mcamen@mcamen.de");
+ m_aboutdata->addAuthor("Frerich Raabe", "librss",
+ "raabe@kde.org");
+ m_aboutdata->addAuthor("Ian Reinhart Geiser", "dcoprss",
+ "geiseri@kde.org");
+ m_aboutdata->addAuthor("Joseph Wenninger",
+ I18N_NOOP("Idea and former maintainer"),
+ "jowenn@kde.org");
+ m_aboutdata->setProductName("konqueror/sidebar newsticker");
+ m_about = new KAboutApplication(m_aboutdata, this);
+
+
+ // bugreport dialog
+ m_bugreport = new KBugReport(0, true, m_aboutdata);
+
+
+ // popup menu
+ popup = new KPopupMenu(this);
+ popup->insertItem(KStdGuiItem::configure().iconSet(),
+ i18n("&Configure Newsticker..."), this,
+ SLOT(slotConfigure()));
+ popup->insertItem(SmallIconSet("reload"), i18n("&Reload"), this,
+ SLOT(slotRefresh()));
+ popup->insertItem(KStdGuiItem::close().iconSet(),
+ KStdGuiItem::close().text(), this, SLOT(slotClose()));
+ popup->insertSeparator();
+
+ // help menu
+ helpmenu = new KPopupMenu(this);
+ helpmenu->insertItem(appIcon, i18n("&About Newsticker"), this,
+ SLOT(slotShowAbout()));
+ helpmenu->insertItem(i18n("&Report Bug..."), this,
+ SLOT(slotShowBugreport()));
+
+ popup->insertItem(KStdGuiItem::help().iconSet(),
+ KStdGuiItem::help().text(), helpmenu);
+
+
+ // read configuration from disk and initialize widget
+ m_our_rsssources = SidebarSettings::sources();
+ }
+
+
+ void NSStackTabWidget::addStackTab(NSPanel *nsp, QWidget *page) {
+ QPushButton *button = new QPushButton(this);
+
+ button->setText(KStringHandler::rPixelSqueeze(nsp->title(),
+ button->fontMetrics(),
+ button->width() - 4 ));
+ button->setSizePolicy(QSizePolicy(QSizePolicy::Preferred,
+ QSizePolicy::Preferred));
+ connect(button, SIGNAL(clicked()), this, SLOT(buttonClicked()));
+ QToolTip::add(button, nsp->title());
+
+ // eventFiler for the title button
+ button->installEventFilter(this);
+
+ QScrollView *sv = new QScrollView(this);
+ sv->setResizePolicy(QScrollView::AutoOneFit);
+ sv->addChild(page);
+ sv->setFrameStyle(QFrame::NoFrame);
+ page->show();
+
+ pagesheader.insert(nsp, button);
+ pages.insert(nsp, sv);
+
+ layout->addWidget(button);
+ layout->addWidget(sv);
+ button->show();
+ if (pages.count() == 1) {
+ currentPage = sv;
+ sv->show();
+ } else {
+ sv->hide();
+ }
+ }
+
+
+
+ void NSStackTabWidget::delStackTab(NSPanel *nsp) {
+ pages.remove(nsp);
+ pagesheader.remove(nsp);
+
+ if (pages.count() >= 1) {
+ QPtrDictIterator<QWidget> it(pages);
+ QWidget *previousPage = currentPage;
+ currentPage = it.current();
+ if (currentPage != previousPage)
+ currentPage->show();
+ }
+ }
+
+
+
+ void NSStackTabWidget::updateTitle(NSPanel *nsp) {
+ QPushButton *pb = (QPushButton *)pagesheader.find(nsp);
+ if (! pb->pixmap())
+ pb->setText(nsp->title());
+ }
+
+
+
+ void NSStackTabWidget::updatePixmap(NSPanel *nsp) {
+ QPushButton *pb = (QPushButton *)pagesheader.find(nsp);
+ QPixmap pixmap = nsp->pixmap();
+ if ((pixmap.width() > 88) || (pixmap.height() > 31)) {
+ QImage image = pixmap.convertToImage();
+ pixmap.convertFromImage(image.smoothScale(88, 31, QImage::ScaleMin));
+ }
+ pb->setPixmap(pixmap);
+ }
+
+
+
+
+ void NSStackTabWidget::buttonClicked() {
+ QPushButton *pb = (QPushButton*)sender();
+ NSPanel *nsp = NULL;
+
+ // Which NSPanel belongs to pb
+ QPtrDictIterator<QWidget> it(pagesheader);
+ for (; it.current(); ++it) {
+ QPushButton *currentWidget = (QPushButton *)it.current();
+ if (currentWidget == pb)
+ nsp = (NSPanel *)it.currentKey();
+ }
+
+ if (! nsp)
+ return;
+
+ // Find current ScrollView
+ QWidget *sv = pages.find(nsp);
+
+ // Change visible page
+ if (currentPage != sv) {
+ nsp->refresh();
+ if (currentPage)
+ currentPage->hide();
+ currentPage = sv;
+ currentPage->show();
+ }
+ }
+
+
+
+ bool NSStackTabWidget::eventFilter(QObject *obj, QEvent *ev) {
+ if (ev->type() == QEvent::MouseButtonPress
+ && ((QMouseEvent *)ev)->button() == QMouseEvent::RightButton) {
+ m_last_button_rightclicked = (QPushButton *)obj;
+ popup->exec(QCursor::pos());
+ return true;
+ } else if (ev->type() == QEvent::Resize) {
+ QPushButton *pb = (QPushButton *)obj;
+
+ const QPixmap *pm = pb->pixmap();
+ if ( ! pm ) {
+ // Which NSPanel belongs to pb
+ NSPanel *nsp = NULL;
+ QPtrDictIterator<QWidget> it(pagesheader);
+ for (; it.current(); ++it) {
+ QPushButton *currentWidget = (QPushButton *)it.current();
+ if (currentWidget == pb)
+ nsp = (NSPanel *)it.currentKey();
+ }
+ pb->setText(KStringHandler::rPixelSqueeze(nsp->title(),
+ pb->fontMetrics(),
+ pb->width() - 4 ));
+ }
+ return true;
+ }
+ return false; // pass through event
+ }
+
+
+ void NSStackTabWidget::slotConfigure() {
+ // An instance of your dialog could be already created and could be
+ // cached, in which case you want to display the cached dialog
+ // instead of creating another one
+ if (KConfigDialog::showDialog("settings"))
+ return;
+
+ // KConfigDialog didn't find an instance of this dialog, so lets create it
+ m_confdlg = new KConfigDialog(this, "settings", SidebarSettings::self(),
+ KDialogBase::Plain,
+ KDialogBase::Ok|KDialogBase::Cancel| \
+ KDialogBase::Default| \
+ KDialogBase::Apply,
+ KDialogBase::Ok,
+ true);
+ ConfigFeeds *conf_widget = new ConfigFeeds(0, "feedcfgdlg");
+ m_confdlg->addPage(conf_widget, i18n("RSS Settings"), QString());
+
+ // User edited the configuration - update your local copies of the
+ // configuration data
+ connect(m_confdlg, SIGNAL(settingsChanged()), this,
+ SLOT(slotConfigure_okClicked()));
+
+ m_confdlg->show();
+ }
+
+
+ void NSStackTabWidget::slotConfigure_okClicked() {
+ DCOPRef rss_document("rssservice", "RSSService");
+
+ // remove old sources and old stack tabs
+ QStringList::iterator it;
+ for (it = m_our_rsssources.begin(); it != m_our_rsssources.end(); ++it) {
+ rss_document.call("remove", (*it));
+ }
+
+ // read list of sources
+ m_our_rsssources = SidebarSettings::sources();
+
+ // add new sources and new stack tabs
+ for (it = m_our_rsssources.begin(); it != m_our_rsssources.end(); ++it) {
+ rss_document.call("add", (*it));
+ }
+
+ // save configuration to disk
+ SidebarSettings::setSources(m_our_rsssources);
+ SidebarSettings::writeConfig();
+ }
+
+
+ void NSStackTabWidget::slotShowAbout() {
+ m_about->show();
+ }
+
+
+ void NSStackTabWidget::slotShowBugreport() {
+ m_bugreport->show();
+ }
+
+
+ void NSStackTabWidget::slotRefresh() {
+ NSPanel *nsp = NULL;
+
+ // find appendant NSPanel
+ QPtrDictIterator<QWidget> it(pagesheader);
+ for (; it.current(); ++it) {
+ QPushButton *currentWidget = (QPushButton *)it.current();
+ if (currentWidget == m_last_button_rightclicked)
+ nsp = (NSPanel *)it.currentKey();
+ }
+
+ if (! nsp) {
+ return;
+ } else {
+ nsp->refresh();
+ }
+ }
+
+
+ void NSStackTabWidget::slotClose() {
+ NSPanel *nsp = NULL;
+ // find appendant NSPanel
+ QPtrDictIterator<QWidget> it(pagesheader);
+ for (; it.current(); ++it) {
+ QPushButton *currentWidget = (QPushButton *)it.current();
+ if (currentWidget == m_last_button_rightclicked)
+ nsp = (NSPanel *)it.currentKey();
+ }
+
+ if (! nsp) {
+ return;
+ } else {
+ // TODO: check, if rssservice is available
+
+ // deregister RSS source and save configuration to disk
+ m_our_rsssources.remove(nsp->key());
+ SidebarSettings::setSources(m_our_rsssources);
+ SidebarSettings::writeConfig();
+
+ DCOPRef rss_document("rssservice", "RSSService");
+ rss_document.call("remove", nsp->key());
+ }
+ }
+
+
+ bool NSStackTabWidget::isEmpty() const {
+ return pagesheader.isEmpty();
+ }
+
+
+ bool NSStackTabWidget::isRegistered(const QString &key) {
+ m_our_rsssources = SidebarSettings::sources();
+ if (m_our_rsssources.findIndex(key) == -1)
+ return false;
+ else
+ return true;
+ }
+
+
+} // namespace KSB_News;
+
+
+#include "nsstacktabwidget.moc"
diff --git a/konq-plugins/sidebar/newsticker/nsstacktabwidget.h b/konq-plugins/sidebar/newsticker/nsstacktabwidget.h
new file mode 100644
index 0000000..7b84289
--- /dev/null
+++ b/konq-plugins/sidebar/newsticker/nsstacktabwidget.h
@@ -0,0 +1,91 @@
+// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 8; -*-
+
+/***************************************************************************
+ nsstacktabwidget.h - description
+ -------------------
+ begin : Sat 07.09.2002
+ copyright : (C) 2002-2004 Marcus Camen
+ email : mcamen@mcamen.de
+***************************************************************************/
+
+/*
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _NSSTACKTABWIDGET_H_
+#define _NSSTACKTABWIDGET_H_
+
+#include <qptrdict.h>
+#include "nspanel.h"
+
+
+class QVBoxLayout;
+class QPushButton;
+class QStringList;
+class KPopupMenu;
+class KAboutData;
+class KAboutApplication;
+class KBugReport;
+class KConfigDialog;
+
+namespace KSB_News {
+
+ class NewRssSourceDlg;
+
+ class NSStackTabWidget : public QWidget {
+ Q_OBJECT
+
+ public:
+ NSStackTabWidget(QWidget *parent = 0, const char *name = 0,
+ QPixmap appIcon = QPixmap());
+ void addStackTab(NSPanel *nsp, QWidget *page);
+ void delStackTab(NSPanel *nsp);
+ void updateTitle(NSPanel *nsp);
+ void updatePixmap(NSPanel *nsp);
+ bool isEmpty() const;
+ bool isRegistered(const QString &key);
+
+ protected:
+ bool eventFilter(QObject *obj, QEvent *ev);
+
+ private slots:
+ void buttonClicked();
+ void slotShowAbout();
+ void slotShowBugreport();
+ void slotRefresh();
+ void slotClose();
+ void slotConfigure();
+ void slotConfigure_okClicked();
+
+ private:
+ QPtrDict<QWidget> pages;
+ QPtrDict<QWidget> pagesheader;
+ QVBoxLayout *layout;
+ QWidget *currentPage;
+ KPopupMenu *popup, *helpmenu;
+ KAboutData *m_aboutdata;
+ KAboutApplication *m_about;
+ KBugReport *m_bugreport;
+ QPushButton *m_last_button_rightclicked;
+ KConfigDialog *m_confdlg;
+ QStringList m_our_rsssources;
+ };
+
+
+} // namespace KSB_News
+
+
+#endif
diff --git a/konq-plugins/sidebar/newsticker/pics/LICENSE b/konq-plugins/sidebar/newsticker/pics/LICENSE
new file mode 100644
index 0000000..7108d2b
--- /dev/null
+++ b/konq-plugins/sidebar/newsticker/pics/LICENSE
@@ -0,0 +1,16 @@
+cr16-app-konqsidebar_news.png is based on livemark-item.png
+
+You can find the original file in the mozilla AVIARY_1_0_20040515_BRANCH:
+http://lxr.mozilla.org/aviarybranch/source/browser/themes/winstripe/browser/licemark-item.png, Version 1.1
+
+According to
+http://lxr.mozilla.org/aviarybranch/source/browser/themes/LICENSE
+the file is MPL / GPL / LPGP (confirmed to me in private mail by
+Stephen Horlander <stephen@noved.org>):
+ "All files in this directory are assumed to be licensed under the
+ tri-license (MPL/GPL/LGPL) used throughout this codebase."
+
+--
+Marcus <mcamen@mcamen.de>
+
+ \ No newline at end of file
diff --git a/konq-plugins/sidebar/newsticker/pics/Makefile.am b/konq-plugins/sidebar/newsticker/pics/Makefile.am
new file mode 100644
index 0000000..e5515a8
--- /dev/null
+++ b/konq-plugins/sidebar/newsticker/pics/Makefile.am
@@ -0,0 +1 @@
+KDE_ICON = AUTO
diff --git a/konq-plugins/sidebar/newsticker/pics/cr16-app-konqsidebar_news.png b/konq-plugins/sidebar/newsticker/pics/cr16-app-konqsidebar_news.png
new file mode 100644
index 0000000..4a7321a
--- /dev/null
+++ b/konq-plugins/sidebar/newsticker/pics/cr16-app-konqsidebar_news.png
Binary files differ
diff --git a/konq-plugins/sidebar/newsticker/pics/livemark-item.png b/konq-plugins/sidebar/newsticker/pics/livemark-item.png
new file mode 100644
index 0000000..91cb614
--- /dev/null
+++ b/konq-plugins/sidebar/newsticker/pics/livemark-item.png
Binary files differ
diff --git a/konq-plugins/sidebar/newsticker/sidebar_news.cpp b/konq-plugins/sidebar/newsticker/sidebar_news.cpp
new file mode 100644
index 0000000..f96bcd6
--- /dev/null
+++ b/konq-plugins/sidebar/newsticker/sidebar_news.cpp
@@ -0,0 +1,279 @@
+// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 8; -*-
+
+/***************************************************************************
+ sidebar_news.cpp - The real sidebar plugin
+ -------------------
+ begin : Sat June 23 13:35:30 CEST 2001
+ copyright : (C) 2001,2002 Marcus Camen, Joseph Wenninger
+ copyright : (C) 2003,2004 Marcus Camen
+ email : Marcus Camen <mcamen@mcamen.de>
+ idea and original code: jowenn@kde.org
+***************************************************************************/
+
+/*
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <dcopclient.h>
+#include <qtimer.h>
+#include <qbuffer.h>
+#include <qwidgetstack.h>
+#include <kdebug.h>
+#include <kapplication.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kdesktopfile.h>
+#include <kiconloader.h>
+#include <kdemacros.h>
+#include "sidebar_news.h"
+#include "nsstacktabwidget.h"
+#include "norsswidget.h"
+#include "sidebarsettings.h"
+
+
+namespace KSB_News {
+
+ KonqSidebar_News::KonqSidebar_News(KInstance *inst, QObject *parent,
+ QWidget *widgetParent,
+ QString &desktopName, const char* name)
+ : KonqSidebarPlugin(inst, parent, widgetParent, desktopName, name),
+ DCOPObject("sidebar-newsticker")
+ {
+ // get the application icon
+ // FIXME: as konqueror knows the icon there might be a possibility to
+ // access the already present QPixmap
+ KDesktopFile desktopFile(desktopName, true);
+ QString iconName = desktopFile.readIcon();
+ KIconLoader iconLoader;
+ m_appIcon = iconLoader.loadIcon(iconName, KIcon::Small);
+
+ // create all sidebar widgets
+ widgets = new QWidgetStack(widgetParent, "main_widgetstack");
+ newswidget = new NSStackTabWidget(widgets, "feedbrowser_stackchld",
+ m_appIcon);
+ noRSSwidget = new NoRSSWidget(widgets, "nofeed_stackchld");
+ widgets->addWidget(newswidget);
+ widgets->addWidget(noRSSwidget);
+ widgets->raiseWidget(noRSSwidget);
+ noRSSwidget->show();
+
+ // try to connect to the DCOP service
+ if (checkDcopService() > 0) {
+ KMessageBox::sorry(widgets,
+ i18n("<qt>Cannot connect to RSS service. Please make "
+ "sure the <strong>rssservice</strong> program "
+ "is available (usually distributed as part "
+ "of kdenetwork).</qt>"),
+ i18n("Sidebar Newsticker"));
+ noRSSwidget->setEnabled(false);
+ } else {
+ m_rssservice = DCOPRef("rssservice", "RSSService");
+
+ QStringList reslist = SidebarSettings::sources();
+ QStringList::iterator it;
+ for (it = reslist.begin(); it != reslist.end(); ++it) {
+ addedRSSSource(*it);
+ }
+
+ // fetch added and removed RSS sources
+ connectDCOPSignal("rssservice", m_rssservice.obj(), "added(QString)",
+ "addedRSSSource(QString)", false);
+ connectDCOPSignal("rssservice", m_rssservice.obj(), "removed(QString)",
+ "removedRSSSource(QString)", false);
+
+ // show special widget if there are no RSS sources available
+ if (newswidget->isEmpty()) {
+ widgets->raiseWidget(noRSSwidget);
+ noRSSwidget->show();
+ } else {
+ widgets->raiseWidget(newswidget);
+ }
+ }
+ }
+
+
+ KonqSidebar_News::~KonqSidebar_News() {
+ }
+
+
+
+ void *KonqSidebar_News::provides(const QString &) {return 0;}
+
+ void KonqSidebar_News::emitStatusBarText (const QString &) {;}
+
+ QWidget *KonqSidebar_News::getWidget(){return widgets;}
+
+ void KonqSidebar_News::handleURL(const KURL &/*url*/) {;}
+
+
+///////// startup of the DCOP servce ///////////////////////////////////////
+
+ int KonqSidebar_News::checkDcopService() {
+ QString rdfservice_error;
+ int err = 0;
+
+ if (! kapp->dcopClient()->isApplicationRegistered("rssservice"))
+ if (KApplication::startServiceByDesktopName("rssservice", QString(),
+ &rdfservice_error) > 0)
+ err = 1;
+
+ return err;
+ }
+
+
+
+///////// helper methods ///////////////////////////////////////////////////
+
+ NSPanel *KonqSidebar_News::getNSPanelByKey(QString key) {
+ NSPanel *nsp = NULL, *current_nsp;
+
+ for (current_nsp = nspanelptrlist.first(); current_nsp;
+ current_nsp = nspanelptrlist.next()) {
+ if (current_nsp->key() == key)
+ nsp = current_nsp;
+ }
+
+ return nsp;
+ }
+
+
+ void KonqSidebar_News::addedRSSSource(QString key) {
+ kdDebug(90140) << "KonqSidebar_News::addedRSSSource: " << key << endl;
+
+ // Only add RSS source if we have registered the URI before in
+ // NSStackTabWidget.
+ if (newswidget->isRegistered(key)) {
+ NSPanel *nspanel = new NSPanel(this,
+ QString(QString("sidebar-newsticker-")+key).latin1(),
+ key, &m_rssservice);
+ nspanel->setTitle(key);
+ nspanelptrlist.append(nspanel);
+
+ // add preliminary widgets for this newssource
+ if (! nspanel->listbox()) {
+ TTListBox *listbox = new TTListBox(newswidget, "article_lb");
+ newswidget->addStackTab(nspanel, listbox);
+ connect(listbox, SIGNAL(executed(QListBoxItem *)),
+ this, SLOT(slotArticleItemExecuted(QListBoxItem *)));
+ listbox->insertItem(i18n("Connecting..." ));
+ nspanel->setListbox(listbox);
+ }
+
+ // listen to updates
+ connect(nspanel, SIGNAL(documentUpdated(NSPanel *)),
+ this, SLOT(updateArticles(NSPanel *)));
+ connect(nspanel, SIGNAL(documentUpdated(NSPanel *)),
+ this, SLOT(updateTitle(NSPanel *)));
+ connect(nspanel, SIGNAL(pixmapUpdated(NSPanel *)),
+ this, SLOT(updatePixmap(NSPanel *)));
+
+ if (widgets->visibleWidget() != newswidget)
+ widgets->raiseWidget(newswidget);
+ }
+ }
+
+
+ void KonqSidebar_News::removedRSSSource(QString key) {
+ kdDebug(90140) << "inside KonqSidebar_News::removedSource " << key << endl;
+
+ if (NSPanel *nsp = getNSPanelByKey(key)) {
+ newswidget->delStackTab(nsp);
+ delete nspanelptrlist.take(nspanelptrlist.findRef(nsp));
+ } else
+ kdWarning() << "removedSource called for non-existing id" << endl;
+
+ if (newswidget->isEmpty())
+ widgets->raiseWidget(noRSSwidget);
+ }
+
+
+/////////////////////////////////////////////////////////////////////
+
+ void KonqSidebar_News::slotArticleItemExecuted(QListBoxItem *item) {
+ if (!item) return;
+
+ NSPanel *current_nspanel, *nspanel = NULL;
+ for (current_nspanel = nspanelptrlist.first(); current_nspanel;
+ current_nspanel = nspanelptrlist.next()) {
+ if (current_nspanel->listbox() == item->listBox())
+ nspanel = current_nspanel;
+ }
+
+ int subid = nspanel->listbox()->index(item);
+ QString link = nspanel->articleLinks()[subid];
+
+ emit openURLRequest(KURL(link));
+
+ }
+
+
+
+//////////// update article headlines ////////////
+
+ void KonqSidebar_News::updateArticles(NSPanel *nsp) {
+ nsp->listbox()->clear();
+
+ QStringList articleList = nsp->articles();
+ QStringList::iterator it;
+ for (it = articleList.begin(); it != articleList.end(); ++it)
+ nsp->listbox()->insertItem((*it));
+ }
+
+
+/////////// Title stuff /////////////////////////////////////
+
+ void KonqSidebar_News::updateTitle(NSPanel *nsp) {
+ newswidget->updateTitle(nsp);
+ }
+
+
+/////////// Pixmap stuff /////////////////////////////////////
+
+ void KonqSidebar_News::updatePixmap(NSPanel *nsp) {
+ newswidget->updatePixmap(nsp);
+ }
+
+
+
+/////////////////////////////////////////////////////////
+
+
+ extern "C" {
+ KDE_EXPORT void* create_konq_sidebarnews(KInstance *instance, QObject *par,
+ QWidget *widp,
+ QString &desktopname,
+ const char *name) {
+ KGlobal::locale()->insertCatalogue("konqsidebar_news");
+ return new KonqSidebar_News(instance, par, widp, desktopname, name);
+ }
+ }
+
+ extern "C" {
+ KDE_EXPORT bool add_konq_sidebarnews(QString* fn, QString*,
+ QMap<QString,QString> *map) {
+ map->insert("Type", "Link");
+ map->insert("Icon", "konqsidebar_news");
+ map->insert("Name", i18n("Newsticker"));
+ map->insert("Open", "false");
+ map->insert("X-KDE-KonqSidebarModule", "konq_sidebarnews");
+ fn->setLatin1("news%1.desktop");
+ return true;
+ }
+ }
+
+} // namespace KSB_News
+
+#include "sidebar_news.moc"
diff --git a/konq-plugins/sidebar/newsticker/sidebar_news.h b/konq-plugins/sidebar/newsticker/sidebar_news.h
new file mode 100644
index 0000000..e6da786
--- /dev/null
+++ b/konq-plugins/sidebar/newsticker/sidebar_news.h
@@ -0,0 +1,89 @@
+// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 8; -*-
+
+/***************************************************************************
+ sidebar_news.h - The real sidebar plugin
+ -------------------
+ begin : Sat July 23 20:35:30 CEST 2001
+ copyright : (C) 2001,2002 Marcus Camen, Joseph Wenninger
+ copyright : (C) 2003,2004 Marcus Camen
+ email : Marcus Camen <mcamen@mcamen.de>
+ idea and original code: jowenn@kde.org
+***************************************************************************/
+
+/*
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _konq_sidebar_news_h_
+#define _konq_sidebar_news_h_
+
+#include <konqsidebarplugin.h>
+#include "nspanel.h"
+
+
+class QPixmap;
+class QWidgetStack;
+
+namespace KSB_News {
+
+ class NSStackTabWidget;
+ class NoRSSWidget;
+
+ class KonqSidebar_News : public KonqSidebarPlugin, DCOPObject {
+ Q_OBJECT
+ K_DCOP
+
+ public:
+ KonqSidebar_News(KInstance *instance, QObject *parent,
+ QWidget *widgetParent, QString &desktopName_,
+ const char* name=0);
+ ~KonqSidebar_News();
+ virtual void *provides(const QString &);
+ void emitStatusBarText (const QString &);
+ virtual QWidget *getWidget();
+
+ k_dcop:
+ virtual void addedRSSSource(QString);
+ virtual void removedRSSSource(QString);
+
+ protected:
+ virtual void handleURL(const KURL &url);
+
+ private:
+ int checkDcopService();
+ QWidgetStack *widgets;
+ NSStackTabWidget *newswidget;
+ NoRSSWidget *noRSSwidget;
+ QPtrList<NSPanel> nspanelptrlist;
+ NSPanel *getNSPanelByKey(QString key);
+ DCOPRef m_rssservice;
+ QPixmap m_appIcon;
+
+ signals:
+ // see <konqsidebarplugin.h>
+ void openURLRequest(const KURL &url,
+ const KParts::URLArgs &args = KParts::URLArgs());
+
+ private slots:
+ void slotArticleItemExecuted(QListBoxItem *item);
+ void updateArticles(NSPanel *nsp);
+ void updateTitle(NSPanel *nsp);
+ void updatePixmap(NSPanel *nsp);
+ };
+
+} // namespace KSB_News
+
+#endif
diff --git a/konq-plugins/sidebar/newsticker/sidebarsettings.kcfgc b/konq-plugins/sidebar/newsticker/sidebarsettings.kcfgc
new file mode 100644
index 0000000..6e24cde
--- /dev/null
+++ b/konq-plugins/sidebar/newsticker/sidebarsettings.kcfgc
@@ -0,0 +1,5 @@
+File=konq_sidebarnews.kcfg
+ClassName=SidebarSettings
+Singleton=true
+Mutators=true
+NameSpace=KSB_News
diff --git a/konq-plugins/smbmounter/Readme b/konq-plugins/smbmounter/Readme
new file mode 100644
index 0000000..0ccf41c
--- /dev/null
+++ b/konq-plugins/smbmounter/Readme
@@ -0,0 +1,19 @@
+This directory existed until kde 3.3, if you're interested to revive it, you
+can get it back from cvs. It has been removed because the smbro-ioslave has also
+been removed, and this plugin doesn't work without it.
+
+This plugin for konqy works together with the smbro ioslave.
+It uses the special() function of the smbro ioslave to mount and unmount smb
+shares. This is done by the ioslave by executing smbmount and smbumount.
+Therefor both have to be installed suid root.
+If you consider this a security risk, don't use this plugin.
+Move with konqy into a smb share (e.g. smb://host/my_files) and then select
+Tools->smbmount current share. The share "my_files" will be mounted under
+"~/smb_network/host/my_files". Once you mounted the share, the menu item
+"smbumount current share" becomes active, so that you can unmount it again.
+
+AFAIK smbmount is linux-only, so it won't work on other systems.
+
+If you have suggestions, wishes or find bugs, send me an email.
+
+Alexander Neundorf <neundorf@kde.org>
diff --git a/konq-plugins/uachanger/Makefile.am b/konq-plugins/uachanger/Makefile.am
new file mode 100644
index 0000000..80e2c2b
--- /dev/null
+++ b/konq-plugins/uachanger/Makefile.am
@@ -0,0 +1,17 @@
+kde_module_LTLIBRARIES = libuachangerplugin.la
+
+AM_CPPFLAGS = $(all_includes)
+METASOURCES = AUTO
+
+libuachangerplugin_la_SOURCES = uachangerplugin.cpp
+libuachangerplugin_la_LIBADD = $(LIB_KPARTS) $(LIB_KHTML)
+libuachangerplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+pluginsdir = $(kde_datadir)/khtml/kpartplugins
+plugins_DATA = uachangerplugin.rc uachangerplugin.desktop
+
+appsdir = $(kde_appsdir)/.hidden
+apps_DATA = uachangerplugin.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/uachangerplugin.pot
diff --git a/konq-plugins/uachanger/uachangerplugin.cpp b/konq-plugins/uachanger/uachangerplugin.cpp
new file mode 100644
index 0000000..b929930
--- /dev/null
+++ b/konq-plugins/uachanger/uachangerplugin.cpp
@@ -0,0 +1,436 @@
+/*
+ Copyright (c) 2001 Dawit Alemayehu <adawit@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License (LGPL) as published by the Free Software Foundation;
+ either version 2 of the License, or (at your option) any later
+ version.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <sys/utsname.h>
+
+#include <qregexp.h>
+
+#include <krun.h>
+#include <kdebug.h>
+#include <kaction.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <ktrader.h>
+#include <kconfig.h>
+#include <kio/job.h>
+#include <kservice.h>
+#include <kinstance.h>
+#include <kpopupmenu.h>
+#include <dcopref.h>
+#include <khtml_part.h>
+#include <kgenericfactory.h>
+#include <kprotocolmanager.h>
+#include <kaboutdata.h>
+
+#include "uachangerplugin.h"
+
+typedef KGenericFactory<UAChangerPlugin> UAChangerPluginFactory;
+static const KAboutData aboutdata("uachangerplugin", I18N_NOOP("Change Browser Identification") , "1.0" );
+K_EXPORT_COMPONENT_FACTORY (libuachangerplugin, UAChangerPluginFactory (&aboutdata))
+
+
+#define UA_PTOS(x) (*it)->property(x).toString()
+#define QFL1(x) QString::fromLatin1(x)
+
+
+UAChangerPlugin::UAChangerPlugin( QObject* parent, const char* name,
+ const QStringList & )
+ :KParts::Plugin( parent, name ),
+ m_bSettingsLoaded(false), m_part(0L), m_config(0L)
+{
+ setInstance(UAChangerPlugin::instance());
+
+ m_pUAMenu = new KActionMenu( i18n("Change Browser &Identification"), "agent",
+ actionCollection(), "changeuseragent" );
+ m_pUAMenu->setDelayed( false );
+ connect( m_pUAMenu->popupMenu(), SIGNAL( aboutToShow() ),
+ this, SLOT( slotAboutToShow() ) );
+
+ m_pUAMenu->setEnabled ( false );
+
+ if ( parent && parent->inherits( "KHTMLPart" ) )
+ {
+ m_part = static_cast<KHTMLPart*>(parent);
+ connect( m_part, SIGNAL(started(KIO::Job*)), this,
+ SLOT(slotStarted(KIO::Job*)) );
+ }
+}
+
+UAChangerPlugin::~UAChangerPlugin()
+{
+ saveSettings();
+ slotReloadDescriptions();
+}
+
+void UAChangerPlugin::slotReloadDescriptions()
+{
+ delete m_config;
+ m_config = 0L;
+}
+
+void UAChangerPlugin::parseDescFiles()
+{
+ KTrader::OfferList list = KTrader::self()->query("UserAgentStrings");
+ if ( list.count() == 0 )
+ return;
+
+ m_mapAlias.clear();
+ m_lstAlias.clear();
+ m_lstIdentity.clear();
+
+ struct utsname utsn;
+ uname( &utsn );
+
+ QStringList languageList = KGlobal::locale()->languageList();
+ if ( languageList.count() )
+ {
+ QStringList::Iterator it = languageList.find(QFL1("C"));
+ if( it != languageList.end() )
+ {
+ if( languageList.contains( QFL1("en") ) > 0 )
+ languageList.remove( it );
+ else
+ (*it) = QFL1("en");
+ }
+ }
+
+ KTrader::OfferList::ConstIterator it = list.begin();
+ KTrader::OfferList::ConstIterator lastItem = list.end();
+
+ for ( ; it != lastItem; ++it )
+ {
+ QString tmp = UA_PTOS("X-KDE-UA-FULL");
+ QString tag = UA_PTOS("X-KDE-UA-TAG");
+
+ if(tag != "IE" && tag != "NN" && tag != "MOZ")
+ tag = "OTHER";
+
+ if ( (*it)->property("X-KDE-UA-DYNAMIC-ENTRY").toBool() )
+ {
+ tmp.replace( QFL1("appSysName"), QFL1(utsn.sysname) );
+ tmp.replace( QFL1("appSysRelease"), QFL1(utsn.release) );
+ tmp.replace( QFL1("appMachineType"), QFL1(utsn.machine) );
+ tmp.replace( QFL1("appLanguage"), languageList.join(QFL1(", ")) );
+ tmp.replace( QFL1("appPlatform"), QFL1("X11") );
+ }
+
+ if ( m_lstIdentity.contains(tmp) )
+ continue; // Ignore dups!
+
+ m_lstIdentity << tmp;
+ tmp = QString("%1 %2").arg(UA_PTOS("X-KDE-UA-SYSNAME")).arg(UA_PTOS("X-KDE-UA-SYSRELEASE"));
+
+ if ( tmp.stripWhiteSpace().isEmpty() )
+ {
+ if(tag == "NN" || tag == "IE" || tag == "MOZ")
+ tmp = i18n("Version %1").arg(UA_PTOS("X-KDE-UA-VERSION"));
+ else
+ tmp = QString("%1 %2").arg(UA_PTOS("X-KDE-UA-NAME")).arg(UA_PTOS("X-KDE-UA-VERSION"));
+ }
+ else
+ {
+ if(tag == "NN" || tag == "IE" || tag == "MOZ")
+ tmp = i18n("Version %1 on %2").arg(UA_PTOS("X-KDE-UA-VERSION")).arg(tmp);
+ else
+ tmp = i18n("%1 %2 on %3").arg(UA_PTOS("X-KDE-UA-NAME")).arg(UA_PTOS("X-KDE-UA-VERSION")).arg(tmp);
+ }
+
+ m_lstAlias << tmp;
+
+ /* sort in this UA Alias alphabetically */
+ BrowserGroup ualist = m_mapAlias[tag];
+ BrowserGroup::Iterator e = ualist.begin();
+ while ( !tmp.isEmpty() && e != ualist.end() )
+ {
+ if ( m_lstAlias[(*e)] > tmp ) {
+ ualist.insert( e, m_lstAlias.count()-1 );
+ tmp = QString::null;
+ }
+ ++e;
+ }
+
+ if ( !tmp.isEmpty() )
+ ualist.append( m_lstAlias.count()-1 );
+
+ m_mapAlias[tag] = ualist;
+
+ if(tag == "OTHER")
+ m_mapBrowser[tag] = i18n("Other");
+ else
+ m_mapBrowser[tag] = UA_PTOS("X-KDE-UA-NAME");
+
+ }
+}
+
+void UAChangerPlugin::slotStarted( KIO::Job* )
+{
+ m_currentURL = m_part->url();
+
+ // This plugin works on local files, http[s], and webdav[s].
+ QString proto = m_currentURL.protocol();
+ if (m_currentURL.isLocalFile() ||
+ proto.startsWith("http") || proto.startsWith("webdav"))
+ {
+ if (!m_pUAMenu->isEnabled())
+ m_pUAMenu->setEnabled ( true );
+ }
+ else
+ {
+ m_pUAMenu->setEnabled ( false );
+ }
+}
+
+void UAChangerPlugin::slotAboutToShow()
+{
+ if (!m_config)
+ {
+ m_config = new KConfig( "kio_httprc" );
+ parseDescFiles();
+ }
+
+ if (!m_bSettingsLoaded)
+ loadSettings();
+
+ int count = 0;
+ m_pUAMenu->popupMenu()->clear();
+ m_pUAMenu->popupMenu()->insertTitle(i18n("Identify As")); // imho title doesn't need colon..
+
+ QString host = m_currentURL.isLocalFile() ? QFL1("localhost") : m_currentURL.host();
+ m_currentUserAgent = KProtocolManager::userAgentForHost(host);
+ //kdDebug(90130) << "User Agent: " << m_currentUserAgent << endl;
+
+ int id = m_pUAMenu->popupMenu()->insertItem( i18n("Default Identification"), this,
+ SLOT(slotDefault()), 0, ++count );
+ if( m_currentUserAgent == KProtocolManager::defaultUserAgent() )
+ m_pUAMenu->popupMenu()->setItemChecked(id, true);
+
+ m_pUAMenu->popupMenu()->insertSeparator();
+
+ AliasConstIterator map = m_mapAlias.begin();
+ for( ; map != m_mapAlias.end(); ++map )
+ {
+ KPopupMenu *browserMenu = new KPopupMenu;
+ BrowserGroup::ConstIterator e = map.data().begin();
+ for( ; e != map.data().end(); ++e )
+ {
+ int id = browserMenu->insertItem( m_lstAlias[*e], this, SLOT(slotItemSelected(int)), 0, *e );
+ if (m_lstIdentity[(*e)] == m_currentUserAgent)
+ browserMenu->setItemChecked(id, true);
+ }
+ m_pUAMenu->popupMenu()->insertItem( m_mapBrowser[map.key()], browserMenu );
+ }
+
+ m_pUAMenu->popupMenu()->insertSeparator();
+
+ /* useless here, imho..
+ m_pUAMenu->popupMenu()->insertItem( i18n("Reload Identifications"), this,
+ SLOT(slotReloadDescriptions()),
+ 0, ++count );*/
+
+ m_pUAMenu->popupMenu()->insertItem( i18n("Apply to Entire Site"), this,
+ SLOT(slotApplyToDomain()),
+ 0, ++count );
+ m_pUAMenu->popupMenu()->setItemChecked(count, m_bApplyToDomain);
+
+ m_pUAMenu->popupMenu()->insertItem( i18n("Configure..."), this,
+ SLOT(slotConfigure()));
+
+}
+
+void UAChangerPlugin::slotConfigure()
+{
+ KService::Ptr service = KService::serviceByDesktopName ("useragent");
+ if (service)
+ KRun::runCommand (service->exec ());
+}
+
+void UAChangerPlugin::slotItemSelected( int id )
+{
+ if (m_lstIdentity[id] == m_currentUserAgent) return;
+
+ QString host;
+ m_currentUserAgent = m_lstIdentity[id];
+ host = m_currentURL.isLocalFile() ? QFL1("localhost") : filterHost( m_currentURL.host() );
+
+ m_config->setGroup( host.lower() );
+ m_config->writeEntry( "UserAgent", m_currentUserAgent );
+ m_config->sync();
+
+ // Update the io-slaves...
+ updateIOSlaves ();
+
+ // Reload the page with the new user-agent string
+ m_part->openURL( m_currentURL );
+}
+
+void UAChangerPlugin::slotDefault()
+{
+ if( m_currentUserAgent == KProtocolManager::defaultUserAgent() ) return; // don't flicker!
+ // We have no choice but delete all higher domain level settings here since it
+ // affects what will be matched.
+ QStringList partList = QStringList::split('.', m_currentURL.host(), false);
+
+ if ( !partList.isEmpty() )
+ {
+ partList.remove(partList.begin());
+
+ QStringList domains;
+ // Remove the exact name match...
+ domains << m_currentURL.host ();
+
+ while (partList.count())
+ {
+ if (partList.count() == 2)
+ if (partList[0].length() <=2 && partList[1].length() ==2)
+ break;
+
+ if (partList.count() == 1)
+ break;
+
+ domains << partList.join(QFL1("."));
+ partList.remove(partList.begin());
+ }
+
+ for (QStringList::Iterator it = domains.begin(); it != domains.end(); it++)
+ {
+ //kdDebug () << "Domain to remove: " << *it << endl;
+ if ( m_config->hasGroup(*it) )
+ m_config->deleteGroup(*it);
+ else if( m_config->hasKey(*it) )
+ m_config->deleteEntry(*it);
+ }
+ }
+ else
+ if ( m_currentURL.isLocalFile() && m_config->hasGroup( "localhost" ) )
+ m_config->deleteGroup( "localhost" );
+
+ m_config->sync();
+
+ // Reset some internal variables and inform the http io-slaves of the changes.
+ m_currentUserAgent = KProtocolManager::defaultUserAgent();
+
+ // Update the http io-slaves.
+ updateIOSlaves();
+
+ // Reload the page with the default user-agent
+ m_part->openURL( m_currentURL );
+}
+
+void UAChangerPlugin::updateIOSlaves ()
+{
+ // Inform running http(s) io-slaves about the change...
+ if (!DCOPRef("*", "KIO::Scheduler").send("reparseSlaveConfiguration", QString::null))
+ kdWarning() << "UAChangerPlugin::updateIOSlaves: Unable to update running application!" << endl;
+}
+
+QString UAChangerPlugin::filterHost(const QString &hostname)
+{
+ QRegExp rx;
+
+ // Check for IPv4 address
+ rx.setPattern ("[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}");
+ if (rx.exactMatch (hostname))
+ return hostname;
+
+ // Check for IPv6 address here...
+ rx.setPattern ("^\\[.*\\]$");
+ if (rx.exactMatch (hostname))
+ return hostname;
+
+ // Return the TLD if apply to domain or
+ return (m_bApplyToDomain ? findTLD(hostname): hostname);
+}
+
+QString UAChangerPlugin::findTLD (const QString &hostname)
+{
+ QStringList domains;
+ QStringList partList = QStringList::split('.', hostname, false);
+
+ if (partList.count())
+ partList.remove(partList.begin()); // Remove hostname
+
+ while(partList.count())
+ {
+ // We only have a TLD left.
+ if (partList.count() == 1)
+ break;
+
+ if( partList.count() == 2 )
+ {
+ // The .name domain uses <name>.<surname>.name
+ // Although the TLD is striclty speaking .name, for our purpose
+ // it should be <surname>.name since people should not be able
+ // to set cookies for everyone with the same surname.
+ // Matches <surname>.name
+ if( partList[1].lower() == QFL1("name") )
+ {
+ break;
+ }
+ else if( partList[1].length() == 2 )
+ {
+ // If this is a TLD, we should stop. (e.g. co.uk)
+ // We assume this is a TLD if it ends with .xx.yy or .x.yy
+ if (partList[0].length() <= 2)
+ break; // This is a TLD.
+
+ // Catch some TLDs that we miss with the previous check
+ // e.g. com.au, org.uk, mil.co
+ QCString t = partList[0].lower().utf8();
+ if ((t == "com") || (t == "net") || (t == "org") || (t == "gov") ||
+ (t == "edu") || (t == "mil") || (t == "int"))
+ break;
+ }
+ }
+
+ domains.append(partList.join(QFL1(".")));
+ partList.remove(partList.begin()); // Remove part
+ }
+
+ if( domains.isEmpty() )
+ return hostname;
+
+ return domains[0];
+}
+
+void UAChangerPlugin::saveSettings()
+{
+ if(!m_bSettingsLoaded) return;
+
+ KConfig cfg ("uachangerrc", false, false);
+ cfg.setGroup ("General");
+
+ cfg.writeEntry ("applyToDomain", m_bApplyToDomain);
+}
+
+void UAChangerPlugin::loadSettings()
+{
+ KConfig cfg ("uachangerrc", false, false);
+ cfg.setGroup ("General");
+
+ m_bApplyToDomain = cfg.readBoolEntry ("applyToDomain", true);
+ m_bSettingsLoaded = true;
+}
+
+void UAChangerPlugin::slotApplyToDomain()
+{
+ m_bApplyToDomain = !m_bApplyToDomain;
+}
+
+#include "uachangerplugin.moc"
diff --git a/konq-plugins/uachanger/uachangerplugin.desktop b/konq-plugins/uachanger/uachangerplugin.desktop
new file mode 100644
index 0000000..9b15127
--- /dev/null
+++ b/konq-plugins/uachanger/uachangerplugin.desktop
@@ -0,0 +1,121 @@
+[Desktop Entry]
+X-KDE-Library=UserAgentChanger
+X-KDE-PluginInfo-Author=Dawit Alemayehu
+X-KDE-PluginInfo-Email=adawit@kde.org
+X-KDE-PluginInfo-Name=UserAgentChanger
+X-KDE-PluginInfo-Version=3.3
+X-KDE-PluginInfo-Website=
+X-KDE-PluginInfo-Category=Tools
+X-KDE-PluginInfo-Depends=
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=true
+Name=UserAgent Changer
+Name[bs]=Promjena identifikacije preglednika
+Name[ca]=Canvia l'agent d'usuari
+Name[cs]=Změna uživatelského agenta
+Name[da]=Ændring af brugeragent
+Name[de]=Browserkennung ändern
+Name[el]=Αλλαγή πράκτορα χρήστη
+Name[eo]=Uzantagenta ŝanĝilo
+Name[es]=Cambiador de la identificación del agente usuario
+Name[et]=Identifikaatori muutja
+Name[eu]=Erabiltzaile agentearen aldatzailea
+Name[fa]=تغییردهندۀ عامل کاربر
+Name[fi]=Käyttäjäagenttimuuttaja
+Name[fr]=Changeur d'identité du navigateur
+Name[fy]=Brûkersagint wizigje
+Name[ga]=Clár Athraithe UserAgent
+Name[gl]=Cámbio de Identificación do Navegador
+Name[he]=משנה זיהוי דפדפן
+Name[hi]=यूज़रएजेंट परिवर्तक
+Name[hr]=Izmjenjivač korisničkog agenta
+Name[hu]=A böngészőazonosító átváltása
+Name[is]=Auðkenni vafra
+Name[it]=Modificatore di User Agent
+Name[ja]=ユーザエージェント チェンジャー
+Name[ka]=UserAgent შემცვლელი
+Name[kk]=UserAgent ауыстырғышы
+Name[km]=កម្មវិធី​ផ្លាស់ប្ដូរ​ភ្នាក់ងារ​អ្នកប្រើ
+Name[lt]=Naudotojo agento keitiklis
+Name[mk]=Менувач на кориснички агент
+Name[nb]=Brukeragent-endring
+Name[nds]=Nettkieker-Kennen ännern
+Name[ne]=प्रयोगकर्ता अभिकर्ता परिवर्तक
+Name[nl]=Gebruikersagent wijzigen
+Name[nn]=Endring av brukaragent
+Name[pa]=ਉਪਭੋਗੀ ਏਜੰਟ ਤਬਦੀਲੀਕਾਰ
+Name[pl]=Zmiana identyfikacji przeglądarki
+Name[pt]=Mudança de Agente do Utilizador
+Name[pt_BR]=Modificar de Agente de Usuários
+Name[ru]=Смена идентификации браузера (UserAgent)
+Name[sk]=Zmena identifikácie prehliadača
+Name[sl]=Spreminjanje uporabniškega agenta
+Name[sr]=Измењивач корисничког агента
+Name[sr@Latn]=Izmenjivač korisničkog agenta
+Name[sv]=Ändring av användaragent
+Name[ta]=பயனர் முகவர் மாற்றி
+Name[tg]=Ивазкунии нишондиҳандаҳои воқеанигор (UserAgent)
+Name[tr]=KullanıcıAjanı Değiştiricisi
+Name[uk]=Селектор агента користувача
+Name[vi]=Bộ đổi UserAgent
+Name[zh_CN]=用户代理更换器
+Comment=Plugin for changing the user agent
+Comment[af]=Inplak vir verandering die gebruiker agent
+Comment[az]=İstifadəçi alıcısını dəyişdirmək üçün əlavə
+Comment[bg]=Приставка за смяна на идентификацията на браузъра
+Comment[bs]=Dodatak za promijenju identifikacije preglednika
+Comment[ca]=Connector per a modificar l'agent d'usuari
+Comment[cs]=Modul pro změnu uživatelského agenta
+Comment[cy]=Ategyn i newid asiant y defnyddiwr
+Comment[da]=Plugin til at ændre brugeragenten
+Comment[de]=Modul zum Ändern der Browserkennung
+Comment[el]=Πρόσθετο για την αλλαγή του πράκτορα χρήστη
+Comment[eo]=Kromaĵo por ŝanĝi la uzantan agenton
+Comment[es]=Complemento para cambiar el agente usuario
+Comment[et]=Brauseri identifikaatori muutmise plugin
+Comment[eu]=Erabiltzaile agentea aldatzeko plugina
+Comment[fa]=وصله برای تغییر عامل کاربر
+Comment[fi]=Sovelma käyttäjäagentin muuttamiseen
+Comment[fr]=Module externe pour changer l'identification du navigateur
+Comment[fy]=Plugin foar it wizigjen fan de brûkersagint
+Comment[ga]=Breiseán a athraíonn an gníomhaire úsáideora
+Comment[gl]=Un plugin para alterar o axente do usuário
+Comment[he]=תוסף לשינוי זיהוי הדפדפן
+Comment[hi]=यूज़रएजेंट बदलने के लिए प्लगइन
+Comment[hr]=Dodatak za izmjenu korisničkog agenta
+Comment[hu]=Bővítőmodul a böngészőazonosító megváltoztatásához
+Comment[is]=Íforrit til að breyta auðkenni vafra
+Comment[it]=Plugin per modificare lo user agent
+Comment[ja]=ユーザエージェント変更用プラグイン
+Comment[ka]=მომხმარებლის აგენტის შეცვლის მოდული
+Comment[kk]=Пайдаланушы агентін ауыстыру плагин модулі
+Comment[km]=កម្មវិធី​ជំនួយ​សម្រាប់​ផ្លាស់ប្ដូរ​ភ្នាក់ងារ​អ្នក​ប្រើ​​
+Comment[lt]=Priedas naudotojo agentui keisti
+Comment[mk]=Приклучок за менување на корисничкиот агент
+Comment[ms]=Plugin untuk mengubah ejen pengguna
+Comment[nb]=Tilleggsmodul for å endre brukeragent
+Comment[nds]=Moduul för't Ännern vun de Nettkieker-Kennen
+Comment[ne]=प्रयोगकर्ता अभिकर्ता परिवर्तनका लागि प्लगइन
+Comment[nl]=Plugin voor het wijzigen van de gebruikersagent
+Comment[nn]=Programtillegg som kan endra brukaragenten
+Comment[pl]=Wtyczka zmiany identyfikacji przeglądarki
+Comment[pt]=Um 'plugin' para alterar o agente do utilizador
+Comment[pt_BR]=Plug-in para modificar o agente de usuário
+Comment[ro]=Modul pentru modificarea identificării "User Agent" a Konqueror
+Comment[ru]=Модуль настройки описания браузера
+Comment[sk]=Modul pre zmenu UserAgent-a
+Comment[sl]=Vstavek za spreminjanje uporabniškega agenta
+Comment[sr]=Прикључак за мењање корисничког агента
+Comment[sr@Latn]=Priključak za menjanje korisničkog agenta
+Comment[sv]=Insticksprogram för att ändra användaragent
+Comment[ta]=பயனர் செயலியை மாற்றுவதற்கான சொருகுப் பொருள்
+Comment[tg]=Модули танзимоти тахаллуси воқеанигор
+Comment[tr]=Kullanıcı ajanını değiştirmek için bir eklenti
+Comment[uk]=Втулок для зміни агента користувача
+Comment[vi]=Bổ sung thay đổi tác nhân người dùng
+Comment[xh]=Plagela ngaphakathi utshintsho lomsebenzisiwomntu omele omnye
+Comment[zh_CN]=用来更换用户代理的插件
+Comment[zh_TW]=改變使用者代理人的外掛程式
+X-KDE-ParentApp=konqueror
+Icon=agent
+DocPath=konq-plugins/uachanger/index.html
diff --git a/konq-plugins/uachanger/uachangerplugin.h b/konq-plugins/uachanger/uachangerplugin.h
new file mode 100644
index 0000000..eb70704
--- /dev/null
+++ b/konq-plugins/uachanger/uachangerplugin.h
@@ -0,0 +1,95 @@
+/*
+ Copyright (c) 2001 Dawit Alemayehu <adawit@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License (LGPL) as published by the Free Software Foundation;
+ either version 2 of the License, or (at your option) any later
+ version.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef __UACHANGER_PLUGIN_H
+#define __UACHANGER_PLUGIN_H
+
+#include <qmap.h>
+#include <qvaluelist.h>
+#include <qstringlist.h>
+
+#include <kurl.h>
+#include <klibloader.h>
+#include <kparts/plugin.h>
+
+class KHTMLPart;
+class KActionMenu;
+class KConfig;
+
+namespace KIO
+{
+ class Job;
+}
+
+class UAChangerPlugin : public KParts::Plugin
+{
+ Q_OBJECT
+
+public:
+ UAChangerPlugin( QObject* parent, const char* name,
+ const QStringList & );
+ ~UAChangerPlugin();
+
+protected slots:
+ void slotDefault();
+ void parseDescFiles();
+ void updateIOSlaves();
+
+ void slotConfigure();
+ void slotAboutToShow();
+ void slotApplyToDomain();
+ void slotItemSelected(int);
+ void slotStarted(KIO::Job*);
+ void slotReloadDescriptions();
+
+protected:
+ QString findTLD (const QString &hostname);
+ QString filterHost (const QString &hostname);
+
+private:
+ void loadSettings();
+ void saveSettings();
+
+ int m_selectedItem;
+ bool m_bApplyToDomain;
+ bool m_bSettingsLoaded;
+
+ KHTMLPart* m_part;
+ KActionMenu* m_pUAMenu;
+ KConfig* m_config;
+
+ KURL m_currentURL;
+ QString m_currentUserAgent;
+
+ QStringList m_lstAlias;
+ QStringList m_lstIdentity;
+
+ typedef QValueList<int> BrowserGroup;
+ typedef QMap<QString,BrowserGroup> AliasMap;
+ typedef QMap<QString,QString> BrowserMap;
+
+ typedef AliasMap::Iterator AliasIterator;
+ typedef AliasMap::ConstIterator AliasConstIterator;
+
+ BrowserMap m_mapBrowser;
+ AliasMap m_mapAlias;
+};
+
+#endif
diff --git a/konq-plugins/uachanger/uachangerplugin.rc b/konq-plugins/uachanger/uachangerplugin.rc
new file mode 100644
index 0000000..91535bf
--- /dev/null
+++ b/konq-plugins/uachanger/uachangerplugin.rc
@@ -0,0 +1,11 @@
+<!DOCTYPE kpartplugin>
+<kpartplugin name="UserAgentChanger" library="libuachangerplugin">
+<MenuBar>
+ <Menu name="tools"><Text>&amp;Tools</Text>
+ <Action name="changeuseragent"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="extraToolBar"><text>Extra Toolbar</text>
+ <Action name="changeuseragent"/>
+</ToolBar>
+</kpartplugin>
diff --git a/konq-plugins/uninstall.desktop b/konq-plugins/uninstall.desktop
new file mode 100644
index 0000000..e1e3e17
--- /dev/null
+++ b/konq-plugins/uninstall.desktop
@@ -0,0 +1,2 @@
+[Desktop Entry]
+Hidden=true
diff --git a/konq-plugins/validators/Makefile.am b/konq-plugins/validators/Makefile.am
new file mode 100644
index 0000000..3c09508
--- /dev/null
+++ b/konq-plugins/validators/Makefile.am
@@ -0,0 +1,24 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = libvalidatorsplugin.la
+
+libvalidatorsplugin_la_SOURCES = plugin_validators.cpp validatorsdialog.cpp
+libvalidatorsplugin_la_LIBADD = $(LIB_KPARTS) $(LIB_KHTML)
+libvalidatorsplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+pluginsdir = $(kde_datadir)/khtml/kpartplugins
+plugins_DATA = plugin_validators.rc plugin_validators.desktop
+
+appsdir = $(kde_appsdir)/.hidden
+apps_DATA = plugin_validators.desktop
+
+install-data-local: $(srcdir)/../uninstall.desktop
+ $(mkinstalldirs) $(DESTDIR)$(pluginsdir)
+ $(INSTALL_DATA) $(srcdir)/../uninstall.desktop $(DESTDIR)$(pluginsdir)/validatorsplugin.desktop
+
+KDE_ICON = validators cssvalidator htmlvalidator
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/validatorsplugin.pot
diff --git a/konq-plugins/validators/cr16-action-cssvalidator.png b/konq-plugins/validators/cr16-action-cssvalidator.png
new file mode 100644
index 0000000..63bbee6
--- /dev/null
+++ b/konq-plugins/validators/cr16-action-cssvalidator.png
Binary files differ
diff --git a/konq-plugins/validators/cr16-action-htmlvalidator.png b/konq-plugins/validators/cr16-action-htmlvalidator.png
new file mode 100644
index 0000000..b4a0acc
--- /dev/null
+++ b/konq-plugins/validators/cr16-action-htmlvalidator.png
Binary files differ
diff --git a/konq-plugins/validators/cr16-action-validators.png b/konq-plugins/validators/cr16-action-validators.png
new file mode 100644
index 0000000..b4a0acc
--- /dev/null
+++ b/konq-plugins/validators/cr16-action-validators.png
Binary files differ
diff --git a/konq-plugins/validators/cr22-action-cssvalidator.png b/konq-plugins/validators/cr22-action-cssvalidator.png
new file mode 100644
index 0000000..a6dec2b
--- /dev/null
+++ b/konq-plugins/validators/cr22-action-cssvalidator.png
Binary files differ
diff --git a/konq-plugins/validators/cr22-action-htmlvalidator.png b/konq-plugins/validators/cr22-action-htmlvalidator.png
new file mode 100644
index 0000000..ff67d1e
--- /dev/null
+++ b/konq-plugins/validators/cr22-action-htmlvalidator.png
Binary files differ
diff --git a/konq-plugins/validators/cr22-action-validators.png b/konq-plugins/validators/cr22-action-validators.png
new file mode 100644
index 0000000..ff67d1e
--- /dev/null
+++ b/konq-plugins/validators/cr22-action-validators.png
Binary files differ
diff --git a/konq-plugins/validators/plugin_validators.cpp b/konq-plugins/validators/plugin_validators.cpp
new file mode 100644
index 0000000..69f07cd
--- /dev/null
+++ b/konq-plugins/validators/plugin_validators.cpp
@@ -0,0 +1,202 @@
+/* This file is part of Validators
+ *
+ * It's a merge of the HTML- and the CSSValidator
+ *
+ * Copyright (C) 2001 by Richard Moore <rich@kde.org>
+ * Andreas Schlapbach <schlpbch@iam.unibe.ch>
+ *
+ * for information how to write your own plugin see:
+ * http://developer.kde.org/documentation/tutorials/dot/writing-plugins.html
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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 the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+/* $Id$ */
+
+#include <kinstance.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <kaction.h>
+#include <khtml_part.h>
+#include <kgenericfactory.h>
+#include <kdebug.h>
+#include <kaboutdata.h>
+
+#include "plugin_validators.h"
+#include "validatorsdialog.h"
+
+
+typedef KGenericFactory<PluginValidators> PluginValidatorsFactory;
+static const KAboutData aboutdata("validatorsplugin", I18N_NOOP("Validate Web Page") , "1.0" );
+K_EXPORT_COMPONENT_FACTORY( libvalidatorsplugin,
+ PluginValidatorsFactory( &aboutdata ) )
+
+PluginValidators::PluginValidators( QObject* parent, const char* name,
+ const QStringList & )
+ : Plugin( parent, name ), m_configDialog(0), m_part(0)
+{
+ setInstance(PluginValidatorsFactory::instance());
+
+ m_menu = new KActionMenu ( i18n( "&Validate Web Page" ), "validators",
+ actionCollection(), "validateWebpage" );
+ m_menu->setDelayed( false );
+
+ m_menu->insert( new KAction( i18n( "Validate &HTML" ),
+ "htmlvalidator", 0,
+ this, SLOT(slotValidateHTML()),
+ actionCollection(), "validateHTML") );
+
+ m_menu->insert( new KAction( i18n( "Validate &CSS" ),
+ "cssvalidator", 0,
+ this, SLOT(slotValidateCSS()),
+ actionCollection(), "validateCSS") );
+
+ m_menu->insert( new KAction( i18n( "Validate &Links" ),
+ 0,
+ this, SLOT(slotValidateLinks()),
+ actionCollection(), "validateLinks") );
+
+ m_menu->setEnabled( false );
+
+ if ( parent && parent->inherits( "KHTMLPart" ))
+ {
+ m_menu->insert( new KAction( i18n( "C&onfigure Validator..." ),
+ "configure", 0,
+ this, SLOT(slotConfigure()),
+ actionCollection(), "configure") );
+
+ m_part = static_cast<KHTMLPart *>( parent );
+ m_configDialog = new ValidatorsDialog( m_part->widget() );
+ setURLs();
+
+ connect( m_part, SIGNAL(started(KIO::Job*)), this,
+ SLOT(slotStarted(KIO::Job*)) );
+ }
+}
+
+PluginValidators::~PluginValidators()
+{
+ delete m_configDialog;
+// Dont' delete the action. KActionCollection as parent does the job already
+// and not deleting it at this point also ensures that in case we are not unplugged
+// from the GUI yet and the ~KXMLGUIClient destructor will do so it won't hit a
+// dead pointer. The kxmlgui factory keeps references to the actions, but it does not
+// connect to their destroyed() signal, yet (need to find an elegant solution for that
+// as it can easily increase the memory usage significantly) . That's why actions must
+// persist as long as the plugin is plugged into the GUI.
+// delete m_menu;
+}
+
+void PluginValidators::setURLs()
+{
+ m_WWWValidatorUrl = KURL(m_configDialog->getWWWValidatorUrl());
+ m_CSSValidatorUrl = KURL(m_configDialog->getCSSValidatorUrl());
+ m_WWWValidatorUploadUrl = KURL(m_configDialog->getWWWValidatorUploadUrl());
+ m_CSSValidatorUploadUrl = KURL(m_configDialog->getCSSValidatorUploadUrl());
+ m_linkValidatorUrl = KURL(m_configDialog->getLinkValidatorUrl());
+}
+
+void PluginValidators::slotStarted( KIO::Job* )
+{
+ // The w3c validator can only access http URLs, and upload local files.
+ // No https, probably no webdav either.
+ m_menu->setEnabled( m_part->url().isLocalFile()
+ || m_part->url().protocol().lower() == "http" );
+}
+
+void PluginValidators::slotValidateHTML()
+{
+ validateURL(m_WWWValidatorUrl, m_WWWValidatorUploadUrl);
+}
+
+void PluginValidators::slotValidateCSS()
+{
+ validateURL(m_CSSValidatorUrl, m_CSSValidatorUploadUrl);
+}
+
+void PluginValidators::slotValidateLinks()
+{
+ validateURL(m_linkValidatorUrl, KURL());
+}
+
+void PluginValidators::slotConfigure()
+{
+ m_configDialog->show();
+ setURLs();
+}
+
+void PluginValidators::validateURL(const KURL &url, const KURL &uploadUrl)
+{
+ // The parent is assumed to be a KHTMLPart
+ if ( !parent()->inherits("KHTMLPart") )
+ {
+ QString title = i18n( "Cannot Validate Source" );
+ QString text = i18n( "You cannot validate anything except web pages with "
+ "this plugin." );
+
+ KMessageBox::sorry( 0, text, title );
+ return;
+ }
+
+ KURL validatorUrl(url);
+
+ // Get URL
+ KURL partUrl = m_part->url();
+ if ( !partUrl.isValid() ) // Just in case ;)
+ {
+ QString title = i18n( "Malformed URL" );
+ QString text = i18n( "The URL you entered is not valid, please "
+ "correct it and try again." );
+ KMessageBox::sorry( 0, text, title );
+ return;
+ }
+
+ if (partUrl.isLocalFile())
+ {
+ if ( validatorUrl.isEmpty() ) {
+ QString title = i18n( "Upload Not Possible" );
+ QString text = i18n( "Validating links is not possible for local "
+ "files." );
+ KMessageBox::sorry( 0, text, title );
+ return;
+ }
+ validatorUrl = uploadUrl;
+ }
+ else
+ {
+ if (partUrl.hasPass())
+ {
+ KMessageBox::sorry(
+ m_part->widget(),
+ i18n("<qt>The selected URL cannot be verified because it contains "
+ "a password. Sending this URL to <b>%1</b> would put the security "
+ "of <b>%2</b> at risk.</qt>")
+ .arg(validatorUrl.host()).arg(partUrl.host()));
+ return;
+ }
+ // Set entered URL as a parameter
+ QString q = partUrl.url();
+ q = KURL::encode_string( q );
+ QString p = "uri=";
+ p += q;
+ validatorUrl.setQuery( p );
+ }
+ kdDebug(90120) << "final URL: " << validatorUrl.url() << endl;
+
+ emit m_part->browserExtension()->openURLRequest( validatorUrl );
+}
+
+#include <plugin_validators.moc>
diff --git a/konq-plugins/validators/plugin_validators.desktop b/konq-plugins/validators/plugin_validators.desktop
new file mode 100644
index 0000000..f326863
--- /dev/null
+++ b/konq-plugins/validators/plugin_validators.desktop
@@ -0,0 +1,128 @@
+[Desktop Entry]
+X-KDE-Library=validators
+X-KDE-PluginInfo-Author=Richard Moore, Andreas Schlapbach
+X-KDE-PluginInfo-Email=rich@kde.org, schlpbch@iam.unibe.ch
+X-KDE-PluginInfo-Name=validators
+X-KDE-PluginInfo-Version=3.3
+X-KDE-PluginInfo-Website=
+X-KDE-PluginInfo-Category=Tools
+X-KDE-PluginInfo-Depends=
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=false
+Name=Website Validators
+Name[bg]=Валидатори за уеб сайтове
+Name[bs]=Validatori za Web stranice
+Name[ca]=Validadors de pàgines web
+Name[cs]=Validátory webových stránek
+Name[da]=Gyldighedstjekkere af netsider
+Name[de]=Webseiten-Überprüfung
+Name[el]=Ελεγκτές εγκυρότητας ιστοσελίδων
+Name[eo]=Retsituo kontroliloj
+Name[es]=Validadores de sitios web
+Name[et]=Veebilehe süntaksi kontrollijad
+Name[eu]=Weblekuen balidatzailea
+Name[fa]=اعتبارسنجهای وب‌گاه
+Name[fi]=WWW-validaattorit
+Name[fr]=Validateur de sites Internet
+Name[fy]=Webstee-falidaasjeprogramma
+Name[ga]=Bailíochtóirí Suímh Ghréasáin
+Name[gl]=Validación de Páxinas Web
+Name[he]=מוודאי אתרי אינטרנט
+Name[hi]=वेबसाइट वेलिडेटर्स
+Name[hr]=Provjera valjanosti web-lokacije
+Name[hu]=Weboldal-ellenőrző
+Name[is]=Villuleitun vefa
+Name[it]=Validatore di Siti Web
+Name[ja]=ウェブサイト検証
+Name[ka]=ვებგვერდის დამმოწმებელი
+Name[kk]=Вебсайт тексергіші
+Name[km]=កម្មវិធី​ធ្វើ​ឲ្យ​តំបន់​បណ្ដាញ​មាន​សុពលភាព
+Name[lt]=Web sričių tikrinimo priemonės
+Name[mk]=Валидатори на веб-страници
+Name[ms]=Pengesah Laman Web
+Name[nb]=Nettsted-validator
+Name[nds]=Nettsieden-Prööv
+Name[ne]=वेबसाइट प्रमाणितकर्ता
+Name[nl]=Website-validatieprogramma
+Name[nn]=Nettstadvalidering
+Name[pl]=Sprawdzanie poprawności witryn internetowych
+Name[pt]=Validação de Páginas Web
+Name[pt_BR]=Validadores de Sites Web
+Name[ru]=Проверка правильности сайтов
+Name[sk]=Kontrola web stránky
+Name[sl]=Potrdilniki spletnih strani
+Name[sr]=Оверивачи веб сајтова
+Name[sr@Latn]=Overivači veb sajtova
+Name[sv]=Validering av webbplatser
+Name[ta]=வலைதள மதிப்பீடுகள்
+Name[tg]=Тафтиши дурустии сайтҳо
+Name[tr]=İnternet Sitesi Denetleyicisi
+Name[uk]=Служби перевірки сайтів
+Name[uz]=Veb-sahifa toʻgʻriligini tekshirish
+Name[uz@cyrillic]=Веб-саҳифа тўғрилигини текшириш
+Name[vi]=Bộ thẩm tra chỗ Mạng
+Name[zh_CN]=网站校验器
+Name[zh_TW]=網站驗證器
+Comment=CSS and HTML validator plugins
+Comment[af]=Css en Html geldighiedstoetser inprop modules
+Comment[ar]=ملحقات للتأكد من صلاحية ملفات HTML و CSS
+Comment[az]=CSS və HTML doğrulayıcı əlavələri
+Comment[bg]=Приставка за валидиране на CSS и HTML
+Comment[bs]=CSS i HTML validator dodaci
+Comment[ca]=Connectors de validació CSS i HTML
+Comment[cs]=Moduly pro validaci CSS a HTML
+Comment[cy]=Ategynnau dilysydd CSS a HTML
+Comment[da]=Gyldighedstjekker-plugin for CSS og HTML
+Comment[de]=CSS- und HTML-Module zur Syntaxüberprüfung
+Comment[el]=Πρόσθετα ελέγχου εγκυρότητας CSS και HTML
+Comment[eo]=CSS kaj HTML kontrolaj kromaĵoj
+Comment[es]=Complementos para validar CSS y HTML
+Comment[et]=CSS ja HTML süntaksi kontrollimise plugin
+Comment[eu]=CSS eta HTML balidatzeko pluginak
+Comment[fa]=وصله‌های اعتبارسنج زنگام و CSS
+Comment[fi]=CSS ja HTML validointisovelmat
+Comment[fr]=Module de validation CSS et HTML
+Comment[fy]=Plugins foar it falidearjen fan HTML en CSS
+Comment[ga]=Breiseáin Bhailíochtaithe CSS agus HTML
+Comment[gl]=Plugins de validación de CSS e HTML
+Comment[he]=תוספים לווידוא CSS ו־HTML
+Comment[hi]=सीएसएस तथा एचटीएमएल वेलिडेटर प्लगइन्स
+Comment[hr]=Dodatak za provjeravanje valjanosti CSS-a i HTML-a
+Comment[hu]=CSS- és HTML-ellenőrző bővítőmodul
+Comment[is]=CSS og HTML gildir
+Comment[it]=Plugin per validare CSS e HTML
+Comment[ja]=CSS と HTML を検証するプラグイン
+Comment[ka]=CSS და HTML დამოწმების მოდული
+Comment[kk]=CSS және HTML тексергіш плагин модулі
+Comment[km]=កម្មវិធី​ជំនួយ​​របស់​កម្មវិធី​​ធ្វើ​ឲ្យ​ CSS និង​ HTML មាន​សុពលភាព
+Comment[lt]=CSS ir HTML tikrinimo priedai
+Comment[mk]=Приклучоци за валидирање на CSS и HTML
+Comment[ms]=Plugin pengesah CSS dan HTML
+Comment[nb]=Tilleggsmoduler for validering av CSS og HTML
+Comment[nds]=CSS- un HTML-Pröövmodulen
+Comment[ne]=सीएसएस र एचटीएमएल प्रमाणितकर्ता प्लगइनहरू
+Comment[nl]=Plugins voor het valideren van HTML en CSS
+Comment[nn]=Programtillegg for validering av CSS og HTML
+Comment[pl]=Wtyczka sprawdzania poprawności HTML i CSS
+Comment[pt]='Plugins' de validação de CSS e HTML
+Comment[pt_BR]=Plug-Ins validador para CSS e HTML
+Comment[ro]=Module de validare CSS şi HTML
+Comment[ru]=Модули проверки правильности HTML и CSS
+Comment[sk]=Modul pre kontrolu CSS a HTML
+Comment[sl]=Vstavki za potrjevanje CSS in HTML
+Comment[sr]=Прикључци за оверавање CSS-а и HTML-а
+Comment[sr@Latn]=Priključci za overavanje CSS-a i HTML-a
+Comment[sv]=Insticksprogram för CSS- och HTML-validering
+Comment[ta]=CSS மற்றும் HTML மதிப்பீட்டாளர் சொருகுப்பொருள்கள்
+Comment[tg]=Модули тафтиши дурустии HTML ва CSS
+Comment[tr]=CSS ve HTML denetleme eklentileri
+Comment[uk]=Втулки перевірки CSS і HTML
+Comment[uz]=HTML va CSS toʻgʻriligini tekshirish vositalari
+Comment[uz@cyrillic]=HTML ва CSS тўғрилигини текшириш воситалари
+Comment[vi]=Bổ sung thẩm tra HTML và CSS
+Comment[xh]=Iiplagi zangaphakathi zomqinisekisi we CSS ne HTML
+Comment[zh_CN]=CSS 和 HTML 校验插件
+Comment[zh_TW]=CSS 與 HTML 驗證外掛程式
+Icon=validators
+X-KDE-ParentApp=konqueror
+DocPath=konq-plugins/validators/index.html
diff --git a/konq-plugins/validators/plugin_validators.h b/konq-plugins/validators/plugin_validators.h
new file mode 100644
index 0000000..448e77f
--- /dev/null
+++ b/konq-plugins/validators/plugin_validators.h
@@ -0,0 +1,72 @@
+/* This file is part of Validators
+ *
+ * It's a merge of the HTML- and the CSSValidator
+ *
+ * Copyright (C) 2001 by Richard Moore <rich@kde.org>
+ * Andreas Schlapbach <schlpbch@iam.unibe.ch>
+ *
+ * for information how to write your own plugin see:
+ * http://developer.kde.org/documentation/tutorials/dot/writing-plugins.html
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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 the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+/* $Id$ */
+
+#ifndef __plugin_validators_h
+#define __plugin_validators_h
+
+#include <kparts/plugin.h>
+#include <klibloader.h>
+
+#include "validatorsdialog.h"
+#include <qguardedptr.h>
+
+class KAction;
+class KURL;
+
+class PluginValidators : public KParts::Plugin
+{
+ Q_OBJECT
+public:
+ PluginValidators( QObject* parent, const char* name,
+ const QStringList & );
+ virtual ~PluginValidators();
+
+public slots:
+ void slotValidateHTML();
+ void slotValidateCSS();
+ void slotValidateLinks();
+ void slotConfigure();
+
+private slots:
+ void slotStarted( KIO::Job* );
+
+private:
+ KActionMenu *m_menu;
+ QGuardedPtr<ValidatorsDialog> m_configDialog; // |
+ // +-> Order dependency.
+ KHTMLPart* m_part; // |
+
+ KURL m_WWWValidatorUrl, m_WWWValidatorUploadUrl;
+ KURL m_CSSValidatorUrl, m_CSSValidatorUploadUrl;
+ KURL m_linkValidatorUrl;
+
+ void setURLs();
+ void validateURL(const KURL &url, const KURL &uploadUrl = KURL());
+};
+
+#endif
diff --git a/konq-plugins/validators/plugin_validators.rc b/konq-plugins/validators/plugin_validators.rc
new file mode 100644
index 0000000..5207ee8
--- /dev/null
+++ b/konq-plugins/validators/plugin_validators.rc
@@ -0,0 +1,11 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="validators" library="libvalidatorsplugin">
+<MenuBar>
+ <Menu name="tools"><Text>&amp;Tools</Text>
+ <Action name="validateWebpage"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="extraToolBar"><text>Extra Toolbar</text>
+ <Action name="validateWebpage"/>
+</ToolBar>
+</kpartplugin>
diff --git a/konq-plugins/validators/validatorsdialog.cpp b/konq-plugins/validators/validatorsdialog.cpp
new file mode 100644
index 0000000..0c524e2
--- /dev/null
+++ b/konq-plugins/validators/validatorsdialog.cpp
@@ -0,0 +1,176 @@
+/* This file is part of the KDE project
+
+ Copyright (C) 2001 Andreas Schlapbach <schlpbch@iam.unibe.ch>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <qlabel.h>
+#include <qvbox.h>
+#include <qgroupbox.h>
+#include <qlayout.h>
+#include <qcombobox.h>
+#include <kconfig.h>
+
+#include <klocale.h>
+
+#include "validatorsdialog.h"
+#include "validatorsdialog.moc"
+
+ValidatorsDialog::ValidatorsDialog(QWidget *parent, const char *name )
+ : KDialogBase( parent, name, false, i18n("Configure"), Ok|Cancel, Ok, true )
+{
+ setCaption(i18n("Configure Validating Servers"));
+ setMinimumWidth(300);
+
+ QVBox *page = makeVBoxMainWidget ();
+
+ QGroupBox *tgroup = new QGroupBox( i18n("HTML/XML Validator"), page );
+ QVBoxLayout *vlay = new QVBoxLayout( tgroup, spacingHint() );
+ vlay->addSpacing( fontMetrics().lineSpacing());
+
+ vlay->addWidget(new QLabel( i18n("URL:"), tgroup));
+
+ m_WWWValidatorCB = new QComboBox(true, tgroup);
+ m_WWWValidatorCB->setDuplicatesEnabled(false);
+ vlay->addWidget( m_WWWValidatorCB );
+
+ vlay->addWidget(new QLabel( i18n("Upload:"), tgroup));
+
+ m_WWWValidatorUploadCB = new QComboBox(true, tgroup);
+ m_WWWValidatorUploadCB->setDuplicatesEnabled(false);
+ vlay->addWidget( m_WWWValidatorUploadCB );
+
+ ///
+
+ QGroupBox *group2= new QGroupBox( i18n("CSS Validator"), page );
+ QVBoxLayout *vlay2 = new QVBoxLayout( group2, spacingHint() );
+ vlay2->addSpacing( fontMetrics().lineSpacing());
+
+ vlay2->addWidget(new QLabel( i18n("URL:"), group2));
+
+ m_CSSValidatorCB = new QComboBox(true, group2);
+ m_CSSValidatorCB->setDuplicatesEnabled(false);
+ vlay2->addWidget( m_CSSValidatorCB );
+
+ vlay2->addWidget(new QLabel( i18n("Upload:"), group2));
+
+ m_CSSValidatorUploadCB = new QComboBox(true, group2);
+ m_CSSValidatorUploadCB->setDuplicatesEnabled(false);
+ vlay2->addWidget( m_CSSValidatorUploadCB );
+
+ ///
+
+ QGroupBox *group3= new QGroupBox( i18n("Link Validator"), page );
+ QVBoxLayout *vlay3 = new QVBoxLayout( group3, spacingHint() );
+ vlay3->addSpacing( fontMetrics().lineSpacing());
+
+ vlay3->addWidget(new QLabel( i18n("URL:"), group3));
+
+ m_linkValidatorCB = new QComboBox(true, group3);
+ m_linkValidatorCB->setDuplicatesEnabled(false);
+ vlay3->addWidget( m_linkValidatorCB );
+
+ load();
+}
+
+ValidatorsDialog::~ValidatorsDialog()
+{
+ delete m_config;
+}
+
+void ValidatorsDialog::load()
+{
+ m_config = new KConfig("validatorsrc");
+ m_config->setGroup("Addresses");
+
+ m_WWWValidatorCB->insertStringList(m_config->readListEntry("WWWValidatorUrl"));
+ if (m_WWWValidatorCB->count()==0) {
+ m_WWWValidatorCB->insertItem("http://validator.w3.org/check");
+ }
+ m_WWWValidatorCB->setCurrentItem(m_config->readNumEntry("WWWValidatorUrlIndex",0));
+
+ m_CSSValidatorCB->insertStringList(m_config->readListEntry("CSSValidatorUrl"));
+ if (m_CSSValidatorCB->count()==0) {
+ m_CSSValidatorCB->insertItem("http://jigsaw.w3.org/css-validator/validator");
+ }
+ m_CSSValidatorCB->setCurrentItem(m_config->readNumEntry("CSSValidatorUrlIndex",0));
+
+ m_linkValidatorCB->insertStringList(m_config->readListEntry("LinkValidatorUrl"));
+ if (m_linkValidatorCB->count()==0) {
+ m_linkValidatorCB->insertItem("http://validator.w3.org/checklink");
+ }
+ m_linkValidatorCB->setCurrentItem(m_config->readNumEntry("LinkValidatorUrlIndex",0));
+
+ m_WWWValidatorUploadCB->insertStringList(m_config->readListEntry("WWWValidatorUploadUrl"));
+ if (m_WWWValidatorUploadCB->count()==0) {
+ m_WWWValidatorUploadCB->insertItem("http://validator.w3.org/file-upload.html");
+ }
+ m_WWWValidatorUploadCB->setCurrentItem(m_config->readNumEntry("WWWValidatorUploadUrlIndex",0));
+
+ m_CSSValidatorUploadCB->insertStringList(m_config->readListEntry("CSSValidatorUploadUrl"));
+ if (m_CSSValidatorUploadCB->count()==0) {
+ m_CSSValidatorUploadCB->insertItem("http://jigsaw.w3.org/css-validator/validator-upload.html" );
+ }
+ m_CSSValidatorUploadCB->setCurrentItem(m_config->readNumEntry("CSSValidatorUploadUrlIndex",0));
+}
+
+void ValidatorsDialog::save()
+{
+ QStringList strList;
+ for (int i = 0; i < m_WWWValidatorCB->count(); i++) {
+ strList.append(m_WWWValidatorCB->text(i));
+ }
+ m_config->writeEntry( "WWWValidatorUrl", strList );
+ strList.clear();
+ for (int i = 0; i < m_CSSValidatorCB->count(); i++) {
+ strList.append(m_CSSValidatorCB->text(i));
+ }
+ m_config->writeEntry( "CSSValidatorUrl", strList );
+ strList.clear();
+ for (int i = 0; i < m_linkValidatorCB->count(); i++) {
+ strList.append(m_linkValidatorCB->text(i));
+ }
+ m_config->writeEntry( "LinkValidatorUrl", strList );
+ strList.clear();
+ for (int i = 0; i < m_WWWValidatorUploadCB->count(); i++) {
+ strList.append(m_WWWValidatorUploadCB->text(i));
+ }
+ m_config->writeEntry( "WWWValidatorUploadUrl", strList );
+ strList.clear();
+ for (int i = 0; i < m_CSSValidatorUploadCB->count(); i++) {
+ strList.append(m_CSSValidatorUploadCB->text(i));
+ }
+ m_config->writeEntry( "CSSValidatorUploadUrl", strList );
+
+ m_config->writeEntry( "WWWValidatorUrlIndex", m_WWWValidatorCB->currentItem() );
+ m_config->writeEntry( "CSSValidatorUrlIndex", m_CSSValidatorCB->currentItem() );
+ m_config->writeEntry( "LinkValidatorUrlIndex", m_linkValidatorCB->currentItem() );
+ m_config->writeEntry( "WWWValidatorUploadUrlIndex", m_WWWValidatorUploadCB->currentItem() );
+ m_config->writeEntry( "CSSValidatorUploadUrlIndex", m_CSSValidatorUploadCB->currentItem() );
+ m_config->sync();
+}
+
+void ValidatorsDialog::slotOk()
+{
+ save();
+ hide();
+}
+
+void ValidatorsDialog::slotCancel()
+{
+ load();
+ hide();
+}
diff --git a/konq-plugins/validators/validatorsdialog.h b/konq-plugins/validators/validatorsdialog.h
new file mode 100644
index 0000000..79684f5
--- /dev/null
+++ b/konq-plugins/validators/validatorsdialog.h
@@ -0,0 +1,58 @@
+/* This file is part of the KDE project
+
+ Copyright (C) 2001 Andreas Schlapbach <schlpbch@iam.unibe.ch>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef __validatorsdialog_h
+#define __validatorsdialog_h
+
+#include <qcombobox.h>
+
+#include <kconfig.h>
+#include <kdialogbase.h>
+
+class ValidatorsDialog : public KDialogBase
+{
+ Q_OBJECT
+
+ public:
+ ValidatorsDialog(QWidget *parent=0, const char *name=0 );
+ ~ValidatorsDialog();
+
+ const QString getWWWValidatorUrl() const {return m_WWWValidatorCB->currentText();}
+ const QString getCSSValidatorUrl() const {return m_CSSValidatorCB->currentText();}
+ const QString getWWWValidatorUploadUrl() const {return m_WWWValidatorUploadCB->currentText();}
+ const QString getCSSValidatorUploadUrl() const {return m_CSSValidatorUploadCB->currentText();}
+ const QString getLinkValidatorUrl() const {return m_linkValidatorCB->currentText();}
+
+ protected slots:
+ void slotOk();
+ void slotCancel();
+
+ private:
+ void load();
+ void save();
+
+ QComboBox *m_WWWValidatorCB;
+ QComboBox *m_WWWValidatorUploadCB;
+ QComboBox *m_CSSValidatorCB;
+ QComboBox *m_CSSValidatorUploadCB;
+ QComboBox *m_linkValidatorCB;
+ KConfig *m_config;
+};
+
+#endif
diff --git a/konq-plugins/webarchiver/Makefile.am b/konq-plugins/webarchiver/Makefile.am
new file mode 100644
index 0000000..53d519e
--- /dev/null
+++ b/konq-plugins/webarchiver/Makefile.am
@@ -0,0 +1,32 @@
+INCLUDES = $(all_includes)
+KDE_CXXFLAGS = $(USE_EXCEPTIONS)
+METASOURCES = AUTO
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = libwebarchiverplugin.la webarchivethumbnail.la
+
+libwebarchiverplugin_la_SOURCES = plugin_webarchiver.cpp archiveviewbase.ui archivedialog.cpp
+libwebarchiverplugin_la_LIBADD = $(LIB_KPARTS) $(LIB_KHTML)
+libwebarchiverplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+pluginsdir = $(kde_datadir)/khtml/kpartplugins
+plugins_DATA = plugin_webarchiver.rc plugin_webarchiver.desktop
+
+appsdir = $(kde_appsdir)/.hidden
+apps_DATA = plugin_webarchiver.desktop
+
+install-data-local: $(srcdir)/../uninstall.desktop
+ $(mkinstalldirs) $(DESTDIR)$(pluginsdir)
+ $(INSTALL_DATA) $(srcdir)/../uninstall.desktop $(DESTDIR)$(pluginsdir)/webarchiverplugin.desktop
+
+webarchivethumbnail_la_SOURCES = webarchivecreator.cpp
+webarchivethumbnail_la_LIBADD = $(LIB_KHTML)
+webarchivethumbnail_la_LDFLAGS = $(all_libraries) -module $(KDE_PLUGIN)
+
+servicesdir = $(kde_servicesdir)
+services_DATA = webarchivethumbnail.desktop
+
+KDE_ICON = webarchiver
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/webarchiver.pot
diff --git a/konq-plugins/webarchiver/archivedialog.cpp b/konq-plugins/webarchiver/archivedialog.cpp
new file mode 100644
index 0000000..71390c2
--- /dev/null
+++ b/konq-plugins/webarchiver/archivedialog.cpp
@@ -0,0 +1,565 @@
+/*
+ Copyright (C) 2001 Andreas Schlapbach <schlpbch@iam.unibe.ch>
+ Copyright (C) 2003 Antonio Larrosa <larrosa@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "archivedialog.h"
+#include <qwidget.h>
+#include <khtml_part.h>
+#include "archiveviewbase.h"
+#include <kinstance.h>
+#include <ktempfile.h>
+#include <ktar.h>
+
+#include <kfiledialog.h>
+#include <kmessagebox.h>
+#include <kpassivepopup.h>
+#include <klocale.h>
+#include <kio/netaccess.h>
+#include <khtml_part.h>
+#include <kdebug.h>
+#include <kgenericfactory.h>
+#include <kactivelabel.h>
+#include <qstylesheet.h>
+#include <qiodevice.h>
+#include <klistview.h>
+#include <kio/job.h>
+#include <kapplication.h>
+#include <kurllabel.h>
+#include <kprogress.h>
+#include <kstringhandler.h>
+#include <qpushbutton.h>
+
+#undef DEBUG_WAR
+
+#define CONTENT_TYPE "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">"
+
+ArchiveDialog::ArchiveDialog(QWidget *parent, const QString &filename,
+ KHTMLPart *part) :
+ KDialogBase(parent, "WebArchiveDialog", false, i18n("Web Archiver"),
+ KDialogBase::Ok | KDialogBase::Cancel | KDialogBase::User1 ),
+ m_bPreserveWS(false), m_tmpFile(0), m_url(part->url())
+{
+ m_widget=new ArchiveViewBase(this);
+ setMainWidget(m_widget);
+ setWFlags(getWFlags() | WDestructiveClose);
+
+ m_widget->urlLabel->setText(QString("<a href=\"")+m_url.url()+"\">"+KStringHandler::csqueeze( m_url.url(), 80 )+"</a>");
+ m_widget->targetLabel->setText(QString("<a href=\"")+filename+"\">"+KStringHandler::csqueeze( filename, 80 )+"</a>");
+
+ if(part->document().ownerDocument().isNull())
+ m_document = part->document();
+ else
+ m_document = part->document().ownerDocument();
+
+ enableButtonOK( false );
+ showButton( KDialogBase::User1, false );
+ setButtonOK( KStdGuiItem::close() );
+
+ m_tarBall = new KTar(filename,"application/x-gzip");
+}
+
+void ArchiveDialog::archive()
+{
+ m_iterator=0;
+ m_currentLVI=0;
+ if (m_tarBall->open(IO_WriteOnly)) {
+#ifdef DEBUG_WAR
+ kdDebug(90110) << "Web Archive opened " << endl;
+#endif
+
+ m_linkDict.insert(QString("index.html"), QString(""));
+ saveFile("index.html");
+
+ } else {
+ const QString title = i18n( "Unable to Open Web-Archive" );
+ const QString text = i18n( "Unable to open \n %1 \n for writing." ).arg(m_tarBall->fileName());
+ KMessageBox::sorry( 0L, text, title );
+ }
+}
+
+ArchiveDialog::~ArchiveDialog()
+{
+ delete m_tarBall;
+}
+
+/* Store the HTMLized DOM-Tree to a temporary file and add it to the Tar-Ball */
+
+void ArchiveDialog::saveFile( const QString&)
+{
+ KTempFile tmpFile;
+ if (!(tmpFile.status())) {
+
+ QString temp;
+
+ m_state=Retrieving;
+ QTextStream *tempStream = new QTextStream(&temp, IO_ReadOnly);
+
+ saveToArchive(tempStream);
+
+ delete tempStream;
+
+ m_downloadedURLDict.clear();
+
+ m_state=Downloading;
+ m_widget->progressBar->setTotalSteps(m_urlsToDownload.count());
+ m_widget->progressBar->setProgress(0);
+ downloadNext();
+
+ } else {
+ const QString title = i18n( "Could Not Open Temporary File" );
+ const QString text = i18n( "Could not open a temporary file" );
+ KMessageBox::sorry( 0, text, title );
+ }
+}
+
+void ArchiveDialog::setSavingState()
+{
+ KTempFile tmpFile;
+ QTextStream* textStream = tmpFile.textStream();
+ textStream->setEncoding(QTextStream::UnicodeUTF8);
+
+ m_widget->progressBar->setProgress(m_widget->progressBar->totalSteps());
+
+ m_state=Saving;
+ saveToArchive(textStream);
+
+ tmpFile.close();
+
+ QString fileName="index.html";
+ QFile file(tmpFile.name());
+ file.open(IO_ReadOnly);
+ m_tarBall->writeFile(fileName, QString::null, QString::null, file.size(), file.readAll());
+#ifdef DEBUG_WAR
+ kdDebug(90110) << "HTML-file written: " << fileName << endl;
+#endif
+ file.close();
+
+ // Cleaning up
+ file.remove();
+ m_tarBall->close();
+
+ KPassivePopup::message( m_url.prettyURL() , i18n( "Archiving webpage completed." ), this );
+
+ enableButtonOK(true);
+ setEscapeButton(Ok);
+ actionButton(Ok)->setFocus();
+ enableButtonCancel(false);
+}
+
+/* Recursively travers the DOM-Tree */
+
+void ArchiveDialog::saveToArchive(QTextStream* _textStream)
+{
+ if (!_textStream) return;
+
+ // Add a doctype
+
+ (*_textStream) <<"<!-- saved from:" << endl << m_url.url() << " -->" << endl;
+
+ try
+ {
+ saveArchiveRecursive(m_document.documentElement(), m_url, _textStream, 0);
+ }
+ catch (...)
+ {
+ kdDebug(90110) << "exception" << endl;
+ }
+}
+
+static bool hasAttribute(const DOM::Node &pNode, const QString &attrName, const QString &attrValue)
+{
+ const DOM::Element element = (const DOM::Element) pNode;
+ DOM::Attr attr;
+ DOM::NamedNodeMap attrs = element.attributes();
+ unsigned long lmap = attrs.length();
+ for( unsigned int j=0; j<lmap; j++ ) {
+ attr = static_cast<DOM::Attr>(attrs.item(j));
+ if ((attr.name().string().upper() == attrName) &&
+ (attr.value().string().upper() == attrValue))
+ return true;
+ }
+ return false;
+}
+
+static bool hasChildNode(const DOM::Node &pNode, const QString &nodeName)
+{
+ DOM::Node child;
+ try
+ {
+ // We might throw a DOM exception
+ child = pNode.firstChild();
+ }
+ catch (...)
+ {
+ // No children, stop recursion here
+ child = DOM::Node();
+ }
+
+ while(!child.isNull()) {
+ if (child.nodeName().string().upper() == nodeName)
+ return true;
+ child = child.nextSibling();
+ }
+ return false;
+}
+
+/* Transform DOM-Tree to HTML */
+
+void ArchiveDialog::saveArchiveRecursive(const DOM::Node &pNode, const KURL& baseURL,
+ QTextStream* _textStream, int indent)
+{
+ const QString nodeNameOrig(pNode.nodeName().string());
+ const QString nodeName(pNode.nodeName().string().upper());
+ QString text;
+ QString strIndent;
+ strIndent.fill(' ', indent);
+ const DOM::Element element = (const DOM::Element) pNode;
+ DOM::Node child;
+
+ if ( !element.isNull() ) {
+ if (nodeName.at(0)=='-') {
+ /* Don't save khtml internal tags '-konq..'
+ * Approximating it with <DIV>
+ */
+ text += "<DIV> <!-- -KONQ_BLOCK -->";
+ } else if (nodeName == "BASE") {
+ /* Skip BASE, everything is relative to index.html
+ * Saving SCRIPT but they can cause trouble!
+ */
+ } else if ((nodeName == "META") && hasAttribute(pNode, "HTTP-EQUIV", "CONTENT-TYPE")) {
+ /* Skip content-type meta tag, we provide our own.
+ */
+ } else {
+ if (!m_bPreserveWS) {
+ if (nodeName == "PRE") {
+ m_bPreserveWS = true;
+ }
+ text = strIndent;
+ }
+ text += "<" + nodeNameOrig;
+ QString attributes;
+ QString attrNameOrig, attrName, attrValue;
+ DOM::Attr attr;
+ DOM::NamedNodeMap attrs = element.attributes();
+ unsigned long lmap = attrs.length();
+ for( unsigned int j=0; j<lmap; j++ ) {
+ attr = static_cast<DOM::Attr>(attrs.item(j));
+ attrNameOrig = attr.name().string();
+ attrName = attrNameOrig.upper();
+ attrValue = attr.value().string();
+
+#if 0
+ if ((nodeName == "FRAME" || nodeName == "IFRAME") && attrName == "SRC") {
+ //attrValue = handleLink(baseURL, attrValue);
+
+ /* Going recursively down creating a DOM-Tree for the Frame, second Level of recursion */
+ //## Add Termination criteria, on the other hand frames are not indefinetly nested, are they :)
+
+ KHTMLPart* part = new KHTMLPart();
+ KURL absoluteURL = getAbsoluteURL(baseURL, attrValue);
+ part->openURL(absoluteURL);
+ saveFile(getUniqueFileName(absoluteURL.fileName()), part);
+ delete part;
+
+ } else if
+#endif
+ if ((nodeName == "LINK" && attrName == "HREF") || // Down load stylesheets, js-script, ..
+ ((nodeName == "FRAME" || nodeName == "IFRAME") && attrName == "SRC") ||
+ ((nodeName == "IMG" || nodeName == "INPUT" || nodeName == "SCRIPT") && attrName == "SRC") ||
+ ((nodeName == "BODY" || nodeName == "TABLE" || nodeName == "TH" || nodeName == "TD") && attrName == "BACKGROUND")) {
+ // Some people use carriage return in file names and browsers support that!
+ attrValue = handleLink(baseURL, attrValue.replace(QRegExp("\\s"), ""));
+ }
+ /*
+ * ## Make recursion level configurable
+ */
+ /*
+ } else if (nodeName == "A" && attrName == "HREF") {
+ attrValue = handleLink(baseURL, attrValue);
+ */
+
+ attributes += " " + attrName + "=\"" + attrValue + "\"";
+ }
+ if (!(attributes.isEmpty())){
+ text += " ";
+ }
+ text += attributes.simplifyWhiteSpace();
+ text += ">";
+
+ if (nodeName == "HTML") {
+ /* Search for a HEAD tag, if not found, generate one.
+ */
+ if (!hasChildNode(pNode, "HEAD"))
+ text += "\n" + strIndent + " <HEAD>" CONTENT_TYPE "</HEAD>";
+ }
+ else if (nodeName == "HEAD") {
+ text += "\n" + strIndent + " " + CONTENT_TYPE;
+ }
+ }
+ } else {
+ const QString& nodeValue(pNode.nodeValue().string());
+ if (!(nodeValue.isEmpty())) {
+ // Don't escape < > in JS or CSS
+ QString parentNodeName = pNode.parentNode().nodeName().string().upper();
+ if (parentNodeName == "STYLE") {
+ text = analyzeInternalCSS(baseURL, pNode.nodeValue().string());
+ } else if (m_bPreserveWS) {
+ text = QStyleSheet::escape(pNode.nodeValue().string());
+ } else if (parentNodeName == "SCRIPT") {
+ text = pNode.nodeValue().string();
+ } else {
+ text = strIndent + QStyleSheet::escape(pNode.nodeValue().string());
+ }
+ }
+ }
+
+#ifdef DEBUG_WAR
+ kdDebug(90110) << "text:" << text << endl;
+#endif
+ if (!(text.isEmpty())) {
+ (*_textStream) << text;
+ if (!m_bPreserveWS) {
+ (*_textStream) << endl;
+ }
+ }
+
+ try
+ {
+ // We might throw a DOM exception
+ child = pNode.firstChild();
+ }
+ catch (...)
+ {
+ // No children, stop recursion here
+ child = DOM::Node();
+ }
+
+ while(!child.isNull()) {
+ saveArchiveRecursive(child, baseURL, _textStream, indent+2);
+ child = child.nextSibling();
+ }
+
+ if (!(element.isNull())) {
+ if (nodeName == "AREA" || nodeName == "BASE" || nodeName == "BASEFONT" ||
+ nodeName == "BR" || nodeName == "COL" || nodeName == "FRAME" ||
+ nodeName == "HR" || nodeName == "IMG" || nodeName == "INPUT" ||
+ nodeName == "ISINDEX" || nodeName == "META" || nodeName == "PARAM") {
+
+ /* Closing Tag is forbidden, see HTML 4.01 Specs: Index of Elements */
+
+ } else {
+ if (!m_bPreserveWS) {
+ text = strIndent;
+ } else {
+ text ="";
+ }
+ if (nodeName.at(0)=='-') {
+ text += "</DIV> <!-- -KONQ_BLOCK -->";
+ } else {
+ text += "</" + pNode.nodeName().string() + ">";
+ if (nodeName == "PRE") {
+ m_bPreserveWS = false;
+ }
+ }
+#ifdef DEBUG_WAR
+ kdDebug(90110) << text << endl;
+#endif
+ if (!(text.isEmpty())) {
+ (*_textStream) << text;
+ if (!m_bPreserveWS) {
+ (*_textStream) << endl;
+ }
+ }
+ }
+ }
+}
+
+/* Extract the URL, download it's content and return an unique name for the link */
+
+QString ArchiveDialog::handleLink(const KURL& _url, const QString& _link)
+{
+ KURL url(getAbsoluteURL(_url, _link));
+
+ QString tarFileName;
+ if (kapp->authorizeURLAction("redirect", _url, url))
+ {
+ if (m_state==Retrieving)
+ m_urlsToDownload.append(url);
+ else if (m_state==Saving)
+ tarFileName = m_downloadedURLDict[url.url()];
+ }
+
+ return tarFileName;
+}
+
+void ArchiveDialog::downloadNext()
+{
+ if (m_iterator>=m_urlsToDownload.count())
+ {
+ // We've already downloaded all the files we wanted, let's save them
+ setSavingState();
+ return;
+ }
+
+ KURL url=m_urlsToDownload[m_iterator];
+
+#ifdef DEBUG_WAR
+ kdDebug(90110) << "URL : " << url.url() << endl;
+#endif
+ QString tarFileName;
+
+ // Only download file once
+ if (m_downloadedURLDict.contains(url.url())) {
+ tarFileName = m_downloadedURLDict[url.url()];
+#ifdef DEBUG_WAR
+ kdDebug(90110) << "File already downloaded: " << url.url()
+ << m_downloadedURLDict.count() << endl;
+#endif
+ m_iterator++;
+ downloadNext();
+ return;
+ } else {
+
+ // Gets the name of a temporary file into m_tmpFileName
+ delete m_tmpFile;
+ m_tmpFile=new KTempFile();
+ m_tmpFile->close();
+ QFile::remove(m_tmpFile->name());
+ kdDebug(90110) << "downloading: " << url.url() << " to: " << m_tmpFile->name() << endl;
+ KURL dsturl;
+ dsturl.setPath(m_tmpFile->name());
+ KIO::Job *job=KIO::file_copy(url, dsturl, -1, false, false, false);
+ job->addMetaData("cache", "cache"); // Use entry from cache if available.
+ connect(job, SIGNAL(result( KIO::Job *)), this, SLOT(finishedDownloadingURL( KIO::Job *)) );
+
+ m_currentLVI=new QListViewItem(m_widget->listView, url.prettyURL());
+ m_widget->listView->insertItem( m_currentLVI );
+ m_currentLVI->setText(1,i18n("Downloading"));
+ }
+#ifdef DEBUG_WAR
+ kdDebug(90110) << "TarFileName: [" << tarFileName << "]" << endl << endl;
+#endif
+}
+
+void ArchiveDialog::finishedDownloadingURL( KIO::Job *job )
+{
+ if ( job->error() )
+ {
+// QString s=job->errorString();
+ m_currentLVI->setText(1,i18n("Error"));
+ }
+ else
+ m_currentLVI->setText(1,i18n("Ok"));
+
+ m_widget->progressBar->advance(1);
+
+
+ KURL url=m_urlsToDownload[m_iterator];
+
+ QString tarFileName = getUniqueFileName(url.fileName());
+
+ // Add file to Tar-Ball
+ QFile file(m_tmpFile->name());
+ file.open(IO_ReadOnly);
+ m_tarBall->writeFile(tarFileName, QString::null, QString::null, file.size(), file.readAll());
+ file.close();
+ m_tmpFile->unlink();
+ delete m_tmpFile;
+ m_tmpFile=0;
+
+ // Add URL to downloaded URLs
+
+ m_downloadedURLDict.insert(url.url(), tarFileName);
+ m_linkDict.insert(tarFileName, QString(""));
+
+ m_iterator++;
+ downloadNext();
+}
+
+/* Create an absolute URL for download */
+
+KURL ArchiveDialog::getAbsoluteURL(const KURL& _url, const QString& _link)
+{
+ // Does all the magic for me
+ return KURL(_url, _link);
+}
+
+/* Adds an id to a fileName to make it unique relative to the Tar-Ball */
+
+QString ArchiveDialog::getUniqueFileName(const QString& fileName)
+{
+ // Name clash -> add unique id
+ static int id=2;
+ QString uniqueFileName(fileName);
+
+#ifdef DEBUG_WAR
+ kdDebug(90110) << "getUniqueFileName(..): [" << fileName << "]" << endl;
+#endif
+
+ while (uniqueFileName.isEmpty() || m_linkDict.contains(uniqueFileName))
+ uniqueFileName = QString::number(id++) + fileName;
+
+ return uniqueFileName;
+}
+
+/* Search for Images in CSS, extract them and adjust CSS */
+
+QString ArchiveDialog::analyzeInternalCSS(const KURL& _url, const QString& string)
+{
+#ifdef DEBUG_WAR
+ kdDebug () << "analyzeInternalCSS" << endl;
+#endif
+
+ QString str(string);
+ int pos = 0;
+ int startUrl = 0;
+ int endUrl = 0;
+ int length = string.length();
+ while (pos < length && pos >= 0) {
+ pos = str.find("url(", pos);
+ if (pos!=-1) {
+ pos += 4; // url(
+
+ if (str[pos]=='"' || str[pos]=='\'') // CSS 'feature'
+ pos++;
+ startUrl = pos;
+ pos = str.find(")",startUrl);
+ endUrl = pos;
+ if (str[pos-1]=='"' || str[pos-1]=='\'') // CSS 'feature'
+ endUrl--;
+ QString url = str.mid(startUrl, endUrl-startUrl);
+
+#ifdef DEBUG_WAR
+ kdDebug () << "url: " << url << endl;
+#endif
+
+ url = handleLink(_url, url);
+
+#ifdef DEBUG_WAR
+ kdDebug () << "url: " << url << endl;
+#endif
+
+ str = str.replace(startUrl, endUrl-startUrl, url);
+ pos++;
+ }
+ }
+ return str;
+}
+
+#include "archivedialog.moc"
diff --git a/konq-plugins/webarchiver/archivedialog.h b/konq-plugins/webarchiver/archivedialog.h
new file mode 100644
index 0000000..1dc5ff8
--- /dev/null
+++ b/konq-plugins/webarchiver/archivedialog.h
@@ -0,0 +1,82 @@
+/*
+ Copyright (C) 2003 Antonio Larrosa <larrosa@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef _ARCHIVEDIALOG_H_
+#define _ARCHIVEDIALOG_H_
+
+#include <dom/dom_core.h>
+#include <dom/html_document.h>
+
+#include <kdialogbase.h>
+#include <ktempfile.h>
+#include <kio/job.h>
+
+#include <qstring.h>
+#include <qmap.h>
+#include <qvaluelist.h>
+
+class QWidget;
+class KHTMLPart;
+class ArchiveViewBase;
+class KURL;
+class KTar;
+class QTextStream;
+class QListViewItem;
+
+class ArchiveDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ ArchiveDialog(QWidget *parent, const QString &targetFilename, KHTMLPart *part);
+ ~ArchiveDialog();
+
+ void archive();
+
+public slots:
+ void finishedDownloadingURL( KIO::Job *job );
+ void setSavingState();
+protected:
+ void saveFile( const QString& fileName);
+ void saveToArchive(QTextStream* _textStream);
+ void saveArchiveRecursive(const DOM::Node &node, const KURL& baseURL,
+ QTextStream* _textStream, int ident);
+ QString handleLink(const KURL& _url, const QString & _link);
+ KURL getAbsoluteURL(const KURL& _url, const QString& _link);
+ QString getUniqueFileName(const QString& fileName);
+ QString stringToHTML(const QString& string);
+ QString analyzeInternalCSS(const KURL& _url, const QString& string);
+ void downloadNext();
+
+ ArchiveViewBase *m_widget;
+ QMap<QString, QString> m_downloadedURLDict;
+ QMap<QString, QString> m_linkDict;
+ KTar* m_tarBall;
+ bool m_bPreserveWS;
+ QListViewItem *m_currentLVI;
+ unsigned int m_iterator;
+ enum State { Retrieving=0, Downloading, Saving };
+ State m_state;
+ QValueList <KURL>m_urlsToDownload;
+ KTempFile *m_tmpFile;
+ KURL m_url;
+ DOM::Document m_document;
+
+};
+
+#endif // _ARCHIVEDIALOG_H_
diff --git a/konq-plugins/webarchiver/archiveviewbase.ui b/konq-plugins/webarchiver/archiveviewbase.ui
new file mode 100644
index 0000000..a2aceb2
--- /dev/null
+++ b/konq-plugins/webarchiver/archiveviewbase.ui
@@ -0,0 +1,128 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>ArchiveViewBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>ArchiveViewBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>483</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Web Archiver</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KActiveLabel" row="1" column="1">
+ <property name="name">
+ <cstring>targetLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Local File</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>To:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Archiving:</string>
+ </property>
+ </widget>
+ <widget class="KActiveLabel" row="0" column="1">
+ <property name="name">
+ <cstring>urlLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Original URL</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="KProgress">
+ <property name="name">
+ <cstring>progressBar</cstring>
+ </property>
+ </widget>
+ <widget class="KListView">
+ <column>
+ <property name="text">
+ <string>URL</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>State</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>listView</cstring>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ <property name="fullWidth">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+</customwidgets>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kactivelabel.h</includehint>
+ <includehint>kactivelabel.h</includehint>
+ <includehint>klistview.h</includehint>
+</includehints>
+</UI>
diff --git a/konq-plugins/webarchiver/cr16-action-webarchiver.png b/konq-plugins/webarchiver/cr16-action-webarchiver.png
new file mode 100644
index 0000000..aa60f00
--- /dev/null
+++ b/konq-plugins/webarchiver/cr16-action-webarchiver.png
Binary files differ
diff --git a/konq-plugins/webarchiver/cr22-action-webarchiver.png b/konq-plugins/webarchiver/cr22-action-webarchiver.png
new file mode 100644
index 0000000..ddf14ac
--- /dev/null
+++ b/konq-plugins/webarchiver/cr22-action-webarchiver.png
Binary files differ
diff --git a/konq-plugins/webarchiver/plugin_webarchiver.cpp b/konq-plugins/webarchiver/plugin_webarchiver.cpp
new file mode 100644
index 0000000..fca9bc7
--- /dev/null
+++ b/konq-plugins/webarchiver/plugin_webarchiver.cpp
@@ -0,0 +1,116 @@
+/* This file is part of Webarchiver
+ * Copyright (C) 2001 by Andreas Schlapbach <schlpbch@iam.unibe.ch>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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 the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+/* $Id$ */
+
+/*
+ * There are two recursions within this code:
+ * - Recursively create DOM-Tree for referenced links which get recursively
+ * converted to HTML
+ *
+ * => This code has the potential to download whole sites to a TarGz-Archive
+ */
+
+//#define DEBUG_WAR
+
+#include <qdir.h>
+#include <qfile.h>
+
+#include <kaction.h>
+#include <kinstance.h>
+
+#include <kfiledialog.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <khtml_part.h>
+#include <kdebug.h>
+#include <kgenericfactory.h>
+#include <kglobalsettings.h>
+
+#include "plugin_webarchiver.h"
+#include "archivedialog.h"
+
+typedef KGenericFactory<PluginWebArchiver> PluginWebArchiverFactory;
+K_EXPORT_COMPONENT_FACTORY( libwebarchiverplugin,
+ PluginWebArchiverFactory( "webarchiver" ) )
+
+PluginWebArchiver::PluginWebArchiver( QObject* parent, const char* name,
+ const QStringList & )
+ : Plugin( parent, name )
+{
+ (void) new KAction( i18n("Archive &Web Page..."),
+ "webarchiver", 0,
+ this, SLOT(slotSaveToArchive()),
+ actionCollection(), "archivepage" );
+}
+
+PluginWebArchiver::~PluginWebArchiver()
+{
+}
+
+void PluginWebArchiver::slotSaveToArchive()
+{
+ // ## Unicode ok?
+ if( !parent() || !parent()->inherits("KHTMLPart"))
+ return;
+ KHTMLPart *part = static_cast<KHTMLPart *>( parent() );
+
+ QString archiveName = QString::fromUtf8(part->htmlDocument().title().string().utf8());
+
+ if (archiveName.isEmpty())
+ archiveName = i18n("Untitled");
+
+ // Replace space with underscore, proposed Frank Pieczynski <pieczy@knuut.de>
+
+ archiveName = archiveName.simplifyWhiteSpace();
+ archiveName.replace( "\\s:", " ");
+ archiveName.replace( "?", "");
+ archiveName.replace( ":", "");
+ archiveName.replace( "/", "");
+ archiveName = archiveName.replace( QRegExp("\\s+"), " ");
+
+ archiveName = KGlobalSettings::documentPath() + "/" + archiveName + ".war" ;
+
+ KURL url = KFileDialog::getSaveURL(archiveName, i18n("*.war *.tgz|Web Archives"), part->widget(),
+ i18n("Save Page as Web-Archive") );
+
+ if (url.isEmpty()) { return; }
+
+ if (!(url.isValid())) {
+ const QString title = i18n( "Invalid URL" );
+ const QString text = i18n( "The URL\n%1\nis not valid." ).arg(url.prettyURL());
+ KMessageBox::sorry(part->widget(), text, title );
+ return;
+ }
+
+ const QFile file(url.path());
+ if (file.exists()) {
+ const QString title = i18n( "File Exists" );
+ const QString text = i18n( "Do you really want to overwrite:\n%1?" ).arg(url.prettyURL());
+ if (KMessageBox::Continue != KMessageBox::warningContinueCancel( part->widget(), text, title, i18n("Overwrite") ) ) {
+ return;
+ }
+ }
+
+ ArchiveDialog *dialog=new ArchiveDialog(0L, url.path(), part);
+ dialog->show();
+ dialog->archive();
+}
+
+#include "plugin_webarchiver.moc"
diff --git a/konq-plugins/webarchiver/plugin_webarchiver.desktop b/konq-plugins/webarchiver/plugin_webarchiver.desktop
new file mode 100644
index 0000000..3e8f55b
--- /dev/null
+++ b/konq-plugins/webarchiver/plugin_webarchiver.desktop
@@ -0,0 +1,130 @@
+[Desktop Entry]
+X-KDE-Library=webarchiver
+X-KDE-PluginInfo-Author=Andreas Schlapbach
+X-KDE-PluginInfo-Email=schlpbch@iam.unibe.ch
+X-KDE-PluginInfo-Name=webarchiver
+X-KDE-PluginInfo-Version=3.3
+X-KDE-PluginInfo-Website=
+X-KDE-PluginInfo-Category=Tools
+X-KDE-PluginInfo-Depends=
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=true
+Name=Web Archiver
+Name[bg]=Уеб архиватор
+Name[br]=Dieller ar gwiad
+Name[bs]=Web arhiver
+Name[ca]=Arxivador de webs
+Name[cs]=Archivátor webu
+Name[cy]=Archifydd Gwe
+Name[da]=Netarkivør
+Name[de]=Web-Archivierung
+Name[el]=Δημιουργός αρχειοθήκης Ιστού
+Name[eo]=TTT-arĥivilo
+Name[es]=Archivador Web
+Name[et]=Veebiarhiivid
+Name[eu]=Web artxibalaria
+Name[fa]=بایگانی‌کنندۀ وب
+Name[fi]=WWW arkistot
+Name[fr]=Archiveur Internet
+Name[fy]=Webargiven
+Name[ga]=Cartlannaí Gréasáin
+Name[gl]=Arquivador Web
+Name[he]=ארכיוני רשת
+Name[hi]=वेब अभिलेखागार
+Name[hr]=Web-arhiviranje
+Name[hu]=Weboldal-archiváló
+Name[is]=Safnvistuð vefgögn
+Name[it]=Immagazzinatore Web
+Name[ja]=ウェブアーカイバ
+Name[ka]=ვებ არქივატორი
+Name[kk]=Веб архивтеуіші
+Name[km]=កម្មវិធី​ទុកបណ្ដាញ​ជា​ប័ណ្ណសារ
+Name[lt]=Žiniatinklių puslapių archyvavimo priemonė
+Name[mk]=Веб-архивер
+Name[ms]=Pengarkib Web
+Name[nb]=Nett-arkivar
+Name[nds]=Nettarchiv-Maker
+Name[ne]=वेब सङ्ग्रहकर्ता
+Name[nl]=Webarchieven
+Name[nn]=Vevarkiverar
+Name[pa]=ਵੈਬ ਆਰਚੀਵਰ
+Name[pl]=Archiwizator stron WWW
+Name[pt]=Arquivos Web
+Name[pt_BR]=Arquivador Web
+Name[ru]=Web-архиватор
+Name[sk]=Web archívy
+Name[sl]=Spletni arhivirnik
+Name[sr]=Веб архивер
+Name[sr@Latn]=Veb arhiver
+Name[sv]=Webbarkiv
+Name[ta]=வலை காப்பு
+Name[tg]=Веб-архивчӣ
+Name[tr]=Web Arşivleyici
+Name[uk]=Архіватор Тенет
+Name[uz]=Veb-arxivlagich
+Name[uz@cyrillic]=Веб-архивлагич
+Name[vi]=Bộ lưu trữ Mạng
+Name[zh_CN]=Web 存档器
+Name[zh_TW]=Web 檔案館
+Comment=Creates archives of websites
+Comment[ar]=يقوم بإنشاء أرشيفات للمواقع الشبكة
+Comment[az]=Veb saytlarını arxivləyir
+Comment[bg]=Създаване на архиви от уеб сайтове
+Comment[bs]=Pravi arhive web stranica
+Comment[ca]=Crea arxius de les pàgines web
+Comment[cs]=Vytvoří archív webové stránky
+Comment[cy]=Creu archifau o wefannau
+Comment[da]=Opretter arkiver af netsider
+Comment[de]=Erstellt ein Archiv von Webseiten
+Comment[el]=Δημιουργεί αρχειοθήκες από ιστοσελίδες
+Comment[eo]=Kreas arĥivojn el retsituojn
+Comment[es]=Crea copias de sitios web
+Comment[et]=Loob veebilehtede arhiivi
+Comment[eu]=Weblekuen artxiboak sortzen ditu
+Comment[fa]=بایگانیهای وب‌گاهها را ایجاد می‌کند
+Comment[fi]=Luo webbisivustojen arkistoja
+Comment[fr]=Crée des archives de sites Internet
+Comment[fy]=Makket argiven fan websteën oan
+Comment[ga]=Cruthaigh cartlann de shuímh Ghréasáin
+Comment[gl]=Cria ficheiros de páxinas web
+Comment[he]=יצירת ארכיונים של אתרי אינטרנט
+Comment[hi]=वेबसाइटों के अभिलेखागार बनाए
+Comment[hr]=Izrada arhiva od web-lokacija
+Comment[hu]=Website-archiválás
+Comment[is]=Býr til safnskrár af vefsetrum
+Comment[it]=Crea archivi dei siti web
+Comment[ja]=ウェブサイトのアーカイブを作成
+Comment[ka]=ვებ გვერდების არქივებს ქმნის
+Comment[kk]=Вебсайттың архивін құру
+Comment[km]=បង្កើត​ប័ណ្ណ​សារ​របស់​តំបន់​បណ្ដាញ
+Comment[lt]=Sukuria archyvus iš žiniatinklio puslapių
+Comment[mk]=Креира архиви од веб-страници
+Comment[ms]=Bina arkib laman web
+Comment[nb]=Lager arkiver av nettsteder
+Comment[nds]=Stellt Nettsiedenarchiven op
+Comment[ne]=वेबसाइटहरूको सङ्ग्रह सिर्जना गर्छ
+Comment[nl]=Maakt archieven van websites aan
+Comment[nn]=Lagar arkiv av nettstader
+Comment[pl]=Tworzy archiwa stron WWW
+Comment[pt]=Cria arquivos de páginas web
+Comment[pt_BR]=Cria arquivos de sites web
+Comment[ro]=Creează arhive ale site-urilor web
+Comment[ru]=Создание архивов web-сайтов
+Comment[sk]=Vytvára archívy webových stránok
+Comment[sl]=Ustvari arhive spletnih strani
+Comment[sr]=Прави архиве од веб сајтова
+Comment[sr@Latn]=Pravi arhive od veb sajtova
+Comment[sv]=Skapar arkiv av webbplatser
+Comment[ta]=வலைதளங்களின் காப்பகத்தை உருவாக்குகிறது
+Comment[tg]=Эҷод кардани архивҳои веб-сайтҳо
+Comment[tr]=Web sayfalarının arşivini oluşturur
+Comment[uk]=Створює архіви сайтів Тенет
+Comment[uz]=Veb-saytlarning arxivini yaratish
+Comment[uz@cyrillic]=Веб-сайтларнинг архивини яратиш
+Comment[vi]=Tạo kho lưu chỗ Mạng
+Comment[xh]=Yenza iindawo zokugcina ze websites
+Comment[zh_CN]=创建网站存档
+Comment[zh_TW]=建立網站的檔案
+Icon=webarchiver
+X-KDE-ParentApp=konqueror
+DocPath=konq-plugins/webarchiver/index.html
diff --git a/konq-plugins/webarchiver/plugin_webarchiver.h b/konq-plugins/webarchiver/plugin_webarchiver.h
new file mode 100644
index 0000000..2353fe1
--- /dev/null
+++ b/konq-plugins/webarchiver/plugin_webarchiver.h
@@ -0,0 +1,42 @@
+/* This file is part of Webarchiver
+ * Copyright (C) 2001 by Andreas Schlapbach <schlpbch@iam.unibe.ch>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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 the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ **/
+
+/* $Id$ */
+
+#ifndef plugin_webarchiver_h
+#define plugin_webarchiver_h
+
+#include <kparts/plugin.h>
+#include <klibloader.h>
+
+class PluginWebArchiver : public KParts::Plugin
+{
+ Q_OBJECT
+
+ public:
+ PluginWebArchiver( QObject* parent, const char* name,
+ const QStringList & );
+ virtual ~PluginWebArchiver();
+
+ public slots:
+ void slotSaveToArchive();
+
+};
+
+#endif
diff --git a/konq-plugins/webarchiver/plugin_webarchiver.rc b/konq-plugins/webarchiver/plugin_webarchiver.rc
new file mode 100644
index 0000000..d0369c8
--- /dev/null
+++ b/konq-plugins/webarchiver/plugin_webarchiver.rc
@@ -0,0 +1,11 @@
+<!DOCTYPE kpartgui>
+<kpartplugin name="webarchiver" library="libwebarchiverplugin">
+<MenuBar>
+ <Menu name="tools"><Text>&amp;Tools</Text>
+ <Action name="archivepage"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="extraToolBar"><text>Extra Toolbar</text>
+ <Action name="archivepage"/>
+</ToolBar>
+</kpartplugin>
diff --git a/konq-plugins/webarchiver/webarchivecreator.cpp b/konq-plugins/webarchiver/webarchivecreator.cpp
new file mode 100644
index 0000000..cba7f18
--- /dev/null
+++ b/konq-plugins/webarchiver/webarchivecreator.cpp
@@ -0,0 +1,117 @@
+/*
+ Copyright (C) 2001 Malte Starostik <malte@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+// $Id$
+
+#include <time.h>
+
+#include <qpixmap.h>
+#include <qimage.h>
+#include <qpainter.h>
+
+#include <kapplication.h>
+#include <khtml_part.h>
+
+#include "webarchivecreator.moc"
+
+extern "C"
+{
+ ThumbCreator * KDE_EXPORT new_creator()
+ {
+ return new WebArchiveCreator;
+ }
+}
+
+WebArchiveCreator::WebArchiveCreator()
+ : m_html(0)
+{
+}
+
+WebArchiveCreator::~WebArchiveCreator()
+{
+ delete m_html;
+}
+
+bool WebArchiveCreator::create(const QString &path, int width, int height, QImage &img)
+{
+ if (!m_html)
+ {
+ m_html = new KHTMLPart;
+ connect(m_html, SIGNAL(completed()), SLOT(slotCompleted()));
+ m_html->setJScriptEnabled(false);
+ m_html->setJavaEnabled(false);
+ m_html->setPluginsEnabled(false);
+ }
+ KURL url;
+ url.setProtocol( "tar" );
+ url.setPath( path );
+ url.addPath( "index.html" );
+ m_html->openURL( url );
+ m_completed = false;
+ startTimer(5000);
+ while (!m_completed)
+ kapp->processOneEvent();
+ killTimers();
+
+ // render the HTML page on a bigger pixmap and use smoothScale,
+ // looks better than directly scaling with the QPainter (malte)
+ QPixmap pix;
+ if (width > 400 || height > 600)
+ {
+ if (height * 3 > width * 4)
+ pix.resize(width, width * 4 / 3);
+ else
+ pix.resize(height * 3 / 4, height);
+ }
+ else
+ pix.resize(400, 600);
+ // light-grey background, in case loadind the page failed
+ pix.fill( QColor( 245, 245, 245 ) );
+
+ int borderX = pix.width() / width,
+ borderY = pix.height() / height;
+ QRect rc(borderX, borderY, pix.width() - borderX * 2, pix.height() - borderY *
+2);
+
+ QPainter p;
+ p.begin(&pix);
+ m_html->paint(&p, rc);
+ p.end();
+
+ img = pix.convertToImage();
+ return true;
+}
+
+void WebArchiveCreator::timerEvent(QTimerEvent *)
+{
+ m_html->closeURL();
+ m_completed = true;
+}
+
+void WebArchiveCreator::slotCompleted()
+{
+ m_completed = true;
+}
+
+ThumbCreator::Flags WebArchiveCreator::flags() const
+{
+ return DrawFrame;
+}
+
+// vim: ts=4 sw=4 et
diff --git a/konq-plugins/webarchiver/webarchivecreator.h b/konq-plugins/webarchiver/webarchivecreator.h
new file mode 100644
index 0000000..eae653b
--- /dev/null
+++ b/konq-plugins/webarchiver/webarchivecreator.h
@@ -0,0 +1,51 @@
+/*
+ Copyright (C) 2001 Malte Starostik <malte@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+// $Id$
+//
+#ifndef __webarchivecreator_h__
+#define __webarchivecreator_h__
+
+#include <kio/thumbcreator.h>
+
+class KHTMLPart;
+
+class WebArchiveCreator : public QObject, public ThumbCreator
+{
+ Q_OBJECT
+public:
+ WebArchiveCreator();
+ virtual ~WebArchiveCreator();
+ virtual bool create(const QString &path, int width, int height, QImage &img);
+ virtual Flags flags() const;
+
+protected:
+ virtual void timerEvent(QTimerEvent *);
+
+private slots:
+ void slotCompleted();
+
+private:
+ KHTMLPart *m_html;
+ bool m_completed;
+};
+
+#endif
+
+// vim: ts=4 sw=4 et
diff --git a/konq-plugins/webarchiver/webarchivethumbnail.desktop b/konq-plugins/webarchiver/webarchivethumbnail.desktop
new file mode 100644
index 0000000..171ed05
--- /dev/null
+++ b/konq-plugins/webarchiver/webarchivethumbnail.desktop
@@ -0,0 +1,76 @@
+[Desktop Entry]
+Type=Service
+Name=Web Archives
+Name[af]=Web Argiewe
+Name[ar]=أرشيفات الشبكة
+Name[az]=Veb Arxivləri
+Name[bg]=Уеб архиви
+Name[br]=Dielloù ar gwiad
+Name[bs]=Web arhive
+Name[ca]=Arxius web
+Name[cs]=Webové archívy
+Name[cy]=Archifau Wefannau
+Name[da]=Netarkiver
+Name[de]=Web-Archive
+Name[el]=Αρχειοθήκες ιστού
+Name[eo]=TTT-arĥivoj
+Name[es]=Sitios web guardados
+Name[et]=Veebiarhiivid
+Name[eu]=Web artxiboak
+Name[fa]=بایگانیهای وب
+Name[fi]=WWW arkistot
+Name[fo]=Vevskjalasavn
+Name[fr]=Archives Internet
+Name[fy]=Webargiven
+Name[ga]=Cartlanna Gréasáin
+Name[gl]=Arquivos Web
+Name[he]=ארכיוני רשת
+Name[hi]=वेब अभिलेखागार
+Name[hr]=Web arhive
+Name[hu]=Webes archívumok
+Name[is]=Safnvistuð vefgögn
+Name[it]=Archivi Web
+Name[ja]=ウェブアーカイブ
+Name[ka]=ვებ არქივატორები
+Name[kk]=Веб ахивтеуіші
+Name[km]=ប័ណ្ណសារ​បណ្ដាញ
+Name[ko]=웹 저장고
+Name[lt]=Žiniatinklio archyvai
+Name[lv]=Web Arhīvi
+Name[mk]=Веб-архиви
+Name[ms]=Arkib Web
+Name[mt]=Arkivji webb
+Name[nb]=Vev-arkiver
+Name[nds]=Nettarchiven
+Name[ne]=वेब सङ्ग्रह
+Name[nl]=Webarchieven
+Name[nn]=Vevarkiv
+Name[nso]=Dipolokelo tsa Web
+Name[pa]=ਵੈਬ ਆਰਚੀਵ
+Name[pl]=Archiwa WWW
+Name[pt]=Arquivos Web
+Name[pt_BR]=Arquivos Web
+Name[ro]=Arhive web
+Name[ru]=Web-архивы
+Name[sk]=Web archívy
+Name[sl]=Spletni arhivi
+Name[sr]=Веб архиве
+Name[sr@Latn]=Veb arhive
+Name[sv]=Webbarkiv
+Name[ta]=வலை காப்புகள்
+Name[tg]=Веб-архивҳо
+Name[th]=แฟ้มบีบอัดของเว็บ
+Name[tr]=Web Arşivleri
+Name[uk]=Архіви Тенет
+Name[uz]=Veb-arxivlar
+Name[uz@cyrillic]=Веб-архивлар
+Name[ven]=Dziwebu dzau vhulunga zwa kale
+Name[vi]=Kho lưu Mạng
+Name[xh]=Iindawo zokugcina ze web
+Name[zh_CN]=Web 存档
+Name[zh_TW]=Web 檔案館
+Name[zu]=Ushicilelo lukawonke umuntu kanye nemiqulu emidala yeWeb
+ServiceTypes=ThumbCreator
+MimeTypes=application/x-webarchive
+X-KDE-Library=webarchivethumbnail
+CacheThumbnail=true
diff --git a/ksig/Makefile.am b/ksig/Makefile.am
new file mode 100644
index 0000000..733e65c
--- /dev/null
+++ b/ksig/Makefile.am
@@ -0,0 +1,20 @@
+bin_PROGRAMS = ksig
+
+ksig_SOURCES = siggenerator.cpp siglistview.cpp siglistviewitem.cpp ksig.cpp \
+ standardtextbase.ui standardtext.cpp main.cpp
+
+INCLUDES = $(all_includes)
+
+METASOURCES = AUTO
+KDE_ICON = AUTO
+
+ksig_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+ksig_LDADD = $(LIB_QT) $(LIB_KDECORE) $(LIB_KDEUI)
+
+rcdir = $(kde_datadir)/ksig
+rc_DATA = ksigui.rc
+
+xdg_apps_DATA = ksig.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/ksig.pot
diff --git a/ksig/hi16-app-ksig.png b/ksig/hi16-app-ksig.png
new file mode 100644
index 0000000..1ac881b
--- /dev/null
+++ b/ksig/hi16-app-ksig.png
Binary files differ
diff --git a/ksig/hi32-app-ksig.png b/ksig/hi32-app-ksig.png
new file mode 100644
index 0000000..968d9af
--- /dev/null
+++ b/ksig/hi32-app-ksig.png
Binary files differ
diff --git a/ksig/ksig.cpp b/ksig/ksig.cpp
new file mode 100644
index 0000000..801b18c
--- /dev/null
+++ b/ksig/ksig.cpp
@@ -0,0 +1,273 @@
+/***************************************************************************
+ ksig.cpp - description
+ -------------------
+ begin : Tue Jul 9 23:14:22 EDT 2002
+ copyright : (C) 2002 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <kapplication.h>
+#include <kstdaction.h>
+#include <kaction.h>
+#include <kconfig.h>
+#include <kglobalsettings.h>
+#include <kmessagebox.h>
+#include <kstatusbar.h>
+#include <ktextedit.h>
+#include <klistviewsearchline.h>
+#include <klocale.h>
+
+#include <qsplitter.h>
+
+#include "ksig.h"
+#include "siglistviewitem.h"
+#include "standardtext.h"
+
+////////////////////////////////////////////////////////////////////////////////
+// public methods
+////////////////////////////////////////////////////////////////////////////////
+
+KSig::KSig(QWidget *parent, const char *name) : KMainWindow(parent, name),
+ changed(false)
+{
+ setupActions();
+ setupLayout();
+ setupSearchLine();
+
+ if (!initialGeometrySet())
+ resize(640,480);
+ setupGUI(ToolBar | Keys | StatusBar | Create);
+ setAutoSaveSettings();
+
+ readConfig();
+ loadData();
+}
+
+KSig::~KSig()
+{
+
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// private methods
+////////////////////////////////////////////////////////////////////////////////
+
+void KSig::setupActions()
+{
+ KStdAction::openNew(this, SLOT(add()), actionCollection());
+ new KAction(i18n("Remove"), "editdelete", 0, this, SLOT(remove()), actionCollection(), "remove");
+ KStdAction::save(this, SLOT(save()), actionCollection());
+ KStdAction::quit(this, SLOT(quit()), actionCollection());
+
+ KStdAction::cut(kapp, SLOT(cut()), actionCollection());
+ KStdAction::copy(kapp, SLOT(copy()), actionCollection());
+ KStdAction::paste(kapp, SLOT(paste()), actionCollection());
+ new KAction(i18n("C&lear"), "editclear", 0, kapp, SLOT(clear()), actionCollection(), "clear");
+
+ new KAction(i18n("Edit Standard Header"), 0, 0, this, SLOT(editHeader()), actionCollection(), "editHeader");
+ new KAction(i18n("Edit Standard Footer"), 0, 0, this, SLOT(editFooter()), actionCollection(), "editFooter");
+}
+
+void KSig::setupLayout()
+{
+ splitter = new QSplitter(Qt::Vertical, this);
+
+ setCentralWidget(splitter);
+
+ sigList = SigListView::instance(splitter, "sigList");
+
+ sigEdit = new KTextEdit(splitter, "sigEdit");
+ sigEdit->setTextFormat(Qt::PlainText);
+ sigEdit->setFont(KGlobalSettings::fixedFont());
+ sigEdit->setEnabled(false);
+ sigEdit->setCheckSpellingEnabled(true);
+
+ statusBar()->insertItem(i18n(" Line: %1 ").arg(0), LineNumber, 0, true);
+ statusBar()->insertItem(i18n(" Col: %1 ").arg(0), ColumnNumber, 0, true);
+ statusBar()->show();
+
+ updateListLock = false;
+ connect(sigEdit, SIGNAL(textChanged()), this, SLOT(updateList()));
+ connect(sigList, SIGNAL(selectionChanged()), this, SLOT(updateEdit()));
+ connect(sigEdit, SIGNAL(cursorPositionChanged(int,int)), this, SLOT(updateStatus(int,int)));
+}
+
+void KSig::setupSearchLine()
+{
+ KListViewSearchLineWidget *searchWidget = new KListViewSearchLineWidget(sigList, this);
+ new KWidgetAction(searchWidget, i18n("Search"), KShortcut(), 0, 0, actionCollection(), "search");
+}
+
+void KSig::loadData()
+{
+ if(sigList->childCount() > 0) {
+ sigList->setCurrentItem(sigList->firstChild());
+ sigList->setSelected(sigList->firstChild(), true);
+
+ sigEdit->setEnabled(true);
+ }
+ else {
+ updateListLock = true;
+ sigEdit->setText(i18n("To get started, first create a new signature by selecting "
+ "\"New\" above. You will then be able to edit and save "
+ "your collection of signatures."));
+ updateListLock = false;
+ }
+ setDataChanged(false);
+}
+
+void KSig::readConfig()
+{
+ setAutoSaveSettings();
+ KConfig *config = KGlobal::config();
+ {
+ KConfigGroupSaver saver(config, "Settings");
+ if(splitter) {
+ QValueList<int> sizes;
+
+ sizes.append(config->readNumEntry("ListSize", -1));
+ sizes.append(config->readNumEntry("EditSize", -1));
+
+ if(sizes[0] > 0 && sizes[1] > 0)
+ splitter->setSizes(sizes);
+ }
+
+ header = config->readEntry("Header");
+ footer = config->readEntry("Footer");
+ }
+}
+
+void KSig::writeConfig()
+{
+ KConfig *config = KGlobal::config();
+ {
+ KConfigGroupSaver saver(config, "Settings");
+ if(splitter) {
+ QValueList<int> sizes = splitter->sizes();
+
+ config->writeEntry("ListSize", sizes[0]);
+ config->writeEntry("EditSize", sizes[1]);
+ }
+
+ config->writeEntry("Header", header);
+ config->writeEntry("Footer", footer);
+ }
+ config->sync();
+}
+
+bool KSig::queryClose()
+{
+ if(changed) {
+ int saveChanges = KMessageBox::questionYesNoCancel(this, i18n("Do you want to save your changes before exiting?"),QString::null,KStdGuiItem::save(),KStdGuiItem::discard());
+ if(saveChanges == KMessageBox::Cancel)
+ return(false);
+ else if(saveChanges == KMessageBox::Yes)
+ save();
+ }
+
+ writeConfig();
+ return(true);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// private slots
+////////////////////////////////////////////////////////////////////////////////
+
+void KSig::add()
+{
+ setDataChanged();
+ SigListViewItem *sigItem = sigList->createItem();
+ sigList->setCurrentItem(sigItem);
+
+ sigEdit->setEnabled(true);
+ sigEdit->setFocus();
+ sigEdit->clear();
+}
+
+void KSig::remove()
+{
+ setDataChanged();
+ sigEdit->clear();
+ delete(sigList->currentItem());
+}
+
+void KSig::save()
+{
+ sigList->save();
+ setDataChanged(false);
+}
+
+void KSig::setDataChanged(bool value)
+{
+ changed = value;
+
+ if(changed)
+ setCaption(kapp->makeStdCaption(QString::null, true, true));
+ else
+ setCaption(kapp->makeStdCaption(QString::null, true, false));
+}
+
+void KSig::editHeader()
+{
+ StandardText *t = new StandardText(0, 0, true);
+ t->setLabel(i18n("Standard signature header:"));
+ t->setText(header);
+
+ connect(t, SIGNAL(textUpdated(const QString &)), this, SLOT(setHeader(const QString &)));
+
+ t->exec();
+}
+
+void KSig::editFooter()
+{
+ StandardText *t = new StandardText(0, 0, true);
+ t->setLabel(i18n("Standard signature footer:"));
+ t->setText(footer);
+
+ connect(t, SIGNAL(textUpdated(const QString &)), this, SLOT(setFooter(const QString &)));
+
+ t->exec();
+}
+
+void KSig::updateList()
+{
+ if(!updateListLock) {
+ setDataChanged();
+ SigListViewItem *item = sigList->currentItem();
+ if(item)
+ item->setText(sigEdit->text());
+ }
+}
+
+void KSig::updateEdit()
+{
+ updateListLock = true;
+
+ SigListViewItem *item = sigList->currentItem();
+ if(item)
+ sigEdit->setText(item->text());
+
+ updateListLock = false;
+}
+
+void KSig::updateStatus(int line, int column)
+{
+ statusBar()->changeItem(i18n(" Line: %1 ").arg(line + 1), LineNumber);
+ statusBar()->changeItem(i18n(" Col: %1 ").arg(column + 1), ColumnNumber);
+}
+
+void KSig::quit()
+{
+ close();
+}
+
+#include "ksig.moc"
diff --git a/ksig/ksig.desktop b/ksig/ksig.desktop
new file mode 100644
index 0000000..3968ec7
--- /dev/null
+++ b/ksig/ksig.desktop
@@ -0,0 +1,72 @@
+# KDE Config File
+[Desktop Entry]
+Type=Application
+Exec=ksig -caption "%c" %i %m
+Icon=ksig
+Terminal=false
+Name=KSig
+Name[hi]=के-सिग
+Name[sv]=Ksig
+Name[tr]=Ksig
+Name[vi]=K-Ký
+GenericName=Signature Editor
+GenericName[ar]=محرر التوقيعات
+GenericName[bg]=Редактор на подписи
+GenericName[br]=Aozer ar sinadurioù
+GenericName[bs]=Editor potpisa
+GenericName[ca]=Editor per la signatura
+GenericName[cs]=Editor podpisů
+GenericName[cy]=Golygydd Llofnod
+GenericName[da]=Underskriftteditor
+GenericName[de]=Signaturen-Editor
+GenericName[el]=Επεξεργαστής υπογραφής
+GenericName[eo]=Signuma redaktilo
+GenericName[es]=Editor de firma
+GenericName[et]=Allkirja redaktor
+GenericName[eu]=Sinadura editorea
+GenericName[fa]=ویرایشگر امضا
+GenericName[fi]=Allekirjoitusmuokkain
+GenericName[fr]=Éditeur de signatures
+GenericName[fy]=Hântekeningen bewurkje
+GenericName[ga]=Eagarthóir Sínithe
+GenericName[gl]=Editor de Sinaturas
+GenericName[he]=עורך חתימות
+GenericName[hi]=हस्ताक्षर संपादक
+GenericName[hr]=Uređivač potpisa
+GenericName[hu]=Aláírásszerkesztő
+GenericName[is]=Ritill fyrir undirritanir
+GenericName[it]=Editor della firma
+GenericName[ja]=署名エディタ
+GenericName[ka]=ხელმოწერის რედაქტორი
+GenericName[kk]=Қолтаңба редакторы
+GenericName[km]=កម្មវិធី​និពន្ធ​ហត្ថលេខា
+GenericName[lt]=Parašų rengyklė
+GenericName[mk]=Уредувач на потписи
+GenericName[ms]=Editor Tandatangan
+GenericName[nb]=Signaturredigering
+GenericName[nds]=Signatuur-Editor
+GenericName[ne]=हस्ताक्षर सम्पादक
+GenericName[nl]=Handtekeningen bewerken
+GenericName[nn]=Signaturredigering
+GenericName[pa]=ਦਸਤਖਤ ਸੰਪਾਦਕ
+GenericName[pl]=Edytor podpisów
+GenericName[pt]=Editor de Assinaturas
+GenericName[pt_BR]=Editor de Assinaturas
+GenericName[ro]=Editor de semnături
+GenericName[ru]=Редактор подписей
+GenericName[sk]=Editor signatúr
+GenericName[sl]=Urejevalnik podpisov
+GenericName[sr]=Уређивач потписа
+GenericName[sr@Latn]=Uređivač potpisa
+GenericName[sv]=Signatureditor
+GenericName[ta]=கையொப்ப தொகுப்பான்
+GenericName[tg]=Муҳаррири имзоҳо
+GenericName[tr]=İmza Düzenleyici
+GenericName[uk]=Редактор підписів
+GenericName[uz]=Imzo tahrirchisi
+GenericName[uz@cyrillic]=Имзо таҳрирчиси
+GenericName[vi]=Bộ soạn thảo chữ ký
+GenericName[zh_CN]=签名编辑器
+GenericName[zh_TW]=簽名編輯器
+Categories=Qt;KDE;Utility;X-KDE-Utilities-PIM;
+DocPath=ksig/index.html
diff --git a/ksig/ksig.h b/ksig/ksig.h
new file mode 100644
index 0000000..0598f10
--- /dev/null
+++ b/ksig/ksig.h
@@ -0,0 +1,75 @@
+/***************************************************************************
+ ksig.h - description
+ -------------------
+ begin : Tue Jul 9 23:14:22 EDT 2002
+ copyright : (C) 2002 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef KSIG_H
+#define KSIG_H
+
+#include "siglistview.h"
+
+#include <kmainwindow.h>
+
+class KTextEdit;
+class QSplitter;
+
+class KSig : public KMainWindow
+{
+ Q_OBJECT
+
+public:
+ KSig(QWidget *parent = 0, const char *name = 0);
+ virtual ~KSig();
+
+private:
+ enum StatusBarColumns { LineNumber, ColumnNumber };
+
+ void setupLayout();
+ void setupActions();
+ void setupSearchLine();
+ void loadData();
+ void readConfig();
+ void writeConfig();
+
+ virtual bool queryClose();
+
+private slots:
+ void add();
+ void remove();
+ void save();
+ void quit();
+ void setDataChanged(bool value = true);
+
+ void editHeader();
+ void editFooter();
+ void setHeader(const QString &text) { header = text; writeConfig(); }
+ void setFooter(const QString &text) { footer = text; writeConfig(); }
+
+ void updateList();
+ void updateEdit();
+ void updateStatus(int line, int column);
+
+private:
+ QString header;
+ QString footer;
+
+ QSplitter *splitter;
+ SigListView *sigList;
+ KTextEdit *sigEdit;
+ bool updateListLock;
+ bool changed;
+};
+
+#endif
diff --git a/ksig/ksig.spec b/ksig/ksig.spec
new file mode 100644
index 0000000..19d77a3
--- /dev/null
+++ b/ksig/ksig.spec
@@ -0,0 +1,45 @@
+%define distversion %( perl -e '$_=\<\>;/(\\d+)\\.(\\d)\\.?(\\d)?/; print "$1$2".($3||0)' /etc/*-release)
+Name: ksmssend
+Summary: %{name} -- A frontend to smssend for KDE
+Version: 3.0.8
+Release: %{_vendor}_%{distversion}
+Copyright: GPL
+Group: X11/KDE/Utilities
+Source: ftp://ftp.kde.org/pub/kde/unstable/apps/utils/%{name}-%{version}.tar.gz
+Packager: ian reinhart geiser <geiseri@kde.org>
+BuildRoot: /tmp/%{name}-%{version}
+Prefix: `kde-config --prefix`
+
+%description
+A signature management utility. This version is compiled for %{_vendor} %{distversion}.
+
+%prep
+rm -rf $RPM_BUILD_ROOT
+%setup -n %{name}-%{version}
+WANT_AUTOCONF_2_5=1 make -f admin/Makefile.common
+CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" ./configure \
+ --disable-debug --enable-final --prefix=%{prefix} \
+ -with-install-root=$RPM_BUILD_ROOT
+
+%build
+# Setup for parallel builds
+numprocs=`egrep -c ^cpu[0-9]+ /proc/stat || :`
+if [ "$numprocs" = "0" ]; then
+ numprocs=1
+fi
+
+make -j$numprocs
+
+%install
+make prefix=$RPM_BUILD_ROOT%{prefix} install
+cd $RPM_BUILD_ROOT
+find . -type d | sed '1,2d;s,^\.,\%attr(-\,root\,root) \%dir ,' > $RPM_BUILD_DIR/%{name}-master.list
+find . -type f -o -type l | sed 's|^\.||' >> $RPM_BUILD_DIR/%{name}-master.list
+
+%clean
+#rm -rf $RPM_BUILD_ROOT
+rm -rf $RPM_BUILD_DIR/%{name}-%{version}
+rm -rf $RPM_BUILD_DIR/%{name}-master.list
+
+%files -f ../%{name}-master.list
+
diff --git a/ksig/ksigui.rc b/ksig/ksigui.rc
new file mode 100644
index 0000000..2e03b22
--- /dev/null
+++ b/ksig/ksigui.rc
@@ -0,0 +1,26 @@
+<!DOCTYPE kpartgui>
+<kpartgui name="ksig">
+
+<MenuBar>
+ <Menu name="file"><text>&amp;File</text>
+ <Action name="remove"/>
+ </Menu>
+ <Menu name="edit"><text>&amp;Edit</text>
+ <Action name="clear"/>
+ </Menu>
+ <Menu name="settings"><text>&amp;Settings</text>
+ <Action name="editHeader" append="save_merge"/>
+ <Action name="editFooter" append="save_merge"/>
+ </Menu>
+</MenuBar>
+
+<ToolBar name="mainToolBar"><text>Main Toolbar</text>
+ <Action name="remove"/>
+</ToolBar>
+
+<ToolBar name="searchToolBar" newline="true">
+ <text>Search Toolbar</text>
+ <Action name="search"/>
+</ToolBar>
+
+</kpartgui>
diff --git a/ksig/main.cpp b/ksig/main.cpp
new file mode 100644
index 0000000..0017f00
--- /dev/null
+++ b/ksig/main.cpp
@@ -0,0 +1,69 @@
+/***************************************************************************
+ main.cpp - description
+ -------------------
+ begin : Tue Jul 9 23:14:22 EDT 2002
+ copyright : (C) 2002 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <kapplication.h>
+#include <kcmdlineargs.h>
+#include <kaboutdata.h>
+#include <klocale.h>
+#include <kdebug.h>
+
+#include "ksig.h"
+#include "siggenerator.h"
+
+static const char description[] = I18N_NOOP("KSig");
+
+static KCmdLineOptions options[] =
+{
+ { "random", I18N_NOOP("Display a random signature"), 0},
+ { "daily", I18N_NOOP("Display a signature for the day"), 0},
+ KCmdLineLastOption
+};
+
+int main(int argc, char *argv[])
+{
+
+ KAboutData aboutData("ksig", I18N_NOOP("KSig"),
+ "1.1", description, KAboutData::License_GPL,
+ "(c) 2002, Scott Wheeler", 0, 0, "wheeler@kde.org");
+
+ aboutData.addAuthor("Scott Wheeler", 0, "wheeler@kde.org");
+ KCmdLineArgs::init(argc, argv, &aboutData);
+ KCmdLineArgs::addCmdLineOptions(options);
+
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ if(args->isSet("random") || args->isSet("daily")) {
+ KApplication a(false, false);
+ SigGenerator generator;
+
+ QTextStream output(stdout, IO_WriteOnly);
+ if(args->isSet("random"))
+ output << generator.random();
+ else if(args->isSet("daily"))
+ output << generator.daily();
+
+ return(0);
+ }
+ else {
+ KApplication a;
+
+ KSig *ksig = new KSig();
+ a.setMainWidget(ksig);
+ ksig->show();
+ return a.exec();
+ }
+}
diff --git a/ksig/siggenerator.cpp b/ksig/siggenerator.cpp
new file mode 100644
index 0000000..b232cb3
--- /dev/null
+++ b/ksig/siggenerator.cpp
@@ -0,0 +1,87 @@
+/***************************************************************************
+ siggenerator.cpp - description
+ -------------------
+ begin : Sat Jul 20 2002
+ copyright : (C) 2002 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "siggenerator.h"
+#include "siglistviewitem.h"
+
+#include <kstandarddirs.h>
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdebug.h>
+
+#include <qfile.h>
+#include <qdatetime.h>
+
+SigGenerator::SigGenerator()
+{
+ QString dir = KGlobal::dirs()->saveLocation("appdata");
+ QFile file(dir + "sigs.sigml");
+
+ if(file.open(IO_ReadOnly) && doc.setContent(&file)) {
+ signatures = doc.elementsByTagName("signature");
+ file.close();
+ }
+
+ KConfig *config = KGlobal::config();
+ {
+ KConfigGroupSaver saver(config, "Settings");
+ header = config->readEntry("Header");
+ footer = config->readEntry("Footer");
+ }
+}
+
+SigGenerator::~SigGenerator()
+{
+
+}
+
+
+QString SigGenerator::random() const
+{
+ if(signatures.count() <= 0)
+ return(QString::null);
+
+ int i = KApplication::random() % signatures.count();
+ QString text;
+ SigListViewItem::nodeToText(signatures.item(i), text);
+
+ return attachStandard(text);
+}
+
+QString SigGenerator::daily() const
+{
+ if(signatures.count() <= 0)
+ return(QString::null);
+
+ QDate date;
+ int i = date.dayOfYear() % signatures.count();
+ QString text;
+ SigListViewItem::nodeToText(signatures.item(i), text);
+ return attachStandard(text);
+}
+
+QString SigGenerator::attachStandard(const QString &text) const
+{
+ QString s = text;
+
+ if(!header.isEmpty())
+ s = header + "\n" + s;
+ if(!footer.isEmpty())
+ s = s + "\n" + footer + "\n";
+
+ return s;
+}
diff --git a/ksig/siggenerator.h b/ksig/siggenerator.h
new file mode 100644
index 0000000..a2c429d
--- /dev/null
+++ b/ksig/siggenerator.h
@@ -0,0 +1,43 @@
+/***************************************************************************
+ siggenerator.h - description
+ -------------------
+ begin : Sat Jul 20 2002
+ copyright : (C) 2002 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef SIGGENERATOR_H
+#define SIGGENERATOR_H
+
+#include <qstring.h>
+#include <qdom.h>
+
+class SigGenerator
+{
+public:
+ SigGenerator();
+ ~SigGenerator();
+
+ QString random() const;
+ QString daily() const;
+
+private:
+
+ QString attachStandard(const QString &text) const;
+
+ QDomDocument doc;
+ QDomNodeList signatures;
+ QString header;
+ QString footer;
+};
+
+#endif
diff --git a/ksig/siglistview.cpp b/ksig/siglistview.cpp
new file mode 100644
index 0000000..d212478
--- /dev/null
+++ b/ksig/siglistview.cpp
@@ -0,0 +1,124 @@
+/***************************************************************************
+ siglistview.cpp - description
+ -------------------
+ begin : Fri Jul 19 2002
+ copyright : (C) 2002 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "siglistview.h"
+#include "siglistview.moc"
+
+#include "siglistviewitem.h"
+
+#include <kstandarddirs.h>
+#include <klocale.h>
+
+SigListView *SigListView::listView = 0;
+
+////////////////////////////////////////////////////////////////////////////////
+// public members
+////////////////////////////////////////////////////////////////////////////////
+
+SigListView *SigListView::instance(QWidget *parent, const char *name)
+{
+ if(!listView)
+ listView = new SigListView(parent, name);
+ return(listView);
+}
+
+void SigListView::load()
+{
+ if(file.open(IO_ReadOnly) && doc.setContent(&file)) {
+
+ // find the root element
+ QDomNodeList topLevelElements = doc.childNodes();
+ uint i = 0;
+ while(topLevelElements.item(i).toElement().tagName() != "SigML" && i < topLevelElements.count())
+ i++;
+
+ if(i < topLevelElements.count())
+ // if we didn't hit the end of the list
+ rootElement = topLevelElements.item(i).toElement();
+ else {
+ // if we didn't find the root element, create one
+ rootElement = doc.createElement("SigML");
+ doc.appendChild(rootElement);
+ }
+
+ QDomNodeList signatures = doc.elementsByTagName("signature");
+ for(i = 0; i < signatures.count(); i++)
+ (void) new SigListViewItem(this, doc, signatures.item(i).toElement());
+
+ file.close();
+ }
+ // if the document could not be opened or setData failed, create the document framework
+ else {
+ rootElement = doc.createElement("SigML");
+ doc.appendChild(rootElement);
+ }
+}
+
+void SigListView::save()
+{
+ QListViewItemIterator it(this);
+ while(it.current()) {
+ SigListViewItem *item = dynamic_cast<SigListViewItem *>(it.current());
+ if(item)
+ item->render();
+ it++;
+ }
+
+ if(file.open(IO_WriteOnly)) {
+ QTextStream stream(&file);
+ stream << doc;
+ file.close();
+ }
+}
+
+SigListViewItem *SigListView::createItem()
+{
+ QDomElement element = doc.createElement("signature");
+ rootElement.appendChild(element);
+
+ SigListViewItem *item = new SigListViewItem(this, doc, element);
+ return(item);
+}
+
+SigListViewItem *SigListView::currentItem()
+{
+ return(dynamic_cast<SigListViewItem *>(KListView::currentItem()));
+}
+
+const SigListViewItem *SigListView::currentItem() const
+{
+ return(dynamic_cast<SigListViewItem *>(KListView::currentItem()));
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// protected members
+////////////////////////////////////////////////////////////////////////////////
+
+SigListView::SigListView(QWidget *parent, const char *name) : KListView(parent, name)
+{
+ addColumn(i18n("Signatures"));
+
+ QString dir = KGlobal::dirs()->saveLocation("appdata");
+ if(!dir.isNull())
+ file.setName(dir + "sigs.sigml");
+ load();
+}
+
+SigListView::~SigListView()
+{
+
+}
diff --git a/ksig/siglistview.h b/ksig/siglistview.h
new file mode 100644
index 0000000..553d86c
--- /dev/null
+++ b/ksig/siglistview.h
@@ -0,0 +1,71 @@
+/***************************************************************************
+ siglistview.h - description
+ -------------------
+ begin : Fri Jul 19 2002
+ copyright : (C) 2002 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef SIGLISTVIEW_H
+#define SIGLISTVIEW_H
+
+#include <klistview.h>
+#include <kdebug.h>
+
+#include <qfile.h>
+#include <qdom.h>
+
+class SigListViewItem;
+
+/**
+ * SigListView is implemented as a singleton, and as such has a private
+ * constructor. You can access the instance of SigListView through the
+ * instance method. This is implemented as a singleton not to provide
+ * global access, but because things will break horribly were there to
+ * be two instances of this widget created.
+*/
+
+class SigListView : public KListView
+{
+ Q_OBJECT
+public:
+ static SigListView *instance(QWidget *parent = 0, const char *name = 0);
+
+ void load();
+ void save();
+
+ /**
+ * This method should be used for all creation of SigListViewItems.
+ */
+ SigListViewItem *createItem();
+ SigListViewItem *currentItem();
+ const SigListViewItem *currentItem() const;
+
+public slots:
+ /**
+ * Override the destructive default.
+ */
+ void clear() {}
+
+protected:
+ SigListView(QWidget *parent = 0, const char *name = 0);
+ virtual ~SigListView();
+
+private:
+ static SigListView *listView;
+
+ QFile file;
+ QDomDocument doc;
+ QDomElement rootElement;
+};
+
+#endif
diff --git a/ksig/siglistviewitem.cpp b/ksig/siglistviewitem.cpp
new file mode 100644
index 0000000..6744f87
--- /dev/null
+++ b/ksig/siglistviewitem.cpp
@@ -0,0 +1,108 @@
+/***************************************************************************
+ siglistviewitem.cpp - description
+ -------------------
+ begin : Fri Jul 12 2002
+ copyright : (C) 2002 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "siglistviewitem.h"
+
+#include <klocale.h>
+#include <kdebug.h>
+
+#include <qregexp.h>
+
+////////////////////////////////////////////////////////////////////////////////
+// public members
+////////////////////////////////////////////////////////////////////////////////
+
+SigListViewItem::~SigListViewItem()
+{
+ // remove the element from the tree
+ element.parentNode().removeChild(element);
+}
+
+QString SigListViewItem::text() const
+{
+ return(elementText);
+}
+
+void SigListViewItem::setText(const QString &t)
+{
+ if(t != elementText) {
+ elementText = t;
+ dirty = true;
+ refreshText();
+ }
+}
+
+void SigListViewItem::refreshText()
+{
+ if(!text().isEmpty())
+ KListViewItem::setText(0, text().simplifyWhiteSpace());
+ else
+ KListViewItem::setText(0, emptySigString);
+}
+
+void SigListViewItem::nodeToText(const QDomNode &n, QString &s)
+{
+ QDomNodeList children = n.childNodes();
+
+ for(uint i = 0; i < children.count(); i++) {
+ if(children.item(i).isText())
+ s.append(children.item(i).toText().data());
+ else {
+ nodeToText(children.item(i), s);
+ if(children.item(i).isElement() && children.item(i).toElement().tagName() == "p") {
+ s.append("\n");
+ }
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// private members
+////////////////////////////////////////////////////////////////////////////////
+
+SigListViewItem::SigListViewItem(QListView *parent, QDomDocument document, QDomElement signatureElement) : KListViewItem(parent)
+{
+ emptySigString = i18n("<empty signature>");
+
+ doc = document;
+ element = signatureElement;
+ nodeToText(element, elementText);
+ elementText.replace(QRegExp("\n$"), "");
+
+ dirty = false;
+ refreshText();
+}
+
+void SigListViewItem::render()
+{
+ if(dirty) {
+ QDomNodeList children = element.childNodes();
+
+ while(!element.firstChild().isNull())
+ element.removeChild(element.firstChild());
+
+ // create new children
+ QStringList lines = QStringList::split("\n", elementText, true);
+
+ for(QStringList::Iterator it = lines.begin(); it != lines.end(); it++) {
+ QDomElement p = doc.createElement("p");
+ element.appendChild(p);
+ p.appendChild(doc.createTextNode(*it));
+ }
+ dirty = false;
+ }
+}
diff --git a/ksig/siglistviewitem.h b/ksig/siglistviewitem.h
new file mode 100644
index 0000000..f3a6814
--- /dev/null
+++ b/ksig/siglistviewitem.h
@@ -0,0 +1,57 @@
+/***************************************************************************
+ siglistviewitem.h - description
+ -------------------
+ begin : Fri Jul 12 2002
+ copyright : (C) 2002 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef SIGLISTVIEWITEM_H
+#define SIGLISTVIEWITEM_H
+
+#include "siglistview.h"
+
+#include <qdom.h>
+
+class SigListViewItem : public KListViewItem
+{
+ friend class SigListView;
+public:
+ virtual ~SigListViewItem();
+ void setText(const QString &t);
+ QString text() const;
+ void refreshText();
+
+ static void nodeToText(const QDomNode &n, QString &s);
+
+private:
+ /**
+ * The constructor is private because all SigListViewItems should be
+ * created using SigListView::createItem(). This is accessible to
+ * SigListView because SigListView is a friend class.
+ */
+ SigListViewItem(QListView *parent, QDomDocument document, QDomElement signatureElement);
+
+ /**
+ * Renders the data back to the DOM element.
+ */
+ void render();
+
+ QString emptySigString;
+
+ QDomDocument doc;
+ QDomElement element;
+ QString elementText;
+ bool dirty;
+};
+
+#endif
diff --git a/ksig/standardtext.cpp b/ksig/standardtext.cpp
new file mode 100644
index 0000000..7c21e67
--- /dev/null
+++ b/ksig/standardtext.cpp
@@ -0,0 +1,51 @@
+/***************************************************************************
+ standardtext.cpp - description
+ -------------------
+ copyright : (C) 2003 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <ktextedit.h>
+
+#include <qlabel.h>
+
+#include "standardtext.h"
+
+StandardText::StandardText(QWidget *parent, const char *name, bool modal, WFlags fl) : StandardTextBase(parent, name, modal, fl)
+{
+
+}
+
+StandardText::~StandardText()
+{
+
+}
+
+void StandardText::setLabel(const QString &text)
+{
+ label->setText(text);
+}
+
+void StandardText::setText(const QString &text)
+{
+ textEdit->setText(text);
+}
+
+void StandardText::done(int r)
+{
+ if(r == QDialog::Accepted)
+ emit textUpdated(textEdit->text());
+
+ StandardTextBase::done(r);
+}
+
+#include "standardtext.moc"
diff --git a/ksig/standardtext.h b/ksig/standardtext.h
new file mode 100644
index 0000000..dfa8b8c
--- /dev/null
+++ b/ksig/standardtext.h
@@ -0,0 +1,39 @@
+/***************************************************************************
+ standardtext.h - description
+ -------------------
+ copyright : (C) 2003 by Scott Wheeler
+ email : wheeler@kde.org
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef STANDARDTEXT_H
+#define STANDARDTEXT_H
+
+#include "standardtextbase.h"
+
+class StandardText : public StandardTextBase
+{
+ Q_OBJECT
+public:
+ StandardText(QWidget *parent = 0, const char *name = 0, bool modal = false, WFlags fl = 0);
+ virtual ~StandardText();
+
+ void setLabel(const QString &text);
+ void setText(const QString &text);
+
+signals:
+ void textUpdated(const QString &);
+
+private slots:
+ virtual void done(int r);
+};
+
+#endif
diff --git a/ksig/standardtextbase.ui b/ksig/standardtextbase.ui
new file mode 100644
index 0000000..d1050c2
--- /dev/null
+++ b/ksig/standardtextbase.ui
@@ -0,0 +1,119 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>StandardTextBase</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>StandardTextBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>511</width>
+ <height>282</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string></string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>label</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="KTextEdit">
+ <property name="name">
+ <cstring>textEdit</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>buttonSpacer</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>buttonCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>buttonOk</sender>
+ <signal>clicked()</signal>
+ <receiver>StandardTextBase</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>buttonCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>StandardTextBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>ktextedit.h</includehint>
+</includehints>
+</UI>
diff --git a/noatun-plugins/Makefile.am b/noatun-plugins/Makefile.am
new file mode 100644
index 0000000..25f7198
--- /dev/null
+++ b/noatun-plugins/Makefile.am
@@ -0,0 +1,18 @@
+if include_SDL
+SDL_SUBDIRS = blurscope synaescope tippercanoe tyler
+endif
+
+if include_noatunplugin
+NOATUN_SUBDIR = pitchablespeed wavecapture
+endif
+
+if include_BERKELEY_DB
+BDB_SUBDIRS = oblique
+endif
+
+SUBDIRS = \
+ alarm alsaplayer charlatan dub ffrs \
+ luckytag lyrics noatunmadness $(NOATUN_SUBDIR) \
+ $(BDB_SUBDIRS) $(SDL_SUBDIRS)
+
+
diff --git a/noatun-plugins/alarm/Makefile.am b/noatun-plugins/alarm/Makefile.am
new file mode 100644
index 0000000..8d2a928
--- /dev/null
+++ b/noatun-plugins/alarm/Makefile.am
@@ -0,0 +1,21 @@
+INCLUDES= -I$(kde_includes)/arts $(all_includes)
+kde_module_LTLIBRARIES = noatunwakeup.la
+
+noatunwakeup_la_SOURCES = wakeup.cpp \
+ kminutespinbox.cpp \
+ kpercentspinbox.cpp
+
+noatunwakeup_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+noatunwakeup_la_LIBADD = $(LIB_KFILE) -lnoatun -lm
+
+noatunwakeup_la_METASOURCES = AUTO
+
+noinst_HEADERS = wakeup.h \
+ kminutespinbox.h \
+ kpercentspinbox.h
+
+noatun_DATA = wakeup.plugin
+noatundir = $(kde_datadir)/noatun
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/wakeup.pot
diff --git a/noatun-plugins/alarm/kminutespinbox.cpp b/noatun-plugins/alarm/kminutespinbox.cpp
new file mode 100644
index 0000000..3eac84d
--- /dev/null
+++ b/noatun-plugins/alarm/kminutespinbox.cpp
@@ -0,0 +1,41 @@
+// Copyright (C) 2001 Neil Stevens <multivac@fcmail.com>
+//
+// 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
+// THE AUTHOR(S) 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.
+//
+// Except as contained in this notice, the name(s) of the author(s) shall not be
+// used in advertising or otherwise to promote the sale, use or other dealings
+// in this Software without prior written authorization from the author(s).
+
+#include "kminutespinbox.h"
+
+KMinuteSpinBox::KMinuteSpinBox(int _step, QWidget *_parent, const char *_name)
+ : QSpinBox(0, 59, _step, _parent, _name)
+{
+ setButtonSymbols(PlusMinus);
+ setWrapping(true);
+}
+
+QString KMinuteSpinBox::mapValueToText(int v)
+{
+ if(v < 10)
+ return QString("0%1").arg(v);
+ else
+ return QString::number(v);
+}
+
+#include "kminutespinbox.moc"
diff --git a/noatun-plugins/alarm/kminutespinbox.h b/noatun-plugins/alarm/kminutespinbox.h
new file mode 100644
index 0000000..14e2c4f
--- /dev/null
+++ b/noatun-plugins/alarm/kminutespinbox.h
@@ -0,0 +1,38 @@
+// Copyright (C) 2001 Neil Stevens <multivac@fcmail.com>
+//
+// 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
+// THE AUTHOR(S) 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.
+//
+// Except as contained in this notice, the name(s) of the author(s) shall not be
+// used in advertising or otherwise to promote the sale, use or other dealings
+// in this Software without prior written authorization from the author(s).
+
+#ifndef KMINUTESPINBOX_H
+#define KMINUTESPINBOX_H
+
+#include <qspinbox.h>
+
+class KMinuteSpinBox : public QSpinBox
+{
+Q_OBJECT
+public:
+ KMinuteSpinBox(int _step = 1, QWidget *_parent = 0, const char *_name = 0);
+protected:
+ virtual QString mapValueToText(int v);
+};
+
+#endif
diff --git a/noatun-plugins/alarm/kpercentspinbox.cpp b/noatun-plugins/alarm/kpercentspinbox.cpp
new file mode 100644
index 0000000..32b5820
--- /dev/null
+++ b/noatun-plugins/alarm/kpercentspinbox.cpp
@@ -0,0 +1,38 @@
+/***************************************************************************
+ kpercentspinbox.cpp - QSpinbox with %
+ -------------------
+ begin : Sun Apr 15 CEST 2001
+ copyright: (C) 2001 by Mickael Marchand <mikmak@freenux.org>
+
+ ***************************************************************************/
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "kpercentspinbox.h"
+
+KPercentSpinBox::KPercentSpinBox(int _step, QWidget *_parent, const char *_name)
+ : QSpinBox(0, 100, _step, _parent, _name)
+{
+ setButtonSymbols(PlusMinus);
+}
+
+QString KPercentSpinBox::mapValueToText(int v)
+{
+ return QString::number(v)+'%';
+}
+#if 0
+int KPercentSpinBox::mapTextToValue(bool *ok)
+{
+ QString mapText= text();
+// mapText.truncate(mapText.length()-1);
+
+ return mapText.toInt(ok);
+}
+#endif
+#include "kpercentspinbox.moc"
diff --git a/noatun-plugins/alarm/kpercentspinbox.h b/noatun-plugins/alarm/kpercentspinbox.h
new file mode 100644
index 0000000..abcdd49
--- /dev/null
+++ b/noatun-plugins/alarm/kpercentspinbox.h
@@ -0,0 +1,33 @@
+/***************************************************************************
+ kpercentspinbox.h - QSpinbox with %
+ -------------------
+ begin : Sun Apr 15 CEST 2001
+ copyright: (C) 2001 by Mickael Marchand <mikmak@freenux.org>
+
+ ***************************************************************************/
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef KPERCENT_SPINBOX_H
+#define KPERCENT_SPINBOX_H
+
+#include <qspinbox.h>
+
+class KPercentSpinBox : public QSpinBox
+{
+ Q_OBJECT
+ public:
+ KPercentSpinBox (int _step=1, QWidget *_parent=0, const char *name=0);
+
+ protected:
+ virtual QString mapValueToText(int v);
+// virtual int mapTextToValue(bool *ok);
+};
+
+#endif
diff --git a/noatun-plugins/alarm/wakeup.cpp b/noatun-plugins/alarm/wakeup.cpp
new file mode 100644
index 0000000..648d3e3
--- /dev/null
+++ b/noatun-plugins/alarm/wakeup.cpp
@@ -0,0 +1,373 @@
+/**************************************************************************
+ wakeup.cpp - alarm plugin for noatun
+ ------------------
+ begin : Wed Apr 11 CEST 2001
+ copyright: (C) 2001 by Mickael Marchand <mikmak@freenux.org>
+
+ ***************************************************************************/
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+
+#include <noatun/engine.h>
+#include <noatun/player.h>
+#include <noatun/app.h>
+
+#include <klocale.h>
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qspinbox.h>
+#include <qtimer.h>
+#include <qdatetime.h>
+#include <qlayout.h>
+#include <qvbox.h>
+#include <qhbox.h>
+#include <qbuttongroup.h>
+#include <qradiobutton.h>
+#include <qwhatsthis.h>
+#include <kiconloader.h>
+
+#include <kconfig.h>
+#include <kglobal.h>
+#include "wakeup.h"
+#include "kminutespinbox.h"
+#include "kpercentspinbox.h"
+
+extern "C" Plugin *create_plugin()
+{
+ KGlobal::locale()->insertCatalogue("wakeup");
+ return new Wakeup();
+}
+
+Wakeup *Wakeup::wakeme = 0;
+
+Wakeup::Wakeup() : QObject(), Plugin()
+{
+ wakeme = this;
+
+ NOATUNPLUGINC(Wakeup);
+ new WakeupPrefs(this);
+
+ update();
+
+ QTimer *timer=new QTimer(this);
+ connect (timer,SIGNAL(timeout()),SLOT(slotCheckTime()));
+ timer->start(60000,false);
+}
+
+Wakeup::~Wakeup()
+{
+}
+
+void Wakeup::update()
+{
+ KConfig *config=KGlobal::config();
+ config->setGroup("Noatun Alarm");
+
+ hour[0]=config->readNumEntry("Hour1",7);
+ minute[0]=config->readNumEntry("Minute1",0);
+ hour[1]=config->readNumEntry("Hour2",7);
+ minute[1]=config->readNumEntry("Minute2",0);
+ hour[2]=config->readNumEntry("Hour3",7);
+ minute[2]=config->readNumEntry("Minute3",0);
+ hour[3]=config->readNumEntry("Hour4",7);
+ minute[3]=config->readNumEntry("Minute4",0);
+ hour[4]=config->readNumEntry("Hour5",7);
+ minute[4]=config->readNumEntry("Minute5",0);
+ hour[5]=config->readNumEntry("Hour6",7);
+ minute[5]=config->readNumEntry("Minute6",0);
+ hour[6]=config->readNumEntry("Hour7",7);
+ minute[6]=config->readNumEntry("Minute7",0);
+
+ days[0]=config->readBoolEntry("Monday",false);
+ days[1]=config->readBoolEntry("Tuesday",false);
+ days[2]=config->readBoolEntry("Wednesday",false);
+ days[3]=config->readBoolEntry("Thursday",false);
+ days[4]=config->readBoolEntry("Friday",false);
+ days[5]=config->readBoolEntry("Saturday",false);
+ days[6]=config->readBoolEntry("Sunday",false);
+
+ volEndVal=config->readNumEntry("VolumeEnd",80);
+ modeAlarm=config->readNumEntry("ModeAlarm",0);
+// songlist=config->readEntry("List","");
+}
+
+void Wakeup::slotCheckTime()
+{
+ QTime t;
+ QDate d;
+
+ t=QTime::currentTime();
+ d=QDate::currentDate();
+
+ if (t.minute()!=minute[d.dayOfWeek()-1] || t.hour()!=hour[d.dayOfWeek()-1]) return;
+
+ if (days[d.dayOfWeek()-1])
+ {
+ //napp->player()->play();
+ PlayerAct();
+ }
+}
+
+void Wakeup::PlayerAct()
+{
+ if (modeAlarm==1 && !napp->player()->isPlaying())
+ {
+ napp->player()->setVolume(0);
+ }
+
+ if (!napp->player()->isPlaying() && modeAlarm!=2) napp->player()->play();
+
+ // timer for volume (up/down) according to prefs :-)
+ volTimer = new QTimer (this);
+ connect (volTimer,SIGNAL(timeout()), SLOT(slotVolumeChange()));
+
+ volTimer->start(1000,false); // updates volume every seconds
+
+}
+
+void Wakeup::slotVolumeChange()
+{
+ int vol = napp->player()->volume();
+ if ( vol >= volEndVal && modeAlarm==1)
+ {
+ volTimer->stop();
+ return;
+ }
+ else if (vol <= 0 && modeAlarm==2)
+ {
+ volTimer->stop();
+ napp->player()->stop();
+ return;
+ }
+ else if (modeAlarm==0)
+ {
+ volTimer->stop();
+ return;
+ }
+
+ if (modeAlarm==1)
+ {
+ napp->player()->setVolume( vol + 1 );
+ }
+ else if (modeAlarm==2)
+ {
+ napp->player()->setVolume( vol - 1 );
+ }
+}
+
+///////////////////////////////////////////////////////////////////
+// Prefs CModule
+///////////////////////////////////////////////////////////////////
+WakeupPrefs::WakeupPrefs( QObject *parent ) :
+ CModule( i18n("Wakeup"), i18n("Alarm Configuration"), "date", parent )
+{
+ QVBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+ QGridLayout *grid = new QGridLayout (layout,8,4);
+
+ monday=new QCheckBox(i18n("Monday"),this);
+ tuesday=new QCheckBox(i18n("Tuesday"),this);
+ wednesday=new QCheckBox(i18n("Wednesday"),this);
+ thursday=new QCheckBox(i18n("Thursday"),this);
+ friday=new QCheckBox(i18n("Friday"),this);
+ saturday=new QCheckBox(i18n("Saturday"),this);
+ sunday=new QCheckBox(i18n("Sunday"),this);
+ hour1 = new QSpinBox(0, 23, 1, this , "Hour1");
+ hour1->setButtonSymbols(QSpinBox::PlusMinus);
+ minute1 = new KMinuteSpinBox(1, this , "Minute1");
+ hour2 = new QSpinBox(0, 23, 1, this, "Hour2");
+ hour2->setButtonSymbols(QSpinBox::PlusMinus);
+ minute2 = new KMinuteSpinBox(1, this, "Minute2");
+ hour3 = new QSpinBox(0, 23, 1, this, "Hour3");
+ hour3->setButtonSymbols(QSpinBox::PlusMinus);
+ minute3 = new KMinuteSpinBox(1, this, "Minute3");
+ hour4 = new QSpinBox(0, 23, 1, this, "Hour4");
+ hour4->setButtonSymbols(QSpinBox::PlusMinus);
+ minute4 = new KMinuteSpinBox(1, this, "Minute4");
+ hour5 = new QSpinBox(0, 23, 1, this, "Hour5");
+ hour5->setButtonSymbols(QSpinBox::PlusMinus);
+ minute5 = new KMinuteSpinBox(1, this, "Minute5");
+ hour6 = new QSpinBox(0, 23, 1, this, "Hour6");
+ hour6->setButtonSymbols(QSpinBox::PlusMinus);
+ minute6 = new KMinuteSpinBox(1, this, "Minute6");
+ hour7 = new QSpinBox(0, 23, 1, this, "Hour7");
+ hour7->setButtonSymbols(QSpinBox::PlusMinus);
+ minute7 = new KMinuteSpinBox(1, this, "Minute7");
+
+ QLabel *selectday = new QLabel (i18n("Select days:"),this);
+ QLabel *choosehour = new QLabel (i18n("Hour"),this);
+ QLabel *choosemin = new QLabel (i18n("Minute"),this);
+ grid->addWidget (selectday,0,0,Qt::AlignLeft);
+ grid->addWidget (choosehour,0,1,Qt::AlignLeft);
+ grid->addWidget (choosemin,0,2,Qt::AlignLeft);
+
+ applyall = new QPushButton (this,"applyall");
+ applyall->setPixmap( BarIcon("down", KIcon::SizeSmall) );
+ applyall->setSizePolicy( QSizePolicy( QSizePolicy::Fixed,
+ QSizePolicy::Fixed,
+ applyall->sizePolicy().hasHeightForWidth()) );
+ grid->addWidget (applyall,1,3,Qt::AlignLeft);
+
+ grid->addWidget (monday,1,0,Qt::AlignLeft);
+ grid->addWidget (tuesday,2,0,Qt::AlignLeft);
+ grid->addWidget (wednesday,3,0,Qt::AlignLeft);
+ grid->addWidget (thursday,4,0,Qt::AlignLeft);
+ grid->addWidget (friday,5,0,Qt::AlignLeft);
+ grid->addWidget (saturday,6,0,Qt::AlignLeft);
+ grid->addWidget (sunday,7,0,Qt::AlignLeft);
+ grid->addWidget (hour1,1,1,Qt::AlignLeft);
+ grid->addWidget (hour2,2,1,Qt::AlignLeft);
+ grid->addWidget (hour3,3,1,Qt::AlignLeft);
+ grid->addWidget (hour4,4,1,Qt::AlignLeft);
+ grid->addWidget (hour5,5,1,Qt::AlignLeft);
+ grid->addWidget (hour6,6,1,Qt::AlignLeft);
+ grid->addWidget (hour7,7,1,Qt::AlignLeft);
+ grid->addWidget (minute1,1,2,Qt::AlignLeft);
+ grid->addWidget (minute2,2,2,Qt::AlignLeft);
+ grid->addWidget (minute3,3,2,Qt::AlignLeft);
+ grid->addWidget (minute4,4,2,Qt::AlignLeft);
+ grid->addWidget (minute5,5,2,Qt::AlignLeft);
+ grid->addWidget (minute6,6,2,Qt::AlignLeft);
+ grid->addWidget (minute7,7,2,Qt::AlignLeft);
+ grid->setColStretch (0,3);
+
+ QButtonGroup *modeGroup = new QButtonGroup (3, Qt::Vertical, i18n ("Volume Control"),this);
+ alarmmode = new QRadioButton (i18n("No change to volume, just starts the player"),modeGroup);
+ nightmode = new QRadioButton (i18n("The volume decreases slowly and finally stops the player"),modeGroup);
+ morningmode = new QRadioButton (i18n("The player starts and the volume increases to the chosen value"),modeGroup);
+ modeGroup->setExclusive(true);
+ morningmode->setChecked(true);
+
+ volFrame = new QFrame (this);
+ QLabel *volEndLabel = new QLabel (i18n("Volume increases to:"), volFrame);
+ volEndValue = new KPercentSpinBox (1 ,volFrame,"volendvalue");
+
+ layout->addWidget(modeGroup);
+ layout->addWidget(volFrame);
+ layout->addStretch();
+
+ QHBoxLayout *volLayout = new QHBoxLayout(volFrame, KDialog::marginHint(), KDialog::spacingHint());
+ volLayout->addWidget(volEndLabel);
+ volLayout->addWidget(volEndValue);
+ volLayout->addStretch();
+
+ connect (morningmode,SIGNAL(stateChanged(int)),SLOT(slotViewFrame(int)));
+ connect (applyall,SIGNAL(clicked()),SLOT(slotApplyAll()));
+
+ load();
+}
+
+void WakeupPrefs::slotApplyAll()
+{
+ hour2->setValue(hour1->text().toInt());
+ hour3->setValue(hour1->text().toInt());
+ hour4->setValue(hour1->text().toInt());
+ hour5->setValue(hour1->text().toInt());
+ hour6->setValue(hour1->text().toInt());
+ hour7->setValue(hour1->text().toInt());
+ minute2->setValue(minute1->text().toInt());
+ minute3->setValue(minute1->text().toInt());
+ minute4->setValue(minute1->text().toInt());
+ minute5->setValue(minute1->text().toInt());
+ minute6->setValue(minute1->text().toInt());
+ minute7->setValue(minute1->text().toInt());
+}
+
+void WakeupPrefs::slotViewFrame(int state)
+{
+ if (state==2) volFrame->show();
+ else volFrame->hide();
+}
+
+void WakeupPrefs::save()
+{
+ KConfig *config=KGlobal::config();
+ config->setGroup("Noatun Alarm");
+ config->writeEntry("Monday",monday->isChecked());
+ config->writeEntry("Tuesday",tuesday->isChecked());
+ config->writeEntry("Wednesday",wednesday->isChecked());
+ config->writeEntry("Thursday",thursday->isChecked());
+ config->writeEntry("Friday",friday->isChecked());
+ config->writeEntry("Saturday",saturday->isChecked());
+ config->writeEntry("Sunday",sunday->isChecked());
+ config->writeEntry("Hour1",hour1->text());
+ config->writeEntry("Minute1",minute1->text());
+ config->writeEntry("Hour2",hour2->text());
+ config->writeEntry("Minute2",minute2->text());
+ config->writeEntry("Hour3",hour3->text());
+ config->writeEntry("Minute3",minute3->text());
+ config->writeEntry("Hour4",hour4->text());
+ config->writeEntry("Minute4",minute4->text());
+ config->writeEntry("Hour5",hour5->text());
+ config->writeEntry("Minute5",minute5->text());
+ config->writeEntry("Hour6",hour6->text());
+ config->writeEntry("Minute6",minute6->text());
+ config->writeEntry("Hour7",hour7->text());
+ config->writeEntry("Minute7",minute7->text());
+ QString val(volEndValue->text());
+ config->writeEntry("VolumeEnd",val);
+
+ if (nightmode->isChecked()) config->writeEntry("ModeAlarm",2);
+ else if (morningmode->isChecked()) config->writeEntry("ModeAlarm",1);
+ else config->writeEntry("ModeAlarm", 0);
+
+ config->sync();
+
+ Wakeup *wake = Wakeup::wakeme;
+ if (wake) wake->update();
+}
+
+void WakeupPrefs::load()
+{
+ KGlobal::config()->setGroup("Noatun Alarm");
+ monday->setChecked(KGlobal::config()->readBoolEntry("Monday",false));
+ tuesday->setChecked(KGlobal::config()->readBoolEntry("Tuesday",false));
+ wednesday->setChecked(KGlobal::config()->readBoolEntry("Wednesday",false));
+ thursday->setChecked(KGlobal::config()->readBoolEntry("Thursday",false));
+ friday->setChecked(KGlobal::config()->readBoolEntry("Friday",false));
+ saturday->setChecked(KGlobal::config()->readBoolEntry("Saturday",false));
+ sunday->setChecked(KGlobal::config()->readBoolEntry("Sunday",false));
+
+ hour1->setValue(KGlobal::config()->readNumEntry("Hour1",7));
+ minute1->setValue(KGlobal::config()->readNumEntry("Minute1",0));
+ hour2->setValue(KGlobal::config()->readNumEntry("Hour2",7));
+ minute2->setValue(KGlobal::config()->readNumEntry("Minute2",0));
+ hour3->setValue(KGlobal::config()->readNumEntry("Hour3",7));
+ minute3->setValue(KGlobal::config()->readNumEntry("Minute3",0));
+ hour4->setValue(KGlobal::config()->readNumEntry("Hour4",7));
+ minute4->setValue(KGlobal::config()->readNumEntry("Minute4",0));
+ hour5->setValue(KGlobal::config()->readNumEntry("Hour5",7));
+ minute5->setValue(KGlobal::config()->readNumEntry("Minute5",0));
+ hour6->setValue(KGlobal::config()->readNumEntry("Hour6",7));
+ minute6->setValue(KGlobal::config()->readNumEntry("Minute6",0));
+ hour7->setValue(KGlobal::config()->readNumEntry("Hour7",7));
+ minute7->setValue(KGlobal::config()->readNumEntry("Minute7",0));
+
+ QString volend(KGlobal::config()->readEntry("VolumeEnd","80%"));
+ volend.truncate(volend.length()-1);
+
+ volEndValue->setValue(volend.toInt());
+
+ switch (KGlobal::config()->readNumEntry("ModeAlarm",0))
+ {
+ case 0:
+ alarmmode->setChecked(true);
+ break;
+ case 1:
+ morningmode->setChecked(true);
+ break;
+ case 2:
+ nightmode->setChecked(true);
+ break;
+ default:
+ alarmmode->setChecked(true);
+ }
+}
+
+#include "wakeup.moc"
diff --git a/noatun-plugins/alarm/wakeup.h b/noatun-plugins/alarm/wakeup.h
new file mode 100644
index 0000000..e2992a8
--- /dev/null
+++ b/noatun-plugins/alarm/wakeup.h
@@ -0,0 +1,103 @@
+/***************************************************************************
+ wakeup.h - alarm plugin for noatun
+ -------------------
+ begin : Wed Apr 11 CEST 2000
+ copyright: (C) 2001 by Mickael Marchand <mikmak@freenux.org>
+
+ ***************************************************************************/
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+
+#ifndef WAKEUP_H
+#define WAKEUP_H
+
+#include <noatun/pref.h>
+#include <noatun/plugin.h>
+#include <qradiobutton.h>
+#include <qbuttongroup.h>
+#include <qpushbutton.h>
+
+class QSpinBox;
+class QCheckBox;
+class KMinuteSpinBox;
+class KPercentSpinBox;
+
+class Wakeup : public QObject, public Plugin
+{
+ Q_OBJECT
+ NOATUNPLUGIND
+
+public:
+ Wakeup();
+ ~Wakeup();
+ static Wakeup *wakeme;
+ void PlayerAct();
+ void update();
+
+public slots:
+ void slotVolumeChange();
+ void slotCheckTime();
+
+private:
+ QStringList *day_list;
+// QString songlist;
+ int hour[7];
+ int minute[7];
+ bool days[7];
+ QTimer *volTimer;
+ int volEndVal;
+ int modeAlarm;
+};
+
+
+class WakeupPrefs : public CModule
+{
+ Q_OBJECT
+
+public:
+ WakeupPrefs( QObject *parent );
+ virtual void save();
+ virtual void load();
+public slots:
+ void slotViewFrame(int);
+ void slotApplyAll();
+
+private:
+ QCheckBox *monday;
+ QCheckBox *tuesday;
+ QCheckBox *wednesday;
+ QCheckBox *thursday;
+ QCheckBox *friday;
+ QCheckBox *saturday;
+ QCheckBox *sunday;
+ KMinuteSpinBox *minute1;
+ KMinuteSpinBox *minute2;
+ KMinuteSpinBox *minute3;
+ KMinuteSpinBox *minute4;
+ KMinuteSpinBox *minute5;
+ KMinuteSpinBox *minute6;
+ KMinuteSpinBox *minute7;
+ QSpinBox *hour1;
+ QSpinBox *hour2;
+ QSpinBox *hour3;
+ QSpinBox *hour4;
+ QSpinBox *hour5;
+ QSpinBox *hour6;
+ QSpinBox *hour7;
+
+ KPercentSpinBox *volEndValue;
+ QRadioButton *alarmmode;
+ QRadioButton *morningmode;
+ QRadioButton *nightmode;
+ QFrame *volFrame;
+ QPushButton *applyall;
+};
+
+#endif // WAKEUP_H
diff --git a/noatun-plugins/alarm/wakeup.plugin b/noatun-plugins/alarm/wakeup.plugin
new file mode 100644
index 0000000..8a851c5
--- /dev/null
+++ b/noatun-plugins/alarm/wakeup.plugin
@@ -0,0 +1,115 @@
+Filename=noatunwakeup.la
+Author=Mickael Marchand
+Site=http://www.freenux.org/
+Email=mikmak@freenux.org
+Type=other
+License=GPL
+Name=WakeUp
+Name[af]=Word wakker
+Name[ar]=استيقظ
+Name[az]=Oyan
+Name[cs]=Budíček
+Name[cy]=Deffro
+Name[da]=VågnOp
+Name[de]=Wecker
+Name[el]=Ξύπνησε
+Name[eo]=Vekilo
+Name[es]=Despertador
+Name[et]=Ärataja
+Name[fa]=بیدار شدن
+Name[fi]=Herätys
+Name[fr]=Réveil
+Name[fy]=Wekker
+Name[he]=התעורר
+Name[hi]=वेक-अप
+Name[hr]=Buđenje
+Name[it]=Sveglia
+Name[ka]=გაღვიძება
+Name[kk]=Ояту
+Name[km]=ភ្ញាក់ឡើង
+Name[lt]=Žadintuvas
+Name[mk]=РазбудиСе
+Name[nb]=Våknopp
+Name[nds]=Weckklock
+Name[ne]=जगाउनु
+Name[nl]=Wekker
+Name[nn]=Vakn-opp
+Name[nso]=Tsoga
+Name[pa]=ਜਗਾਉ
+Name[pl]=Budzenie
+Name[ro]=Deşteptător
+Name[ru]=Пробуждение
+Name[sl]=Zbudi se
+Name[sv]=Väckarklocka
+Name[ta]=எழுந்திருத்தல்
+Name[tg]=Бедоршавӣ
+Name[tr]=Uyan
+Name[uk]=Пробудження
+Name[uz]=Uygʻotish
+Name[uz@cyrillic]=Уйғотиш
+Name[vi]=Dậy đi
+Name[xh]=Vuka
+Name[zh_CN]=醒来
+Comment=A simple, customizable alarm
+Comment[af]='n eenvoudige, pakmaakbaar alarm
+Comment[ar]=منبه بسيط قابل للتخصيص
+Comment[az]=Bəsit bir alarm
+Comment[bg]=Проста и лесна за настройване аларма за събуждане сутрин
+Comment[bs]=Jednostavan, lagan za podešavanje alarm
+Comment[ca]=Una alarma senzilla i personalitzable
+Comment[cs]=Jednoduchý, přizpůsobitelný alarm
+Comment[cy]=Alarwm syml addasadwy
+Comment[da]=En simpel, brugerdefinérbar alarm
+Comment[de]=Ein einfacher, anpassbarer Wecker
+Comment[el]=Ένα απλό, ρυθμιζόμενο ξυπνητήρι
+Comment[en_GB]=A simple, customisable alarm
+Comment[eo]=Simpla, proprebla alarmilo
+Comment[es]=Una alarma sencilla y personalizable
+Comment[et]=Lihtne kohandatav ärataja
+Comment[eu]=Alarma erraz eta pertsonalizatua
+Comment[fa]=یک هشدار قابل سفارش و ساده
+Comment[fi]=Yksinkertainen herätysohjelma
+Comment[fr]=Une alarme simple personnalisable
+Comment[fy]=In ienfâldich yn te stellen alaarm
+Comment[ga]=Aláram simplí, in-saincheaptha
+Comment[gl]=Unha alarma simples e configurábel
+Comment[he]=תזכורת פשוטה הניתנת להתאמה אישית
+Comment[hi]=एक साधारण, कस्टमाइजेबल अलार्म
+Comment[hr]=Jednostavan i prilagodljiv alarm
+Comment[hu]=Egyszerű, testreszabható emlékeztetés
+Comment[is]=Einfaldur og stillanlegur vekjari
+Comment[it]=Un allarme semplice e personalizzabile
+Comment[ja]=シンプルでカスタマイズ可能なアラーム
+Comment[ka]=მარტივი მორგებადი მაღვიძარა
+Comment[kk]=Қарапайым, бапталатын оятқыш
+Comment[km]=សំឡេង​រោទ៍​ដែល​អាច​ប្ដូរ​តាម​បំណង​ធម្មតា​មួយ
+Comment[lt]=Paprastas, derinamas, žadintuvas
+Comment[mk]=Едноставен приспособлив аларм
+Comment[ms]=Jam loceng mudah selenggara
+Comment[nb]=En enkel vekkeklokke som kan tilpasses
+Comment[nds]=En eenfache Weckklock mit mennige Instellen
+Comment[ne]=एउटा सामान्य, अनुकूलनयोग्य संसूचक
+Comment[nl]=Een eenvoudig in te stellen alarm
+Comment[nn]=Ei enkel vekkjarklokke som kan tilpassast
+Comment[nso]=Alamo ye bonolo, yago amanyega
+Comment[pa]=ਛੋਟਾ ਜਿਹਾ, ਆਸਾਨ ਅਲਾਰਮ
+Comment[pl]=Prosty budzik
+Comment[pt]=Um alarme simples e configurável
+Comment[pt_BR]=Um alarme simples e personalizável
+Comment[ro]=O aplicaţie de alarmare simplă şi personalizabilă
+Comment[ru]=Простой будильник с различными настройками
+Comment[sk]=Jednoduchý, nastaviteľný alarm
+Comment[sl]=Preprost prilagodljiv alarm
+Comment[sr]=Једноставан, прилагодљив аларм
+Comment[sr@Latn]=Jednostavan, prilagodljiv alarm
+Comment[sv]=Enkel anpassningsbar väckarklocka
+Comment[ta]=எளிய, தனிப்பயனாக்கு எச்சரிக்கை மணி
+Comment[tg]=Огоҳкунаки оддӣ бо танзимотҳои гуногун
+Comment[tr]=Basit, ayarlanabilir bir alarm
+Comment[uk]=Простий будильник з різноманітними параметрами
+Comment[uz]=Oddiy ogohlantirgich
+Comment[uz@cyrillic]=Оддий огоҳлантиргич
+Comment[vi]=Đồng hồ báo thức đơn giản có thể tùy chỉnh
+Comment[xh]=I alamu elula, yokwenza into ngokwemfuneko
+Comment[zh_CN]=一个简单的可定制的闹钟
+Comment[zh_TW]=一個簡單可調整的鬧鐘
diff --git a/noatun-plugins/alsaplayer/AlsaPlayer.ui b/noatun-plugins/alsaplayer/AlsaPlayer.ui
new file mode 100644
index 0000000..772af81
--- /dev/null
+++ b/noatun-plugins/alsaplayer/AlsaPlayer.ui
@@ -0,0 +1,2640 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>APMainWindow</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>APMainWindow</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>385</width>
+ <height>118</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Noaplayer</string>
+ </property>
+ <property name="acceptDrops">
+ <bool>true</bool>
+ </property>
+ <property name="layoutMargin" stdset="0">
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>4</number>
+ </property>
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <widget class="QFrame">
+ <property name="name">
+ <cstring>Frame3</cstring>
+ </property>
+ <property name="palette">
+ <palette>
+ <active>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>228</red>
+ <green>228</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>241</red>
+ <green>241</green>
+ <blue>241</blue>
+ </color>
+ <color>
+ <red>114</red>
+ <green>114</green>
+ <blue>114</blue>
+ </color>
+ <color>
+ <red>152</red>
+ <green>152</green>
+ <blue>152</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>10</red>
+ <green>95</green>
+ <blue>137</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </active>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>228</red>
+ <green>228</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>114</red>
+ <green>114</green>
+ <blue>114</blue>
+ </color>
+ <color>
+ <red>152</red>
+ <green>152</green>
+ <blue>152</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>10</red>
+ <green>95</green>
+ <blue>137</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </disabled>
+ <inactive>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>228</red>
+ <green>228</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>114</red>
+ <green>114</green>
+ <blue>114</blue>
+ </color>
+ <color>
+ <red>152</red>
+ <green>152</green>
+ <blue>152</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>10</red>
+ <green>95</green>
+ <blue>137</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </inactive>
+ </palette>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <property name="layoutMargin" stdset="0">
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <property name="spacing">
+ <number>4</number>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>speedLabelLeft</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="palette">
+ <palette>
+ <active>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>228</red>
+ <green>228</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>241</red>
+ <green>241</green>
+ <blue>241</blue>
+ </color>
+ <color>
+ <red>114</red>
+ <green>114</green>
+ <blue>114</blue>
+ </color>
+ <color>
+ <red>152</red>
+ <green>152</green>
+ <blue>152</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>8</red>
+ <green>93</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </active>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>228</red>
+ <green>228</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>114</red>
+ <green>114</green>
+ <blue>114</blue>
+ </color>
+ <color>
+ <red>152</red>
+ <green>152</green>
+ <blue>152</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>8</red>
+ <green>93</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </disabled>
+ <inactive>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>228</red>
+ <green>228</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>114</red>
+ <green>114</green>
+ <blue>114</blue>
+ </color>
+ <color>
+ <red>152</red>
+ <green>152</green>
+ <blue>152</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>8</red>
+ <green>93</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </inactive>
+ </palette>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="text">
+ <string>Speed:</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ <property name="hAlign" stdset="0">
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="3">
+ <property name="name">
+ <cstring>timeLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="palette">
+ <palette>
+ <active>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>228</red>
+ <green>228</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>241</red>
+ <green>241</green>
+ <blue>241</blue>
+ </color>
+ <color>
+ <red>114</red>
+ <green>114</green>
+ <blue>114</blue>
+ </color>
+ <color>
+ <red>152</red>
+ <green>152</green>
+ <blue>152</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>8</red>
+ <green>93</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </active>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>228</red>
+ <green>228</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>114</red>
+ <green>114</green>
+ <blue>114</blue>
+ </color>
+ <color>
+ <red>152</red>
+ <green>152</green>
+ <blue>152</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>8</red>
+ <green>93</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </disabled>
+ <inactive>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>228</red>
+ <green>228</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>114</red>
+ <green>114</green>
+ <blue>114</blue>
+ </color>
+ <color>
+ <red>152</red>
+ <green>152</green>
+ <blue>152</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>8</red>
+ <green>93</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </inactive>
+ </palette>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="text">
+ <string>No time data</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>speedLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="palette">
+ <palette>
+ <active>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>228</red>
+ <green>228</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>241</red>
+ <green>241</green>
+ <blue>241</blue>
+ </color>
+ <color>
+ <red>114</red>
+ <green>114</green>
+ <blue>114</blue>
+ </color>
+ <color>
+ <red>152</red>
+ <green>152</green>
+ <blue>152</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>8</red>
+ <green>93</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </active>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>228</red>
+ <green>228</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>114</red>
+ <green>114</green>
+ <blue>114</blue>
+ </color>
+ <color>
+ <red>152</red>
+ <green>152</green>
+ <blue>152</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>8</red>
+ <green>93</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </disabled>
+ <inactive>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>228</red>
+ <green>228</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>114</red>
+ <green>114</green>
+ <blue>114</blue>
+ </color>
+ <color>
+ <red>152</red>
+ <green>152</green>
+ <blue>152</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>8</red>
+ <green>93</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </inactive>
+ </palette>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="text">
+ <string>100%</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="2" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>titleLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="palette">
+ <palette>
+ <active>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>228</red>
+ <green>228</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>241</red>
+ <green>241</green>
+ <blue>241</blue>
+ </color>
+ <color>
+ <red>114</red>
+ <green>114</green>
+ <blue>114</blue>
+ </color>
+ <color>
+ <red>152</red>
+ <green>152</green>
+ <blue>152</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>8</red>
+ <green>93</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </active>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>228</red>
+ <green>228</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>114</red>
+ <green>114</green>
+ <blue>114</blue>
+ </color>
+ <color>
+ <red>152</red>
+ <green>152</green>
+ <blue>152</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>8</red>
+ <green>93</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </disabled>
+ <inactive>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>228</red>
+ <green>228</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>114</red>
+ <green>114</green>
+ <blue>114</blue>
+ </color>
+ <color>
+ <red>152</red>
+ <green>152</green>
+ <blue>152</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>8</red>
+ <green>93</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </inactive>
+ </palette>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="text">
+ <string>No stream</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="1">
+ <property name="name">
+ <cstring>volumeLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="palette">
+ <palette>
+ <active>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>228</red>
+ <green>228</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>241</red>
+ <green>241</green>
+ <blue>241</blue>
+ </color>
+ <color>
+ <red>114</red>
+ <green>114</green>
+ <blue>114</blue>
+ </color>
+ <color>
+ <red>152</red>
+ <green>152</green>
+ <blue>152</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>8</red>
+ <green>93</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </active>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>228</red>
+ <green>228</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>114</red>
+ <green>114</green>
+ <blue>114</blue>
+ </color>
+ <color>
+ <red>152</red>
+ <green>152</green>
+ <blue>152</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>8</red>
+ <green>93</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </disabled>
+ <inactive>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>228</red>
+ <green>228</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>114</red>
+ <green>114</green>
+ <blue>114</blue>
+ </color>
+ <color>
+ <red>152</red>
+ <green>152</green>
+ <blue>152</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>8</red>
+ <green>93</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </inactive>
+ </palette>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="text">
+ <string>100%</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>volumeLabelLeft</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="palette">
+ <palette>
+ <active>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>228</red>
+ <green>228</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>241</red>
+ <green>241</green>
+ <blue>241</blue>
+ </color>
+ <color>
+ <red>114</red>
+ <green>114</green>
+ <blue>114</blue>
+ </color>
+ <color>
+ <red>152</red>
+ <green>152</green>
+ <blue>152</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>8</red>
+ <green>93</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </active>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>228</red>
+ <green>228</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>114</red>
+ <green>114</green>
+ <blue>114</blue>
+ </color>
+ <color>
+ <red>152</red>
+ <green>152</green>
+ <blue>152</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>8</red>
+ <green>93</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </disabled>
+ <inactive>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>228</red>
+ <green>228</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>114</red>
+ <green>114</green>
+ <blue>114</blue>
+ </color>
+ <color>
+ <red>152</red>
+ <green>152</green>
+ <blue>152</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>8</red>
+ <green>93</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </inactive>
+ </palette>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="text">
+ <string>Volume:</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ <property name="hAlign" stdset="0">
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="2">
+ <property name="name">
+ <cstring>infoLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="palette">
+ <palette>
+ <active>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>228</red>
+ <green>228</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>241</red>
+ <green>241</green>
+ <blue>241</blue>
+ </color>
+ <color>
+ <red>114</red>
+ <green>114</green>
+ <blue>114</blue>
+ </color>
+ <color>
+ <red>152</red>
+ <green>152</green>
+ <blue>152</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>8</red>
+ <green>93</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </active>
+ <disabled>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>228</red>
+ <green>228</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>114</red>
+ <green>114</green>
+ <blue>114</blue>
+ </color>
+ <color>
+ <red>152</red>
+ <green>152</green>
+ <blue>152</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>128</red>
+ <green>128</green>
+ <blue>128</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>8</red>
+ <green>93</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </disabled>
+ <inactive>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>228</red>
+ <green>228</green>
+ <blue>228</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>114</red>
+ <green>114</green>
+ <blue>114</blue>
+ </color>
+ <color>
+ <red>152</red>
+ <green>152</green>
+ <blue>152</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>8</red>
+ <green>93</green>
+ <blue>139</blue>
+ </color>
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ <color>
+ <red>0</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </inactive>
+ </palette>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="Seeker">
+ <property name="name">
+ <cstring>seeker</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout10</cstring>
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>4</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout9</cstring>
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout8</cstring>
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>menuButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image0</pixmap>
+ </property>
+ <property name="popupDelay">
+ <number>0</number>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Menu</string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>previousButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image1</pixmap>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Skip to previous track</string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>playButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image2</pixmap>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Play</string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>nextButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image3</pixmap>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Skip to next track</string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>stopButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image4</pixmap>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Stop</string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>playlistButton</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image5</pixmap>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Show playlist</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout5</cstring>
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>pauseButton</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image6</pixmap>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Pause</string>
+ </property>
+ </widget>
+ <widget class="QToolButton">
+ <property name="name">
+ <cstring>forwardButton</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="pixmap">
+ <pixmap>image7</pixmap>
+ </property>
+ <property name="autoRaise">
+ <bool>true</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Forwards, normal speed</string>
+ </property>
+ </widget>
+ <widget class="QSlider">
+ <property name="name">
+ <cstring>speedSlider</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="maxValue">
+ <number>233</number>
+ </property>
+ <property name="value">
+ <number>66</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Playback speed and direction</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <property name="layoutSpacing" stdset="0">
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>2</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>PixmapLabel2</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="pixmap">
+ <pixmap>image8</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Balance</string>
+ </property>
+ </widget>
+ <widget class="QSlider">
+ <property name="name">
+ <cstring>balanceSlider</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="value">
+ <number>50</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Balance</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>PixmapLabel1</cstring>
+ </property>
+ <property name="pixmap">
+ <pixmap>image9</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>false</bool>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Volume</string>
+ </property>
+ </widget>
+ <widget class="QSlider">
+ <property name="name">
+ <cstring>volumeSlider</cstring>
+ </property>
+ <property name="maxValue">
+ <number>100</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Volume</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>Seeker</class>
+ <header location="local">seeker.h</header>
+ <sizehint>
+ <width>64</width>
+ <height>22</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>7</hordata>
+ <verdata>5</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image10</pixmap>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="2716">789c8dd4c972db461006e0bb9e82a5bea952bf89958372e5a0c5a23652a256caa91c060b454924b5905a5379770fba7b60a62c25117cf93c3f67d0e806beacb58647bdd6da9795f9c22eae8b5631b68fadb5f2693a7dfbe3cfdfff5a590db256fd2fe8b4c2d5df5656078b56d1eadfcdaa1a74e9406dfeab0d52c7ea99388803364dd52630bc7e210efdef536f5d3ff20ee5f7dfd4715bd607deba7ea636ba5fdb3bccd877ea42f27869ccebd413476df5c43b0a38ffaa2ea41e84deba9ff18ee4bca1386e8b69e61df37ea4f5c7b15aef2736b165435d88712c4efcfd04de0937876ed5895acf4f83546cd5895afb9566a99c772e36a5c9d9fabcb2208bf9bcefea2c2bd8da0f1b58593f54276a9d0f5b59ced38d380f7359cfd4a9baafaef2922df3629afeca3c9834d0e775ef2df5a2a81d34fdc4b5b8e95f47adf38877b5ce23e5de7ade01db34f3b22b6efa5d8a7dff70af36ea37b5cff7c4852da4bebdda61d36fdca8b5dff42af6cf979ed959a4f34ca762d76ea9f7405c54b23f71fd511019a99fae1acbef47623f8fb06a3f6f9be2322c13cef3fb16074999c8fab6d8f703cfe2a67f5be23295df839f6f6cfdfc81e72d09fdfce244dcd17ed29bd8e8fc625fecebc393b8b4257f8fb0c17612139f9fbafd74de4fd47efeb7bd3b11fb589de979ebe2e6bcb9b80aab94f363b675fb49bf1ec4468d85d8e791d4ee449d40cec38e3ad3f3b99e4eeeccef1fbaea524c92cf4da0eb1371652ba997fb65ea7196fdfaea44cdefa7c97d7f88e7398bddfb2cefdf58dcf4eb513c0a4772fffc7dcd8ae6fbb01037df87486c13fd3e3c889be7c5fdb1b1cf5321b656bf1715bbf0f5e0565d697ddcffbccc43fd9eeca9add653aa7d7debe222d4791c8947ee8fd7f9bc2269f67b57a762c46abfdf5c5ca6badf95d8ef077e1fcb9ff9aed8cda7bc3ffc3ccbaad0f5c1e2ff5ccb49102cf2e62a3e4fba6c890a23775db96b8cebcf932e7b835bce8e3071d9e9a77bce70877b3ce011732cf08467bc7c789f33bce20def2ebb8e0d97dcc416bef9eccf24e7b6d1c50e76b1877d1ca087bebb0e71b49cc400c738c129ce5cf61c1718e29273f5f51d339f441b014244885d36714ad181d16c4640db2789c8524e059588a9a2115dd198ae61e8c65db734a169939cd11dddd383cb3dd29c4a5aa04b4ff48c21bdd0a43e7be93e0dbdd21bbdbbdc7a7d0fb4419bb445ae72c92dd74edbd4a51ddaa53db76749fbd8a103ead1f4a3e7497d3aa4231ad0319dd0299df9733fec9171f76b5dd50603ea2de77eedbbabeddc3d87095e68bafcffbf265df6c2ed3bfce77e1f27eb39a5cb7f9fe4ff98f9bfbfaefc00c86f7cfc</data>
+ </image>
+ <image name="image1">
+ <data format="XPM.GZ" length="449">789c5dd0cf0a824010c7f1bb4fb1b837894a5048a247283a06d1e1b733b3d4a182fe1c227af766560b7510dcefc7c5456785db6dd7ae9865f7071e277274c4cd15fc3c9f5ffbc3ea9de565edf45ab8329f64f9d491db5c2f626baf6b3f4f63c99635eaa686252c9baa299bca522c4100c892ba9436a365e020812d83654c930ef53ad334b66809a1254ff4239644fa280c494f8a71401e08227d52a1382015dbd427483bfd5dcc0c19bd4b6d44661891d998f40efcc8a3fb46e63f0dfec467997d0195cb6726</data>
+ </image>
+ <image name="image2">
+ <data format="XPM.GZ" length="591">789c6dd04d0b823018c0f1fb3ec570378974a898441fa1e8184487672fba0e16941d22faeef5cc692ef7e061ff1f43b625313decb7344ec8bd83ee2ca93470a3b17ab4edf378dabc48c45714bf94f26841a225957477bd685cc377cd523b9806b380a22a00b3c12cb3929719a6c2acf28a573926c3841c38d814362500484ced52f759630a25b4509812b3b6638f341bab2ca8002ca40220a052f9deab56ca73f707a93c778a9b27eeb4df3cfaa0a21e067dd4a61fe3ed9d9aafe6ff0c9efdd404ee6682efe09bd3f9abbfd7e403068c8c08</data>
+ </image>
+ <image name="image3">
+ <data format="XPM.GZ" length="434">789c5dd04d0ac2301005e07d4e119a5d91d6428304f1088a4b415c4c6622baa882d6858877372fa5d274c862dec790bfbad487fd5697b57af6d45f59f3851eba9457d7bd8fa7cd47158dd571ad74532c545169d6bbfb2da037b137cb54888268c93a4b888ce85ad7b81691108989881103a2171fbc207ac473aa748a31a64a65d00d443498f13c92470b221929044a362122cfb08ce258b48c30c6262714e7c422329b82e47b3124a724536296f9ed879948fc7f76fe13dfb5fa01cc9062ba</data>
+ </image>
+ <image name="image4">
+ <data format="XPM.GZ" length="419">789cc590bd0ac2301080f73cc5916c41aca16806f1112a8e8238dc5d2a3a54c1d641c477b7179bf8f7007e64b8ef1b02778585f5aa025ba8b6c3eec0c07b3c830d97a6b96eb68b9bd26e0afd9b81d323a5c7c0b03c1d6b994d3f9b494494457de99d2f4583283222b2288952a09a82288aee22f1db4f6232ef0c0929c129516afc4a149efc35f180c9893379a1df1dbf2e719fab0784606704</data>
+ </image>
+ <image name="image5">
+ <data format="XPM.GZ" length="621">789c75d0414bc33014c0f17b3f45e8bb15d9da39c782ec23383c0ae2e1f525693298829b8731f6ddcdcb6b9ae9b4f490ffaf2149336fd4cbf3936ae6d5e188c7408a3c7eaac67cedf7a7d7b7cdb9aabbb5e277a1bafaaeaa678ad4f6e3ddf218e218daf470f69c9ada5613e78e1397d8e1929338c968ed1c274a124a7a4ebb5a3fc85296d3b9fb716527a9b5a4c9291b054942f93ae45c2dd2816f9e6b85bf14b0871b0524a4d127054466f1ac1929f9a88c136785fe076685e489cbba00c6422fe8cadc010c3b46b430ede69919d8a693c130b20f01ca797d64c7167c5981270710bafee33839d2eed7ed00948b9cfd73eb97c7ea1b79808d44</data>
+ </image>
+ <image name="image6">
+ <data format="XPM.GZ" length="305">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade65232345130345230563054d2e152d2534856f0cbcf4b05b195816c650330007113415c4b134b434b13b04a14804b4419086024542431511946d25c04c376026eaeb5e6020001a43bf5</data>
+ </image>
+ <image name="image7">
+ <data format="XPM.GZ" length="305">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade65232345130345230563054d2e152d2534856f0cbcf4b05b195816c650330007113415c4b134b434b13b04a1480534459194324112e0617498489218940c5f08aa0ebc23019c376fc6eaeb5e60200d5d93b89</data>
+ </image>
+ <image name="image8">
+ <data format="XPM.GZ" length="358">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade652323253b05430563054d2e152d2534856f0cbcf4b05b195816c650b630b430b63103711c44d4d4d4d4c05cbeae9e929eb6100901044162aa90c033069b82c4844391102946122605965986e659824541a21ab0c93069b822e8b6431aa5eb834c264655457a1eb4592c5e9df5a6b2e00611245be</data>
+ </image>
+ <image name="image9">
+ <data format="XPM.GZ" length="309">789cd3d7528808f055d0d2e72a2e492cc94c5648ce482c52d04a29cdcdad8c8eb5ade65232345330345430563054d2e152d2534856f0cbcf4b05b195816c650b630b430b63103711c44d4d4d4d4c05cbeaa1018498b2329884892903f9ca89ca7a50418858a2b27222484c19452c112c0611441153c62286a60ed33c2cf662731fba3f6aadb900b64e3d13</data>
+ </image>
+ <image name="image10">
+ <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758</data>
+ </image>
+</images>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/noatun-plugins/alsaplayer/Custom.cw b/noatun-plugins/alsaplayer/Custom.cw
new file mode 100644
index 0000000..d2e037b
--- /dev/null
+++ b/noatun-plugins/alsaplayer/Custom.cw
@@ -0,0 +1,20 @@
+<!DOCTYPE CW><CW>
+<customwidgets>
+ <customwidget>
+ <class>Seeker</class>
+ <header location="local">seeker.h</header>
+ <sizehint>
+ <width>64</width>
+ <height>22</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>7</hordata>
+ <verdata>5</verdata>
+ </sizepolicy>
+ <pixmap>
+ <data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758</data>
+ </pixmap>
+ </customwidget>
+</customwidgets>
+</CW>
diff --git a/noatun-plugins/alsaplayer/Makefile.am b/noatun-plugins/alsaplayer/Makefile.am
new file mode 100644
index 0000000..3b149f6
--- /dev/null
+++ b/noatun-plugins/alsaplayer/Makefile.am
@@ -0,0 +1,24 @@
+INCLUDES= $(all_includes)
+
+kde_module_LTLIBRARIES = noatunalsaplayer.la
+
+noatunalsaplayer_la_SOURCES = \
+ AlsaPlayer.ui \
+ alsaplayerui.cpp \
+ userinterface.cpp \
+ configmodule.cpp \
+ seeker.cpp
+
+noatunalsaplayer_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module
+
+noatunalsaplayer_la_LIBADD = -lnoatuncontrols -lnoatun
+
+noatunalsaplayer_la_METASOURCES = AUTO
+
+noinst_HEADERS = userinterface.h configmodule.h seeker.h
+
+noatun_DATA = alsaplayerui.plugin
+noatundir = $(kde_datadir)/noatun
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/alsaplayerui.pot
diff --git a/noatun-plugins/alsaplayer/alsaplayerui.cpp b/noatun-plugins/alsaplayer/alsaplayerui.cpp
new file mode 100644
index 0000000..1620b78
--- /dev/null
+++ b/noatun-plugins/alsaplayer/alsaplayerui.cpp
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+ *
+ * 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 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.
+ *
+ */
+
+#include "userinterface.h"
+#include <klocale.h>
+
+extern "C"
+{
+ Plugin * create_plugin()
+ {
+ KGlobal::locale()->insertCatalogue("alsaplayerui");
+ return new AlsaPlayer;
+ }
+}
+
+// vim:ts=2:sw=2:tw=78:noet
diff --git a/noatun-plugins/alsaplayer/alsaplayerui.plugin b/noatun-plugins/alsaplayer/alsaplayerui.plugin
new file mode 100644
index 0000000..49dce46
--- /dev/null
+++ b/noatun-plugins/alsaplayer/alsaplayerui.plugin
@@ -0,0 +1,84 @@
+Filename=noatunalsaplayer.la
+Author=Rik Hemsley
+Site=http://noatun.kde.org/plugins/alsaplayer/
+Email=rik@kde.org
+Type=userinterface
+License=Artistic
+Name=AlsaPlayer
+Name[af]=Alsa-speler
+Name[ar]=مشغل Alsa
+Name[cy]=ChwaraewrAlsa
+Name[eo]=Alsaludilo
+Name[fy]=Alsaspiler
+Name[hi]=अल्सा-प्लेयर
+Name[nb]=Alsaspiller
+Name[ne]=एल्साप्लेएर
+Name[nl]=Alsaspeler
+Name[nn]=Alsaspelar
+Name[nso]=Sbapadi sa Alsa
+Name[ro]=Redare Alsa
+Name[sv]=Alsaplayer
+Name[ta]=Alsa இயக்கி
+Name[tr]=Alsa Çalıcı
+Name[uz]=Alsa pleyer
+Name[uz@cyrillic]=Alsa плейер
+Name[xh]=Umdlali weAlsa
+Name[zh_CN]=Alsa 播放器
+Comment=AlsaPlayer UI clone
+Comment[af]=Alsa-speler Ui kloon
+Comment[az]=AlsaPlayer İA bənzəri
+Comment[bg]=Версия на графичния интерфейс на плеъра AlsaPlayer
+Comment[bs]=AlsaPlayer UI klon
+Comment[ca]=Clon de la interfície d'usuari per a l'AlsaPlayer
+Comment[cs]=Klon uživatelského rozhraní AlsaPlayer
+Comment[cy]=Clôn UI ChwaraewrAlsa
+Comment[da]=AlsaPlayer UI-klon
+Comment[de]=Benutzeroberfläche für AlsaPlayer
+Comment[el]=Κλώνος του περιβάλλοντος χρήσης AlsaPlayer
+Comment[eo]=Klono de Alsaludilo
+Comment[es]=Clon del reproductor AlsaPlayer
+Comment[et]=AlsaPlayeri kasutajaliides
+Comment[eu]=AlsaPlayer UI klona
+Comment[fa]=بدل دقیق واسط کاربر AlsaPlayer
+Comment[fi]=AlsaPlayer käyttöliittymäklooni
+Comment[fr]=Clone de l'interface AlsaPlayer
+Comment[fy]=Kloan fan AlsaSpiler UI
+Comment[gl]=Clone da interface de AlsaPlayer
+Comment[he]=תואם ממשק המשתמש של AlsaPlayer
+Comment[hi]=अल्सा-प्लेयर यूआई क्लोन
+Comment[hr]=AlsaPlayer UI klon
+Comment[hu]=AlsaPlayer-változat
+Comment[is]=AlsaPlayer eftirlíking
+Comment[it]=Clone UI di AlsaPlayer
+Comment[ja]=AlsaPlayer UI クローン
+Comment[ka]=AlsaPlayer UI კლონი
+Comment[kk]=AlsaPlayer интерфейсі
+Comment[km]=AlsaPlayer ក្លូន UI
+Comment[lt]=AlsaPlayer naudotojo sąsajos klonas
+Comment[mk]=Клон на AlsaPlayer
+Comment[ms]=Klon UI AlsaPlayer
+Comment[nb]=UI-klon for Alsa-spiller
+Comment[nds]=AlsaPlayer-Böversietkloon
+Comment[ne]=एल्साप्लेएर यूआई क्लोन
+Comment[nl]=Kloon van AlsaPlayer UI
+Comment[nn]=UI-klon av AlsaPlayer
+Comment[pl]=Klon interfejsu użytkownika dla AlsaPlayer
+Comment[pt]=Clone da interface do AlsaPlayer
+Comment[pt_BR]=Clone do AlsaPlayer
+Comment[ro]=Clonă interfaţă grafică "Redare Alsa"
+Comment[ru]=Интерфейс к AlsaPlayer
+Comment[sk]=Klon AlsaPlayer UI
+Comment[sl]=Klon uporabniškega vmensnika AlsaPlayer
+Comment[sr]=UI клон AlsaPlayer-а
+Comment[sr@Latn]=UI klon AlsaPlayer-a
+Comment[sv]=Kopia av Alsaplayer-gränssnitt
+Comment[ta]=Alsaஇயக்கி UI clone
+Comment[tg]=Интерфейси дигар ба AlsaPlayer
+Comment[tr]=AlsaPlayer arayüzü
+Comment[uk]=Дублікат зовнішнього інтерфейсу AlsaPlayer
+Comment[uz]=Alsa pleyer uchun grafik interfeys
+Comment[uz@cyrillic]=Alsa плейер учун график интерфейс
+Comment[vi]=Bộ nhái giao diện AlsaPlayer
+Comment[xh]=Umdlali weAlsa Indlela yokwenza into efana nenye ye UI
+Comment[zh_CN]=Alsa 播放器的界面复制品
+Comment[zh_TW]=AlsaPlayer 使用者介面
diff --git a/noatun-plugins/alsaplayer/configmodule.cpp b/noatun-plugins/alsaplayer/configmodule.cpp
new file mode 100644
index 0000000..07c5cfd
--- /dev/null
+++ b/noatun-plugins/alsaplayer/configmodule.cpp
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+ *
+ * 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 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.
+ *
+ */
+
+#include <klocale.h>
+#include <kglobal.h>
+#include <kconfig.h>
+
+#include <qcheckbox.h>
+#include <qlayout.h>
+
+#include "configmodule.h"
+
+AlsaPlayerConfigModule::AlsaPlayerConfigModule(QObject * parent)
+ :
+ CModule
+ (
+ i18n("AlsaPlayer"),
+ i18n("AlsaPlayer Interface Settings"),
+ "appearance",
+ parent
+ )
+{
+ scroll_ = new QCheckBox(i18n("Scroll song title"), this);
+
+ QVBoxLayout * layout = new QVBoxLayout(this);
+
+ layout->addWidget(scroll_);
+
+ layout->addStretch(100);
+
+ reopen();
+}
+
+ void
+AlsaPlayerConfigModule::save()
+{
+ KConfig * c(KGlobal::config());
+ c->setGroup("AlsaPlayerInterface");
+ c->writeEntry("ScrollTitle", scroll_->isChecked());
+ c->sync();
+ emit(saved());
+}
+
+ void
+AlsaPlayerConfigModule::reopen()
+{
+ KConfig * c(KGlobal::config());
+ c->setGroup("AlsaPlayerInterface");
+ scroll_->setChecked(c->readBoolEntry("ScrollTitle", true));
+}
+
+// vim:ts=2:sw=2:tw=78:noet
+#include "configmodule.moc"
diff --git a/noatun-plugins/alsaplayer/configmodule.h b/noatun-plugins/alsaplayer/configmodule.h
new file mode 100644
index 0000000..2104fdf
--- /dev/null
+++ b/noatun-plugins/alsaplayer/configmodule.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+ *
+ * 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 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.
+ *
+ */
+
+#ifndef ALSAPLAYER_CONFIG_MODULE_H
+#define ALSAPLAYER_CONFIG_MODULE_H
+
+#include <noatun/pref.h>
+
+class QCheckBox;
+
+class AlsaPlayerConfigModule : public CModule
+{
+ Q_OBJECT
+
+ public:
+
+ AlsaPlayerConfigModule(QObject *);
+
+ signals:
+
+ void saved();
+
+ public slots:
+
+ virtual void save();
+ virtual void reopen();
+
+ private:
+
+ QCheckBox * scroll_;
+};
+
+#endif // ALSAPLAYER_CONFIG_MODULE_H
+// vim:ts=2:sw=2:tw=78:noet
diff --git a/noatun-plugins/alsaplayer/seeker.cpp b/noatun-plugins/alsaplayer/seeker.cpp
new file mode 100644
index 0000000..6ffac8c
--- /dev/null
+++ b/noatun-plugins/alsaplayer/seeker.cpp
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+ *
+ * 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 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.
+ *
+ */
+
+#include <qtimer.h>
+
+#include <noatun/app.h>
+#include <noatun/player.h>
+#include "seeker.h"
+
+Seeker::Seeker(QWidget * parent, const char * name)
+ : L33tSlider(0, 1000, 10, 0, Horizontal, parent, name)
+{
+ connect(this, SIGNAL(userChanged(int)), SLOT(slotValueChanged(int)));
+
+ connect(napp->player(), SIGNAL(timeout()), SLOT(slotTimeout()));
+}
+
+Seeker::~Seeker()
+{
+}
+
+void Seeker::slotValueChanged(int i)
+{
+ napp->player()->skipTo((int)(i*1000));
+}
+
+void Seeker::slotTimeout()
+{
+ if(!napp->player()->current()) return;
+ if(currentlyPressed()) return;
+
+ setRange(0, (int)napp->player()->getLength() / 1000 );
+ setValue((int)napp->player()->getTime() / 1000 );
+}
+
+void Seeker::wheelEvent(QWheelEvent *)
+{
+ // ignore
+}
+
+// vim:ts=2:sw=2:tw=78:noet
+#include "seeker.moc"
diff --git a/noatun-plugins/alsaplayer/seeker.h b/noatun-plugins/alsaplayer/seeker.h
new file mode 100644
index 0000000..ec5504e
--- /dev/null
+++ b/noatun-plugins/alsaplayer/seeker.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+ *
+ * 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 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.
+ *
+ */
+
+#ifndef SEEKER_H
+#define SEEKER_H
+
+#include <noatun/controls.h>
+
+class Seeker : public L33tSlider
+{
+ Q_OBJECT
+
+ public:
+
+ Seeker(QWidget * parent, const char * name = 0);
+ virtual ~Seeker();
+
+ protected slots:
+
+ void slotValueChanged(int i);
+ void slotTimeout();
+
+ protected:
+
+ void wheelEvent(QWheelEvent *);
+
+ private:
+};
+
+#endif
+// vim:ts=2:sw=2:tw=78:noet
diff --git a/noatun-plugins/alsaplayer/userinterface.cpp b/noatun-plugins/alsaplayer/userinterface.cpp
new file mode 100644
index 0000000..1071736
--- /dev/null
+++ b/noatun-plugins/alsaplayer/userinterface.cpp
@@ -0,0 +1,339 @@
+/*
+ * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+ *
+ * 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 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.
+ *
+ */
+
+#include "seeker.h"
+#include "userinterface.h"
+#include <noatun/app.h>
+#include <noatun/player.h>
+#include <noatun/controls.h>
+#include <noatun/effects.h>
+#include <noatun/engine.h>
+
+#include <qtoolbutton.h>
+#include <qdragobject.h>
+#include <qlayout.h>
+#include <qtooltip.h>
+#include <qframe.h>
+
+#include <kstatusbar.h>
+#include <kpopupmenu.h>
+#include <kurldrag.h>
+#include <kglobal.h>
+#include <kconfig.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kurldrag.h>
+#include <noatun/playlist.h>
+#include <noatun/stdaction.h>
+
+#include <arts/artsmodules.h>
+#include <arts/reference.h>
+#include <arts/soundserver.h>
+#include <arts/kmedia2.h>
+
+#include "configmodule.h"
+
+AlsaPlayer::AlsaPlayer()
+ : APMainWindow (0, "AlsaPlayer"),
+ UserInterface (),
+ speed_ (100)
+{
+ connect
+ (
+ playlistButton,
+ SIGNAL(clicked()),
+ napp->player(),
+ SLOT(toggleListView())
+ );
+
+ connect
+ (
+ previousButton,
+ SIGNAL(clicked()),
+ napp->player(),
+ SLOT(back())
+ );
+
+ connect
+ (
+ nextButton,
+ SIGNAL(clicked()),
+ napp->player(),
+ SLOT(forward())
+ );
+
+ connect
+ (
+ stopButton,
+ SIGNAL(clicked()),
+ napp->player(),
+ SLOT(stop())
+ );
+
+ connect
+ (
+ playButton,
+ SIGNAL(clicked()),
+ napp->player(),
+ SLOT(playpause())
+ );
+
+ connect(napp, SIGNAL(hideYourself()), SLOT(hide()));
+ connect(napp, SIGNAL(showYourself()), SLOT(show()));
+
+ connect(napp->player(), SIGNAL(playlistShown()), SLOT(slotPlayListShown()));
+ connect(napp->player(), SIGNAL(playlistHidden()), SLOT(slotPlayListHidden()));
+ connect(napp->player(), SIGNAL(playing()), SLOT(slotPlaying()));
+ connect(napp->player(), SIGNAL(stopped()), SLOT(slotStopped()));
+ connect(napp->player(), SIGNAL(paused()), SLOT(slotPaused()));
+
+ connect(napp->player(), SIGNAL(timeout()), SLOT(slotTimeout()));
+ connect(napp->player(), SIGNAL(changed()), SLOT(slotTrackChanged()));
+
+ connect
+ (
+ napp->player(),
+ SIGNAL(volumeChanged(int)),
+ SLOT(slotVolumeChanged(int))
+ );
+
+ connect
+ (
+ new AlsaPlayerConfigModule(this),
+ SIGNAL(saved()),
+ SLOT(slotConfigChanged())
+ );
+
+ connect
+ (
+ volumeSlider,
+ SIGNAL(valueChanged(int)),
+ napp->player(),
+ SLOT(setVolume(int))
+ );
+
+ connect
+ (
+ forwardButton,
+ SIGNAL(clicked()),
+ SLOT(slotForward())
+ );
+
+ connect
+ (
+ pauseButton,
+ SIGNAL(clicked()),
+ SLOT(slotPause())
+ );
+
+ connect(speedSlider, SIGNAL(valueChanged(int)), SLOT(slotSetSpeed(int)));
+
+ menuButton->setPopup(NoatunStdAction::ContextMenu::contextMenu());
+
+ setIcon(BarIcon("noatun"));
+
+ napp->player()->handleButtons();
+
+ loadConfig();
+
+ resize(sizeHint().width(), minimumSizeHint().height());
+
+ show();
+}
+
+AlsaPlayer::~AlsaPlayer()
+{
+ // Empty.
+}
+
+void AlsaPlayer::closeEvent(QCloseEvent *)
+{
+ unload();
+}
+
+void AlsaPlayer::dragEnterEvent(QDragEnterEvent *event)
+{
+ event->accept(KURLDrag::canDecode(event));
+}
+
+void AlsaPlayer::dropEvent(QDropEvent *event)
+{
+ KURL::List uri;
+ if (KURLDrag::decode(event, uri))
+ {
+ for (KURL::List::Iterator i = uri.begin(); i != uri.end(); ++i)
+ napp->player()->openFile(*i, false);
+ }
+}
+
+void AlsaPlayer::setTitleText(const QString & s)
+{
+ QString titleText
+ (s.isNull() ? napp->player()->current().title() : s);
+
+ if (titleLabel->text() != titleText)
+ titleLabel->setText(titleText);
+}
+
+void AlsaPlayer::slotPlaying()
+{
+ setTitleText(QString::null);
+
+ playButton->setOn(true);
+ stopButton->setEnabled(true);
+}
+
+void AlsaPlayer::slotStopped()
+{
+ setTitleText(i18n("No File Loaded"));
+
+ stopButton->setEnabled(false);
+ playButton->setOn(false);
+}
+
+void AlsaPlayer::slotPaused()
+{
+ setTitleText(QString::null);
+
+ stopButton->setEnabled(true);
+ playButton->setOn(false);
+}
+
+bool AlsaPlayer::eventFilter(QObject *o, QEvent *e)
+{
+ switch (e->type())
+ {
+ case QEvent::MouseButtonPress:
+ mousePressEvent(static_cast<QMouseEvent *>(e));
+ break;
+
+ case QEvent::Wheel:
+ wheelEvent(static_cast<QWheelEvent*>(e));
+ return true;
+ break;
+
+ default:
+ break;
+ }
+
+ return QWidget::eventFilter(o, e);
+}
+
+void AlsaPlayer::slotPlayListShown()
+{
+ playlistButton->setOn(true);
+}
+
+void AlsaPlayer::slotPlayListHidden()
+{
+ playlistButton->setOn(false);
+}
+
+void AlsaPlayer::mousePressEvent(QMouseEvent * e)
+{
+ if (e->button() == RightButton)
+ {
+ NoatunStdAction::ContextMenu::showContextMenu();
+ return;
+ }
+
+ return QWidget::mousePressEvent(e);
+}
+
+void AlsaPlayer::wheelEvent(QWheelEvent * e)
+{
+ int newVolume = napp->player()->volume() + (e->delta() / 120);
+ napp->player()->setVolume(newVolume);
+}
+
+void AlsaPlayer::slotConfigChanged()
+{
+ loadConfig();
+}
+
+void AlsaPlayer::slotVolumeChanged(int i)
+{
+ QString text("%1%");
+ volumeLabel->setText(text.arg(i));
+ volumeSlider->setValue(i);
+}
+
+void AlsaPlayer::slotTimeout()
+{
+ // noatun bug: napp->player()->lengthString() will crash if there's
+ // no 'current track'.
+ if (!napp->player()->current())
+ return;
+
+ setTitleText(QString::null);
+
+ QString lengthText(napp->player()->lengthString());
+
+ if (timeLabel->text() != lengthText)
+ timeLabel->setText(lengthText);
+}
+
+void AlsaPlayer::loadConfig()
+{
+ // Empty.
+}
+
+void AlsaPlayer::slotRestart()
+{
+ napp->player()->skipTo(0);
+}
+
+void AlsaPlayer::slotTrackChanged()
+{
+ slotSetSpeed(speed_);
+}
+
+void AlsaPlayer::slotSetSpeed(int newSpeed)
+{
+ speed_ = newSpeed;
+
+ pauseButton->setEnabled(0 != speed_);
+ speedLabel->setText(QString("%1%").arg(speed_));
+
+ Arts::PlayObject playobject(napp->player()->engine()->playObject());
+ Arts::PitchablePlayObject pitchable = Arts::DynamicCast(playobject);
+
+ if (!pitchable.isNull())
+ {
+ float f = (float(speed_) / 100.f);
+ pitchable.speed(f);
+ }
+}
+
+void AlsaPlayer::slotPause()
+{
+ speedSlider->setValue(0);
+ pauseButton->setEnabled(false);
+}
+
+void AlsaPlayer::slotForward()
+{
+ speedSlider->setValue(100);
+}
+
+#include "userinterface.moc"
+// vim:ts=2:sw=2:tw=78:noet
diff --git a/noatun-plugins/alsaplayer/userinterface.h b/noatun-plugins/alsaplayer/userinterface.h
new file mode 100644
index 0000000..2a97b86
--- /dev/null
+++ b/noatun-plugins/alsaplayer/userinterface.h
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+ *
+ * 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 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.
+ *
+ */
+
+#ifndef USERINTERFACE_H
+#define USERINTERFACE_H
+
+#include <noatun/plugin.h>
+
+#include "AlsaPlayer.h"
+
+class Seeker;
+
+/**
+ * @short Main window class
+ * @author Rik Hemsley <rik@kde.org>
+ * @version 1.0
+ */
+class AlsaPlayer : public APMainWindow, public UserInterface
+{
+ Q_OBJECT
+
+ public:
+
+ AlsaPlayer();
+ virtual ~AlsaPlayer();
+
+ void load(const QString & url);
+
+ protected slots:
+
+ virtual void slotConfigChanged();
+
+ virtual void slotVolumeChanged(int);
+
+ virtual void slotPlaying();
+ virtual void slotStopped();
+ virtual void slotPaused();
+
+ virtual void slotPlayListShown();
+ virtual void slotPlayListHidden();
+
+ virtual void slotTimeout();
+
+ virtual void slotRestart();
+
+ virtual void slotTrackChanged();
+ virtual void slotSetSpeed(int);
+
+ virtual void slotPause();
+ virtual void slotForward();
+
+ protected:
+
+ virtual void mousePressEvent (QMouseEvent *);
+ virtual void dragEnterEvent (QDragEnterEvent *);
+ virtual void dropEvent (QDropEvent *);
+ virtual void closeEvent (QCloseEvent *);
+ virtual bool eventFilter (QObject *, QEvent *);
+ virtual void wheelEvent (QWheelEvent *);
+ virtual void setTitleText (const QString &);
+
+ void loadConfig();
+
+ private:
+
+ Seeker * seeker_;
+
+ int speed_;
+};
+
+#endif
+// vim:ts=2:sw=2:tw=78:noet
diff --git a/noatun-plugins/blurscope/Makefile.am b/noatun-plugins/blurscope/Makefile.am
new file mode 100644
index 0000000..6ac86b3
--- /dev/null
+++ b/noatun-plugins/blurscope/Makefile.am
@@ -0,0 +1,10 @@
+INCLUDES= $(all_includes) $(SDL_CFLAGS)
+
+kde_module_LTLIBRARIES = noatunblurscope.la
+noatunblurscope_la_SOURCES = sdlscope.cpp scopedisplayer.cpp
+noatunblurscope_la_LDFLAGS = -module -avoid-version -no-undefined $(all_libraries)
+noatunblurscope_la_LIBADD = $(LIB_KFILE) -lnoatun -lm $(SDL_LIBS)
+noatunblurscope_la_METASOURCES = AUTO
+
+noatun_DATA = blurscope.plugin
+noatundir = $(kde_datadir)/noatun
diff --git a/noatun-plugins/blurscope/blurscope.plugin b/noatun-plugins/blurscope/blurscope.plugin
new file mode 100644
index 0000000..9b50232
--- /dev/null
+++ b/noatun-plugins/blurscope/blurscope.plugin
@@ -0,0 +1,74 @@
+Filename=noatunblurscope.la
+Author=Charles Samuels
+Site=http://noatun.kde.org/
+Email=charles@kde.org
+Type=visualization
+License=BSD
+Name=Blurscope
+Name[da]=Blurskop
+Name[de]=Blurskop
+Name[eo]=Monoskopo
+Name[hi]=ब्लरस्कोप
+Name[ne]=ब्लरस्कोप
+Name[nn]=Skoddeskop
+Name[ru]=Зрительный образ Размытие
+Name[sv]=Blurskop
+Name[ta]=கறை செயற்பரப்பு
+Name[tg]=Рахна кардан
+Name[tr]=Buğulu Alan
+Name[vi]=Xem mờ
+Name[zh_CN]=模糊观测器
+Comment=A pretty, fading monoscope
+Comment[af]='n redelik, uitdoof monoskoop
+Comment[az]=Gözəl, feydləyən monoskop
+Comment[bg]=Хубавичък и шарен визуализатор
+Comment[bs]=Lijep fading monoscope
+Comment[ca]=Un bonic monoscopi per a desdibuixar
+Comment[cs]=Pěkný monoskop
+Comment[cy]=Monosgop del, gwanllyd
+Comment[da]=Et flot, henfaldende monoskop
+Comment[de]=Ein schönes, ausblendendes Monoskop
+Comment[el]=Ένα όμορφο, ομαλό καλειδοσκόπιο
+Comment[eo]=Okulplaĉa, stompanta monoskopo
+Comment[es]=Un bonito suavizado
+Comment[et]=Kena ja hägune Monoscope'ile tuginev ostsilloskoop
+Comment[eu]=Motelduz doan monoskopio polit bat
+Comment[fa]=monoscope محوشوندۀ زیبای
+Comment[fi]=Kaunis häviävä monoskooppi
+Comment[fr]=Un joli scope de fondus
+Comment[fy]=In fraaie, ferdizenjende monoskoop
+Comment[gl]=Un osciloscópio bonito e que se desvanece
+Comment[he]=מונוסקופ יפה שנמוג
+Comment[hi]=एक सुन्दर, मन्द होता मोनोस्कोप
+Comment[hr]=Lijep, pretapajući monoskop
+Comment[hu]=Elhalványuló monoszkóp
+Comment[is]=Falleg monoscope myndbrella
+Comment[ja]=感じの良いフェードするモノスコープ
+Comment[ka]=სიმპატიური ჩამოშლადი monoscope
+Comment[kk]=Көркем эффект моноскопы
+Comment[km]=ម៉ូណូស្កូប​លិច​បន្តិច​ម្ដងៗ​ដ៏ស្អាតអាត​
+Comment[lt]=Gražus, lėtai išnykstantis monoskopas
+Comment[mk]=Убав, избледувачки осцилоскоп
+Comment[ms]=Monoskop luntur dan cantik
+Comment[nb]=Et pent, hendøende monoskop
+Comment[nds]=En smuck, utblennen Monoskop
+Comment[ne]=एउटा राम्रो, फेडिङ मोनोस्कोप
+Comment[nl]=Een fraaie, vervagende monoscoop
+Comment[nn]=Eit pent, monoskop som tonar ut
+Comment[pl]=Ładny, gasnący monoskop
+Comment[pt]=Um osciloscópio bonito e que se desvanece
+Comment[pt_BR]=Um monoscópio
+Comment[ro]=Un monoscop cu estompare şi drăguţ
+Comment[ru]=Зрительный образ с эффектом размытия
+Comment[sk]=Pekný, blednucí monoskop
+Comment[sl]=Prijeten, pojemajoč monoscope
+Comment[sr]=Леп, бледећи моноскоп
+Comment[sr@Latn]=Lep, bledeći monoskop
+Comment[sv]=Snyggt, tonande monoskop
+Comment[ta]=அழகான ஒரே வண்ண நிறமாற்றம்
+Comment[tg]=Намуди тамошобин бо қувваи рахна
+Comment[tr]=Güzel, yok olan Monoskop
+Comment[uk]=Гарний, згасаючий моноскоп
+Comment[vi]=Xem mờ dần đẹp
+Comment[xh]=I monoscope ephelayo, entle
+Comment[zh_CN]=一个美观的能够逐渐淡出的单管观测器
diff --git a/noatun-plugins/blurscope/scopedisplayer.cpp b/noatun-plugins/blurscope/scopedisplayer.cpp
new file mode 100644
index 0000000..42b375a
--- /dev/null
+++ b/noatun-plugins/blurscope/scopedisplayer.cpp
@@ -0,0 +1,291 @@
+/*****************************************************************
+
+Copyright (c) 2001 Charles Samuels <charles@kde.org>
+ 2001 Neil Stevens <multivac@fcmail.com>
+ With code stolen from Paul Harrison <pfh@yoyo.cc.monash.edu.au>
+
+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 BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIAB\ILITY, 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.
+
+******************************************************************/
+
+#include "sdlscope.h"
+
+#if 0
+#define TEST() cout << "At line " << __LINE__ << endl
+#else
+#define TEST() if(0)
+#endif
+
+#define output ((unsigned char*)data)
+template <class Type>
+inline void Bitmap<Type>::addPixel(int x, int y, int br1, int br2)
+{
+ if (x < 0 || x >= width || y < 0 || y >= height) return;
+
+ register unsigned char *p = output+x*2+y*width*2;
+ if (p[0] < 255-br1) p[0] += br1; else p[0] = 255;
+ if (p[1] < 255-br2) p[1] += br2; else p[1] = 255;
+}
+
+template <class Type>
+void Bitmap<Type>::addVertLine(int x, int y1, int y2, int br1, int br2)
+{
+ if(y1 < y2)
+ {
+ for(int y = y1; y <= y2; y++)
+ addPixel(x,y, br1, br2);
+ }
+ else if(y2 < y1)
+ {
+ for(int y = y2; y <= y1; y++)
+ addPixel(x, y, br1, br2);
+ }
+ else
+ {
+ addPixel(x, y1, br1, br2);
+ }
+}
+
+template <class Type>
+void Bitmap<Type>::fadeStar()
+{
+ register unsigned long *ptr = (unsigned long*)output;
+ int i = width*height*2/4;
+ do
+ {
+ if (*ptr)
+ *ptr -= ((*ptr & 0xf0f0f0f0ul) >> 4) + ((*ptr & 0xe0e0e0e0ul) >> 5);
+ ptr++;
+ } while(--i > 0);
+}
+
+SDLView::SDLView(int in) : mFd(in), outputBmp(0), fullscreen(false)
+{
+ surface = 0;
+ width = 320;
+ height = width*6/8;
+ outputBmp.size(width, height);
+ TEST();
+
+ TEST();
+ fcntl(mFd, F_SETFL, fcntl(mFd, F_GETFL) & ~O_NONBLOCK);
+ TEST();
+
+
+ float *data = new float[width];
+ TEST();
+
+ startVideo();
+ setupPalette();
+ TEST();
+
+ while(true)
+ {
+ checkInput();
+
+ if(!surface) exit(0);
+
+ int bytestoread = width * sizeof(float);
+ int pos = 0;
+ while(pos < bytestoread)
+ {
+ char *d = (char *)data;
+ int r = read(mFd, d + pos, bytestoread - pos);
+ if(r > 0) pos += r;
+ else if (r==0) exit(0);
+ }
+
+ outputBmp.fadeStar();
+ outputBmp.fadeStar();
+
+ float *d = data;
+ float *end = data + width;
+ float heightHalf = height / 4.0;
+ int y = height / 2;
+ int x=0;
+ int oldy=(int)(*d * heightHalf);
+ while(d <= end)
+ {
+ int amp = (int)(*d * heightHalf);
+ amp+=y;
+
+ outputBmp.addVertLine(x, oldy, amp, 255, 255);
+ oldy=amp;
+
+ d++;
+ x++;
+ }
+ repaint();
+ }
+}
+
+static SDL_Surface *CreateScreen(Uint16 w, Uint16 h, Uint8 bpp, Uint32 flags)
+{
+ SDL_Surface *screen;
+
+ // Set the video mode
+ screen = SDL_SetVideoMode(w, h, bpp, flags);
+ return screen;
+}
+
+void SDLView::startVideo()
+{
+ if(surface)
+ {
+ SDL_FreeSurface(surface);
+ surface = 0;
+ }
+
+ Uint32 videoflags;
+
+ /* Initialize SDL */
+ if ( SDL_Init(SDL_INIT_VIDEO) < 0 )
+ exit(0);
+
+ SDL_WM_SetCaption("BlurScope","blurscope");
+
+ /* See if we try to get a hardware colormap */
+ videoflags = SDL_SWSURFACE | (fullscreen?SDL_FULLSCREEN:0);
+
+ surface = CreateScreen(width, height, 8, videoflags);
+ if (!surface)
+ exit(0);
+
+ SDL_ShowCursor(0);
+
+ if(!surface)
+ SDL_Quit();
+
+ SDL_WM_SetCaption("BlurScope", 0);
+ SDL_ShowCursor(0);
+
+}
+
+void SDLView::setupPalette(double)
+{
+#define BOUND(x) ((x) > 255 ? 255 : (x))
+#define PEAKIFY(x) int(BOUND((x) - (x)*(255-(x))/255/2))
+#define MAX(x,y) ((x) > (y) ? (x) : (y))
+
+ int redMax=136;
+ int greenMax=136;
+ int blueMax=255;
+
+ SDL_Color sdlPalette[256];
+
+ for(int i=0;i<256;i++)
+ {
+ // i
+ // 255 136
+ sdlPalette[i].r = i*redMax/255;
+ sdlPalette[i].g = i*greenMax/255;
+ sdlPalette[i].b = i*blueMax/255;
+ }
+
+ SDL_SetColors(surface, sdlPalette, 0, 256);
+
+#undef BOUND
+#undef PEAKIFY
+#undef MAX
+}
+
+void SDLView::checkInput()
+{
+ SDL_Event myEvent;
+
+ while(SDL_PollEvent(&myEvent))
+ {
+ switch(myEvent.type)
+ {
+ case SDL_KEYDOWN:
+ switch(myEvent.key.keysym.sym)
+ {
+ case SDLK_SPACE:
+// fullscreen ^= true;
+// startVideo();
+ break;
+ default:
+ break;
+ }
+ break;
+
+ case SDL_QUIT:
+ exit(0);
+ break;
+ }
+ }
+}
+
+#define output2 ((unsigned char*)outputBmp.data)
+
+void SDLView::repaint()
+{
+ SDL_LockSurface(surface);
+ TEST();
+
+ register unsigned long *ptr2 = (unsigned long*)output2;
+ unsigned long *ptr1 = (unsigned long*)( surface->pixels );
+ int i = width*height/4;
+ TEST();
+
+ do {
+ // Asger Alstrup Nielsen's (alstrup@diku.dk)
+ // optimized 32 bit screen loop
+ register unsigned int const r1 = *(ptr2++);
+ register unsigned int const r2 = *(ptr2++);
+
+ //if (r1 || r2) {
+#ifdef LITTLEENDIAN
+ register unsigned int const v =
+ ((r1 & 0x000000f0ul) >> 4)
+ | ((r1 & 0x0000f000ul) >> 8)
+ | ((r1 & 0x00f00000ul) >> 12)
+ | ((r1 & 0xf0000000ul) >> 16);
+ *(ptr1++) = v |
+ ( ((r2 & 0x000000f0ul) << 12)
+ | ((r2 & 0x0000f000ul) << 8)
+ | ((r2 & 0x00f00000ul) << 4)
+ | ((r2 & 0xf0000000ul)));
+#else
+ register unsigned int const v =
+ ((r2 & 0x000000f0ul) >> 4)
+ | ((r2 & 0x0000f000ul) >> 8)
+ | ((r2 & 0x00f00000ul) >> 12)
+ | ((r2 & 0xf0000000ul) >> 16);
+ *(ptr1++) = v |
+ ( ((r1 & 0x000000f0ul) << 12)
+ | ((r1 & 0x0000f000ul) << 8)
+ | ((r1 & 0x00f00000ul) << 4)
+ | ((r1 & 0xf0000000ul)));
+#endif
+ //} else ptr1++;
+ } while (--i);
+ TEST();
+
+ SDL_UnlockSurface(surface);
+ SDL_UpdateRect(surface, 0, 0, 0, 0);
+ TEST();
+
+}
+
+SDLView::~SDLView()
+{
+ ::close(mFd);
+}
+
+
diff --git a/noatun-plugins/blurscope/sdlscope.cpp b/noatun-plugins/blurscope/sdlscope.cpp
new file mode 100644
index 0000000..9485c1f
--- /dev/null
+++ b/noatun-plugins/blurscope/sdlscope.cpp
@@ -0,0 +1,78 @@
+/*****************************************************************
+
+Copyright (c) 2001 Charles Samuels <charles@kde.org>
+ 2001 Neil Stevens <multivac@fcmail.com>
+ With code stolen from Paul Harrison <pfh@yoyo.cc.monash.edu.au>
+
+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 BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIAB\ILITY, 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.
+******************************************************************/
+
+#include <sys/wait.h>
+#include <sys/types.h>
+
+#include "sdlscope.h"
+
+extern "C"
+{
+Plugin *create_plugin()
+{
+ return new SDLScope();
+}
+}
+
+SDLScope::SDLScope()
+ : MonoScope(50)
+ , Plugin()
+{
+ setSamples(320);
+}
+
+SDLScope::~SDLScope()
+{
+ ::close(mOutFd);
+ wait(0);
+}
+
+void SDLScope::init()
+{
+ int pipes[2];
+ ::pipe(pipes);
+ mOutFd=pipes[1];
+ if (!fork())
+ {
+ ::close(pipes[1]);
+ new SDLView(pipes[0]);
+ exit(0);
+ }
+ else
+ {
+ fcntl(mOutFd, F_SETFL, fcntl(mOutFd, F_GETFL) & ~O_NONBLOCK);
+ ::close(pipes[0]);
+ MonoScope::start();
+ }
+}
+
+void SDLScope::scopeEvent(float *d, int size)
+{
+ if (::write(mOutFd, (char *)d, size * sizeof(float))==-1)
+ {
+ MonoScope::stop();
+ unload();
+ }
+}
+
diff --git a/noatun-plugins/blurscope/sdlscope.h b/noatun-plugins/blurscope/sdlscope.h
new file mode 100644
index 0000000..45c734c
--- /dev/null
+++ b/noatun-plugins/blurscope/sdlscope.h
@@ -0,0 +1,110 @@
+/*****************************************************************
+
+Copyright (c) 2000-2001 the noatun authors. See file AUTHORS.
+
+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 BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIAB\ILITY, 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.
+
+******************************************************************/
+
+#ifndef SDLSCOPE_H
+#define SDLSCOPE_H
+
+#include <noatun/plugin.h>
+#include <string.h>
+
+extern "C"
+{
+#include <SDL.h>
+#include <fcntl.h>
+#include <unistd.h>
+}
+
+class SDLScope : public MonoScope, public Plugin
+{
+NOATUNPLUGIND
+
+public:
+ SDLScope();
+ virtual ~SDLScope();
+
+ void init();
+
+protected:
+ virtual void scopeEvent(float *data, int bands);
+
+private:
+ int mOutFd;
+};
+
+struct SDL_Surface;
+
+template<class Pixel> class Bitmap
+{
+public:
+ int width, height, extra;
+ Pixel *data;
+
+ Bitmap(int e=0) : extra(e), data(0) { }
+ ~Bitmap() { delete[] data; }
+
+ inline void addPixel(int x, int y, int bright1, int bright2);
+ void addVertLine(int x, int y, int y2, int br1, int br2);
+
+ void fadeStar();
+
+ void size(int w,int h)
+ {
+ delete[] data;
+ width = w;
+ height = h;
+ data = new Pixel[w*h+extra];
+ clear();
+ }
+
+ void clear()
+ {
+ memset(data,0,sizeof(Pixel)*(width*height+extra));
+ }
+};
+
+
+class SDLView
+{
+public:
+ SDLView(int in);
+ ~SDLView();
+
+protected:
+ void startVideo();
+ void checkInput();
+ void setupPalette(double dummy=0.0);
+
+ void repaint();
+
+private:
+ int mFd;
+
+ SDL_Surface *surface;
+ Bitmap<unsigned short> outputBmp;
+
+ bool fullscreen;
+ int width;
+ int height;
+};
+
+#endif
diff --git a/noatun-plugins/charlatan/Makefile.am b/noatun-plugins/charlatan/Makefile.am
new file mode 100644
index 0000000..0603703
--- /dev/null
+++ b/noatun-plugins/charlatan/Makefile.am
@@ -0,0 +1,23 @@
+INCLUDES= $(all_includes)
+
+kde_module_LTLIBRARIES = noatuncharlatan.la
+
+noatuncharlatan_la_SOURCES = \
+ charlatanui.cpp \
+ seeker.cpp \
+ userinterface.cpp \
+ configmodule.cpp
+
+noatuncharlatan_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module
+
+noatuncharlatan_la_LIBADD = -lnoatuncontrols -lnoatun
+
+noatuncharlatan_la_METASOURCES = AUTO
+
+noinst_HEADERS = userinterface.h configmodule.h seeker.h
+
+noatun_DATA = charlatanui.plugin
+noatundir = $(kde_datadir)/noatun
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/charlatanui.pot
diff --git a/noatun-plugins/charlatan/charlatanui.cpp b/noatun-plugins/charlatan/charlatanui.cpp
new file mode 100644
index 0000000..a2a9bec
--- /dev/null
+++ b/noatun-plugins/charlatan/charlatanui.cpp
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+ *
+ * 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 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.
+ *
+ */
+
+#include "userinterface.h"
+#include <klocale.h>
+
+extern "C"
+{
+ Plugin * create_plugin()
+ {
+ KGlobal::locale()->insertCatalogue("charlatanui");
+ return new Charlatan;
+ }
+}
+
+// vim:ts=2:sw=2:tw=78:noet
diff --git a/noatun-plugins/charlatan/charlatanui.plugin b/noatun-plugins/charlatan/charlatanui.plugin
new file mode 100644
index 0000000..254074d
--- /dev/null
+++ b/noatun-plugins/charlatan/charlatanui.plugin
@@ -0,0 +1,77 @@
+Filename=noatuncharlatan.la
+Author=Rik Hemsley
+Site=http://noatun.kde.org/plugins/charlatan/
+Email=rik@kde.org
+Type=userinterface
+License=Artistic
+Name=Charlatan
+Name[af]=Voorgewer
+Name[az]=Şarlatan
+Name[cs]=Šarlatán
+Name[eo]=Ĉarlatano
+Name[hi]=चार्लटन
+Name[hr]=Šarlatan
+Name[ne]=नक्कली
+Name[nn]=Sjarlatan
+Name[pl]=Szarlatan
+Name[pt_BR]=Charlatão
+Name[ro]=Şarlatan
+Name[ru]=Обманщик
+Name[ta]=சர்லதான்
+Name[tg]=Шарлатан
+Name[tr]=Şarlatan
+Name[uk]=Шарлатан
+Comment=The dead man's interface
+Comment[az]=Ölü adamın ara üzü
+Comment[bg]=Интерфейс за плеъра Noatun
+Comment[bs]=Interfejs mrtvog čovjeka
+Comment[ca]=Interfície per al penjat
+Comment[cs]=Rozhraní "mrtvého muže"
+Comment[cy]=Rhyngwyneb y marw
+Comment[da]=Den døde mands grænseflade
+Comment[de]=Schnittstelle eines toten Mannes
+Comment[el]=Το γραφικό περιβάλλον dead man
+Comment[eo]=La interfaco de la mortinta homo
+Comment[es]=La interfaz del ahorcado
+Comment[et]=Surnud mehe pale
+Comment[eu]=Hilda dagoen gizonaren interfazea
+Comment[fi]=Kuolleen miehen liittymä
+Comment[fr]=L'interface de l'homme mort
+Comment[fy]=Interface fan in deade man
+Comment[ga]=Comhéadan na marbh
+Comment[gl]=A interface do home morto
+Comment[hi]=द डीड मैन्स इंटरफेस
+Comment[hr]=Sučelje mrtve straže
+Comment[hu]=Egy haláli vizualizációs modul
+Comment[is]=Viðmót dauða mannsins
+Comment[it]=L'interfaccia per l'uomo duro
+Comment[ja]=dead man のインターフェース
+Comment[ka]=მკვდრის ინტერფეისი
+Comment[kk]=Charlatan интерфейсі
+Comment[km]=ចំណុច​ប្រទាក់​របស់ man ស្លាប់
+Comment[lt]=Mirusio žmogaus sąsaja
+Comment[mk]=Интерфејсот на мртвиот човек
+Comment[ms]=Antaramuka lelaki mati
+Comment[nb]=Død manns grensesnitt
+Comment[nds]=Koppelsteed vun den doden Mann
+Comment[ne]=मृत मानिसको इन्टरफेस
+Comment[nl]=Interface van een dode man
+Comment[nn]=Daudmannsgrensesnitt
+Comment[pl]=Motyw ascetyczny
+Comment[pt]=A interface do homem morto
+Comment[pt_BR]=Uma interface para homens sem saída
+Comment[ro]=Interfaţa "dead man"
+Comment[ru]=Интерфейс Обманщик
+Comment[sk]=Rozhranie dead man
+Comment[sl]=Vmesnik mrtvega človeka
+Comment[sr]=Интерфејс мртвог човека
+Comment[sr@Latn]=Interfejs mrtvog čoveka
+Comment[sv]=Död mans gränssnitt
+Comment[ta]=இறந்த மனிதனின் இடைமுகம்
+Comment[tg]=Интерфейси шарлатан
+Comment[tr]=Ölü adamın arabirimi
+Comment[uk]=Інтерфейс обманка
+Comment[vi]=Giao diện của người chết
+Comment[xh]=Ubuso bendoda ubujongeneyo
+Comment[zh_CN]=死人界面
+Comment[zh_TW]=The dead man 介面
diff --git a/noatun-plugins/charlatan/configmodule.cpp b/noatun-plugins/charlatan/configmodule.cpp
new file mode 100644
index 0000000..0b2e178
--- /dev/null
+++ b/noatun-plugins/charlatan/configmodule.cpp
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+ *
+ * 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 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.
+ *
+ */
+
+#include <klocale.h>
+#include <kglobal.h>
+#include <kconfig.h>
+
+#include <qcheckbox.h>
+#include <qlayout.h>
+
+#include "configmodule.h"
+#include "configmodule.moc"
+CharlatanConfigModule::CharlatanConfigModule(QObject * parent)
+ :
+ CModule
+ (
+ i18n("Charlatan"),
+ i18n("Charlatan Interface Settings"),
+ "appearance",
+ parent
+ )
+{
+ scroll_ = new QCheckBox(i18n("Scroll song title"), this);
+
+ QVBoxLayout * layout = new QVBoxLayout(this);
+
+ layout->addWidget(scroll_);
+
+ layout->addStretch(100);
+
+ reopen();
+}
+
+ void
+CharlatanConfigModule::save()
+{
+ KConfig * c(KGlobal::config());
+ c->setGroup("CharlatanInterface");
+ c->writeEntry("ScrollTitle", scroll_->isChecked());
+ c->sync();
+ emit(saved());
+}
+
+ void
+CharlatanConfigModule::reopen()
+{
+ KConfig * c(KGlobal::config());
+ c->setGroup("CharlatanInterface");
+ scroll_->setChecked(c->readBoolEntry("ScrollTitle", true));
+}
+
+// vim:ts=2:sw=2:tw=78:noet
diff --git a/noatun-plugins/charlatan/configmodule.h b/noatun-plugins/charlatan/configmodule.h
new file mode 100644
index 0000000..92b0bf7
--- /dev/null
+++ b/noatun-plugins/charlatan/configmodule.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+ *
+ * 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 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.
+ *
+ */
+
+#ifndef CHARLATAN_CONFIG_MODULE_H
+#define CHARLATAN_CONFIG_MODULE_H
+
+#include <noatun/pref.h>
+
+class QCheckBox;
+
+class CharlatanConfigModule : public CModule
+{
+ Q_OBJECT
+
+ public:
+
+ CharlatanConfigModule(QObject *);
+
+ signals:
+
+ void saved();
+
+ public slots:
+
+ virtual void save();
+ virtual void reopen();
+
+ private:
+
+ QCheckBox * scroll_;
+};
+
+#endif // CHARLATAN_CONFIG_MODULE_H
+// vim:ts=2:sw=2:tw=78:noet
diff --git a/noatun-plugins/charlatan/pixmaps.h b/noatun-plugins/charlatan/pixmaps.h
new file mode 100644
index 0000000..9235f9b
--- /dev/null
+++ b/noatun-plugins/charlatan/pixmaps.h
@@ -0,0 +1,612 @@
+/*
+ * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+ *
+ * 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 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.
+ *
+ */
+
+#ifndef __PIXMAP_H__
+#define __PIXMAP_H__
+
+static const char * const px_close[] = {
+"16 16 4 1",
+"o c black",
+"x c Gray50",
+". c white",
+" c None",
+" ",
+" oo oo ",
+" o.xo ox.o ",
+" ox.xo ox.xo ",
+" ox.xo ox.xo ",
+" ox.xoox.xo ",
+" ox.xx.xo ",
+" ox..xo ",
+" ox..xo ",
+" ox.xx.xo ",
+" ox.xoox.xo ",
+" ox.xo ox.xo ",
+" ox.xo ox.xo ",
+" o.xo ox.o ",
+" oo oo ",
+" "
+};
+
+static const char * const px_playlist[] = {
+"16 16 3 1",
+"o c black",
+". c white",
+" c None",
+" ",
+" ",
+" ooo ",
+" o . o ",
+" o . . o ",
+" o . . . o ",
+" o. . . .o ",
+" o . . . o ",
+" o . . o ",
+" o . ooo ",
+" ooo ooo ",
+" ooo ",
+" ooo ",
+" o ",
+" ",
+" "
+};
+
+static const char * const px_album[] = {
+"16 16 4 1",
+"o c black",
+"x c Gray50",
+". c White",
+" c None",
+" ",
+" ",
+" ",
+" oooooo ",
+" oo......oo ",
+" o..x....xxxo ",
+" o....xooxx...o ",
+"o.....o o.....o",
+"o.....o o.....o",
+" o...xxoox....o ",
+" oxxx....x..o ",
+" oo......oo ",
+" oooooo ",
+" ",
+" ",
+" "
+};
+
+static const char * const px_artist[] = {
+"16 16 4 1",
+"o c black",
+"x c Gray50",
+". c White",
+" c None",
+" oxxo ",
+" oxxo ",
+" oxxo ",
+" oxxo ",
+" oxxo ",
+" oxxo ",
+" oxxo ",
+" oxxo ",
+" oooo ",
+" oxxoo ",
+" o..xoo ",
+" o.xxoo ",
+" o.xxoo ",
+" oxxoo ",
+" o.xoo ",
+" oooo "
+};
+
+static const char * const px_track[] = {
+"16 16 4 1",
+"o c black",
+"x c Gray50",
+". c white",
+" c None",
+" ",
+" oo ",
+" ooxoo ",
+" oo..xoo ",
+" oox...xoo ",
+" oooox...oo ",
+" oo oox.oo ",
+" ooooo oooo ",
+" oo.xoo oo ",
+" oxoooo oo ",
+" ooooo ooooo ",
+" ooo oo.xoo ",
+" oxoooo ",
+" ooooo ",
+" ooo ",
+" "
+};
+
+static const char * const px_next[] = {
+"16 16 3 1",
+"o c black",
+". c white",
+" c None",
+" ",
+" ",
+" o o ",
+" o.o o o ",
+" o .o o.o ",
+" o. .o o o ",
+" o . .o o.o ",
+" o. . .o o o ",
+" o . . o o.o ",
+" o. . o o o ",
+" o . o o.o ",
+" o. o o o ",
+" o o o.o ",
+" o o ",
+" ",
+" "
+};
+
+static const char * const px_pause[] = {
+"16 16 3 1",
+"o c black",
+". c white",
+" c None",
+" ",
+" ",
+" oo oo ",
+" o. o o. o ",
+" o .o o .o ",
+" o. o o. o ",
+" o .o o .o ",
+" o. o o. o ",
+" o .o o .o ",
+" o. o o. o ",
+" o .o o .o ",
+" o. o o. o ",
+" o .o o .o ",
+" oo oo ",
+" ",
+" "
+};
+
+static const char * const px_play1[] = {
+"16 16 3 1",
+"o c black",
+". c white",
+" c None",
+" ",
+" ",
+" oo ",
+" o .oo ",
+" o. . oo ",
+" o . . .oo ",
+" o. . . . oo ",
+" o . . . . .o ",
+" o. . . . . o ",
+" o . . . .oo ",
+" o. . . oo ",
+" o . .oo ",
+" o. oo ",
+" oo ",
+" ",
+" "
+};
+
+static const char * const px_play2[] = {
+"16 16 3 1",
+"o c black",
+". c white",
+" c None",
+" ",
+" ",
+" ",
+" oo ",
+" o .oo ",
+" o. . oo ",
+" o . . .oo ",
+" o. . . . o ",
+" o . . . .o ",
+" o. . . oo ",
+" o . .oo ",
+" o. oo ",
+" oo ",
+" ",
+" ",
+" "
+};
+
+static const char * const px_play3[] = {
+"16 16 3 1",
+"o c black",
+". c white",
+" c None",
+" ",
+" ",
+" ",
+" ",
+" oo ",
+" o .oo ",
+" o. . oo ",
+" o . . .o ",
+" o. . . o ",
+" o . .oo ",
+" o. oo ",
+" oo ",
+" ",
+" ",
+" ",
+" "
+};
+
+static const char * const px_restart[] = {
+"16 16 3 1",
+"o c black",
+". c white",
+" c None",
+" ",
+" ",
+" o o ",
+" o.o o.o ",
+" o. o o. o ",
+" o. .oo. .o ",
+" o. . o. . o ",
+" o. . o. . .o ",
+" o . .o . . o ",
+" o . .o . .o ",
+" o . oo . o ",
+" o .o o .o ",
+" o o o o ",
+" o o ",
+" ",
+" "
+};
+
+static const char * const px_previous[] = {
+"16 16 3 1",
+"o c black",
+". c white",
+" c None",
+" ",
+" ",
+" o o ",
+" o o o.o ",
+" o.o o. o ",
+" o o o. .o ",
+" o.o o. . o ",
+" o o o. . .o ",
+" o.o o . . o ",
+" o o o . .o ",
+" o.o o . o ",
+" o o o .o ",
+" o.o o o ",
+" o o ",
+" ",
+" "
+};
+
+static const char * const px_stop[] = {
+"16 16 3 1",
+"o c black",
+". c white",
+" c None",
+" ",
+" ",
+" oooooooooo ",
+" o . . . . .o ",
+" o. . . . . o ",
+" o . . . . .o ",
+" o. . . . . o ",
+" o . . . . .o ",
+" o. . . . . o ",
+" o . . . . .o ",
+" o. . . . . o ",
+" o . . . . .o ",
+" o. . . . . o ",
+" oooooooooo ",
+" ",
+" "
+};
+
+static const char * const px_config[] = {
+"16 16 3 1",
+"o c black",
+". c white",
+" c None",
+" ",
+" ooo ",
+" o. o ",
+" o. o ",
+" oo o .o ",
+" o.oo . o ",
+" o . . . o ",
+" o . . . ooo ",
+" ooo . . . o ",
+" o . . . o ",
+" o . oo.o ",
+" o. o oo ",
+" o .o ",
+" o .o ",
+" ooo ",
+" "
+};
+
+static const char * const px_x[] = {
+"12 12 2 1",
+"o c black",
+" c None",
+" ",
+" o ",
+" ooo ",
+" ooooo ",
+" ooooo ",
+" ooooo ",
+" ooooo ",
+" ooooo ",
+" o oo ",
+" oo o ",
+" ooo ",
+" "
+};
+
+static const char * const px_plus[] = {
+"12 12 2 1",
+"o c black",
+" c None",
+" ",
+" oo ",
+" oo ",
+" oo ",
+" oo ",
+" oooooooooo ",
+" oooooooooo ",
+" oo ",
+" oo ",
+" oo ",
+" oo ",
+" "
+};
+
+static const char * const px_minus[] = {
+"12 12 2 1",
+"o c black",
+" c None",
+" ",
+" ",
+" ",
+" ",
+" ",
+" oooooooooo ",
+" oooooooooo ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
+
+static const char * const px_none[] = {
+"16 16 1 1",
+" c None",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
+
+static const char * const px_squelch[] = {
+"16 16 3 1",
+"o c black",
+". c white",
+" c None",
+" oo ",
+" o. o ",
+" o. .o ",
+" o. .o ",
+" o. .o o ",
+" o. .o o.o ",
+"o. .o o. .o ",
+" o. .o o. .o ",
+" o. .o o. .o ",
+" o. .o o. .o",
+" o .o o. .o ",
+" oo o. .o ",
+" o. .o ",
+" o. .o ",
+" o .o ",
+" oo "
+};
+
+
+static const char * const px_squelch_large[] = {
+"32 32 124 2",
+" c None",
+". c #090D11",
+"+ c #000000",
+"@ c #151B21",
+"# c #9AB9DD",
+"$ c #688BB5",
+"% c #0D1319",
+"& c #9DBCDE",
+"* c #CDE4FF",
+"= c #739CCA",
+"- c #06080B",
+"; c #20262B",
+"> c #A5C1E1",
+", c #AED3FF",
+"' c #789FCC",
+") c #181E23",
+"! c #C8D9EC",
+"~ c #C7E0FF",
+"{ c #6D98C8",
+"] c #10161C",
+"^ c #A3C0E0",
+"/ c #C7E1FF",
+"( c #6F99C8",
+"_ c #171D22",
+": c #95B6DB",
+"< c #A1CDFF",
+"[ c #6A96C7",
+"} c #191F24",
+"| c #B4CBE6",
+"1 c #BBDAFF",
+"2 c #B3CBE5",
+"3 c #719AC9",
+"4 c #C4DFFF",
+"5 c #79A0CC",
+"6 c #0F151B",
+"7 c #98B8DC",
+"8 c #759DCB",
+"9 c #111821",
+"0 c #05080A",
+"a c #0E1216",
+"b c #A6C2E1",
+"c c #D7E9FF",
+"d c #9AB9DC",
+"e c #131A23",
+"f c #BBD3EF",
+"g c #9AB6D5",
+"h c #06090C",
+"i c #111315",
+"j c #ACC3DD",
+"k c #C2DEFF",
+"l c #82ABDA",
+"m c #10171E",
+"n c #0E141A",
+"o c #B9CFE9",
+"p c #B5D7FF",
+"q c #6B94C2",
+"r c #0D1013",
+"s c #7DA1CA",
+"t c #9DCAFF",
+"u c #75A1D4",
+"v c #192026",
+"w c #92B5DD",
+"x c #81A4CB",
+"y c #9AC9FF",
+"z c #7BA5D5",
+"A c #8FB3DC",
+"B c #A5CEFF",
+"C c #6690C0",
+"D c #111417",
+"E c #80A4CB",
+"F c #77A2D4",
+"G c #7FA8D7",
+"H c #92C4FF",
+"I c #6590C0",
+"J c #101316",
+"K c #7EA2CA",
+"L c #9FCBFF",
+"M c #6F9DD2",
+"N c #161D24",
+"O c #A3C0E2",
+"P c #070A0D",
+"Q c #7299C5",
+"R c #86BEFF",
+"S c #040608",
+"T c #5F6469",
+"U c #A5CAF3",
+"V c #5E85B2",
+"W c #010202",
+"X c #27384B",
+"Y c #171717",
+"Z c #90A8C4",
+"` c #90C3FF",
+" . c #7DB1ED",
+".. c #1E2A39",
+"+. c #020203",
+"@. c #101010",
+"#. c #9EB3CC",
+"$. c #C0DDFF",
+"%. c #7FB2ED",
+"&. c #111111",
+"*. c #9FB3CC",
+"=. c #C3DFFF",
+"-. c #8DBAEF",
+";. c #262626",
+">. c #A3B7CE",
+",. c #A8D0FF",
+"'. c #81B3ED",
+"). c #1E1E1E",
+"!. c #A6B9D0",
+"~. c #A7D0FF",
+"{. c #010101",
+"]. c #96ACC7",
+"^. c #8BA4C1",
+"/. c #ABD1FF",
+"(. c #80B3ED",
+"_. c #070707",
+":. c #829DBD",
+"<. c #ADD3FF",
+"[. c #141414",
+"}. c #A5B9D0",
+"|. c #ABD2FF",
+"1. c #7EB1ED",
+"2. c #63788F",
+"3. c #5679A2",
+" . + ",
+" @ # $ + ",
+" % & * = - ",
+" ; > , ' . ",
+" ) ! ~ { . ",
+" ] ^ / ( . ",
+" _ : < [ . ",
+" } | 1 ( . ",
+" ] 2 * 3 . ",
+" ] > 4 5 . ",
+" 6 7 1 8 . 9 0 ",
+" a b c d . e f g h ",
+" i j k l m n o p q h ",
+" r s t u m v w , q h ",
+" r x y z m m A B C h ",
+" D E t F m m G H I h ",
+" J K L M m N O H I h ",
+" P Q R M S + T U R V W ",
+" h I X + Y Z ` ...+ ",
+" +.+ @.#.$.%...+ ",
+" &.*.=.-...+ ",
+" ;.>.,.'...+ ",
+" ).!.~. ...+ ",
+" {.].p ...+ ",
+" + ^./.(...+ ",
+" _.:.<.'...+ ",
+" [.}.|.1...+ ",
+" + 2.|. ...+ ",
+" + 3...+ ",
+" + + ",
+" ",
+" "
+};
+
+#endif
+
diff --git a/noatun-plugins/charlatan/seeker.cpp b/noatun-plugins/charlatan/seeker.cpp
new file mode 100644
index 0000000..4c07411
--- /dev/null
+++ b/noatun-plugins/charlatan/seeker.cpp
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+ *
+ * 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 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.
+ *
+ */
+
+#include <qtimer.h>
+
+#include <noatun/app.h>
+#include <noatun/player.h>
+#include "seeker.h"
+#include "seeker.moc"
+
+Seeker::Seeker(QWidget * parent)
+ : QSlider(0, 60, 10, 0, Horizontal, parent),
+ adjusting_(false)
+{
+ delayedUpdateTimer_ = new QTimer(this);
+
+ connect(this, SIGNAL(sliderPressed()), SLOT(slotSliderPressed()));
+ connect(this, SIGNAL(sliderReleased()), SLOT(slotSliderReleased()));
+ connect(this, SIGNAL(valueChanged(int)), SLOT(slotValueChanged(int)));
+
+ connect(napp->player(), SIGNAL(timeout()), SLOT(slotTimeout()));
+ connect(delayedUpdateTimer_, SIGNAL(timeout()), SLOT(slotDelayedUpdate()));
+}
+
+Seeker::~Seeker()
+{
+}
+
+ void
+Seeker::slotSliderPressed()
+{
+ adjusting_ = true;
+}
+
+ void
+Seeker::slotValueChanged(int)
+{
+ if (adjusting_)
+ delayedUpdateTimer_->start(100, true);
+}
+
+ void
+Seeker::slotDelayedUpdate()
+{
+ napp->player()->skipTo(value());
+}
+
+ void
+Seeker::slotSliderReleased()
+{
+ delayedUpdateTimer_->stop();
+ adjusting_ = false;
+ napp->player()->skipTo(value());
+}
+
+ void
+Seeker::wheelEvent(QWheelEvent *)
+{
+ // Ignore.
+}
+
+ void
+Seeker::slotTimeout()
+{
+ blockSignals(true);
+ {
+ delayedUpdateTimer_->stop();
+
+ int currentLength = int(napp->player()->getLength());
+ int currentTime = int(napp->player()->getTime());
+
+ if (currentLength != maxValue())
+ setMaxValue(currentLength);
+
+ if (!adjusting_)
+ {
+ if (currentTime != value())
+ setValue(currentTime);
+ }
+ }
+ blockSignals(false);
+ update();
+}
+
+// vim:ts=2:sw=2:tw=78:noet
diff --git a/noatun-plugins/charlatan/seeker.h b/noatun-plugins/charlatan/seeker.h
new file mode 100644
index 0000000..ff7af93
--- /dev/null
+++ b/noatun-plugins/charlatan/seeker.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+ *
+ * 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 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.
+ *
+ */
+
+#ifndef SEEKER_H
+#define SEEKER_H
+
+#include <qslider.h>
+
+class QTimer;
+
+class Seeker : public QSlider
+{
+ Q_OBJECT
+
+ public:
+
+ Seeker(QWidget * parent);
+ virtual ~Seeker();
+
+ protected slots:
+
+ void slotValueChanged(int i);
+ void slotSliderPressed();
+ void slotSliderReleased();
+ void slotDelayedUpdate();
+ void slotTimeout();
+
+ protected:
+
+ void wheelEvent(QWheelEvent *);
+
+ private:
+
+ bool adjusting_;
+ QTimer * delayedUpdateTimer_;
+};
+
+#endif
+// vim:ts=2:sw=2:tw=78:noet
diff --git a/noatun-plugins/charlatan/userinterface.cpp b/noatun-plugins/charlatan/userinterface.cpp
new file mode 100644
index 0000000..e15a686
--- /dev/null
+++ b/noatun-plugins/charlatan/userinterface.cpp
@@ -0,0 +1,408 @@
+/*
+ * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+ *
+ * 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 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.
+ *
+ */
+
+#include <noatun/scrollinglabel.h>
+#include "userinterface.h"
+#include <noatun/app.h>
+#include <noatun/player.h>
+#include <noatun/controls.h>
+#include <noatun/effects.h>
+
+#include <qaccel.h>
+#include <qtoolbutton.h>
+#include <qdragobject.h>
+#include <qlayout.h>
+#include <qtooltip.h>
+#include <qframe.h>
+#include <kurldrag.h>
+#include <kstatusbar.h>
+#include <kglobal.h>
+#include <kconfig.h>
+#include <klocale.h>
+#include <kurldrag.h>
+#include <kiconloader.h>
+#include <noatun/playlist.h>
+#include <noatun/stdaction.h>
+
+#include "configmodule.h"
+#include "pixmaps.h"
+#include "seeker.h"
+
+Charlatan::Charlatan()
+ : QWidget (0, "Charlatan"),
+ UserInterface (),
+ previousButton_ (0L),
+ stopButton_ (0L),
+ playButton_ (0L),
+ nextButton_ (0L),
+ playListToggleButton_ (0L),
+ restartButton_ (0L),
+ seekSlider_ (0L),
+ titleLabel_ (0L),
+ positionLabel_ (0L),
+ showingVolumeTimer_ (0L),
+ title_ ("c.h.a.r.l.a.t.a.n")
+{
+ setAcceptDrops(true);
+
+ showingVolumeTimer_ = new QTimer(this);
+
+ connect
+ (
+ showingVolumeTimer_,
+ SIGNAL(timeout()),
+ SLOT(slotStopShowingVolume())
+ );
+
+ playListToggleButton_ = new QToolButton(this);
+ previousButton_ = new QToolButton(this);
+ nextButton_ = new QToolButton(this);
+ stopButton_ = new QToolButton(this);
+ restartButton_ = new QToolButton(this);
+ playButton_ = new QToolButton(this);
+
+ seekSlider_ = new Seeker(this);
+ positionLabel_ = new QLabel(this);
+
+ titleLabel_ = new ScrollingLabel(i18n("No File Loaded"), this);
+
+ playListToggleButton_ ->setPixmap(QPixmap((const char **)px_playlist));
+ previousButton_ ->setPixmap(QPixmap((const char **)px_previous));
+ nextButton_ ->setPixmap(QPixmap((const char **)px_next));
+ stopButton_ ->setPixmap(QPixmap((const char **)px_stop));
+ restartButton_ ->setPixmap(QPixmap((const char **)px_restart));
+ playButton_ ->setPixmap(QPixmap((const char **)px_play1));
+
+ playListToggleButton_ ->setToggleButton(true);
+
+ QVBoxLayout * mainLayout = new QVBoxLayout(this);
+
+ mainLayout->addWidget(titleLabel_);
+
+ mainLayout->addSpacing(2);
+
+ QHBoxLayout * positionLayout = new QHBoxLayout(mainLayout);
+
+ positionLayout->addWidget(seekSlider_);
+ positionLayout->addSpacing(2);
+ positionLayout->addWidget(positionLabel_);
+
+ mainLayout->addSpacing(2);
+
+ QHBoxLayout * buttonLayout = new QHBoxLayout(mainLayout);
+
+ buttonLayout->addWidget(playListToggleButton_);
+ buttonLayout->addWidget(previousButton_);
+ buttonLayout->addWidget(nextButton_);
+ buttonLayout->addWidget(stopButton_);
+ buttonLayout->addWidget(restartButton_);
+ buttonLayout->addWidget(playButton_);
+
+ playListToggleButton_ ->installEventFilter(this);
+ previousButton_ ->installEventFilter(this);
+ nextButton_ ->installEventFilter(this);
+ stopButton_ ->installEventFilter(this);
+ restartButton_ ->installEventFilter(this);
+ playButton_ ->installEventFilter(this);
+ seekSlider_ ->installEventFilter(this);
+ positionLabel_ ->installEventFilter(this);
+ titleLabel_ ->installEventFilter(this);
+
+ connect
+ (
+ playListToggleButton_,
+ SIGNAL(clicked()),
+ napp->player(),
+ SLOT(toggleListView())
+ );
+
+ connect
+ (
+ previousButton_,
+ SIGNAL(clicked()),
+ napp->player(),
+ SLOT(back())
+ );
+
+ connect
+ (
+ nextButton_,
+ SIGNAL(clicked()),
+ napp->player(),
+ SLOT(forward())
+ );
+
+ connect
+ (
+ stopButton_,
+ SIGNAL(clicked()),
+ napp->player(),
+ SLOT(stop())
+ );
+
+ connect(restartButton_, SIGNAL(clicked()), SLOT(slotRestart()));
+
+ connect
+ (
+ playButton_,
+ SIGNAL(clicked()),
+ napp->player(),
+ SLOT(playpause())
+ );
+
+ connect(napp, SIGNAL(hideYourself()), SLOT(hide()));
+ connect(napp, SIGNAL(showYourself()), SLOT(show()));
+
+ connect(napp->player(), SIGNAL(playlistShown()), SLOT(slotPlayListShown()));
+ connect(napp->player(), SIGNAL(playlistHidden()), SLOT(slotPlayListHidden()));
+ connect(napp->player(), SIGNAL(playing()), SLOT(slotPlaying()));
+ connect(napp->player(), SIGNAL(stopped()), SLOT(slotStopped()));
+ connect(napp->player(), SIGNAL(paused()), SLOT(slotPaused()));
+
+ connect(napp->player(), SIGNAL(timeout()), SLOT(slotTimeout()));
+
+ connect
+ (
+ napp->player(),
+ SIGNAL(volumeChanged(int)),
+ SLOT(slotVolumeChanged(int))
+ );
+
+ connect
+ (
+ new CharlatanConfigModule(this),
+ SIGNAL(saved()),
+ SLOT(slotConfigChanged())
+ );
+
+ setCaption(i18n("Noatun"));
+ setIcon(BarIcon("noatun"));
+
+ napp->player()->handleButtons();
+
+ loadConfig();
+
+ // Using QAccel, because I don't want any strings associated or
+ // configurability.
+
+ QAccel * a = new QAccel(this, "Accelerators");
+
+ int accelPlay = a->insertItem(Key_Space);
+ int accelNext = a->insertItem(Key_H);
+ int accelPrev = a->insertItem(Key_L);
+ int accelStop = a->insertItem(Key_Escape);
+ int accelRstt = a->insertItem(Key_Return);
+ int accelQuit = a->insertItem(Key_Q);
+
+ a->connectItem(accelPlay, napp->player(), SLOT(playpause()));
+ a->connectItem(accelNext, napp->player(), SLOT(forward()));
+ a->connectItem(accelPrev, napp->player(), SLOT(back()));
+ a->connectItem(accelStop, napp->player(), SLOT(stop()));
+ a->connectItem(accelRstt, this, SLOT(slotRestart()));
+ a->connectItem(accelQuit, napp, SLOT(quit()));
+
+ show();
+
+ setTitleText();
+}
+
+Charlatan::~Charlatan()
+{
+ // Empty.
+}
+
+void Charlatan::closeEvent(QCloseEvent *)
+{
+ unload();
+}
+
+void Charlatan::dragEnterEvent(QDragEnterEvent *event)
+{
+ event->accept(KURLDrag::canDecode(event));
+}
+
+void Charlatan::dropEvent(QDropEvent *event)
+{
+ KURL::List uri;
+ if (KURLDrag::decode(event, uri))
+ {
+ for (KURL::List::Iterator i = uri.begin(); i != uri.end(); ++i)
+ napp->player()->openFile(*i, false);
+ }
+
+}
+
+void Charlatan::setTitleText(const QString & s)
+{
+ QString titleText;
+
+ if (!s.isNull())
+ {
+ titleText = s;
+ }
+ else
+ {
+ Player * player = napp->player();
+
+ if (0 == player)
+ {
+ qWarning("Noatun's player is null. WTF ?");
+ return;
+ }
+ else
+ {
+ PlaylistItem currentItem = player->current();
+
+ if (!!currentItem)
+ {
+ titleText = currentItem.title();
+ }
+ }
+ }
+
+ if (title_ != titleText)
+ {
+ showingVolumeTimer_->stop();
+ title_ = titleText;
+
+ if (!showingVolumeTimer_->isActive())
+ titleLabel_->setText(title_);
+ }
+}
+
+void Charlatan::slotPlaying()
+{
+ setTitleText();
+
+ playButton_->setOn(true);
+ stopButton_->setEnabled(true);
+ playButton_->setPixmap(QPixmap((const char **)px_pause));
+}
+
+void Charlatan::slotStopped()
+{
+ setTitleText(i18n("No File Loaded"));
+
+ stopButton_->setEnabled(false);
+ playButton_->setOn(false);
+ playButton_->setPixmap(QPixmap((const char **)px_play1));
+}
+
+void Charlatan::slotPaused()
+{
+ setTitleText();
+
+ stopButton_->setEnabled(true);
+ playButton_->setOn(false);
+ playButton_->setPixmap(QPixmap((const char **)px_play1));
+}
+
+bool Charlatan::eventFilter(QObject *o, QEvent *e)
+{
+ switch (e->type())
+ {
+ case QEvent::Wheel:
+ wheelEvent(static_cast<QWheelEvent*>(e));
+ return true;
+ break;
+
+ default:
+ break;
+ }
+
+ return QWidget::eventFilter(o, e);
+}
+
+void Charlatan::slotPlayListShown()
+{
+ playListToggleButton_->setOn(true);
+}
+
+void Charlatan::slotPlayListHidden()
+{
+ playListToggleButton_->setOn(false);
+}
+
+void Charlatan::mousePressEvent(QMouseEvent * e)
+{
+ if (e->button() == RightButton)
+ {
+ NoatunStdAction::ContextMenu::showContextMenu();
+ return;
+ }
+
+ return QWidget::mousePressEvent(e);
+}
+
+void Charlatan::wheelEvent(QWheelEvent * e)
+{
+ int newVolume = napp->player()->volume() + (e->delta() / 120) * 4;
+ napp->player()->setVolume(newVolume);
+}
+
+void Charlatan::slotConfigChanged()
+{
+ loadConfig();
+}
+
+void Charlatan::slotVolumeChanged(int i)
+{
+ QString message(i18n("Volume: %1").arg(i));
+
+ showingVolumeTimer_->start(2000, true);
+ titleLabel_->setText(message);
+}
+
+void Charlatan::slotStopShowingVolume()
+{
+ titleLabel_->setText(title_);
+}
+
+void Charlatan::slotTimeout()
+{
+ // noatun bug: napp->player()->lengthString() will crash if there's
+ // no 'current track'.
+ if (!napp->player()->current())
+ return;
+
+ setTitleText();
+
+ QString lengthText(napp->player()->lengthString());
+
+ if (positionLabel_->text() != lengthText)
+ positionLabel_->setText(lengthText);
+}
+
+void Charlatan::loadConfig()
+{
+ KConfig * c(KGlobal::config());
+ c->setGroup("CharlatanInterface");
+ titleLabel_->setScroll(c->readBoolEntry("ScrollTitle", true));
+}
+
+void Charlatan::slotRestart()
+{
+ napp->player()->skipTo(0);
+}
+
+#include "userinterface.moc"
+// vim:ts=2:sw=2:tw=78:noet
diff --git a/noatun-plugins/charlatan/userinterface.h b/noatun-plugins/charlatan/userinterface.h
new file mode 100644
index 0000000..c6a4e06
--- /dev/null
+++ b/noatun-plugins/charlatan/userinterface.h
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2001 Rik Hemsley (rikkus) <rik@kde.org>
+ *
+ * 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 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.
+ *
+ */
+
+#ifndef USERINTERFACE_H
+#define USERINTERFACE_H
+
+#include <noatun/plugin.h>
+
+class QToolButton;
+class ScrollingLabel;
+class Seeker;
+class QLabel;
+
+/**
+ * @short Main window class
+ * @author Rik Hemsley <rik@kde.org>
+ * @version 1.0
+ */
+class Charlatan : public QWidget, public UserInterface
+{
+ Q_OBJECT
+
+ public:
+
+ Charlatan();
+ virtual ~Charlatan();
+
+ void load(const QString & url);
+
+ protected slots:
+
+ virtual void slotConfigChanged();
+
+ virtual void slotVolumeChanged(int);
+
+ virtual void slotPlaying();
+ virtual void slotStopped();
+ virtual void slotPaused();
+
+ virtual void slotPlayListShown();
+ virtual void slotPlayListHidden();
+
+ virtual void slotTimeout();
+
+ virtual void slotRestart();
+
+ virtual void slotStopShowingVolume();
+
+ protected:
+
+ virtual void mousePressEvent (QMouseEvent *);
+ virtual void dragEnterEvent (QDragEnterEvent *);
+ virtual void dropEvent (QDropEvent *);
+ virtual void closeEvent (QCloseEvent *);
+ virtual bool eventFilter (QObject *, QEvent *);
+ virtual void wheelEvent (QWheelEvent *);
+ virtual void setTitleText (const QString & = QString::null);
+
+ void loadConfig();
+
+ private:
+
+ QToolButton * previousButton_;
+ QToolButton * stopButton_;
+ QToolButton * playButton_;
+ QToolButton * nextButton_;
+ QToolButton * playListToggleButton_;
+ QToolButton * restartButton_;
+
+ Seeker * seekSlider_;
+ ScrollingLabel * titleLabel_;
+
+ QLabel * positionLabel_;
+
+ QTimer * showingVolumeTimer_;
+ QString title_;
+};
+
+#endif
+// vim:ts=2:sw=2:tw=78:noet
diff --git a/noatun-plugins/configure.in.bot b/noatun-plugins/configure.in.bot
new file mode 100644
index 0000000..891f2f2
--- /dev/null
+++ b/noatun-plugins/configure.in.bot
@@ -0,0 +1,10 @@
+if test "x$NOATUN_SUBDIR" = "x"; then
+ echo ""
+ echo "You're missing the noatun header files, therefore"
+ echo "the noatun plugins cannot be compiled. If you want them,"
+ echo "you should install kdemultimedia first."
+ echo ""
+ all_tests=bad
+fi
+
+
diff --git a/noatun-plugins/configure.in.in b/noatun-plugins/configure.in.in
new file mode 100644
index 0000000..3043714
--- /dev/null
+++ b/noatun-plugins/configure.in.in
@@ -0,0 +1,203 @@
+# taken from SDL.m4
+# Sam Lantinga 9/21/99
+# stolen from Manish Singh
+# stolen back from Frank Belew
+# stolen from Manish Singh
+# Shamelessly stolen from Owen Taylor
+
+AM_CONDITIONAL(include_noatunplugin, test x$build_arts = xyes)
+
+dnl AM_PATH_SDL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS
+dnl
+AC_DEFUN([NOATUN_PATH_SDL],
+[
+dnl
+dnl Get the cflags and libraries from the sdl-config script
+dnl
+AC_ARG_WITH(sdl-prefix,[AC_HELP_STRING([--with-sdl-prefix=PFX],
+ [Prefix where SDL is installed (optional)])],
+ sdl_prefix="$withval", sdl_prefix="")
+AC_ARG_WITH(sdl-exec-prefix,[AC_HELP_STRING([--with-sdl-exec-prefix=PFX],
+ [Exec prefix where SDL is installed (optional)])],
+ sdl_exec_prefix="$withval", sdl_exec_prefix="")
+AC_ARG_ENABLE(sdltest, [AC_HELP_STRING([--disable-sdltest],
+ [Do not try to compile and run a test SDL program])],
+ , enable_sdltest=yes)
+
+ if test x$sdl_exec_prefix != x ; then
+ sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix"
+ if test x${SDL_CONFIG+set} != xset ; then
+ SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config
+ fi
+ fi
+ if test x$sdl_prefix != x ; then
+ sdl_args="$sdl_args --prefix=$sdl_prefix"
+ if test x${SDL_CONFIG+set} != xset ; then
+ SDL_CONFIG=$sdl_prefix/bin/sdl-config
+ fi
+ fi
+
+ AC_PATH_PROG(SDL_CONFIG, sdl-config, no)
+ min_sdl_version=ifelse([$1], ,0.11.0,$1)
+ AC_MSG_CHECKING(for SDL - version >= $min_sdl_version)
+ no_sdl=""
+ if test "$SDL_CONFIG" = "no" ; then
+ no_sdl=yes
+ else
+ SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags`
+ SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs | sed 's/[[^ ]]*-rpath[[^ ]]*//'`
+
+ sdl_major_version=`$SDL_CONFIG $sdl_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+ sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+ sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+ if test "x$enable_sdltest" = "xyes" ; then
+ ac_save_CFLAGS="$CFLAGS"
+ ac_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $SDL_CFLAGS"
+ LIBS="$LIBS $SDL_LIBS"
+dnl
+dnl Now check if the installed SDL is sufficiently new. (Also sanity
+dnl checks the results of sdl-config to some extent
+dnl
+ rm -f conf.sdltest
+ AC_TRY_RUN([
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "SDL.h"
+
+char*
+my_strdup (char *str)
+{
+ char *new_str;
+
+ if (str)
+ {
+ new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char));
+ strcpy (new_str, str);
+ }
+ else
+ new_str = NULL;
+
+ return new_str;
+}
+
+int main (int argc, char *argv[])
+{
+ int major, minor, micro;
+ char *tmp_version;
+
+ /* This hangs on some systems (?)
+ system ("touch conf.sdltest");
+ */
+ { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); }
+
+ /* HP/UX 9 (%@#!) writes to sscanf strings */
+ tmp_version = my_strdup("$min_sdl_version");
+ if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
+ printf("%s, bad version string\n", "$min_sdl_version");
+ exit(1);
+ }
+
+ if (($sdl_major_version > major) ||
+ (($sdl_major_version == major) && ($sdl_minor_version > minor)) ||
+ (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro)))
+ {
+ return 0;
+ }
+ else
+ {
+ printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version);
+ printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro);
+ printf("*** best to upgrade to the required version.\n");
+ printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n");
+ printf("*** to point to the correct copy of sdl-config, and remove the file\n");
+ printf("*** config.cache before re-running configure\n");
+ return 1;
+ }
+}
+
+],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ if test "x$no_sdl" = x ; then
+ AC_MSG_RESULT(yes)
+ ifelse([$2], , :, [$2])
+ else
+ AC_MSG_RESULT(no)
+ if test "$SDL_CONFIG" = "no" ; then
+ echo "*** The sdl-config script installed by SDL could not be found"
+ echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in"
+ echo "*** your path, or set the SDL_CONFIG environment variable to the"
+ echo "*** full path to sdl-config."
+ else
+ if test -f conf.sdltest ; then
+ :
+ else
+ echo "*** Could not run SDL test program, checking why..."
+ CFLAGS="$CFLAGS $SDL_CFLAGS"
+ LIBS="$LIBS $SDL_LIBS"
+ AC_TRY_LINK([
+#include <stdio.h>
+#include "SDL.h"
+], [ return 0; ],
+ [ echo "*** The test program compiled, but did not run. This usually means"
+ echo "*** that the run-time linker is not finding SDL or finding the wrong"
+ echo "*** version of SDL. If it is not finding SDL, you'll need to set your"
+ echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+ echo "*** to the installed location Also, make sure you have run ldconfig if that"
+ echo "*** is required on your system"
+ echo "***"
+ echo "*** If you have an old version installed, it is best to remove it, although"
+ echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"],
+ [ echo "*** The test program failed to compile or link. See the file config.log for the"
+ echo "*** exact error that occured. This usually means SDL was incorrectly installed"
+ echo "*** or that you have moved SDL since it was installed. In the latter case, you"
+ echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ SDL_CFLAGS=""
+ SDL_LIBS=""
+ ifelse([$3], , :, [$3])
+ fi
+ AC_SUBST(SDL_CFLAGS)
+ AC_SUBST(SDL_LIBS)
+ rm -f conf.sdltest
+])
+
+noatun_sdl=no
+dnl Check for SDL
+dnl require SDL 1.2 just because it's the new stable version, and it's what I have
+
+AC_ARG_WITH(sdl,
+ [AC_HELP_STRING([--with-sdl],[enable SDL Noatun plugins @<:@default=check@:>@])],
+ [], with_sdl=check)
+
+if test "x$with_sdl" != xno; then
+ NOATUN_PATH_SDL([1.2.0], [noatun_sdl=yes], [])
+
+ if test "x$with_sdl" != xcheck && test "x$noatun_sdl" != xyes; then
+ AC_MSG_ERROR([--with-sdl was given, but test for SDL failed])
+ fi
+fi
+
+AM_CONDITIONAL(include_SDL, test "$noatun_sdl" = yes)
+
+AC_CHECK_HEADERS(endian.h)
+
+NOATUN_SUBDIR=
+KDE_CHECK_HEADER(noatun/app.h, NOATUN_SUBDIR=noatun-plugins)
+
+if test -z "$NOATUN_SUBDIR"; then
+ dnl dir will only be compiled conditionally
+ DO_NOT_COMPILE="$DO_NOT_COMPILE noatun-plugins"
+fi
+
diff --git a/noatun-plugins/dub/AUTHORS b/noatun-plugins/dub/AUTHORS
new file mode 100644
index 0000000..debb2b3
--- /dev/null
+++ b/noatun-plugins/dub/AUTHORS
@@ -0,0 +1 @@
+Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr>
diff --git a/noatun-plugins/dub/BUGS b/noatun-plugins/dub/BUGS
new file mode 100644
index 0000000..345c920
--- /dev/null
+++ b/noatun-plugins/dub/BUGS
@@ -0,0 +1,8 @@
+open bugs:
+----------
+* closing dub window quits noatun
+* same crash from changing from SPL -> dub
+
+fixed:
+------
+* <mETz> changing from dub -> spl does not close the window
diff --git a/noatun-plugins/dub/COPYING b/noatun-plugins/dub/COPYING
new file mode 100644
index 0000000..37ba36f
--- /dev/null
+++ b/noatun-plugins/dub/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/noatun-plugins/dub/ChangeLog b/noatun-plugins/dub/ChangeLog
new file mode 100644
index 0000000..452cb3a
--- /dev/null
+++ b/noatun-plugins/dub/ChangeLog
@@ -0,0 +1,38 @@
+2003-03-02 Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr>
+ * fix: use a local copy of KFileItem taken from list view
+ Can't trust KDirOperator not to destruct it.
+
+2003-02-26 Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr>
+ * implement shuffle/linear sequencer
+ - use libc random number generator, and init seed with time()
+ * implement shuffle/recursive sequencer
+ - use a simple minded selection-randomizer in dir tree
+ * add a wrapper for libc random functions
+
+2003-02-24 Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr>
+ * implement Linear_Recursive sequencer
+ * disable unimplemented play options
+ * fix: open debugging early termination in playlist getFirst
+ * Recursive_Seq:
+ - code stabilized
+ - greatly simplify traversal code
+ - iterators suck (see DubInfo::past_begin)
+ - restart preorder traversal if finished
+ - add prev_preorder traversal
+ - fix: preorder traversal, there were a quite a few obscure bugs
+ - fix: remove code to skip from basic traversal class
+ - verbose debug logging
+
+2003-02-23 Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr>
+ * Recursive_Seq:
+ - fix: compare recursion root change too with canonical dirs
+ - fix: avoid reading parent directories. I incidentally had this
+ backwards, reading only parent dirs.
+ - implement preorder traversal (next only)
+ - debugging output
+ - partially fix iteration of dirs and files in recursive sequencer
+ - start writing preorder traversal
+ * fix: read config module options
+ * fix: show media home on startup / when changed
+ * remove obsolete file traversal functions
+ * comment out debug output in playlistitem
diff --git a/noatun-plugins/dub/INSTALL b/noatun-plugins/dub/INSTALL
new file mode 100644
index 0000000..02a4a07
--- /dev/null
+++ b/noatun-plugins/dub/INSTALL
@@ -0,0 +1,167 @@
+Basic Installation
+==================
+
+ These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+ The file `configure.in' is used to create `configure' by a program
+called `autoconf'. You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes a while. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 4. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. You can give `configure'
+initial values for variables by setting them in the environment. Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+ CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+ env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory. After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on. Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+ CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+ If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+ Use and save the results of the tests in FILE instead of
+ `./config.cache'. Set FILE to `/dev/null' to disable caching, for
+ debugging `configure'.
+
+`--help'
+ Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made.
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--version'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
+
diff --git a/noatun-plugins/dub/Makefile.am b/noatun-plugins/dub/Makefile.am
new file mode 100644
index 0000000..e7268ab
--- /dev/null
+++ b/noatun-plugins/dub/Makefile.am
@@ -0,0 +1,11 @@
+####### kdevelop will overwrite this part!!! (begin)##########
+
+SUBDIRS = dub
+
+EXTRA_DIST = dub.kdevprj AUTHORS COPYING ChangeLog INSTALL README TODO BUGS
+
+####### kdevelop will overwrite this part!!! (end)############
+# not a GNU package. You can remove this line, if
+# have all needed files, that a GNU package needs
+AUTOMAKE_OPTIONS = foreign
+
diff --git a/noatun-plugins/dub/NEWS b/noatun-plugins/dub/NEWS
new file mode 100644
index 0000000..500795c
--- /dev/null
+++ b/noatun-plugins/dub/NEWS
@@ -0,0 +1,35 @@
+dub-0.5
+-------
+
+Beta release. Two play modes: all files, single directory. Normal and
+shuffle play orders. Enjoy!
+
+
+dub-0.4
+-------
+
+Alpha release of dub. It includes two play modes: all files and single
+directory. Currently only normal (linear) ordering of files is supported.
+
+
+dub-0.3
+-------
+
+ Break DubApp into two classes
+ Read UI options
+ Fix: it's no use to return to first item in linear sequencer
+ if no next is found
+
+
+dub-0.2
+-------
+
+ Clean up cruft, remove unused doc class
+ Implement a noatun config module
+ Write some text docs
+
+
+dub-0.1
+-------
+
+ Play and Next working to some extent, eh :)
diff --git a/noatun-plugins/dub/README b/noatun-plugins/dub/README
new file mode 100644
index 0000000..f4cd6b4
--- /dev/null
+++ b/noatun-plugins/dub/README
@@ -0,0 +1,22 @@
+Dub Playlist
+------------
+
+A directory based playlist that's meant to be fast, simple and with the
+kind of functionality you'd expect from a digital player.
+
+Dub name was inspired from the continuous automated mix of digital music
+in Neuromancer. I'm not a Rasta but I still like that idea. As a tribute to
+William Gibson I decided to actually write such a program. That's where this
+code should be going! Read design.txt also.
+
+Author's note: Those who turn tail-recursive functions into iterations will
+be shot! GCC has tail-recursion optimization.
+
+Author's second note: Yes, I know other people have done things that an
+automated dj program could be based on. I'm still more interested in playing
+with a few clustering algorithms to get the result I want, I think deriving
+the features isn't the hard part. Any ideas welcome.
+
+__
+Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr>
+
diff --git a/noatun-plugins/dub/TODO b/noatun-plugins/dub/TODO
new file mode 100644
index 0000000..bb9cee1
--- /dev/null
+++ b/noatun-plugins/dub/TODO
@@ -0,0 +1,20 @@
+ToDo List for dub playlist
++-+-+-++-+-+-++-+-+-++-+-+
+
+Any help welcome!
+Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr
+
+
+For v1.0
+=-=-=-=-
+
+- Repeat
+- Single
+- UI/playlist order consistency
+- implement missing playlist APIs (only getAfter significant)
+
+Misc.
+=-=-=
+
+- Make sure the view has finished loading when querying a file
+- Drag'n'drop support for files and directories.
diff --git a/noatun-plugins/dub/configure.in.in b/noatun-plugins/dub/configure.in.in
new file mode 100644
index 0000000..d4179d6
--- /dev/null
+++ b/noatun-plugins/dub/configure.in.in
@@ -0,0 +1,4 @@
+#MIN_CONFIG
+
+AM_INIT_AUTOMAKE(dub,0.2)
+
diff --git a/noatun-plugins/dub/design.txt b/noatun-plugins/dub/design.txt
new file mode 100644
index 0000000..618c849
--- /dev/null
+++ b/noatun-plugins/dub/design.txt
@@ -0,0 +1,43 @@
+Design
+------
+
+Dub Playlist
+------------
+
+Dub considers the filesystem as its database. User specifies one or more
+directories as the directories in which dub will scan for all or particular
+media types.
+
+The scanning is initiated on demand, so that dub does not perform redundant
+disk access which is expensive.
+
+Design Goals
+------------
+
+v1.0
+----
+
+User interface:
+
+ * settings: select directories that contain media files.
+
+ * list/tree view to browse files: this should scan directories like a file
+manager would, consider re-using code from elsewhere
+
+ * add file: symlink to a directory as Njaard suggests
+
+v2.0
+----
+
+implement filters: directory-wise filtering of media types.
+
+implement database: for storing properties of media files, such as tags in
+mp3s so that alternative queries can be made.
+
+user interface: improved tree view that accesses the db to fetch info
+about files
+
+v3.0
+----
+
+music playing: implement an automated dj process.
diff --git a/noatun-plugins/dub/dub.kdevprj b/noatun-plugins/dub/dub.kdevprj
new file mode 100644
index 0000000..1f1d8b6
--- /dev/null
+++ b/noatun-plugins/dub/dub.kdevprj
@@ -0,0 +1,198 @@
+[AUTHORS]
+dist=true
+install=false
+install_location=
+type=DATA
+
+[BUGS]
+dist=true
+install=false
+install_location=
+type=DATA
+
+[COPYING]
+dist=true
+install=false
+install_location=
+type=DATA
+
+[ChangeLog]
+dist=true
+install=false
+install_location=
+type=DATA
+
+[Config for BinMakefileAm]
+addcxxflags=
+bin_program=dub
+cflags=
+cppflags=
+cxxflags=\s-O0 -g3 -Wall
+ldadd=\s-lkfile -lkdeui -lkdecore -lqt
+ldflags=\s \s
+
+[General]
+AMChanged=false
+author=Eray Ozkural (exa)
+configure_args=\s--build=i386-linux --host=i386-linux --target=i386-linux --prefix=/usr/local/kde3 --with-qt-dir=/usr/local/qt --enable-debug --disable-fast-perl --disable-rpath
+email=erayo@cs.bilkent.edu.tr
+kdevprj_version=1.3
+lfv_open_groups=Headers,Sources,User Interface
+make_options=\s-j1
+makefiles=Makefile.am,dub/Makefile.am
+modifyMakefiles=true
+project_name=Dub
+project_type=kde2_normal
+sgml_file=/home/exa/code/projects/kde/dub/doc/en/index.docbook
+short_info=Dub is a playlist plugin for noatun
+sub_dir=dub/
+version=0.1
+version_control=CVS
+workspace=1
+
+[INSTALL]
+dist=true
+install=false
+install_location=
+type=DATA
+
+[LFV Groups]
+GNU=AUTHORS,COPYING,ChangeLog,INSTALL,README,TODO,NEWS
+Headers=*.h,*.hh,*.hxx,*.hpp,*.H
+Others=*
+Sources=*.cpp,*.c,*.cc,*.C,*.cxx,*.ec,*.ecpp,*.lxx,*.l++,*.ll,*.l
+Translations=*.po
+User Interface=*.kdevdlg,*.ui,*.rc
+groups=Headers,Sources,User Interface,Translations,GNU,Others
+
+[Makefile.am]
+files=dub.kdevprj,AUTHORS,COPYING,ChangeLog,INSTALL,README,TODO,BUGS
+sub_dirs=dub
+type=normal
+
+[README]
+dist=true
+install=false
+install_location=
+type=DATA
+
+[TODO]
+dist=true
+install=false
+install_location=
+type=DATA
+
+[dub.kdevprj]
+dist=true
+install=false
+install_location=
+type=DATA
+
+[dub/BUGS]
+dist=true
+install=false
+install_location=
+type=DATA
+
+[dub/Makefile.am]
+files=dub/main.cpp,dub/dub.cpp,dub/dub.h,dub/dubdoc.cpp,dub/dubdoc.h,dub/dubview.cpp,dub/dubview.h,dub/dubui.rc,dub/dub.plugin,dub/fileselectorwidget.cpp,dub/fileselectorwidget.h,dub/dubplaylist.cpp,dub/dubplaylist.h,dub/dubplaylistitem.cpp,dub/dubplaylistitem.h,dub/BUGS,dub/dubprefs.ui
+sharedlib_LDFLAGS=
+sharedlib_rootname=noatundub
+sub_dirs=
+type=shared_library
+
+[dub/dub.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[dub/dub.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[dub/dub.plugin]
+dist=true
+install=false
+install_location=
+type=DATA
+
+[dub/dubdoc.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[dub/dubdoc.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[dub/dubplaylist.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[dub/dubplaylist.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[dub/dubplaylistitem.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[dub/dubplaylistitem.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[dub/dubprefs.ui]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[dub/dubui.rc]
+dist=true
+install=false
+install_location=
+type=DATA
+
+[dub/dubview.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[dub/dubview.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[dub/fileselectorwidget.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[dub/fileselectorwidget.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[dub/main.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
diff --git a/noatun-plugins/dub/dub/Makefile.am b/noatun-plugins/dub/dub/Makefile.am
new file mode 100644
index 0000000..f49684c
--- /dev/null
+++ b/noatun-plugins/dub/dub/Makefile.am
@@ -0,0 +1,20 @@
+kde_module_LTLIBRARIES = noatundub.la
+
+INCLUDES = $(all_includes)
+
+noatundub_la_SOURCES = dubprefs.ui dubplaylistitem.cpp dubplaylist.cpp \
+fileselectorwidget.cpp dubview.cpp dubapp.cpp dub.cpp dubconfigmodule.cpp
+
+EXTRA_DIST = dubui.rc dub.plugin BUGS \
+ dub.h dubdoc.h dubview.h fileselectorwidget.h dubplaylist.h dubplaylistitem.h
+
+noatundub_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+noatundub_la_LIBADD = $(LIB_KIO) -lnoatun
+
+noatun_DATA = dub.plugin
+noatundir = $(kde_datadir)/noatun
+
+METASOURCES = AUTO
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/dub.pot
diff --git a/noatun-plugins/dub/dub/dub.cpp b/noatun-plugins/dub/dub/dub.cpp
new file mode 100644
index 0000000..4faf221
--- /dev/null
+++ b/noatun-plugins/dub/dub/dub.cpp
@@ -0,0 +1,641 @@
+/***************************************************************************
+ dub.cpp - description
+ -------------------
+ begin : Tue Oct 23 01:44:51 EEST 2001
+ copyright : (C) 2001 by Eray Ozkural (exa)
+ email : erayo@cs.bilkent.edu.tr
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+// include files for QT
+#include <qdir.h>
+#include <qprinter.h>
+#include <qpainter.h>
+
+// include files for KDE
+#include <kiconloader.h>
+#include <kdebug.h>
+#include <kfiledialog.h>
+#include <kmenubar.h>
+#include <kstatusbar.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kstdaction.h>
+#include <kurl.h>
+#include <kurlrequester.h>
+#include <noatun/playlist.h>
+
+#include <vector>
+#include <algorithm>
+using std::vector;
+using std::iterator;
+
+// application specific includes
+#include "dub.h"
+#include "dub.moc"
+#include "dubview.h"
+#include "dubplaylist.h"
+#include "dubprefs.h"
+#include "dubconfigmodule.h"
+
+#include "random.h"
+int Random::seed;
+
+#define ID_STATUS_MSG 1
+
+Dub::Dub(DubPlaylist* plist)
+ : DubApp(0)
+ , playlist(*plist)
+ , dubconfig(*plist->dubconfig)
+ , activeFile(0)
+ , linear_onedir(this)
+ , linear_recursive(this)
+ , shuffle_onedir(this)
+ , shuffle_recursive(this)
+{
+ connect( view->dirOperator(),
+ SIGNAL(fileSelected(const KFileItem*)),
+ this,
+ SLOT(fileSelected(const KFileItem*)) );
+ connect( dubconfig.prefs->mediaDirectory,
+ SIGNAL( urlSelected (const QString &) ),
+ this,
+ SLOT( mediaHomeSelected (const QString &) ) );
+ connect( this,
+ SIGNAL(setMediaHome(KURL)),
+ view,
+ SLOT(setDir(KURL)) );
+ configure_sequencing();
+ emit setMediaHome(dubconfig.mediaDirectory);
+}
+
+/** File selected */
+void Dub::fileSelected(const KFileItem * file) {
+ kdDebug(90010) << "dub: file selected " << file << endl;
+ activeFile = const_cast<KFileItem *>(file);
+ playlist.setCurrent(file, true);
+}
+
+void Dub::mediaHomeSelected(const QString& url) {
+ kdDebug(90010) << "media home selected:" << endl;
+ emit setMediaHome( KURL(url) );
+}
+
+/** changes the active file to the next item
+ */
+void Dub::selectNextFile() {
+ configure_sequencing();
+ sequencer->next();
+}
+
+/** No descriptions */
+KFileItem* Dub::queryRoot() {
+ return view->dirLister()->rootItem();
+}
+
+/** First file in the directory */
+const KFileItem* Dub::queryFirstFile() {
+ return sequencer->first();
+}
+
+/** Select previous file */
+void Dub::selectPreviousFile() {
+ configure_sequencing();
+ sequencer->prev();
+}
+
+void Dub::configure_sequencing()
+{
+ switch (dubconfig.playMode) {
+ case DubConfigModule::allFiles:
+ if (dubconfig.playOrder==DubConfigModule::normal) {
+ linear_recursive.init(dubconfig.mediaDirectory);
+ sequencer = &linear_recursive;
+ }
+ else if (dubconfig.playOrder==DubConfigModule::shuffle) {
+ shuffle_recursive.init(dubconfig.mediaDirectory);
+ sequencer = &shuffle_recursive;
+ }
+ break;
+ case DubConfigModule::recursiveDir:
+ linear_recursive.init(view->currentDirectory().path());
+ sequencer = &linear_recursive;
+ break;
+ case DubConfigModule::oneDir:
+ if (dubconfig.playOrder==DubConfigModule::normal)
+ sequencer = &linear_onedir;
+ else if (dubconfig.playOrder==DubConfigModule::shuffle) {
+ shuffle_onedir.init(view->currentDirectory().path());
+ sequencer = &shuffle_onedir;
+ }
+ break;
+ }
+}
+
+void Dub::Sequencer::set_file(KFileItem** file, KFileItem* val) {
+ assert(val);
+ if (*file)
+ delete *file;
+ *file = new KFileItem(*val);
+ kdDebug(90010) << "set_file to " << val->url() << endl;
+}
+
+KFileItem* Dub::Linear_Seq::first(QPtrList<KFileItem> & items)
+{
+ // find first file
+ KFileItem* firstFile = 0;
+ for (KFileItem* item = items.first(); item; item = items.next() ) {
+ if (item->isFile()) {
+ firstFile = item;
+ break;
+ }
+ }
+ return firstFile;
+}
+
+KFileItem* Dub::Linear_Seq::last(QPtrList<KFileItem> & items)
+{
+ // find last file
+ KFileItem* lastFile = 0;
+ for (KFileItem* item = items.last(); item; item = items.prev() ) {
+ if (item->isFile()) {
+ lastFile = item;
+ break;
+ }
+ }
+ return lastFile;
+}
+
+bool Dub::Linear_Seq::find(QPtrList<KFileItem> & items, KFileItem* a_file)
+{
+ // find file
+ for (KFileItem *file=items.first(); file; file=items.next() )
+ if (file->isFile() && file->cmp(*a_file)) {
+ kdDebug(90010) << " found " << (file->url()) << endl;
+ return true;
+ }
+ return false;
+}
+
+KFileItem* Dub::Linear_Seq::next(QPtrList<KFileItem> & items,
+ KFileItem** active_file)
+{
+ KFileItem* ret = 0;
+ assert(active_file);
+ bool found = false;
+ if (*active_file) {
+ if (find(items, *active_file)) {
+ KFileItem* next = items.next();
+ for (; next && !next->isFile(); next = items.next()) ; // find next file
+ if (next && next->isFile())
+ set_file(active_file, next);
+ found = true;
+ ret = next;
+ }
+ }
+ if (!found) { // try to get the first one then
+ KFileItem *fst = first(items);
+ if (fst) {
+ set_file(active_file, fst);
+ ret = fst;
+ }
+ }
+ return ret;
+}
+
+KFileItem* Dub::Linear_Seq::prev(QPtrList<KFileItem> & items,
+ KFileItem** active_file)
+{
+ KFileItem* ret = 0;
+ assert(active_file);
+ bool found = false;
+ if (*active_file) {
+ // locate current item
+ if (find(items, *active_file)) {
+ KFileItem* prev = items.prev();
+ for (; prev && !prev->isFile(); prev = items.prev()) ; // find prev file
+ if (prev && prev->isFile()) {
+ set_file(active_file, prev);
+ found = true;
+ ret = prev;
+ }
+ }
+ }
+ if (!found) { // try to get the last one then
+ KFileItem *lst = last(items);
+ if (lst) {
+ set_file(active_file, lst);
+ ret = lst;
+ }
+ }
+ return ret;
+}
+
+KFileItem* Dub::Linear_OneDir::first()
+{
+ KFileItem* first = Linear_Seq::first(dub.view->items());
+ if (first)
+ set_file(&first_file, first);
+ else {
+ if (first_file) { // invalidate first
+ delete first_file;
+ first_file = 0;
+ }
+ }
+ return first_file;
+}
+
+//KFileItem* Dub::Linear_OneDir::getAfter(KFileItem* item)
+//{
+
+//}
+
+void Dub::Linear_OneDir::next()
+{
+ KFileItem *f = Linear_Seq::next(dub.view->items(), &dub.activeFile);
+ if (f) {
+ dub.view->selectFile(f);
+ }
+}
+
+void Dub::Linear_OneDir::prev()
+{
+ KFileItem *f = Linear_Seq::prev(dub.view->items(), &dub.activeFile);
+ if (f) {
+ dub.view->selectFile(f);
+ }
+}
+
+Dub::Dir_Node::Dir_Node(QString d, bool forward)
+ : dir(d), past_begin(false)
+{
+ kdDebug(90010) << "cons dir node " << d << endl;
+ // process entry list, form a list of subdirs and normal files
+ file_items.setAutoDelete(true);
+ QDir dir_obj(dir);
+ QFileInfoList* entries =
+ const_cast<QFileInfoList*>(dir_obj.entryInfoList());
+ for ( QFileInfo *file = entries->first(); file; file = entries->next() ) {
+ if (file->isDir() && file->absFilePath().length()>d.length()) {
+ kdDebug(90010) << "dub: dir " << file->absFilePath() << endl;
+ subdirs.append(file->absFilePath());
+ }
+ if (file->isFile()) {
+ // price for portability
+ kdDebug(90010) << "dub: file " << file->absFilePath() << endl;
+ KFileItem* item = new KFileItem(KFileItem::Unknown, KFileItem::Unknown,
+ file->absFilePath(), true);
+ file_items.append(item);
+ }
+ } // for
+
+ init_traversal(forward);
+
+ kdDebug(90010) << "dir node cons end" << endl;
+}
+
+void Dub::Dir_Node::init_traversal(bool forward)
+{
+ kdDebug(90010) << "init traversal" << endl;
+ // initialize traversal information
+ if (forward) {
+ current_subdir = subdirs.begin();
+ file_items.first();
+ }
+ else {
+ current_subdir = subdirs.end();
+ if (current_subdir!=subdirs.begin())
+ current_subdir--; // last item
+ else
+ past_begin=true;
+ file_items.last();
+ }
+ current_file = file_items.current();
+ kdDebug(90010) << "current subdir " << *current_subdir << endl;
+ kdDebug(90010) << "current file " << current_file << endl;
+}
+
+Dub::Recursive_Seq::Recursive_Seq()
+{
+ play_stack.setAutoDelete(true);
+}
+
+void Dub::Recursive_Seq::init(const KURL & root)
+{
+ QString new_root = canonical_path(root.path());
+ if (recursion_root != new_root) {
+ // change recursion stack
+ recursion_root = new_root;
+ kdDebug(90010) << "rec: new root is " << recursion_root << endl;
+ play_stack.clear();
+ push_dir(recursion_root); // start pre-order traversal
+ }
+}
+
+// get canonical path, we need this
+QString Dub::Recursive_Seq::canonical_path(QString dir)
+{
+// kdDebug(90010) << "canonical_path " << dir << endl;
+ //assert(dir.isLocalFile());
+ QDir path(dir);
+ return path.canonicalPath();
+}
+
+// check if dir is contained in the stack
+bool Dub::Recursive_Seq::check_dir(QString dir)
+{
+ kdDebug(90010) << "check_dir " << dir << endl;
+ bool found = false;
+ for ( Dir_Node *cur_dir = play_stack.first();
+ !found && cur_dir; cur_dir = play_stack.next() ) {
+ if (cur_dir->dir==dir)
+ found = true;
+ }
+ return found;
+}
+
+bool Dub::Recursive_Seq::push_dir(QString dir, bool forward)
+{
+ kdDebug(90010) << "push_dir " << dir << ", forward?" << forward << endl;
+ QString cpath = canonical_path(dir);
+ if (check_dir(cpath)) // is it in stack?
+ return false; // avoid infinite recursion
+ else {
+ Dir_Node* node = new Dir_Node(cpath, forward);
+ play_stack.append(node);
+ kdDebug(90010) << "stack after push:" << endl;
+ print_stack();
+ return true;
+ }
+}
+
+bool Dub::Recursive_Seq::pop_dir()
+{
+ assert(!play_stack.isEmpty());
+ kdDebug(90010) << "pop_dir" << endl;
+ play_stack.removeLast();
+ return !play_stack.isEmpty();
+}
+
+bool Dub::Recursive_Seq::advance(bool forward)
+{
+ Dir_Node* top = play_stack.getLast();
+ kdDebug(90010) << "first child " << top->subdirs.first() << endl;
+ kdDebug(90010) << "current child " << *top->current_subdir << endl;
+ kdDebug(90010) << "last child " << top->subdirs.last() << endl;
+ if (forward) {
+ top->current_subdir++; // advance dir
+ return top->current_subdir!=top->subdirs.end();
+ }
+ else
+ if (top->current_subdir!=top->subdirs.begin()) {
+ top->current_subdir--;
+ return true;
+ }
+ else {
+ top->past_begin=true;
+ return false;
+ }
+}
+
+void Dub::Recursive_Seq::pop_preorder(bool forward)
+{
+ if (pop_dir()) { // pop visited
+ advance(forward); // advance to next node
+ Dir_Node* top = play_stack.getLast();
+ kdDebug(90010) << "new child " << *top->current_subdir << endl;
+ if (forward)
+ next_preorder(); // continue processing
+ else
+ prev_preorder(); // continue processing
+ }
+ else {
+ kdDebug(90010) << "push root" << endl;
+ push_dir(recursion_root, forward); // back to the beginning if at end
+ }
+}
+
+void Dub::Recursive_Seq::next_preorder()
+{
+ assert(!play_stack.isEmpty()); // recursion stack cannot be empty
+ kdDebug(90010) << "next_preorder, stack:" << endl;
+ print_stack();
+ Dir_Node* top = play_stack.getLast();
+ if (top->subdirs.isEmpty() || top->current_subdir==top->subdirs.end()) {
+ kdDebug(90010) << "rec: subtrees done" << endl;
+ pop_preorder(true); // pop if subtrees done
+ }
+ else {
+ QString subdir = *top->current_subdir; // we have a subdir
+ push_dir(subdir, true); // push directory w/ forward iterators
+ }
+}
+
+void Dub::Recursive_Seq::prev_preorder()
+{
+ assert(!play_stack.isEmpty()); // recursion stack cannot be empty
+ kdDebug(90010) << "prev_preorder, stack:" << endl;
+ print_stack();
+ Dir_Node* top = play_stack.getLast();
+ if (top->subdirs.isEmpty() || top->past_begin) { // subtrees done?
+ kdDebug(90010) << "rec: subtrees done" << endl;
+ pop_preorder(false);
+ }
+ else {
+ QString subdir = *top->current_subdir;
+ kdDebug(90010) << "we have children, pushing now " << subdir << endl;
+ push_dir(subdir, false); // push directory w/ backward iterators
+ }
+}
+
+void Dub::Recursive_Seq::print_stack() {
+ for ( Dir_Node *cur_dir = play_stack.first();
+ cur_dir; cur_dir = play_stack.next() ) {
+ kdDebug(90010) << cur_dir->dir << endl;
+ }
+}
+
+Dub::Linear_Recursive::Linear_Recursive(Dub* d)
+ : Sequencer(d) {
+ kdDebug(90010) << "cons linear/recursive" << endl;
+}
+
+KFileItem* Dub::Linear_Recursive::first()
+{
+ KFileItem* first = bottom_dir()->file_items.getFirst();
+ return first;
+}
+
+void Dub::Linear_Recursive::next()
+{
+ assert(!play_stack.isEmpty());
+ Dir_Node* top = top_dir();
+ QString dir = top->dir;
+ top->current_file = top->file_items.next();
+ kdDebug(90010) << "dub current dir: " << dir << endl;
+ kdDebug(90010) << "dub current file: " << top->current_file << endl;
+ bool cycle = false;
+ while (!top_dir()->current_file && !cycle) {
+ next_preorder(); // traverse until a non-empty dir or cycle
+ if (top_dir()->dir==dir) {
+ kdDebug(90010) << "we got a cycle" << endl;
+ cycle = true;
+ top_dir()->init_traversal(true);
+ }
+ }
+ top = play_stack.getLast();
+ kdDebug(90010) << "dub new dir: " << *top->current_subdir << endl;
+ kdDebug(90010) << "dub new file: " << top->current_file << endl;
+ if (top->current_file) {
+ kdDebug(90010) << "dub new file: " << top->current_file->url() << endl;
+ dub.activeFile = top->current_file;
+ dub.fileSelected(dub.activeFile);
+ }
+}
+
+void Dub::Linear_Recursive::prev()
+{
+ assert(!play_stack.isEmpty());
+ Dir_Node* top = top_dir();
+ QString dir = top->dir;
+ top->current_file = top->file_items.prev();
+ kdDebug(90010) << "dub current dir: " << dir << endl;
+ kdDebug(90010) << "dub current file: " << top->current_file << endl;
+ bool cycle = false;
+ while (!top_dir()->current_file && !cycle) {
+ prev_preorder(); // traverse until a non-empty dir or cycle
+ if (top_dir()->dir==dir) {
+ kdDebug(90010) << "we got a cycle" << endl;
+ cycle = true;
+ top_dir()->init_traversal(false);
+ }
+ }
+ top = play_stack.getLast();
+ kdDebug(90010) << "dub new dir: " << *top->current_subdir << endl;
+ kdDebug(90010) << "dub new file: " << top->current_file << endl;
+ if (top->current_file) {
+ kdDebug(90010) << "dub new file: " << top->current_file->url() << endl;
+ dub.activeFile = top->current_file;
+ dub.fileSelected(dub.activeFile);
+ }
+}
+
+void Dub::Shuffle_OneDir::init(const QString& dir)
+{
+ if (shuffle_dir != dir) {
+ kdDebug(90010) << "shuffle/onedir init" << endl;
+ shuffle_dir = dir;
+ play_index = 0;
+
+ // make a deep copy
+ items.clear();
+ QPtrList<KFileItem> & view_items = dub.view->items(); //
+ for (KFileItem *file=view_items.first(); file; file=view_items.next() )
+ if (file->isFile()) // add only files
+ items.append(new KFileItem(*file));
+
+ int num_items = items.count();
+ play_order.resize(num_items);
+ if (num_items) { // generate shuffled order
+ kdDebug(90010) << num_items << " file items" << endl;
+ for (int i=0; i<num_items; i++)
+ play_order[i] = i;
+ Random random;
+ Random::init();
+ std::random_shuffle(play_order.begin(), play_order.end(), random);
+ }
+ }
+}
+
+KFileItem* Dub::Shuffle_OneDir::first()
+{
+ return 0;
+}
+
+void Dub::Shuffle_OneDir::next()
+{
+ kdDebug(90010) << "shuffle/onedir next" << endl;
+ if (!items.isEmpty()) {
+ play_index = ++play_index % play_order.size();
+ dub.activeFile = items.at(play_order[play_index]);
+ if (dub.activeFile)
+ dub.fileSelected(dub.activeFile);
+ }
+}
+
+void Dub::Shuffle_OneDir::prev()
+{
+ kdDebug(90010) << "shuffle/onedir prev" << endl;
+ if (!items.isEmpty()) {
+ play_index = --play_index % play_order.size();
+ dub.activeFile = items.at(play_order[play_index]);
+ if (dub.activeFile)
+ dub.fileSelected(dub.activeFile);
+ }
+}
+
+KFileItem* Dub::Shuffle_Recursive::random_file()
+{
+ assert(!play_stack.isEmpty());
+ play_stack.clear();
+ push_dir(recursion_root); // start pre-order traversal
+ KFileItem* selected = 0;
+ double file_probability = 0.3;
+ Random::init();
+ while (!top_dir()->subdirs.isEmpty() && !selected) {
+ if (top_dir()->file_items.isEmpty()) {
+ int ix = Random::random_int(top_dir()->subdirs.count());
+ push_dir(top_dir()->subdirs[ix]);
+ }
+ else {
+ if (Random::random_double(1.0)<file_probability) {
+ int ix = Random::random_int(top_dir()->file_items.count());
+ selected = top_dir()->file_items.at(ix);
+ }
+ else {
+ int ix = Random::random_int(top_dir()->subdirs.count());
+ push_dir(top_dir()->subdirs[ix]);
+ }
+ }
+ }
+ if (!selected) {
+ if (!top_dir()->file_items.isEmpty()) {
+ int ix = Random::random_int(top_dir()->file_items.count());
+ selected = top_dir()->file_items.at(ix);
+ }
+ }
+ return selected;
+}
+
+KFileItem* Dub::Shuffle_Recursive::first()
+{
+ return random_file();
+}
+
+void Dub::Shuffle_Recursive::next()
+{
+ KFileItem* file = random_file();
+ if (file) {
+ kdDebug(90010) << "shuffle/rec: new file: " << file->url() << endl;
+ dub.activeFile = file;
+ dub.fileSelected(file);
+ }
+}
+
+void Dub::Shuffle_Recursive::prev()
+{
+ KFileItem* file = random_file();
+ if (file) {
+ kdDebug(90010) << "shuffle/rec: new file: " << file->url() << endl;
+ dub.activeFile = file;
+ dub.fileSelected(file);
+ }
+}
diff --git a/noatun-plugins/dub/dub/dub.h b/noatun-plugins/dub/dub/dub.h
new file mode 100644
index 0000000..5317f86
--- /dev/null
+++ b/noatun-plugins/dub/dub/dub.h
@@ -0,0 +1,207 @@
+// -*-c++-*-
+/***************************************************************************
+ dub.h - description
+ -------------------
+ begin : Tue Oct 23 01:44:51 EEST 2001
+ copyright : (C) 2001 by Eray Ozkural (exa)
+ email : erayo@cs.bilkent.edu.tr
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef Dub_Interface
+#define Dub_Interface
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+// KDE includes
+#include <kapplication.h>
+#include <kmainwindow.h>
+#include <kurl.h>
+#include <noatun/plugin.h>
+#include <noatun/playlist.h>
+
+// sys includes
+#include <vector>
+#include <list>
+
+// forward decl
+class KFileItem;
+class KDirLister;
+class DubPlaylist;
+
+// application specific includes
+#include "dubapp.h"
+#include "dubconfigmodule.h"
+
+// dub specific application code
+class Dub : public DubApp
+{
+ Q_OBJECT
+
+public:
+
+ Dub(DubPlaylist* plist);
+
+public slots:
+ /** A file selected */
+ void fileSelected(const KFileItem*);
+ void mediaHomeSelected(const QString& url);
+
+ signals:
+void setMediaHome(KURL);
+ // xemacs rules
+
+public:
+
+ /** playlist object to interface noatun
+ */
+ DubPlaylist& playlist;
+ /** noatun configuration object
+ */
+ DubConfigModule& dubconfig;
+
+ KFileItem* getActiveFile() { return activeFile; }
+ /** find root */
+ KFileItem* queryRoot();
+ /** First file in the sequence */
+ const KFileItem* queryFirstFile();
+ /** Select next file in order */
+ void selectNextFile();
+ /** Select previous file in order */
+ void selectPreviousFile();
+
+public:
+
+ /* The chosen file */
+ KFileItem* activeFile;
+
+private:
+
+ void configure_sequencing();
+
+ // expansion slot :P
+ struct Sequencer {
+ Sequencer(Dub* d) : dub(*d) {}
+ virtual KFileItem* first() = 0;
+ virtual void next() = 0;
+ virtual void prev() = 0;
+ Dub& dub;
+ void set_file(KFileItem** file, KFileItem* val);
+ };
+ Sequencer* sequencer;
+
+ // possible sequencers are linear/oneDir, linear/recursive,
+ // shuffle/oneDir, shuffle/recursive, repeat, single
+
+ // linear sequencing subsystem
+ struct Linear_Seq : public Sequencer {
+ Linear_Seq(Dub* d) : Sequencer(d) {}
+ KFileItem* first(QPtrList<KFileItem> & items);
+ KFileItem* last(QPtrList<KFileItem> & items);
+ KFileItem* next(QPtrList<KFileItem> & items, KFileItem** active_file);
+ KFileItem* prev(QPtrList<KFileItem> & items, KFileItem** active_file);
+ bool find(QPtrList<KFileItem> & items, KFileItem* a_file);
+ };
+
+ // sequencer that traverses current directory in view order
+ struct Linear_OneDir : public Linear_Seq {
+ Linear_OneDir(Dub* d) : Linear_Seq(d), first_file(0) {}
+ virtual ~Linear_OneDir() {}
+ KFileItem* first();
+ void next();
+ void prev();
+ KFileItem* first_file;
+ };
+ Linear_OneDir linear_onedir;
+
+ // directory node for recursive play
+ struct Dir_Node
+ {
+ Dir_Node(QString dir, bool forward = true);
+ QString dir;
+ QStringList subdirs;
+ QStringList::iterator current_subdir;
+ QPtrList<KFileItem> file_items;
+ KFileItem* current_file;
+ void init_traversal(bool forward);
+ bool past_begin; // stupid iterators
+ };
+
+ // recursive play sequencing subsystem
+ struct Recursive_Seq {
+ Recursive_Seq();
+ void init(const KURL & root);
+ QString canonical_path(QString dir);
+ bool check_dir(QString dir);
+ Dir_Node* top_dir() { return play_stack.getLast(); }
+ Dir_Node* bottom_dir() { return play_stack.getFirst(); }
+ bool push_dir(QString dir, bool forward = true);
+ bool pop_dir();
+ bool advance(bool forward = true);
+ void pop_preorder(bool forward = true);
+ void next_preorder();
+ void prev_preorder();
+ void print_stack();
+
+ QString recursion_root;
+ QPtrList<Dir_Node> play_stack;
+ };
+
+ // sequencer to make a preorder walk of the directory tree
+ struct Linear_Recursive
+ : public Sequencer, public Recursive_Seq {
+ Linear_Recursive(Dub* d);
+ virtual ~Linear_Recursive() {};
+ KFileItem* first();
+ void next();
+ void prev();
+ };
+ Linear_Recursive linear_recursive;
+
+ // shuffle/onedir sequencer
+ struct Shuffle_OneDir
+ : public Sequencer {
+ Shuffle_OneDir(Dub* d) : Sequencer(d) {
+ items.setAutoDelete(true);
+ }
+ virtual ~Shuffle_OneDir() {};
+ void init(const QString& dir);
+ KFileItem* first();
+ void next();
+ void prev();
+ void init();
+
+ int play_index;
+ std::vector<int> play_order;
+ KURL shuffle_dir;
+ QPtrList<KFileItem> items;
+ };
+ Shuffle_OneDir shuffle_onedir;
+
+ // shuffle/recursive sequencer
+ struct Shuffle_Recursive
+ : public Sequencer, public Recursive_Seq {
+ Shuffle_Recursive(Dub* d) : Sequencer(d) {}
+ virtual ~Shuffle_Recursive() {}
+ KFileItem* random_file();
+ KFileItem* first();
+ void next();
+ void prev();
+
+ QString shuffle_root;
+ };
+ Shuffle_Recursive shuffle_recursive;
+
+};
+
+#endif // DUB_H
diff --git a/noatun-plugins/dub/dub/dub.plugin b/noatun-plugins/dub/dub/dub.plugin
new file mode 100644
index 0000000..c844c01
--- /dev/null
+++ b/noatun-plugins/dub/dub/dub.plugin
@@ -0,0 +1,69 @@
+Filename=noatundub.la
+Author=Eray (exa) Ozkural
+Site=http://www.cs.bilkent.edu.tr/~erayo
+Type=playlist
+License=GPL
+Name=Dub
+Name[af]=Hersien
+Name[eo]=Nomilo
+Name[hi]=डब
+Name[km]=ដាក់​ឈ្មោះ
+Name[ne]=डब
+Name[ta]=பதிவு
+Name[tr]=Ünvan
+Name[xh]=Nika igama lesiteketiso
+Comment=Dub playlist plugin
+Comment[bg]=Приставка за списък за изпълнение, базирана на директории
+Comment[bs]=Dub dodatak za playlistu
+Comment[ca]=Connector de la llista de reproducció Dub
+Comment[cs]=Modul seznamu skladeb "Dub"
+Comment[da]=Dub-spilleliste-plugin
+Comment[de]=Dub Wiedergabelisten-Modul
+Comment[el]=Πρόσθετο λίστας αναπαραγωγής Dub
+Comment[eo]=Kromaĵo por nomi ludlistojn
+Comment[es]=Complemento de doblaje de la lista de reproducción
+Comment[et]=Dubi esitusnimekirja plugin
+Comment[eu]=Dut erreprodukzio-zerrendaren plugina
+Comment[fa]=وصلۀ فهرست پخش Dub
+Comment[fi]=Dub soittolistasovelma
+Comment[fr]=Module de liste de doublage
+Comment[fy]=Dub Ofspyllistplugin
+Comment[ga]=Breiseán seinmliosta Dub
+Comment[gl]=Plugin de lista de reproduición de Dub
+Comment[he]=תוסף רשימת הניגון Dub
+Comment[hi]=डब प्लेलिस्ट प्लगइन
+Comment[hr]=Dodatak albuma za Dub
+Comment[hu]=Dub lejátszási lista modulként
+Comment[is]=Tól til að spila Dub lagalista
+Comment[it]=Plugin per le Playlist di Dub
+Comment[ja]=Dub プレイリスト プラグイン
+Comment[ka]=Dub სიმღერათა სიის მოდული
+Comment[kk]=Dub орындау тізімінің плагин модулі
+Comment[km]=ដាក់​ឈ្មោះ​កម្មវិធី​ជំនួយ​បញ្ជី​ចាក់
+Comment[lt]=Dub gaidaraščio priedas
+Comment[mk]=Приклучок за листа со нумери Dub
+Comment[ms]=Plugin senarai main Dub
+Comment[nb]=Dub programtillegg for spilleliste
+Comment[nds]=Dub-Afspeellistmoduul
+Comment[ne]=डब प्लेसूची प्लगइन
+Comment[nl]=Dub Afspeellijstplugin
+Comment[nn]=Dub-programtillegg for speleliste
+Comment[pl]=Lista odtwarzania pozwalająca wybierać wprost z systemu plików
+Comment[pt]='Plugin' da lista Dub
+Comment[pt_BR]=Plug-in de Lista de reprodução do Dub
+Comment[ru]=Модуль списка произведений Dub
+Comment[sk]=Modul pre Dub playlist
+Comment[sl]=Vstavek predvajalnega seznama za Dub
+Comment[sr]=Прикључак за Dub-ову листу нумера
+Comment[sr@Latn]=Priključak za Dub-ovu listu numera
+Comment[sv]=Spellistan Dub
+Comment[ta]= இயங்குபட்டியல் சொருகுப்பொருளை பதிவு செய்
+Comment[tg]=Модули рӯйхати баровардҳои Dub
+Comment[tr]=Dub çalma listesi eklentisi
+Comment[uk]=Втулок списку композицій Dub
+Comment[uz]=Dub oʻynash roʻyxati plagini
+Comment[uz@cyrillic]=Dub ўйнаш рўйхати плагини
+Comment[vi]=Bổ sung danh mục nhạc Dub
+Comment[zh_CN]=Dub 播放列表插件
+Comment[zh_TW]=Dub 播放清單外掛程式
+
diff --git a/noatun-plugins/dub/dub/dubapp.cpp b/noatun-plugins/dub/dub/dubapp.cpp
new file mode 100644
index 0000000..7097940
--- /dev/null
+++ b/noatun-plugins/dub/dub/dubapp.cpp
@@ -0,0 +1,98 @@
+//
+//
+// C++ Implementation for module: DubApp
+//
+// Description:
+//
+//
+// Author: Eray (exa) Ozkural, (C) 2003
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+// include files for QT
+#include <qdir.h>
+#include <qprinter.h>
+#include <qpainter.h>
+
+// include files for KDE
+#include <kiconloader.h>
+#include <kdebug.h>
+#include <kfiledialog.h>
+#include <kmenubar.h>
+#include <kstatusbar.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kstdaction.h>
+#include <noatun/playlist.h>
+
+// application specific includes
+#include "dubapp.h"
+#include "dubapp.moc"
+#include "dubview.h"
+
+#define ID_STATUS_MSG 1
+
+DubApp::DubApp(QWidget* parent, const char* name)
+ : KMainWindow(parent, name)
+{
+ kdDebug(90010) << "cons dubapp" << endl;
+ config=kapp->config();
+
+ // call inits to invoke all other construction parts
+ initStatusBar();
+ initActions();
+ initView();
+ setAutoSaveSettings();
+}
+
+DubApp::~DubApp()
+{
+ kdDebug(90010) << "destruct dubapp" << endl;
+}
+
+void DubApp::initActions()
+{
+ fileClose = KStdAction::close(this, SLOT(close()), actionCollection());
+ setStandardToolBarMenuEnabled(true);
+ createStandardStatusBarAction();
+
+ fileClose->setStatusText(i18n("Close playlist window"));
+
+ // use the absolute path to your dubui.rc file for testing purpose in createGUI();
+ createGUI();
+}
+
+
+void DubApp::initStatusBar()
+{
+ // status bar
+ statusBar()->insertItem(i18n("Ready."), ID_STATUS_MSG);
+}
+
+void DubApp::initView()
+{
+ // create the main widget here that is managed by KTMainWindow's view-region and
+ // connect the widget to your document to display document contents.
+
+ view = new DubView(this);
+ setCentralWidget(view);
+ setCaption("Dub Playlist",false);
+}
+
+// slots
+
+void DubApp::slotStatusMsg(const QString &text)
+{
+ // change status message permanently
+ statusBar()->clear();
+ statusBar()->changeItem(text, ID_STATUS_MSG);
+}
+
+// events
+
+void DubApp::closeEvent(QCloseEvent*)
+{
+ hide();
+}
diff --git a/noatun-plugins/dub/dub/dubapp.h b/noatun-plugins/dub/dub/dubapp.h
new file mode 100644
index 0000000..e06a2fe
--- /dev/null
+++ b/noatun-plugins/dub/dub/dubapp.h
@@ -0,0 +1,83 @@
+// -*-c++-*-
+//
+// C++ Interface for module: DubApp
+//
+// Description: KDE application entry point for dub playlist
+// Stripped down main window code from kapptemplate
+//
+// Author: Eray (exa) Ozkural, (C) 2003
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#ifndef DubApp_Interface
+#define DubApp_Interface
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+// include files for KDE
+#include <kapplication.h>
+#include <kmainwindow.h>
+#include <kaccel.h>
+#include <kaction.h>
+
+// forward declaration of the Dub classes
+class DubView;
+
+// Application stuff
+class DubApp : public KMainWindow
+{
+ Q_OBJECT
+
+ friend class DubView;
+
+public:
+ /** construtor of DubApp, calls all init functions to create the application.
+ */
+ DubApp(QWidget* parent, const char* name="Dub Playlist");
+ ~DubApp();
+
+ void initActions();
+ /** sets up the statusbar for the main window by initialzing a statuslabel.
+ */
+ void initStatusBar();
+ /** initializes the document object of the main window that is connected to the view in initView().
+ * @see initView();
+ */
+ void initView();
+
+ DubView *view;
+ DubView* getView() {
+ return view;
+ }
+
+protected:
+ virtual void closeEvent(QCloseEvent*e);
+
+private:
+ KConfig *config;
+ /** view is the main widget which represents your working area. The View
+ * class should handle all events of the view widget. It is kept empty so
+ * you can create your view according to your application's needs by
+ * changing the view class.
+ */
+
+ // KAction pointers to enable/disable actions
+ //KAction* fileQuit;
+ KAction* fileClose;
+
+ // signals and slots
+
+public slots:
+ /** changes the statusbar contents for the standard label permanently, used to indicate current actions.
+ * @param text the text that is displayed in the statusbar
+ */
+ void slotStatusMsg(const QString &text);
+ /** get a pointer to view object */
+
+};
+
+#endif
diff --git a/noatun-plugins/dub/dub/dubconfigmodule.cpp b/noatun-plugins/dub/dub/dubconfigmodule.cpp
new file mode 100644
index 0000000..ff1f3dd
--- /dev/null
+++ b/noatun-plugins/dub/dub/dubconfigmodule.cpp
@@ -0,0 +1,125 @@
+//
+//
+// C++ Implementation: cpp
+//
+// Description:
+//
+//
+// Author: Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr>, (C) 2003
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#include <kconfig.h>
+#include <kdialog.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kurlrequester.h>
+#include <kdebug.h>
+
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qlayout.h>
+#include <qradiobutton.h>
+
+#include "dubconfigmodule.h"
+
+DubConfigModule::DubConfigModule(QObject* parent)
+ : CModule(i18n("Dub"), i18n("Folder-Based Playlist"), "noatun", parent)
+ , playMode(oneDir)
+ , playOrder(normal)
+{
+ QVBoxLayout *vbox = new QVBoxLayout(this);
+ vbox->setAutoAdd(true);
+ vbox->setSpacing( 0 );
+ vbox->setMargin( 0 );
+
+ prefs = new DubPrefs(this);
+ prefs->mediaDirectory->setMode(KFile::Directory);
+
+ reopen();
+}
+
+DubConfigModule::~DubConfigModule()
+{
+}
+
+void DubConfigModule::save(void)
+{
+ KConfig* config(KGlobal::config());
+ config->setGroup("DubPlaylist");
+
+ mediaDirectory = prefs->mediaDirectory->url();
+
+ QButton* selectedMode = prefs->playMode->selected();
+ if (selectedMode==prefs->allFiles)
+ playMode = DubConfigModule::allFiles;
+ else
+ if (selectedMode==prefs->recursiveDir)
+ playMode = DubConfigModule::recursiveDir;
+ else
+ playMode = DubConfigModule::oneDir;
+
+ QButton* selectedOrder = prefs->playOrder->selected();
+ if (selectedOrder==prefs->shuffle)
+ playOrder = DubConfigModule::shuffle;
+ else
+ if (selectedOrder==prefs->repeat)
+ playOrder = DubConfigModule::repeat;
+ else
+ if (selectedOrder==prefs->single)
+ playOrder = DubConfigModule::single;
+ else
+ playOrder = DubConfigModule::normal;
+
+ config->writePathEntry("MediaDirectory", mediaDirectory);
+ config->writeEntry("PlayMode", (int) playMode);
+ config->writeEntry("PlayOrder", (int) playOrder);
+}
+
+void DubConfigModule::reopen(void)
+{
+ kdDebug(90010) << "dubconfig: reopen" << endl;
+ KConfig* config(KGlobal::config());
+ config->setGroup("DubPlaylist");
+ mediaDirectory = config->readPathEntry("MediaDirectory", "~/");
+ kdDebug(90010) << "dub: media home is " << mediaDirectory << endl;
+ playMode = (PlayMode) config->readNumEntry("PlayMode", DubConfigModule::oneDir);
+ playOrder = (PlayOrder) config->readNumEntry("PlayOrder", DubConfigModule::normal);
+ apply();
+}
+
+void DubConfigModule::apply()
+{
+ prefs->mediaDirectory->setURL(mediaDirectory);
+ // what a horrible repetition, but it's not worthwhile doing any better ;)
+ switch (playMode) {
+ case allFiles:
+ prefs->playMode->setButton(prefs->playMode->id(prefs->allFiles));
+ break;
+ case oneDir:
+ prefs->playMode->setButton(prefs->playMode->id(prefs->oneDir));
+ break;
+ case recursiveDir:
+ prefs->playMode->setButton(prefs->playMode->id(prefs->recursiveDir));
+ break;
+ }
+ switch (playOrder) {
+ case normal:
+ prefs->playOrder->setButton(prefs->playOrder->id(prefs->normal));
+ break;
+ case shuffle:
+ prefs->playOrder->setButton(prefs->playOrder->id(prefs->shuffle));
+ break;
+ case repeat:
+ prefs->playOrder->setButton(prefs->playOrder->id(prefs->repeat));
+ break;
+ case single:
+ prefs->playOrder->setButton(prefs->playOrder->id(prefs->single));
+ break;
+ }
+}
+
+
+#include "dubconfigmodule.moc"
diff --git a/noatun-plugins/dub/dub/dubconfigmodule.h b/noatun-plugins/dub/dub/dubconfigmodule.h
new file mode 100644
index 0000000..cfb662b
--- /dev/null
+++ b/noatun-plugins/dub/dub/dubconfigmodule.h
@@ -0,0 +1,40 @@
+// -*-c++-*-
+#ifndef DUBCONFIGMODULE_H
+#define DUBCONFIGMODULE_H
+
+
+#include <noatun/pref.h>
+#include "dubprefs.h"
+
+/**
+ * Noatun configuration module for dub
+
+ * Eray Ozkural (exa)
+ **/
+class DubConfigModule : public CModule
+{
+Q_OBJECT
+public:
+ enum PlayOrder { normal, shuffle, repeat, single };
+ enum PlayMode { allFiles, oneDir, recursiveDir };
+
+ DubConfigModule(QObject *parent);
+
+ ~DubConfigModule();
+
+ virtual void save(void);
+ virtual void reopen(void);
+
+ void apply();
+
+ /** The directory in which media files are stored */
+ QString mediaDirectory;
+ PlayMode playMode;
+ PlayOrder playOrder;
+
+ const DubPrefs* getPrefs() { return prefs; }
+ //private:
+ DubPrefs* prefs;
+};
+
+#endif
diff --git a/noatun-plugins/dub/dub/dubplaylist.cpp b/noatun-plugins/dub/dub/dubplaylist.cpp
new file mode 100644
index 0000000..6803214
--- /dev/null
+++ b/noatun-plugins/dub/dub/dubplaylist.cpp
@@ -0,0 +1,158 @@
+//
+//
+// C++ Implementation: dubplaylist.cpp
+//
+// Description:
+//
+//
+// Author: Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr>, (C) 2001
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+//#include dubplaylist.cpp
+
+#include <kmessagebox.h>
+#include <kdebug.h>
+#include <noatun/playlist.h>
+#include <klocale.h>
+
+#include "dub.h"
+#include "dubconfigmodule.h"
+
+#include "dubplaylist.h"
+
+// plugin interface
+extern "C" Plugin *create_plugin()
+{
+ KGlobal::locale()->insertCatalogue("dub");
+ DubPlaylist* dub = new DubPlaylist;
+ return dub;
+}
+
+/** Construct playlist object */
+DubPlaylist::DubPlaylist()
+ : Playlist(0, "Dub Playlist")
+ , dub(0)
+ , visible(false)
+{
+ kdDebug(90010) << "dub: cons playlist" << endl;
+}
+
+DubPlaylist::~DubPlaylist(){
+ kdDebug(90010) << "dub: destruct playlist " << endl;
+ // destroy app
+ delete dub;
+}
+
+void DubPlaylist::reset() {
+ kdDebug(90010) << "dub: reset" << endl;
+}
+
+void DubPlaylist::clear() {
+ kdDebug(90010) << "dub: clear" << endl;
+}
+
+void DubPlaylist::addFile(const KURL&, bool play) {
+ KMessageBox::information(0, i18n("Adding files not supported yet, see configuration"));
+}
+
+PlaylistItem DubPlaylist::next() {
+ kdDebug(90010) << "dub: next" << endl;
+ dub->selectNextFile();
+ updateCurrent();
+ return currentItem;
+}
+
+PlaylistItem DubPlaylist::current() {
+ if (!currentItem.isNull())
+ kdDebug(90010) << "dub: current item:" << currentItem.data()->url().prettyURL() << endl;
+ return currentItem;
+}
+
+PlaylistItem DubPlaylist::previous() {
+ kdDebug(90010) << "dub: previous" << endl;
+ dub->selectPreviousFile();
+ updateCurrent();
+ return currentItem;
+}
+
+PlaylistItem DubPlaylist::getFirst() const {
+ kdDebug(90010) << "dub: getFirst" << endl;
+ const KFileItem* first = dub->queryFirstFile();
+ if (first) {
+ kdDebug(90010) << "dub: first " << first->url() << endl;
+ DubPlaylistItem* firstData = new DubPlaylistItem(*first);
+ return PlaylistItem(firstData);
+ }
+ else
+ return 0;
+}
+
+PlaylistItem DubPlaylist::getAfter(const PlaylistItem &item) const {
+ kdDebug(90010) << "dub: getAfter" << endl;
+ return 0;
+}
+
+bool DubPlaylist::listVisible() const {
+ kdDebug(90010) << "dub: listVisible" << endl;
+ return visible;
+}
+
+void DubPlaylist::init() {
+ kdDebug(90010) << "dub: init" << endl;
+ dubconfig = new DubConfigModule(this); // we pass this around to dub app
+ dub = new Dub(this);
+ kdDebug(90010) << "dub: init: test playlist() " << endl;
+ playlist();
+}
+
+void DubPlaylist::showList() {
+ kdDebug(90010) << "dub: showList" << endl;
+ visible = true;
+ Q_ASSERT(dub);
+ dub->show();
+}
+
+void DubPlaylist::hideList() {
+ kdDebug(90010) << "dub: hideList" << endl;
+ visible = false;
+ Q_ASSERT(dub);
+ dub->hide();
+}
+
+//void DubPlaylist::remove(const PlaylistItem&) {
+// KMessageBox::information(0, "Removing files not supported yet, see configuration");
+//}
+
+//void DubPlaylist::sort() {
+// kdDebug(90010) << "sort" << endl;
+//}
+
+Playlist* DubPlaylist::playlist() {
+ kdDebug(90010) << "dub: playlist pointer " << this << endl;
+ return static_cast<Playlist*>(this);
+}
+
+void DubPlaylist::setCurrent(const KFileItem* file, bool play) {
+ Q_ASSERT(file);
+ currentItem = new DubPlaylistItem(*file);
+ if (play)
+ emit playCurrent();
+}
+
+void DubPlaylist::setCurrent(const PlaylistItem &play)
+{
+ currentItem=play;
+ emit playCurrent();
+}
+
+/** No descriptions */
+void DubPlaylist::updateCurrent() {
+ KFileItem* active = dub->getActiveFile();
+ if ( active ) {
+ currentItem = new DubPlaylistItem(*active);
+ emit playCurrent();
+ }
+}
diff --git a/noatun-plugins/dub/dub/dubplaylist.h b/noatun-plugins/dub/dub/dubplaylist.h
new file mode 100644
index 0000000..d250926
--- /dev/null
+++ b/noatun-plugins/dub/dub/dubplaylist.h
@@ -0,0 +1,77 @@
+// -*-c++-*-
+//
+// C++ Interface dubplaylist.h
+//
+// Description:
+//
+//
+// Author: Eray Ozkural (exa), (C) 2001
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#ifndef DUBPLAYLIST_H
+#define DUBPLAYLIST_H
+
+class Dub;
+class DubConfigModule;
+
+#include <kfileitem.h>
+#include <noatun/playlist.h>
+#include <noatun/plugin.h>
+
+#include "dubplaylistitem.h"
+
+/**Playlist class. Implements the noatun playlist interface
+ *@author Eray Ozkural (exa)
+ */
+
+class DubPlaylist : public Playlist, public Plugin {
+public:
+
+ DubPlaylist();
+ ~DubPlaylist();
+
+ virtual void reset();
+
+ virtual void clear();
+ virtual void addFile(const KURL&, bool play=false);
+ /**
+ * Cycle everthing through forward
+ **/
+ virtual PlaylistItem next();
+ /**
+ * return the one that might/should be playing now
+ **/
+ virtual PlaylistItem current();
+ /**
+ * Cycle through backwards
+ **/
+ virtual PlaylistItem previous();
+ virtual PlaylistItem getFirst() const;
+ virtual PlaylistItem getAfter(const PlaylistItem &item) const;
+
+ virtual bool listVisible() const;
+ virtual void init();
+ virtual Playlist* playlist();
+
+ virtual void setCurrent(const PlaylistItem &play);
+
+public slots:
+ virtual void showList();
+ virtual void hideList();
+ virtual void setCurrent(const KFileItem* file, bool play = false);
+ void updateCurrent();
+// virtual void remove(const PlaylistItem&);
+// virtual void sort();
+
+ DubConfigModule *dubconfig;
+
+private:
+ Dub *dub;
+ PlaylistItem currentItem;
+ bool visible;
+};
+
+#endif
diff --git a/noatun-plugins/dub/dub/dubplaylistitem.cpp b/noatun-plugins/dub/dub/dubplaylistitem.cpp
new file mode 100644
index 0000000..d38eb24
--- /dev/null
+++ b/noatun-plugins/dub/dub/dubplaylistitem.cpp
@@ -0,0 +1,83 @@
+//
+//
+// C++ Implementation: dubplaylistitem.cpp
+//
+// Description:
+//
+//
+// Author: Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr>, (C) 2001
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+//#include dubplaylistitem.cpp
+
+
+#include "dubplaylistitem.h"
+#include <kfile.h>
+#include <kfileitem.h>
+#include <kdebug.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+
+DubPlaylistItem::DubPlaylistItem(const KFileItem& fItem)
+ : fileItem(fItem)
+{
+// kdDebug(90010) << "construct playlist item " << fItem.url().prettyURL() << endl;
+
+// PlaylistItemData::addRef();
+ PlaylistItemData::added();
+}
+
+DubPlaylistItem::~DubPlaylistItem(){
+// kdDebug(90010) << "destruct playlist item " << fileItem.url().prettyURL() << endl;
+
+// PlaylistItemData::removed();
+ PlaylistItemData::removeRef();
+}
+
+QString DubPlaylistItem::property(const QString &key, const QString &def) const {
+// kdDebug(90010) << "property " << key << endl;
+ if (isProperty(key)) {
+ kdDebug(90010) << key << " -> " << property_map.find(key).data() << endl;
+ return property_map.find(key).data();
+ }
+ else
+ return def;
+}
+
+void DubPlaylistItem::setProperty(const QString &key, const QString &val) {
+// kdDebug(90010) << "set property" << endl;
+ property_map[key] = val;
+}
+
+void DubPlaylistItem::clearProperty(const QString &key) {
+// kdDebug(90010) << "clear property" << endl;
+ property_map.remove(key);
+}
+
+QStringList DubPlaylistItem::properties() const {
+// kdDebug(90010) << "properties" << endl;
+ QStringList list;
+ for (Properties::const_iterator i=property_map.begin();
+ i!=property_map.end(); i++) {
+ list.append(i.data());
+ }
+ return list;
+}
+
+bool DubPlaylistItem::isProperty(const QString &key) const {
+// kdDebug(90010) << "is property? " << key << endl;
+ return (property_map.find(key) != property_map.end());
+}
+
+KURL DubPlaylistItem::url() const {
+// kdDebug(90010) << "item url" << endl;
+
+ return fileItem.url();
+}
+/** No descriptions */
+void DubPlaylistItem::remove() {
+ KMessageBox::information(0, i18n("Do you really want to delete this file?"));
+}
diff --git a/noatun-plugins/dub/dub/dubplaylistitem.h b/noatun-plugins/dub/dub/dubplaylistitem.h
new file mode 100644
index 0000000..6f7a96d
--- /dev/null
+++ b/noatun-plugins/dub/dub/dubplaylistitem.h
@@ -0,0 +1,55 @@
+//
+//
+// C++ Interface dubplaylistitem.h
+//
+// Description:
+//
+//
+// Author: Eray Ozkural (exa), (C) 2001
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+
+#ifndef DUBPLAYLISTITEM_H
+#define DUBPLAYLISTITEM_H
+
+#include <kfileitem.h>
+#include <dubplaylistitem.h>
+
+#include <noatun/playlist.h>
+
+/**noatun playlistitem implementation
+ *@author Eray Ozkural (exa)
+ */
+
+class KFileItem;
+
+class DubPlaylistItem : public PlaylistItemData {
+public:
+ DubPlaylistItem(const KFileItem&);
+ virtual ~DubPlaylistItem();
+
+ virtual QString property(const QString &, const QString & = 0) const;
+ virtual void setProperty(const QString &, const QString &);
+ virtual void clearProperty(const QString &);
+ virtual QStringList properties() const;
+ virtual bool isProperty(const QString &) const;
+ virtual KURL url() const;
+ KFileItem& getFileItem() {
+ return fileItem;
+ }
+ /** No descriptions */
+ virtual void remove();
+
+private:
+ KFileItem fileItem;
+ typedef QMap<QString,QString> Properties;
+ Properties property_map;
+
+// virtual QString file() const;
+
+};
+
+#endif
diff --git a/noatun-plugins/dub/dub/dubprefs.ui b/noatun-plugins/dub/dub/dubprefs.ui
new file mode 100644
index 0000000..6b27195
--- /dev/null
+++ b/noatun-plugins/dub/dub/dubprefs.ui
@@ -0,0 +1,187 @@
+<!DOCTYPE UI><UI version="3.1" stdsetdef="1">
+<class>DubPrefs</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>DubPrefs</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>451</width>
+ <height>349</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="caption">
+ <string>Dub Preferences</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>1</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Media home:</string>
+ </property>
+ </widget>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>mediaDirectory</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Top-level folder where my media files are stored</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>playMode</cstring>
+ </property>
+ <property name="title">
+ <string>Play Mode</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>allFiles</cstring>
+ </property>
+ <property name="text">
+ <string>All media files</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>All media files found under Media Home</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>oneDir</cstring>
+ </property>
+ <property name="text">
+ <string>Selected folder</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Play current folder only</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>recursiveDir</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>All files under selected folder</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Choose media files from current folder and all its subfolders</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>playOrder</cstring>
+ </property>
+ <property name="title">
+ <string>Play Order</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>normal</cstring>
+ </property>
+ <property name="text">
+ <string>Normal</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Play files in normal order</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>shuffle</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Shuffle</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Randomized order</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>repeat</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Repeat</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Repeat the same file forever</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>single</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Single</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Play a single file and stop</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </vbox>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/noatun-plugins/dub/dub/dubui.rc b/noatun-plugins/dub/dub/dubui.rc
new file mode 100644
index 0000000..1b735ef
--- /dev/null
+++ b/noatun-plugins/dub/dub/dubui.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui>
+<kpartgui name="dub" version="1">
+<MenuBar>
+ <Menu name="file"><text>&amp;File</text>
+ <Action name="file_new_window"/>
+ </Menu>
+</MenuBar>
+</kpartgui>
diff --git a/noatun-plugins/dub/dub/dubview.cpp b/noatun-plugins/dub/dub/dubview.cpp
new file mode 100644
index 0000000..e1e4713
--- /dev/null
+++ b/noatun-plugins/dub/dub/dubview.cpp
@@ -0,0 +1,63 @@
+/***************************************************************************
+ dubview.cpp - description
+ -------------------
+ begin : Tue Oct 23 01:44:51 EEST 2001
+ copyright : (C) 2001 by Eray Ozkural (exa)
+ email : erayo@cs.bilkent.edu.tr
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+// include files for Qt
+#include <qprinter.h>
+#include <qpainter.h>
+#include <kdebug.h>
+
+// application specific includes
+#include "dubview.h"
+#include "dubview.moc"
+#include "dub.h"
+#include "fileselectorwidget.h"
+
+//DubView::DubView(QWidget *parent, const char *name) : QWidget(parent, name)
+//{
+// setBackgroundMode(PaletteBase);
+//}
+
+DubView::DubView(QWidget *parent) : FileSelectorWidget(parent)
+{
+ kdDebug(90010) << "dub view cons" << endl;
+ setBackgroundMode(PaletteBase);
+}
+
+DubView::~DubView()
+{
+}
+
+void DubView::print(QPrinter *pPrinter)
+{
+ QPainter printpainter;
+ printpainter.begin(pPrinter);
+
+ // TODO: add your printing code here
+
+ printpainter.end();
+}
+/** Return item list of view */
+QPtrList<KFileItem>& DubView::items()
+{
+ return const_cast<QPtrList<KFileItem>&>( *dirOperator()->view()->items() );
+}
+
+/** Select a file */
+void DubView::selectFile(KFileItem* file){
+ dirOperator()->view()->setCurrentItem( file );
+ dirOperator()->view()->ensureItemVisible( file );
+}
diff --git a/noatun-plugins/dub/dub/dubview.h b/noatun-plugins/dub/dub/dubview.h
new file mode 100644
index 0000000..c768ca6
--- /dev/null
+++ b/noatun-plugins/dub/dub/dubview.h
@@ -0,0 +1,52 @@
+/***************************************************************************
+ dubview.h - description
+ -------------------
+ begin : Tue Oct 23 01:44:51 EEST 2001
+ copyright : (C) 2001 by Eray Ozkural (exa)
+ email : erayo@cs.bilkent.edu.tr
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef DUBVIEW_H
+#define DUBVIEW_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+// include files for Qt
+#include <qwidget.h>
+
+#include <fileselectorwidget.h>
+
+// the viewing widget for the playlist
+class DubView : public FileSelectorWidget
+{
+ Q_OBJECT
+ public:
+ /** Constructor for the main view */
+ DubView(QWidget *parent = 0);
+ /** Destructor for the main view */
+ ~DubView();
+
+
+ /** contains the implementation for printing functionality */
+ void print(QPrinter *pPrinter);
+ /** Return item list of view */
+ QPtrList<KFileItem>& items();
+ /** select a particular file */
+ void selectFile(KFileItem* file);
+
+ private:
+
+};
+
+#endif // DUBVIEW_H
diff --git a/noatun-plugins/dub/dub/fileselectorwidget.cpp b/noatun-plugins/dub/dub/fileselectorwidget.cpp
new file mode 100644
index 0000000..153af20
--- /dev/null
+++ b/noatun-plugins/dub/dub/fileselectorwidget.cpp
@@ -0,0 +1,183 @@
+/****************************************************************************
+ * Copyright (C) 2001 by Hugo Varotto *
+ * hugo@varotto-usa.com *
+ * *
+ * Based on Kate's fileselector widget by *
+ * Matt Newell *
+ * (C) 2001 by Matt Newell *
+ * newellm@proaxis.com *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version *
+ * *
+ ***************************************************************************/
+
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qstrlist.h>
+#include <qtooltip.h>
+
+#include <kiconloader.h>
+#include <kurlcombobox.h>
+#include <kurlcompletion.h>
+#include <kprotocolinfo.h>
+#include <kdiroperator.h>
+#include <kconfig.h>
+#include <klocale.h>
+#include <kcombobox.h>
+
+#include <kdebug.h>
+
+//#include "fileselector_part.h"
+#include "fileselectorwidget.h"
+
+
+FileSelectorWidget::FileSelectorWidget(QWidget *parent)
+ : QWidget(parent, "file selector widget")
+{
+
+ // widgets and layout
+
+ QVBoxLayout* lo = new QVBoxLayout(this);
+
+ QHBox *hlow = new QHBox (this);
+ lo->addWidget(hlow);
+
+ home = new QPushButton( hlow );
+ home->setPixmap(SmallIcon("gohome"));
+ QToolTip::add(home, i18n("Home folder"));
+ up = new QPushButton( /*i18n("&Up"),*/ hlow );
+ up->setPixmap(SmallIcon("up"));
+ QToolTip::add(up, i18n("Up one level"));
+ back = new QPushButton( /*i18n("&Back"),*/ hlow );
+ back->setPixmap(SmallIcon("back"));
+ QToolTip::add(back, i18n("Previous folder"));
+ forward = new QPushButton( /*i18n("&Next"),*/ hlow );
+ forward->setPixmap(SmallIcon("forward"));
+ QToolTip::add(forward, i18n("Next folder"));
+
+ // HACK
+ QWidget* spacer = new QWidget(hlow);
+ hlow->setStretchFactor(spacer, 1);
+ hlow->setMaximumHeight(up->height());
+
+ cmbPath = new KURLComboBox( KURLComboBox::Directories, true, this, "path combo" );
+ cmbPath->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ));
+ KURLCompletion* cmpl = new KURLCompletion();
+ cmbPath->setCompletionObject( cmpl );
+ lo->addWidget(cmbPath);
+
+ dir = new KDirOperator(QString::null, this, "operator");
+ dir->setView(KFile::Detail);
+ lo->addWidget(dir);
+ lo->setStretchFactor(dir, 2);
+
+ QHBox* filterBox = new QHBox(this);
+ filterIcon = new QLabel(filterBox);
+ filterIcon->setPixmap( BarIcon("filter") );
+ filter = new KHistoryCombo(filterBox, "filter");
+ filter->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ));
+ filterBox->setStretchFactor(filter, 2);
+ lo->addWidget(filterBox);
+
+ // slots and signals
+
+ connect( filter, SIGNAL( activated(const QString&) ), SLOT( slotFilterChange(const QString&) ) );
+ connect( filter, SIGNAL( returnPressed(const QString&) ),filter, SLOT( addToHistory(const QString&) ) );
+
+ connect( home, SIGNAL( clicked() ), dir, SLOT( home() ) );
+ connect( up, SIGNAL( clicked() ), dir, SLOT( cdUp() ) );
+ connect( back, SIGNAL( clicked() ), dir, SLOT( back() ) );
+ connect( forward, SIGNAL( clicked() ), dir, SLOT( forward() ) );
+
+ connect( cmbPath, SIGNAL( urlActivated( const KURL& )),
+ this, SLOT( cmbPathActivated( const KURL& ) ));
+ connect( cmbPath, SIGNAL( returnPressed( const QString& )),
+ this, SLOT( cmbPathReturnPressed( const QString& ) ));
+ connect(dir, SIGNAL(urlEntered(const KURL&)),
+ this, SLOT(dirUrlEntered(const KURL&)) );
+
+ connect(dir, SIGNAL(finishedLoading()),
+ this, SLOT(dirFinishedLoading()) );
+
+
+ connect(dir, SIGNAL(fileHighlighted(const KFileItem *)),
+ SLOT(fileHighlighted(const KFileItem *)));
+ connect(dir, SIGNAL(fileSelected(const KFileItem *)),
+ SLOT(fileSelected(const KFileItem *)));
+
+ kdDebug(90010) << "connected stuff!" << endl;
+}
+
+
+FileSelectorWidget::~FileSelectorWidget()
+{}
+
+KURL FileSelectorWidget::currentDirectory()
+{
+ return dirLister()->url();
+}
+
+void FileSelectorWidget::slotFilterChange( const QString & nf )
+{
+ dir->setNameFilter( nf );
+ dir->rereadDir();
+}
+
+void FileSelectorWidget::cmbPathActivated( const KURL& u )
+{
+ dir->setURL( u, true );
+}
+
+void FileSelectorWidget::cmbPathReturnPressed( const QString& u )
+{
+ dir->setFocus();
+ dir->setURL( KURL(u), true );
+}
+
+
+void FileSelectorWidget::dirUrlEntered( const KURL& u )
+{
+ cmbPath->removeURL( u );
+ QStringList urls = cmbPath->urls();
+ urls.prepend( u.url() );
+ while ( urls.count() >= (uint)cmbPath->maxItems() )
+ urls.remove( urls.last() );
+ cmbPath->setURLs( urls );
+}
+
+
+void FileSelectorWidget::dirFinishedLoading()
+{
+ // HACK - enable the nav buttons
+ // have to wait for diroperator...
+ up->setEnabled( dir->actionCollection()->action( "up" )->isEnabled() );
+ back->setEnabled( dir->actionCollection()->action( "back" )->isEnabled() );
+ forward->setEnabled( dir->actionCollection()->action( "forward" )->isEnabled() );
+ home->setEnabled( dir->actionCollection()->action( "home" )->isEnabled() );
+}
+
+
+void FileSelectorWidget::focusInEvent(QFocusEvent*)
+{
+ dir->setFocus();
+}
+
+void FileSelectorWidget::setDir( KURL u )
+{
+ dir->setURL(u, true);
+}
+
+void FileSelectorWidget::fileHighlighted(const KFileItem *) {
+ kdDebug(90010) << "file highlighted!" << endl;
+}
+
+void FileSelectorWidget::fileSelected(const KFileItem * ) {
+ kdDebug(90010) << "file selected!" << endl;
+}
+#include "fileselectorwidget.moc"
+
diff --git a/noatun-plugins/dub/dub/fileselectorwidget.h b/noatun-plugins/dub/dub/fileselectorwidget.h
new file mode 100644
index 0000000..724173a
--- /dev/null
+++ b/noatun-plugins/dub/dub/fileselectorwidget.h
@@ -0,0 +1,74 @@
+/*-*-c++-*-*****************************************************************
+ * Copyright (C) 2001 by Bernd Gehrmann bernd@kdevelop.org *
+ * Copyright (C) 2002 by Eray Ozkural erayo@cs.bilkent.edu.tr *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef _FILESELECTORWIDGET_H_
+#define _FILESELECTORWIDGET_H_
+
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qstrlist.h>
+#include <qtooltip.h>
+
+#include <klistview.h>
+#include <qvbox.h>
+#include <qwidget.h>
+#include <kfile.h>
+#include <kurlcombobox.h>
+#include <kurlcompletion.h>
+#include <kcombobox.h>
+#include <kprotocolinfo.h>
+#include <kdiroperator.h>
+
+class DubPlayListItem;
+
+class FileSelectorWidget : public QWidget
+{
+ Q_OBJECT
+
+ friend class DubPlayListItem;
+
+public:
+ FileSelectorWidget(QWidget *parent);
+ ~FileSelectorWidget();
+
+ KDirOperator* dirOperator() {return dir;}
+ KDirLister* dirLister() { return dir->dirLister(); }
+ KURL currentDirectory();
+
+public slots:
+ void slotFilterChange(const QString&);
+ void setDir(KURL);
+
+private slots:
+ void cmbPathActivated( const KURL& u );
+ void cmbPathReturnPressed( const QString& u );
+ void dirUrlEntered( const KURL& u );
+ void dirFinishedLoading();
+ void fileHighlighted(const KFileItem *);
+ void fileSelected(const KFileItem *);
+// void setCurrentDocDir();
+
+protected:
+ void focusInEvent(QFocusEvent*);
+
+private:
+
+ KURLComboBox *cmbPath;
+ KHistoryCombo * filter;
+ QLabel* filterIcon;
+ KDirOperator * dir;
+ QPushButton *home, *up, *back, *forward, *cfdir;
+
+};
+
+#endif
diff --git a/noatun-plugins/dub/dub/random.h b/noatun-plugins/dub/dub/random.h
new file mode 100644
index 0000000..cf2a970
--- /dev/null
+++ b/noatun-plugins/dub/dub/random.h
@@ -0,0 +1,43 @@
+//
+//
+// C++ Interface for module: Random
+//
+// Description:
+//
+//
+// Author: exa
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#ifndef Random_Interface
+#define Random_Interface
+
+#include <cstdlib>
+#include <time.h>
+
+// wrapper for random functions
+class Random {
+public:
+ int operator() (int N) {
+ return random_int (N);
+ }
+
+ static void init() {
+ seed += time(0);
+ srandom(seed);
+ }
+ static double random_double (double upper_bound) {
+ return double(random()) * upper_bound / RAND_MAX;
+ }
+
+ static int random_int (int upper_bound) {
+ return random() % upper_bound;
+ }
+private:
+ static int seed;
+};
+
+#endif
+
diff --git a/noatun-plugins/dub/dub/templates/cpp_template b/noatun-plugins/dub/dub/templates/cpp_template
new file mode 100644
index 0000000..9973050
--- /dev/null
+++ b/noatun-plugins/dub/dub/templates/cpp_template
@@ -0,0 +1,15 @@
+//
+//
+// C++ Implementation: |FILENAME|
+//
+// Description:
+//
+//
+// Author: |AUTHOR| <|EMAIL|>, (C) |YEAR|
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+//#include |FILENAME|
+
diff --git a/noatun-plugins/dub/dub/templates/header_template b/noatun-plugins/dub/dub/templates/header_template
new file mode 100644
index 0000000..9ec0a73
--- /dev/null
+++ b/noatun-plugins/dub/dub/templates/header_template
@@ -0,0 +1,21 @@
+//
+//
+// C++ Interface |FILENAME|
+//
+// Description:
+//
+//
+// Author: |AUTHOR|, (C) |YEAR|
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#ifndef |FILENAME|_Interface
+#define |FILENAME|_Interface
+
+#include "General.hxx"
+
+
+
+#endif
diff --git a/noatun-plugins/ffrs/Makefile.am b/noatun-plugins/ffrs/Makefile.am
new file mode 100644
index 0000000..96eae2d
--- /dev/null
+++ b/noatun-plugins/ffrs/Makefile.am
@@ -0,0 +1,17 @@
+INCLUDES= -I$(kde_includes)/arts $(all_includes)
+kde_module_LTLIBRARIES = noatun_ffrs.la
+
+noatun_ffrs_la_SOURCES = ffrs.cpp
+
+noatun_ffrs_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+noatun_ffrs_la_LIBADD = $(LIB_KFILE) -lnoatun -lm
+
+noatun_ffrs_la_METASOURCES = AUTO
+
+noinst_HEADERS = ffrs.h
+
+noatun_DATA = ffrs.plugin
+noatundir = $(kde_datadir)/noatun
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/ffrs.pot
diff --git a/noatun-plugins/ffrs/ffrs.cpp b/noatun-plugins/ffrs/ffrs.cpp
new file mode 100644
index 0000000..5c4282a
--- /dev/null
+++ b/noatun-plugins/ffrs/ffrs.cpp
@@ -0,0 +1,305 @@
+#include <noatun/engine.h>
+#include <noatun/player.h>
+#include <noatun/app.h>
+
+#include <math.h>
+#include <qpainter.h>
+#include <qbitmap.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <qcursor.h>
+#include <qtooltip.h>
+#include <kwin.h>
+
+
+#include "ffrs.h"
+
+extern "C" Plugin *create_plugin()
+{
+ KGlobal::locale()->insertCatalogue("ffrs");
+ return new FFRS();
+}
+
+
+View::View(int width, int height, int block, int unblock, QColor front, QColor back, int channel)
+ : QWidget(0,0, Qt::WStyle_Customize | Qt::WStyle_NoBorder | Qt::WStyle_StaysOnTop | Qt::WType_TopLevel), mChannel(channel)
+{
+ fg = front;
+ bg = back;
+ resize(width, height);
+ setPaletteBackgroundColor(back);
+ KWin::setState(handle(), NET::SkipTaskbar);
+
+ KConfig *c = napp->config();
+ c->setGroup("FFRS");
+
+ QSize size = napp->desktop()->size();
+ QRect desktop(0,0, size.width(), size.height());
+
+ QPoint at;
+ if (channel==0)
+ {
+ at = QPoint(size.width()-width*4, size.height()-height-32);
+ QToolTip::add(this, i18n("Left"));
+ }
+ else // if (channel==1)
+ {
+ at = QPoint(size.width()-width*2, size.height()-height-32);
+ QToolTip::add(this, i18n("Right"));
+ }
+
+ move(c->readPointEntry("at"+QString::number(mChannel), &at));
+
+ // make sure we're on the desktop
+ if (
+ !desktop.contains(rect().topLeft())
+ || !desktop.contains(rect().bottomRight())
+ )
+ {
+ move(at);
+ }
+
+
+ QBitmap mask(width, height);
+ QPainter p(&mask);
+
+// Qt::color0 = transparent
+// Qt::color1 = opaque
+ p.fillRect(0, 0, width, height, Qt::color0);
+ for (int i=0; i < height; )
+ {
+ p.fillRect(0, height-i-block, width, block, Qt::color1);
+ i += block + unblock;
+ }
+ setMask(mask);
+ units = block+unblock;
+ show();
+
+ moving=false;
+}
+
+View::~View()
+{
+ KConfig *c = napp->config();
+ c->setGroup("FFRS");
+ c->writeEntry("at"+QString::number(mChannel), pos());
+}
+
+void View::mouseMoveEvent(QMouseEvent *)
+{
+ if (moving)
+ {
+ move ( QCursor::pos()-mMousePoint );
+ }
+}
+
+void View::mousePressEvent(QMouseEvent *)
+{
+ moving = true;
+ mMousePoint = mapFromGlobal(QCursor::pos());
+}
+
+void View::mouseReleaseEvent(QMouseEvent *)
+{
+ moving = false;
+}
+
+void View::draw(float level)
+{
+ int w = width();
+ int h = height();
+
+ // now convert level to pixels
+
+ static const float LEVEL_MIN = 1.0/(1<<20);
+ if (level < LEVEL_MIN) level = LEVEL_MIN;
+ level = (2.0/log(2.0))*log(level+1.0);
+
+ float fpix = level * (float)h;
+ fpix = fabs(fpix);
+ if (fpix - (int)fpix > .5) fpix += .5;
+
+ int pix = (int)(fpix / units) * units;
+
+ // and draw it (it updates too quickly for it to
+ // need a paintEvent)
+ QPainter p(this);
+ p.fillRect(0, 0, w, h-pix, bg);
+ p.fillRect(0, h-pix, w, h - (h-pix), fg);
+}
+
+
+
+FFRS::FFRS() : QObject(), Plugin()
+{
+ dpyleft = dpyright = 0;
+ changed();
+ prefs = new FFRSPrefs(this);
+ connect(prefs, SIGNAL(changed()), SLOT(changed()));
+
+ setSamples(256);
+
+ start();
+}
+
+FFRS::~FFRS()
+{
+ delete dpyleft;
+ delete dpyright;
+}
+
+void FFRS::scopeEvent(float *left, float *right, int len)
+{
+ float avl=0;
+ float avr=0;
+
+ for (int i=0; i < len; i++)
+ {
+ avl += fabs(left[i]);
+ avr += fabs(right[i]);
+ }
+ avl /= len;
+ avr /= len;
+
+ dpyleft->draw(avl);
+ if (dpyright)
+ dpyright->draw(avr);
+}
+
+void FFRS::changed()
+{
+ delete dpyleft;
+ delete dpyright;
+
+ dpyleft = new View(prefs->width(), prefs->height(), prefs->fgblock(), prefs->bgblock(), prefs->fgcolor(), prefs->bgcolor(), 0);
+ dpyright = new View(prefs->width(), prefs->height(), prefs->fgblock(), prefs->bgblock(), prefs->fgcolor(), prefs->bgcolor(), 1);
+
+ setInterval(prefs->rate());
+}
+
+
+#include <knuminput.h>
+#include <kcolorbutton.h>
+#include <qlayout.h>
+#include <qhbox.h>
+#include <qlabel.h>
+
+FFRSPrefs::FFRSPrefs( QObject *parent )
+ : CModule(i18n("Foreign Region"), i18n("French Foreign Region"),"",parent)
+{
+ QVBoxLayout *layout = new QVBoxLayout(this);
+
+ QHBox *box = new QHBox(this);
+ layout->addWidget(box);
+ new QLabel(i18n("Width:"), box);
+ mWidth = new KIntNumInput(width(), box);
+ mWidth->setMinValue(0);
+
+ box = new QHBox(this);
+ layout->addWidget(box);
+ new QLabel(i18n("Height:"), box);
+ mHeight = new KIntNumInput(height(), box);
+ mHeight->setMinValue(0);
+
+ box = new QHBox(this);
+ layout->addWidget(box);
+ new QLabel(i18n("Visible block size:"), box);
+ mFgblock = new KIntNumInput(fgblock(), box);
+ mFgblock->setMinValue(0);
+
+ box = new QHBox(this);
+ layout->addWidget(box);
+ new QLabel(i18n("Transparent block size:"), box);
+ mBgblock = new KIntNumInput(bgblock(), box);
+ mBgblock->setMinValue(0);
+
+ box = new QHBox(this);
+ layout->addWidget(box);
+ new QLabel(i18n("Update interval:"), box);
+ mRate = new KIntNumInput(rate(), box);
+ mRate->setMinValue(0);
+
+ box = new QHBox(this);
+ layout->addWidget(box);
+ new QLabel(i18n("Foreground color:"), box);
+ mFgcolor = new KColorButton(fgcolor(), box);
+
+ box = new QHBox(this);
+ layout->addWidget(box);
+ new QLabel(i18n("Background color:"), box);
+ mBgcolor = new KColorButton(bgcolor(), box);
+
+ layout->addStretch();
+}
+
+void FFRSPrefs::save()
+{
+ KConfig *c = napp->config();
+
+ c->setGroup("FFRS");
+ c->writeEntry("width", mWidth->value());
+ c->writeEntry("height", mHeight->value());
+ c->writeEntry("fgblock", mFgblock->value());
+ c->writeEntry("bgblock", mBgblock->value());
+ c->writeEntry("rate", mRate->value());
+
+ c->writeEntry("bgcolor", mBgcolor->color());
+ c->writeEntry("fgcolor", mFgcolor->color());
+
+ emit changed();
+}
+
+int FFRSPrefs::width()
+{
+ KConfig *c = napp->config();
+ c->setGroup("FFRS");
+ return c->readNumEntry("width", 22);
+}
+
+int FFRSPrefs::height()
+{
+ KConfig *c = napp->config();
+ c->setGroup("FFRS");
+ return c->readNumEntry("height", 162);
+}
+
+int FFRSPrefs::fgblock()
+{
+ KConfig *c = napp->config();
+ c->setGroup("FFRS");
+ return c->readNumEntry("fgblock", 27-12);
+}
+
+int FFRSPrefs::bgblock()
+{
+ KConfig *c = napp->config();
+ c->setGroup("FFRS");
+ return c->readNumEntry("bgblock", 12);
+}
+
+int FFRSPrefs::rate()
+{
+ KConfig *c = napp->config();
+ c->setGroup("FFRS");
+ return c->readNumEntry("rate", 110);
+}
+
+
+QColor FFRSPrefs::bgcolor()
+{
+ KConfig *c = napp->config();
+ c->setGroup("FFRS");
+ QColor dumbass(0, 64, 0);
+ return c->readColorEntry("bgcolor", &dumbass);
+}
+
+QColor FFRSPrefs::fgcolor()
+{
+ KConfig *c = napp->config();
+ c->setGroup("FFRS");
+ QColor dumbass(0, 255, 0);
+ return c->readColorEntry("fgcolor", &dumbass);
+}
+
+#include "ffrs.moc"
+
diff --git a/noatun-plugins/ffrs/ffrs.h b/noatun-plugins/ffrs/ffrs.h
new file mode 100644
index 0000000..b97c576
--- /dev/null
+++ b/noatun-plugins/ffrs/ffrs.h
@@ -0,0 +1,80 @@
+#ifndef FFRS_H
+#define FFRS_H
+
+#include <noatun/pref.h>
+#include <noatun/plugin.h>
+
+
+class View : public QWidget
+{
+Q_OBJECT
+public:
+ View(int width, int height, int block, int unblock, QColor front, QColor back, int channel);
+ ~View();
+
+ void draw(float intensity);
+
+ virtual void mouseMoveEvent(QMouseEvent *e);
+ virtual void mousePressEvent(QMouseEvent *e);
+ virtual void mouseReleaseEvent(QMouseEvent *e);
+
+private:
+ int units;
+ QColor fg, bg;
+ bool moving;
+ QPoint mMousePoint;
+ int mChannel;
+};
+
+class FFRSPrefs;
+
+class FFRS : public QObject, public Plugin, public StereoScope
+{
+Q_OBJECT
+
+public:
+ FFRS();
+ ~FFRS();
+
+ virtual void scopeEvent(float *left, float *right, int len);
+
+public slots:
+ void changed();
+
+private:
+ View *dpyleft, *dpyright;
+ FFRSPrefs *prefs;
+};
+
+
+class KIntNumInput;
+class KColorButton;
+
+class FFRSPrefs : public CModule
+{
+Q_OBJECT
+
+public:
+ FFRSPrefs( QObject *parent );
+ virtual void save();
+
+ int width();
+ int height();
+ int fgblock();
+ int bgblock();
+ int rate();
+
+ QColor bgcolor();
+ QColor fgcolor();
+
+signals:
+ void changed();
+
+private:
+ KIntNumInput *mWidth, *mHeight, *mFgblock, *mBgblock, *mRate;
+ KColorButton *mBgcolor, *mFgcolor;
+};
+
+
+#endif
+
diff --git a/noatun-plugins/ffrs/ffrs.plugin b/noatun-plugins/ffrs/ffrs.plugin
new file mode 100644
index 0000000..2213169
--- /dev/null
+++ b/noatun-plugins/ffrs/ffrs.plugin
@@ -0,0 +1,108 @@
+Filename=noatun_ffrs.la
+Author=Charles Samuels
+Site=http://noatun.kde.org
+Email=charles@kde.org
+Type=visualization
+License=BSD with Advertising Clause
+Name=French Foreign Region
+Name[af]=Franse Buiteland Streek
+Name[az]=Fransız Xarici Bölgə
+Name[bg]=Френски регион
+Name[bs]=Francuski strani region
+Name[ca]=Comarca estrangera francesa
+Name[cs]=Cizí francouzský region
+Name[cy]=Ardal Estron Ffrengig
+Name[da]=Fransk udlandsområde
+Name[de]=Ausländische Regionen (franz.)
+Name[eo]=Franca eksterlanda regio
+Name[es]=Región externa francesa
+Name[et]=Prantsuse välisalad
+Name[eu]=Frantziaren atzerriko lurraldea
+Name[fa]=منطقۀ بیگانۀ فرانسوی
+Name[fr]=Région étrangère française
+Name[fy]=Bûtenlânske gebieten (Frânsktalich)
+Name[ga]=Réigiún Coigríochach na Fraince
+Name[gl]=Rexión Estranxeira da Franza
+Name[hi]=फ्रांसीसी विदेशी क्षेत्र
+Name[hr]=Francuska Legija stranaca
+Name[is]=Franska útlendingasveitin
+Name[it]=Legione Straniera Francese
+Name[ka]=ფრანგული საზღვარგარეთ რეგიონი
+Name[kk]=Францияның шетел өлкесі
+Name[km]=តំបន់​​ខាង​ក្រៅ​​ ភាសាបារាំង
+Name[lt]=Prancūzų užsieniečių regionas
+Name[mk]=Француски странски регион
+Name[ms]=Rantau Asing Perancis
+Name[nb]=Franske fremmedlegion
+Name[nds]=Franzöösch frömd Regioon
+Name[ne]=फ्रेन्च विदेशी क्षेत्र
+Name[nl]=Buitenlandse gebieden (Franstalig)
+Name[nn]=Den franske framandregionen
+Name[pa]=ਫਰੈਂਚ ਵਿਦੇਸ਼ੀ ਖੇਤਰ
+Name[pl]=Natężenie dźwięku
+Name[pt]=Região Estrangeira da França
+Name[pt_BR]=Legião Estrangeira Francesa
+Name[ro]=Regiunea străină franceză
+Name[ru]=Зрительный образ Плавающие кривые
+Name[sk]=Francúzske zahraničné regióny
+Name[sl]=Francosko tuje področje
+Name[sr]=Француски страни регион
+Name[sr@Latn]=Francuski strani region
+Name[sv]=Franska främlingslegionen
+Name[ta]=பிரான்சு வெளியிடம்
+Name[tg]=Намуди тамошобини мавҷҳои каҷ
+Name[tr]=Fransız Yabancı Bölge
+Name[uk]=Французький іноземний регіон
+Name[vi]=Miền ngoài Pháp
+Name[xh]=Ummandla welizwe langaphandle lwesiFrentshi
+Name[zh_CN]=法国外籍兵团
+Name[zh_TW]=法國國外區域
+Comment=Floating scopes
+Comment[bg]=Хвърчащи сфери
+Comment[bs]=Plutajući scopes
+Comment[ca]=Camps flotants
+Comment[cs]=Plovoucí sloupce
+Comment[da]=Svævende skoper
+Comment[de]=Gleitendes Oszilloskop
+Comment[el]=Επιπλέοντα καλειδοσκόπια
+Comment[eo]=Flosantaj borderoj
+Comment[es]=Alcance variable
+Comment[et]=Hõljuv ostsilloskoop
+Comment[eu]=Eremu flotatzaileak
+Comment[fa]=دامنه‌های شناور
+Comment[fi]=Kelluvat oskiloskoopit
+Comment[fr]=Scopes flottants
+Comment[fy]=Driuwende Ossillioskopen
+Comment[gl]=Osciloscópios flutuantes
+Comment[he]=תחומים צפים
+Comment[hi]=फ्लोटिंग स्कोप्स
+Comment[hr]=Plivajući oscilograf
+Comment[hu]=Lebegő monoszkópok
+Comment[is]=Fljótandi mælar
+Comment[it]=Floating Scopes
+Comment[ka]=მოტივტივე მრუდები
+Comment[kk]=Қалқымалы көрінісі
+Comment[km]=វិសាល​ភាព​​​អណ្ដែត
+Comment[lt]=Plaukiojančios kreivės
+Comment[mk]=Лебдечки осцилоскопи
+Comment[ms]=Skop Apung
+Comment[nb]=Flytende skop
+Comment[nds]=Sweven Frequenzkieker
+Comment[ne]=उत्प्लावन क्षेत्र
+Comment[nl]=Drijvende Oscillioscopen
+Comment[nn]=Flytande skop
+Comment[pl]=Przesuwany wskaźnik natężenia dźwięku
+Comment[pt]=Osciloscópios flutuantes
+Comment[pt_BR]=Escopos Flutuantes
+Comment[ru]=Плавающие кривые
+Comment[sk]=Plávajúce rámce
+Comment[sl]=Plavajoči analizatorji
+Comment[sr]=Плутајући опсези
+Comment[sr@Latn]=Plutajući opsezi
+Comment[sv]=Flytande oscilloskop
+Comment[ta]=மிதவு வரையெல்லைகள்
+Comment[tg]=Мавҷҳои каҷ
+Comment[tr]=Yüzen alanlar
+Comment[uk]=Плаваючі криві
+Comment[vi]=Xem nổi
+Comment[zh_CN]=浮动观测器
diff --git a/noatun-plugins/luckytag/Makefile.am b/noatun-plugins/luckytag/Makefile.am
new file mode 100644
index 0000000..4e02899
--- /dev/null
+++ b/noatun-plugins/luckytag/Makefile.am
@@ -0,0 +1,11 @@
+INCLUDES= $(all_includes)
+kde_module_LTLIBRARIES = noatunluckytag.la
+
+noatunluckytag_la_SOURCES = luckytag.cpp parsedmp3filename.cpp
+noatunluckytag_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+noatunluckytag_la_LIBADD = $(LIB_KFILE) -lnoatun -lnoatuntags
+
+noatunluckytag_la_METASOURCES = AUTO
+
+noatun_DATA = luckytag.plugin
+noatundir = $(kde_datadir)/noatun
diff --git a/noatun-plugins/luckytag/luckytag.cpp b/noatun-plugins/luckytag/luckytag.cpp
new file mode 100644
index 0000000..d040659
--- /dev/null
+++ b/noatun-plugins/luckytag/luckytag.cpp
@@ -0,0 +1,49 @@
+// Copyright (c) 2001 Neil Stevens <multivac@fcmail.com>
+//
+// 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 BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIAB\ILITY, 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.
+
+#include <noatun/app.h>
+#include <noatun/playlist.h>
+#include <noatun/player.h>
+#include "luckytag.h"
+#include "parsedmp3filename.h"
+
+extern "C" Plugin *create_plugin()
+{
+ return new LuckyTagger;
+}
+
+LuckyTagger::LuckyTagger(void) : Tags(-10)
+{
+}
+
+bool LuckyTagger::update(PlaylistItem &item)
+{
+ ParsedMP3FileName parsed(item.file());
+
+ if(parsed.title().length())
+ item.setProperty("title", parsed.title());
+ if(parsed.artist().length())
+ item.setProperty("author", parsed.artist());
+ if(parsed.album().length())
+ item.setProperty("album", parsed.album());
+ if(parsed.comment().length())
+ item.setProperty("comment", parsed.comment());
+ return true;
+}
+
diff --git a/noatun-plugins/luckytag/luckytag.h b/noatun-plugins/luckytag/luckytag.h
new file mode 100644
index 0000000..964cd8d
--- /dev/null
+++ b/noatun-plugins/luckytag/luckytag.h
@@ -0,0 +1,35 @@
+// Copyright (c) 2001 Neil Stevens <multivac@fcmail.com>
+//
+// 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 BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIAB\ILITY, 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.
+
+#ifndef LUCKYTAG_H
+#define LUCKYTAG_H
+
+#include <noatun/plugin.h>
+#include <noatun/tags.h>
+#include <qobject.h>
+
+class LuckyTagger : public Tags, public Plugin
+{
+public:
+ LuckyTagger(void);
+
+ virtual bool update(PlaylistItem &item);
+};
+
+#endif
diff --git a/noatun-plugins/luckytag/luckytag.plugin b/noatun-plugins/luckytag/luckytag.plugin
new file mode 100644
index 0000000..1ed44ac
--- /dev/null
+++ b/noatun-plugins/luckytag/luckytag.plugin
@@ -0,0 +1,121 @@
+Filename=noatunluckytag.la
+Author=Frerich Raabe
+Site=http://noatun.kde.org/
+Type=other
+License=BSD
+Name=Lucky Tag Reader
+Name[af]=Gelukkig Etiket Leser
+Name[ar]=قارئ العلامات المحظوظ
+Name[az]=Lucky Taq Oxuyucusu
+Name[bs]=Sretni čitač tagova
+Name[ca]=Lector d'etiquetes Lucky
+Name[cs]=Chytré čtení tagů
+Name[cy]=Darllenydd Tag Lwcus
+Name[da]=Heldig mærkelæser
+Name[de]=Metainfo-Leser
+Name[el]=Τυχερός αναγνώστης ετικετών
+Name[eo]=Feliĉa etikedlegilo
+Name[es]=Un bonito lector de etiquetas
+Name[et]=Palainfo äraarvaja
+Name[eu]=Lucky etiketa irakurgailua
+Name[fa]=خوانندۀ برچسب خوش‌شانس
+Name[fi]=Onnekas tagien lukija
+Name[fr]=Lecteur de balise
+Name[fy]=Lokkige notysjelêzer
+Name[gl]=Leitor de Marcas Lucky
+Name[he]=קורא תגיות בר־מזל
+Name[hi]=लकी टैग रीडर
+Name[hr]=Lucky čitač oznaka
+Name[is]=Heppni merkingalesarinn
+Name[it]=Lettore Tag Lucky
+Name[ja]=Lucky タグリーダー
+Name[ka]=ბედნიერი ჭდის მკითხველი
+Name[kk]=Мультимедиа файлының сипаттамаларын табу
+Name[km]=កម្មវិធី​អាន​ស្លាក Lucky
+Name[lt]=Sėkminga etikečių skaityklė
+Name[mk]=Читач на ознаки на среќа
+Name[ms]=Pembaca tag Bertuah
+Name[nb]=Tagleser med flaks
+Name[nds]=Metainfo-Leser
+Name[ne]=भाग्यमानी ट्याग पाठक
+Name[nl]=Gelukkige notitielezer
+Name[nn]=Taglesar med lukke
+Name[pl]=Zgadywacz oznaczeń plików
+Name[pt]=Leitor de Marcas Lucky
+Name[pt_BR]=Leitor de símbolos
+Name[ro]=Cititor de taguri prin ghicire
+Name[ru]=Теги из файла мультимедиа
+Name[sk]=Lucky Tag čítačka
+Name[sl]=Bralnik oznak Lucky Tag
+Name[sr]=Читач срећних ознака
+Name[sr@Latn]=Čitač srećnih oznaka
+Name[sv]=Tursam taggläsare
+Name[ta]=லக்கி ஒட்டு வாசிப்பாளர்
+Name[tg]=Тег аз файли мултимедиа
+Name[tr]=Luck Etiket Okuyucu
+Name[uk]=Читач міток Lucky
+Name[uz]=Laki teg oʻquvchi
+Name[uz@cyrillic]=Лаки тэг ўқувчи
+Name[vi]=Bộ đọc thẻ may
+Name[xh]=Umfundi onentlahla weTag
+Name[zh_CN]=幸运标签读取器
+Name[zh_TW]=幸運標籤閱讀器
+Comment=Guesses tag information from the filename
+Comment[af]=Raaiskote etiket informasie van die lêernaam
+Comment[ar]=يحزر معلومات العلامات من اسم الملف
+Comment[az]=Fay adından taq mə'lumatını tapmağa çalışır
+Comment[bg]=Отгатване на информацията за песните от името на файла
+Comment[bs]=Pogađa informacije za tag iz imena datoteke
+Comment[ca]=Intenta endevinar el contingut de l'etiqueta a partir del nom del fitxer
+Comment[cs]=Odhaduje informace o značkách z názvu souboru
+Comment[cy]=Dyfalu gwybodaeth tag o enw'r ffeil
+Comment[da]=Gætter mærkeinformation fra filnavn
+Comment[de]=Errät "auf gut Glück" Metainformationen aus dem Dateinamen
+Comment[el]=Μαντεύει τις πληροφορίες ετικέτας από το όνομα του αρχείου
+Comment[eo]=Divenas etikedan informon el la dosiernomo
+Comment[es]=Obtiene información para la etiqueta a partir del nombre del archivo
+Comment[et]=Oletab mängitava loo infot failinime põhjal
+Comment[eu]=Etiketen informazioa fitxategi izenetik abiatuta igarten du
+Comment[fa]=اطلاعات برچسب را از نام پرونده حدس می‌زند
+Comment[fi]=Arvaa tagitiedot suoraan tiedostonimestä
+Comment[fr]=Devine les informations de balises à partir du nom de fichier
+Comment[fy]=Riedt de notysje-ynformaasje út de triemnamme
+Comment[gl]=Adiviña a información das marcas a partir do nome do ficheiro
+Comment[he]=ניחוש מידע התגיות מתוך שם הקובץ
+Comment[hi]=फ़ाइल-नामों से टैग जानकारी का अंदाजा लगाता है
+Comment[hr]=Nagađa podatke u oznaci iz naziva datoteke
+Comment[hu]=Tag-információ a fájlnév alapján
+Comment[is]=Giskar á lagamerkingar útfrá skráarheitum
+Comment[it]=Indovina le informazioni dei tag dal nome del file
+Comment[ja]=ファイル名からタグ情報を推測
+Comment[ka]=ჭდის ინფორმაციას ფაილის სახელიდან ხვდება
+Comment[kk]=Мультимедиа файлының атауына жүгініп сипаттамаларын табу
+Comment[km]=ព័ត៌មាន​ស្លាក Guesses ពី​ឈ្មោះ​ឯកសារ
+Comment[lt]=Atspėja etiketės informaciją tiesiog iš bylos pavadinimo
+Comment[mk]=Ги погодува информациите за ознаката од името на датотеката
+Comment[ms]=Meneka maklumat tag dari nama fail
+Comment[nb]=Gjetter tag-informasjon fra filnavnen
+Comment[nds]=Raadt Betekerinformatschonen ut den Dateinaam
+Comment[ne]=फाइलनामबाट ट्याग सूचना अनुमान गर्छ
+Comment[nl]=Raadt de notitie-informatie uit de bestandsnaam
+Comment[nn]=Gissar tag-informasjon frå filnamnet
+Comment[pl]=Zgaduje oznaczenia dla pliku z jego nazwy
+Comment[pt]=Adivinha a informação das marcas a partir do nome do ficheiro
+Comment[pt_BR]=Informações de símbolos do nome do arquivo
+Comment[ro]=Ghiceşte informaţiile de tag din numele de fişier
+Comment[ru]=Получение тегов из файла
+Comment[sk]=Háda tag informácie z názvu súborov
+Comment[sl]=Informacije o značkah, uganjenih iz imena datoteke
+Comment[sr]=Погађа информације о ознакама из имена фајла
+Comment[sr@Latn]=Pogađa informacije o oznakama iz imena fajla
+Comment[sv]=Gissar tagginformation från filnamnet
+Comment[ta]=கோப்பு பெயரில் இருந்து கட்டளை தகவலை கண்டுபிடிக்கிறது
+Comment[tg]=Гирифтани тегҳои аз файл
+Comment[tr]=Dosya isminden etiketi bilgisini tahmin etmeye çalışır
+Comment[uk]=Вгадує інформацію про мітку з назви файла
+Comment[uz]=Teg maʼlumotini faylning nomidan taxmin qilish
+Comment[uz@cyrillic]=Тэг маълумотини файлнинг номидан тахмин қилиш
+Comment[vi]=Đoán thông tin thẻ từ tên tập tin
+Comment[xh]=Iqikelela ulwazi lwe tag ukusuka kwi gama lefayile
+Comment[zh_CN]=从文件名中猜测标签信息
+Comment[zh_TW]=從檔名猜測標籤
diff --git a/noatun-plugins/luckytag/parsedmp3filename.cpp b/noatun-plugins/luckytag/parsedmp3filename.cpp
new file mode 100644
index 0000000..a3006bd
--- /dev/null
+++ b/noatun-plugins/luckytag/parsedmp3filename.cpp
@@ -0,0 +1,98 @@
+// Copyright (c) 2001 Frerich Raabe <raabe@kde.org>
+//
+// 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 BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIAB\ILITY, 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.
+
+#include "parsedmp3filename.h"
+
+#include <qstring.h>
+#include <qstringlist.h>
+
+#include <kurl.h>
+
+ParsedMP3FileName::ParsedMP3FileName(const QString &path)
+{
+ KURL url = path;
+
+ QString fileName = url.fileName(false);
+ m_directories = QStringList::split("/", url.directory());
+
+ if (fileName.startsWith("(") && fileName.contains(")"))
+ {
+ m_artist = fileName.mid(1, fileName.find(")") - 1);
+ m_title = fileName.right(fileName.length() - fileName.find(")") - 1);
+ validateArtist();
+ }
+ else if (fileName.startsWith("[") && fileName.contains("]"))
+ {
+ m_artist = fileName.mid(1, fileName.find("]") - 1);
+ m_title = fileName.right(fileName.length() - fileName.find("]") - 1);
+ validateArtist();
+ }
+ else if (fileName.contains("-"))
+ {
+ m_artist = fileName.left(fileName.find("-") - 1);
+ m_title = fileName.right(fileName.length() - fileName.find("-") - 1);
+ validateArtist();
+ }
+ else
+ {
+ m_title = fileName;
+ m_album = m_directories.last();
+ m_artist = m_directories[m_directories.count() - 2];
+ }
+
+ if (m_title.contains("(") && m_title.find(")", m_title.find("(")))
+ {
+ unsigned int start = m_title.find("(");
+ unsigned int end = m_title.find(")");
+ m_comment = m_title.mid(start + 1, end - start - 1);
+ m_title.truncate(start);
+ }
+
+ m_title = beautifyString(m_title);
+ if (m_title.right(4) == ".mp3")
+ m_title.truncate(m_title.length() - 4);
+ m_artist = beautifyString(m_artist);
+ m_album = beautifyString(m_album);
+ m_comment = beautifyString(m_comment);
+}
+
+void ParsedMP3FileName::validateArtist()
+{
+ bool couldConvert;
+ if (m_artist.toUShort(&couldConvert) < 30 && couldConvert)
+ m_artist = m_directories[m_directories.count() - 2];
+ m_album = m_directories.last();
+}
+
+QString ParsedMP3FileName::beautifyString(const QString &s)
+{
+ QString temp = s.lower().simplifyWhiteSpace();
+
+ temp[0] = temp[0].upper();
+
+ unsigned int numSpaces = temp.contains(" ");
+ unsigned int spacePos = 0;
+ while (numSpaces > 0) {
+ spacePos = temp.find(" ", spacePos == 0? 0 : spacePos + 1);
+ temp[spacePos + 1] = temp[spacePos + 1].upper();
+ numSpaces--;
+ }
+
+ return temp;
+}
diff --git a/noatun-plugins/luckytag/parsedmp3filename.h b/noatun-plugins/luckytag/parsedmp3filename.h
new file mode 100644
index 0000000..5dc2809
--- /dev/null
+++ b/noatun-plugins/luckytag/parsedmp3filename.h
@@ -0,0 +1,49 @@
+// Copyright (c) 2001 Frerich Raabe <raabe@kde.org>
+//
+// 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 BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIAB\ILITY, 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.
+
+#ifndef PARSEDMP3FILENAME_H
+#define PARSEDMP3FILENAME_H
+
+#include <qstringlist.h>
+
+class ParsedMP3FileName
+{
+public:
+ ParsedMP3FileName(const QString &);
+ ~ParsedMP3FileName() {}
+
+ QString title() const { return m_title; }
+ QString artist() const { return m_artist; }
+ QString album() const { return m_album; }
+ QString comment() const { return m_comment; }
+
+protected:
+ QString m_title;
+ QString m_artist;
+ QString m_album;
+ QString m_comment;
+
+private:
+ void validateArtist();
+ QString beautifyString(const QString &);
+
+ QStringList m_directories;
+};
+
+#endif
diff --git a/noatun-plugins/lyrics/Makefile.am b/noatun-plugins/lyrics/Makefile.am
new file mode 100644
index 0000000..ac34a17
--- /dev/null
+++ b/noatun-plugins/lyrics/Makefile.am
@@ -0,0 +1,17 @@
+INCLUDES= $(all_includes)
+kde_module_LTLIBRARIES = noatunlyrics.la
+
+noatunlyrics_la_SOURCES = lyrics.cpp historymanager.cpp cmodule.cpp
+
+noatunlyrics_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+noatunlyrics_la_LIBADD = $(LIB_KHTML) $(LIB_KFILE) -lnoatun
+
+noatunlyrics_la_METASOURCES = AUTO
+
+noinst_HEADERS = lyrics.h
+
+noatun_DATA = lyrics.plugin lyricsui.rc
+noatundir = $(kde_datadir)/noatun
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/lyrics.pot
diff --git a/noatun-plugins/lyrics/TODO b/noatun-plugins/lyrics/TODO
new file mode 100644
index 0000000..0b0c503
--- /dev/null
+++ b/noatun-plugins/lyrics/TODO
@@ -0,0 +1,17 @@
+*** TODO for the Lyrics plugin
+ any contribution is welcomed! ***
+
+- Save scroll position (in a per search engine basis, probably)
+ - To account for tables (like in SM)
+- Save Lyrics to file:
+ - As a URL
+ - As a HTML file
+ - As Selected text
+- Automatically searchs at all the places
+ (configurable "no result" regexp)
+- Ideas for the interface:
+ - Save as (URL|HTML|SELECTED TEXT)
+ - Auto save songs (at ~ or global)
+ - Remove (.*) ie, stuff like (live), (cover), etc
+ - Remove non alphabetic stuff
+- Max search size
diff --git a/noatun-plugins/lyrics/cmodule.cpp b/noatun-plugins/lyrics/cmodule.cpp
new file mode 100644
index 0000000..2501ebb
--- /dev/null
+++ b/noatun-plugins/lyrics/cmodule.cpp
@@ -0,0 +1,218 @@
+#include "cmodule.h"
+#include "lyrics.h"
+#include <qlayout.h>
+#include <qstringlist.h>
+#include <qlabel.h>
+#include <kmessagebox.h>
+#include <qvgroupbox.h>
+#include <qgrid.h>
+#include <klistbox.h>
+#include <klineedit.h>
+#include <kbuttonbox.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kdebug.h>
+
+extern Lyrics *lyrics;
+
+const char *const DEFAULT_NAME =
+ "Google,"
+ "Pure Lyrics,"
+ "Sing365,"
+ "Lyrics Planet,"
+ "Lyrics World,"
+ "Get Lyrics,"
+ "AZLyrics,"
+ "Astraweb,"
+ "SongMeanings,"
+ "Google (Feeling Lucky),"
+ "Everything2,"
+ "Everything2 (author info)";
+
+const char *const DEFAULT_QUERY =
+ "http://www.google.com/search?q=lyrics+$(title)+$(author)+$(album),"
+ "http://www.purelyrics.com/index.php?search_artist=$(author)&search_album=$(album)&search_title=$(title)&search_lyrics=&search_advsubmit2=Search,"
+ "http://search.sing365.com/search.php?searchstr=$(title)&submit=search&category=song,"
+ "http://www.lyricsplanet.com/index.php3?style=searchtitle&fix=1&searchstring=$(title),"
+ "http://www.lyricsworld.com/cgi-bin/search.cgi?q=$(title)+$(author),"
+ "http://www.getlyrics.com/search.php?Song=$(title),"
+ "http://www.azlyrics.com/cgi-bin/s.cgi?q=$(title)+$(author),"
+ "http://search.lyrics.astraweb.com?word=$(title)+$(author)+$(album),"
+ "http://www.songmeanings.net/search.php?type=titles&query=$(title),"
+ "http://www.google.com/search?q=lyrics+%22$(title)%22+%22$(author)%22+%22$(album)%22&btnI=I%27m+Feeling+Lucky,"
+ "http://everything2.com/index.pl?node=$(title),"
+ "http://everything2.com/index.pl?node=$(author),"
+ "http://www.letssingit.com/cgi-exe/am.cgi?a=search&p=1&s=$(title)&l=song";
+
+LyricsCModule::LyricsCModule(QObject *_parent) : CModule(i18n("Lyrics"), i18n("Configure Lyrics Plugin"), "document", _parent) {
+ /* Thanks to the kde-usability guys for the help designing this dialog!
+ * help to simon edwards of KGuardGod, for a big help designing it */
+ QVBoxLayout *vlayout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
+ QHBoxLayout *hlayout = new QHBoxLayout(vlayout, KDialog::spacingHint());
+ vlayout->setStretchFactor( hlayout, 1 );
+
+ // Search box
+ QVBoxLayout *boxlayout = new QVBoxLayout( hlayout, KDialog::spacingHint() );
+ boxlayout->addWidget( new QLabel( i18n("Search providers:" ), this ) );
+ providersBox = new KListBox( this, "providersBox" );
+ boxlayout->addWidget(providersBox);
+
+ boxButtons = new KButtonBox( this, Vertical );
+ boxButtons->addButton( i18n( "New Search Provider" ), this, SLOT( newSearch() ) );
+ boxButtons->addButton( i18n( "Delete Search Provider" ), this, SLOT( delSearch() ) );
+ boxButtons->addButton( i18n( "Move Up" ), this, SLOT( moveUpSearch() ) );
+ boxButtons->addButton( i18n( "Move Down" ), this, SLOT( moveDownSearch() ) );
+ boxButtons->layout();
+ boxlayout->addWidget( boxButtons );
+
+ // Edit box
+ QGroupBox *propBox = new QVGroupBox( i18n("Search Provider Properties" ), this );
+ QGrid *editGrid = new QGrid(2, propBox );
+ editGrid->setSpacing( propBox->insideSpacing() );
+ new QLabel( i18n( "Name:" ), editGrid );
+ nameEdit = new KLineEdit( editGrid );
+ new QLabel( i18n( "Query:" ), editGrid );
+ queryEdit = new KLineEdit( editGrid );
+ /* ATTENTION to translators:
+ * The property names can't be translated. This means that $(author) must be kept as $(author), $(title) as $(title), etc, or it won't work.*/
+ QLabel *textLabel = new QLabel(i18n("For your query, you can use any property of your multimedia item, just enclosing it with a $(property).\n\nSome common properties used are $(title), $(author) and $(album). For example, to search in Google for the author, title and track, just use:\nhttp://www.google.com/search?q=$(author)+$(title)+$(track)"), propBox, "textLabel");
+ textLabel->setAlignment(Qt::WordBreak);
+ hlayout->addWidget( propBox, 1 );
+
+ /* Signal/slots */
+ nameEdit->setEnabled( false );
+ queryEdit->setEnabled( false );
+ connect( providersBox, SIGNAL( highlighted( QListBoxItem * ) ), this, SLOT( selected( QListBoxItem * ) ) );
+ connect( nameEdit, SIGNAL( textChanged( const QString &) ), this, SLOT( nameChanged( const QString & ) ) );
+ connect( queryEdit, SIGNAL( textChanged( const QString & ) ), this, SLOT( queryChanged( const QString & ) ) );
+
+
+
+ vlayout->addStretch();
+ reopen();
+ save();
+}
+
+void LyricsCModule::newSearch(QString name, QString query) {
+ kdDebug(90020) << "New search" << endl;
+ SearchProvider s = { name, query };
+ mProviders.push_back( s );
+ providersBox->insertItem( name );
+ providersBox->setCurrentItem( providersBox->count()-1 );
+ nameEdit->setEnabled( true );
+ queryEdit->setEnabled( true );
+//X if ( providersBox->count() == 1 )
+//X providersBox->setCurrentItem( 0 );
+}
+
+void LyricsCModule::selected( QListBoxItem *i ) {
+ kdDebug(90020) << "selected" << endl;
+ int index = providersBox->index( i );
+ if ( index < 0 )
+ return;
+ if ( nameEdit->text() != mProviders[ index ].name )
+ nameEdit->setText( mProviders[ index ].name );
+ if ( queryEdit->text() != mProviders[ index ].url )
+ queryEdit->setText( mProviders[ index ].url );
+}
+
+
+void LyricsCModule::delSearch() {
+ if ( mProviders.size() == 1 ) {
+ KMessageBox::sorry( this, i18n( "You must have at least one search provider. The current one will not be removed." ) );
+ return;
+ }
+ int index = providersBox->currentItem();
+ QValueVector<SearchProvider>::iterator it;
+ for ( it = mProviders.begin(); ( *it ).name != mProviders[ index ].name || ( *it ).url != mProviders[ index ].url; ++it );
+ mProviders.erase( it );
+ providersBox->removeItem( index );
+ providersBox->setSelected( providersBox->currentItem(), true );
+}
+
+void LyricsCModule::moveUpSearch() {
+ if ( providersBox->currentItem() <= 0 )
+ return;
+ int index = providersBox->currentItem();
+ QString name = mProviders[ index ].name;
+ QString url = mProviders[ index ].url;
+ mProviders[ index ].name = mProviders[ index-1 ].name;
+ mProviders[ index ].url = mProviders[ index-1 ].url;
+ mProviders[ index-1 ].name = name;
+ mProviders[ index-1 ].url = url;
+ providersBox->changeItem( mProviders[ index-1 ].name, index-1 );
+ providersBox->changeItem( mProviders[ index ].name, index );
+ providersBox->setSelected( index-1, true );
+}
+
+void LyricsCModule::moveDownSearch() {
+ if ( static_cast<unsigned int>( providersBox->currentItem() ) >= providersBox->count()-1 )
+ return;
+ int index = providersBox->currentItem();
+ QString name = mProviders[ index ].name;
+ QString url = mProviders[ index ].url;
+ mProviders[ index ].name = mProviders[ index+1 ].name;
+ mProviders[ index ].url = mProviders[ index+1 ].url;
+ mProviders[ index+1 ].name = name;
+ mProviders[ index+1 ].url = url;
+ providersBox->changeItem( mProviders[ index+1 ].name, index+1 );
+ providersBox->changeItem( mProviders[ index ].name, index );
+ providersBox->setSelected( index+1, true );
+}
+
+void LyricsCModule::nameChanged( const QString &name ) {
+ kdDebug(90020) << "name changed" << endl;
+ if ( providersBox->currentItem() < 0 )
+ return;
+ mProviders[ providersBox->currentItem() ].name = name;
+ if ( name != providersBox->text( providersBox->currentItem() ) )
+ providersBox->changeItem( name, providersBox->currentItem() );
+}
+
+void LyricsCModule::queryChanged( const QString &query ) {
+ kdDebug(90020) << "query changed" << endl;
+ if ( providersBox->currentItem() < 0 )
+ return;
+ mProviders[ providersBox->currentItem() ].url = query;
+}
+
+
+void LyricsCModule::save() {
+ KConfig *conf = KGlobal::config();
+ conf->setGroup( "Lyrics" );
+ QStringList queryList, nameList;
+ QValueVector<SearchProvider>::iterator it;
+ for ( it = mProviders.begin(); it != mProviders.end(); ++it ) {
+ kdDebug(90020) << "query:" << ( *it ).url << endl;
+ queryList += ( *it ).url;
+ nameList += ( *it ).name;
+ }
+ conf->writeEntry( "queryList", queryList );
+ conf->writeEntry( "nameList", nameList );
+ /* TODO */
+ // APPLY settings
+ if ( lyrics )
+ lyrics->setProviders( mProviders );
+}
+
+void LyricsCModule::reopen() {
+ QStringList queryList, nameList;
+ KConfig *conf = KGlobal::config();
+ mProviders.clear();
+ providersBox->clear();
+ kdDebug(90020) << "config read" << endl;
+ conf->setGroup( "Lyrics" );
+ queryList = conf->readListEntry( "queryList" );
+ nameList = conf->readListEntry( "nameList" );
+ if ( queryList.count() == 0 && nameList.count() == 0 ) {
+ queryList = QStringList::split( ",", DEFAULT_QUERY );
+ nameList = QStringList::split( ",", DEFAULT_NAME );
+ }
+ QStringList::Iterator queryIt, nameIt;
+ for ( queryIt = queryList.begin(), nameIt = nameList.begin(); queryIt != queryList.end() && nameIt != nameList.end(); ++queryIt, ++nameIt ) {
+ kdDebug(90020) << "Read:" << *queryIt << " and " << *nameIt << endl;
+ newSearch( *nameIt, *queryIt );
+ }
+}
+
+#include "cmodule.moc"
diff --git a/noatun-plugins/lyrics/cmodule.h b/noatun-plugins/lyrics/cmodule.h
new file mode 100644
index 0000000..dbb2da7
--- /dev/null
+++ b/noatun-plugins/lyrics/cmodule.h
@@ -0,0 +1,43 @@
+#ifndef _LYRICSCMODULE_H_
+#define _LYRICSCMODULE_H_
+
+#include <noatun/pref.h>
+#include <qvaluevector.h>
+#include <klocale.h>
+
+class KLineEdit;
+class KListBox;
+class KButtonBox;
+
+struct SearchProvider {
+ QString name;
+ QString url;
+};
+
+class LyricsCModule : public CModule {
+ Q_OBJECT
+ public:
+ LyricsCModule(QObject *_parent);
+ public slots:
+ virtual void save(void);
+ virtual void reopen(void);
+ void newSearch(QString name = i18n( "New Search Provider" ), QString query = "");
+ void delSearch();
+ void moveUpSearch();
+ void moveDownSearch();
+ void selected( QListBoxItem *i );
+ void nameChanged( const QString &name );
+ void queryChanged( const QString &query );
+ protected:
+ KListBox *providersBox;
+ KButtonBox *boxButtons;
+ KLineEdit *nameEdit;
+ KLineEdit *queryEdit;
+ QValueVector<SearchProvider> mProviders;
+};
+
+
+
+
+
+#endif
diff --git a/noatun-plugins/lyrics/historymanager.cpp b/noatun-plugins/lyrics/historymanager.cpp
new file mode 100644
index 0000000..1524d7b
--- /dev/null
+++ b/noatun-plugins/lyrics/historymanager.cpp
@@ -0,0 +1,56 @@
+#include "historymanager.h"
+
+/** HISTORY MANAGER ***
+*** TODO: Add more complex support (like in Konqueror)
+ Maybe use Konqueror's History Manager */
+
+HistoryManager::HistoryManager(QObject *parent) : QObject(parent) {
+}
+
+HistoryManager::~HistoryManager() {
+}
+
+void HistoryManager::addURL(const KURL &url) {
+ /* push current URL to the back */
+ if (!currentURL.isEmpty()) {
+ if (back_stack.count() == 0)
+ emit uiChanged( Back, true );
+ back_stack.push(currentURL);
+ }
+ /* Make a copy of the new URL */
+ currentURL = url;
+ /* Clear the forward stack */
+ if (forward_stack.count() > 0)
+ emit uiChanged( Forward, false );
+ forward_stack.clear();
+}
+
+KURL HistoryManager::back() {
+ if (back_stack.count() <= 0)
+ return KURL();
+ /* The currentURL is now pushed in the forward_stack */
+ if (forward_stack.count() == 0)
+ emit uiChanged( Forward, true );
+ forward_stack.push(currentURL);
+ /* The last URL is the back stack is now popped as the current one */
+ if (back_stack.count() == 1)
+ emit uiChanged( Back, false );
+ currentURL = back_stack.pop();
+ return currentURL;
+}
+
+KURL HistoryManager::forward() {
+ if (forward_stack.count() <= 0)
+ return KURL();
+ /* Push the currentURL into the back_stack */
+ if (back_stack.count() == 0)
+ emit uiChanged( Back, true );
+ back_stack.push(currentURL);
+ /* Pop from the forward_stack into the currentURL */
+ if (forward_stack.count() == 1)
+ emit uiChanged( Forward, false );
+ currentURL = forward_stack.pop();
+ return currentURL;
+}
+
+#include "historymanager.moc"
diff --git a/noatun-plugins/lyrics/historymanager.h b/noatun-plugins/lyrics/historymanager.h
new file mode 100644
index 0000000..d2fdb29
--- /dev/null
+++ b/noatun-plugins/lyrics/historymanager.h
@@ -0,0 +1,28 @@
+#ifndef _HISTORY_MANAGER_H
+#define _HISTORY_MANAGER_H
+
+#include <kurl.h>
+#include <qvaluestack.h>
+#include <qobject.h>
+
+class HistoryManager : public QObject {
+ Q_OBJECT
+ public:
+ HistoryManager(QObject *parent = NULL);
+ ~HistoryManager();
+ KURL back();
+ KURL forward();
+ void addURL(const KURL &);
+ enum Buttons {
+ Back,
+ Forward
+ };
+ signals:
+ void uiChanged(int, bool);
+ protected:
+ QValueStack<KURL> back_stack;
+ QValueStack<KURL> forward_stack;
+ KURL currentURL;
+};
+
+#endif
diff --git a/noatun-plugins/lyrics/lyrics.cpp b/noatun-plugins/lyrics/lyrics.cpp
new file mode 100644
index 0000000..611db9c
--- /dev/null
+++ b/noatun-plugins/lyrics/lyrics.cpp
@@ -0,0 +1,268 @@
+#include <klocale.h>
+#include <klineeditdlg.h>
+#include <kconfig.h>
+#include <kmessagebox.h>
+#include <khtmlview.h>
+#include <kstdaction.h>
+#include <kstatusbar.h>
+#include <qregexp.h>
+#include "lyrics.h"
+#include <noatun/player.h>
+#include <kdebug.h>
+#include "historymanager.h"
+
+
+extern "C"
+{
+ Plugin *create_plugin()
+ {
+ KGlobal::locale()->insertCatalogue("lyrics");
+ return new Lyrics();
+ }
+}
+
+Lyrics *lyrics;
+
+Lyrics::Lyrics() : KMainWindow(), Plugin(), active(false)
+{
+ lyrics = this;
+ /* Create default actions */
+ (void)KStdAction::close(this, SLOT(close()), actionCollection());
+ ( void )KStdAction::goTo( this, SLOT( goTo() ), actionCollection(), "go_web_goTo" );
+ //(void)KStdAction::print(this, SLOT(print()), actionCollection());
+ //(void)KStdAction::printPreview(this, SLOT(printPreview()), actionCollection());
+ //(void)KStdAction::mail(this, SLOT(mail()), actionCollection());
+ //(void)KStdAction::find(this, SLOT(find()), actionCollection());
+ follow_act = new KToggleAction(i18n("&Follow Noatun Playlist"), "goto", 0, actionCollection(), "follow");
+ KStdAction::redisplay(this, SLOT(viewLyrics()), actionCollection());
+ attach_act = new KToggleAction(i18n("&Link URL to File"), "attach", KShortcut("CTRL+ALT+A"), actionCollection(), "attach_url");
+ connect(attach_act, SIGNAL(toggled(bool)), this, SLOT(attach(bool)));
+ back_act = KStdAction::back(this, SLOT(back()), actionCollection());
+ back_act->setEnabled(false);
+ forward_act = KStdAction::forward(this, SLOT(forward()), actionCollection());
+ forward_act->setEnabled(false);
+ new KWidgetAction( new QLabel(i18n("Search provider:"), this, "kde toolbar widget"), i18n("Search Provider"), 0, 0, 0, actionCollection(), "search_label");
+ site_act = new KSelectAction(i18n("&Search Provider"), 0, this, SLOT(viewLyrics()), actionCollection(), "search_provider");
+
+ /* Add entry to menu */
+ menuID = napp->pluginMenuAdd(i18n("&View Lyrics"), this, SLOT(viewLyrics()));
+
+ /* Create history manager and htmlpart */
+ history = new HistoryManager(this);
+ htmlpart = new KHTMLPart(this);
+ //htmlpart->view()->setMinimumSize(350, 420);
+
+ /* Connect signals/slots */
+ connect( htmlpart->browserExtension(), SIGNAL(openURLRequestDelayed( const KURL &, const KParts::URLArgs & )), this, SLOT(openURLRequest( const KURL &, const KParts::URLArgs & )));
+ connect( htmlpart, SIGNAL(started(KIO::Job *)), this, SLOT(loadingURL(KIO::Job *)) );
+ connect( htmlpart, SIGNAL(completed()), this, SLOT(loadedURL()) );
+ connect( history, SIGNAL(uiChanged(int, bool)), this, SLOT(changeUI(int, bool)) );
+ connect( napp->player(), SIGNAL(newSong()), this, SLOT(newSong()) );
+
+ /* Status bar */
+ statusBar()->insertItem(i18n("Ready"), 0, 1);
+ statusBar()->setItemAlignment(0, Qt::AlignLeft);
+
+ /* Finalize the GUI */
+ setCentralWidget(htmlpart->view());
+ createGUI("lyricsui.rc");
+ setAutoSaveSettings("Lyrics");
+
+ /* Load configuration */
+ KConfig *config = KGlobal::config();
+ config->setGroup("Lyrics");
+ follow_act->setChecked(config->readBoolEntry("follow", true));
+ /* Create config object */
+ new LyricsCModule(this);
+
+}
+
+void Lyrics::goTo() {
+ bool sel = false;
+ QString url = KLineEditDlg::getText( i18n( "Please enter the URL you want to go to:" ), htmlpart->url().prettyURL(), &sel, this );
+ if ( !url.isEmpty() && sel )
+ go( KURL( url ) );
+}
+
+void Lyrics::setProviders( QValueVector<SearchProvider> &sites ) {
+ mSites = sites;
+ QStringList sitesName;
+ for (unsigned int i = 0; i < mSites.size(); ++i) {
+ sitesName += mSites[i].name;
+ }
+ site_act->setItems(sitesName);
+ site_act->setCurrentItem(0);
+}
+
+void Lyrics::attach(bool a) {
+ if ( !napp->player()->current() )
+ return;
+ if (a) {
+ KMessageBox::information(this, i18n("Choosing this option, the current URL will be attached to the current file. This way, if you try to view the lyrics of this file later, you won't have to search for it again. This information can be stored between sessions, as long as your playlist stores metadata about the multimedia items (almost all the playlists do). If you want to be able to search for other lyrics for this music, you must select this option again to clear the stored URL."), QString::null, "lyrics::attach_info");
+ kdDebug(90020) << "Setting URL for (attach)" << napp->player()->current().title() << endl;
+ napp->player()->current().setProperty("Lyrics::URL", htmlpart->url().url());
+ site_act->setEnabled(false);
+ actionCollection()->action("search_label")->setEnabled(false);
+ }
+ else {
+ kdDebug(90020) << "Clearing URL for " << napp->player()->current().title() << endl;
+ napp->player()->current().clearProperty("Lyrics::URL");
+ site_act->setEnabled(true);
+ actionCollection()->action("search_label")->setEnabled(true);
+ }
+}
+
+void Lyrics::loadingURL(KIO::Job *)
+{
+ statusBar()->changeItem(i18n("Loading..."), 0);
+}
+
+void Lyrics::loadedURL()
+{
+ if ( !napp->player()->current() )
+ return;
+ statusBar()->changeItem(i18n("Loaded"), 0);
+ setCaption(i18n("Lyrics: %1").arg(napp->player()->current().property("title")));
+ if (!htmlpart->url().url().isEmpty() && napp->player()->current() && !napp->player()->current().property("Lyrics::URL").isEmpty()) {
+ kdDebug(90020) << "Setting URL for (loaded)" << napp->player()->current().title() << endl;
+ napp->player()->current().setProperty("Lyrics::URL", htmlpart->url().url());
+ }
+}
+
+void Lyrics::back()
+{
+ KURL url = history->back();
+ if (url.isEmpty())
+ return;
+ kdDebug(90020) << "Going to " << url.url() << endl;
+ htmlpart->openURL(url);
+}
+
+void Lyrics::forward()
+{
+ KURL url = history->forward();
+ if (url.isEmpty())
+ return;
+ kdDebug(90020) << "Going to " << url.url() << endl;
+ htmlpart->openURL(url);
+}
+
+void Lyrics::changeUI(int button, bool enable)
+{
+ if (button == HistoryManager::Back)
+ back_act->setEnabled( enable );
+ else if (button == HistoryManager::Forward)
+ forward_act->setEnabled( enable );
+}
+
+void Lyrics::go(const KURL &url)
+{
+ history->addURL(url);
+ kdDebug(90020) << "Going to " << url.url() << endl;
+ htmlpart->openURL(url);
+}
+
+void Lyrics::newSong() {
+ kdDebug(90020) << "New song!" << endl;
+ // If I'm not following, just forget about it
+ if (!follow_act->isChecked())
+ return;
+ if (active)
+ viewLyrics();
+ // TODO: If not visible, maybe it would be a good idea
+ // to load the lyrics on advance
+}
+
+
+void Lyrics::viewLyrics(int index)
+{
+ if (!napp->player()->current()) {
+ KMessageBox::sorry(this, i18n("You can only view the lyrics of the current song, and currently there is none."));
+ return;
+ }
+//X <small>(if the above information is incorrect, the search may not find the correct music. If that's the case, use a tag editor to fix it. Hint: Use the luckytag plugin from the kdeaddons module to try to guess title, author and album from the song filename)</small><br>
+ QString url, name;
+ if (index < 0)
+ index = site_act->currentItem();
+ if ( index < 0 )
+ return;
+ url = mSites[index].url;
+ name = mSites[index].name;
+ QRegExp props_regexp("\\$\\((\\w+)\\)");
+ int pos = props_regexp.search(url);
+ while (pos >= 0) {
+ QString property = props_regexp.cap(1);
+ url.replace(pos, props_regexp.matchedLength(), napp->player()->current().property(property));
+ pos = props_regexp.search(url);
+ }
+ QString title(napp->player()->current().property("title"));
+ setCaption(i18n("Loading Lyrics for %1").arg(title));
+ // Check if we have a music playing
+ if (napp->player()->current()) {
+ htmlpart->begin();
+ htmlpart->write(i18n("<HTML>"
+ "<BODY>"
+ "<p><strong>Please wait! Searching for...</strong></p>"
+ "<TABLE BORDER=1 WIDTH=\"100%\">"
+ "<TR><TD BGCOLOR=\"#707671\"><strong>Title</strong></TD><TD>%1</TD></TR>"
+ "<TR><TD BGCOLOR=\"#707671\"><strong>Author</strong></TD><TD>%2</TD></TR>"
+ "<TR><TD BGCOLOR=\"#707671\"><strong>Album</strong></TD><TD>%3</TD></TR>"
+ "</TABLE>").arg( napp->player()->current().property( "title" ) ).arg( napp->player()->current().property( "author" ) ).arg( napp->player()->current().property( "album" ) ) );
+ KURL _url;
+ /* Check if we should use the store url or the query one */
+ if (napp->player()->current().property("Lyrics::URL").isEmpty()) {
+ /* Use the query one */
+ _url = url;
+ _url.setQuery(_url.query().replace(QRegExp("%20"), "+"));
+ kdDebug(90020) << "I'm using the query url" << endl;
+ attach_act->setChecked(false);
+ site_act->setEnabled(true);
+ actionCollection()->action("search_label")->setEnabled(true);
+ htmlpart->write( i18n( "<hr><p><strong>Searching at %1</strong><br><small>(<a href=\"%3\">%2</a></small>)</p>" ).arg( name ).arg( _url.prettyURL() ).arg( _url.url() ) );
+ } else {
+ _url = napp->player()->current().property("Lyrics::URL");
+ _url.setQuery(_url.query().replace(QRegExp("%20"), "+"));
+ kdDebug(90020) << "I'm using the stored url" << endl;
+ attach_act->setChecked(true);
+ site_act->setEnabled(false);
+ actionCollection()->action("search_label")->setEnabled(false);
+ htmlpart->write( i18n( "<hr><p><strong>Using the stored URL</strong><br><small>(<a href=\"%2\">%1</a></small>)</p>" ).arg( _url.prettyURL() ).arg( _url.url() ) );
+ }
+ htmlpart->write( "</BODY></HTML>" );
+ htmlpart->end();
+ go(_url);
+ this->show();
+ KMessageBox::information( this, i18n( "In order to find the lyrics for the current song, this plugin uses the properties stored with each song, such as its title, author and album. These properties are usually retrieved by a tag reader, but in some cases they may not be present or be incorrect. In that case, the Lyrics plugin will not be able to find the lyrics until these properties are fixed (you can fix them using the tag editor).\nHint: The lucky tag plugin, present in the kdeaddons module, can try to guess properties such as title and author from the filename of a song. Enabling it may increase the probability of finding lyrics." ), QString::null, "Lyrics::usage_info" );
+ active = true;
+ }
+}
+
+void Lyrics::openURLRequest( const KURL &url, const KParts::URLArgs & )
+{
+ go(url);
+}
+
+Lyrics::~Lyrics()
+{
+ /* Save configurations */
+ KConfig *config = KGlobal::config();
+ config->setGroup("Lyrics");
+ config->writeEntry("follow", follow_act->isChecked());
+ // Force saving, as closeEvent is probably never called
+ saveMainWindowSettings(config, "Lyrics");
+ napp->pluginMenuRemove(menuID);
+}
+
+bool Lyrics::queryClose()
+{
+ if( kapp->sessionSaving())
+ return true;
+ hide();
+ htmlpart->closeURL();
+ htmlpart->begin();
+ htmlpart->end();
+ active = false;
+ return false;
+}
+
+#include "lyrics.moc"
diff --git a/noatun-plugins/lyrics/lyrics.h b/noatun-plugins/lyrics/lyrics.h
new file mode 100644
index 0000000..9454604
--- /dev/null
+++ b/noatun-plugins/lyrics/lyrics.h
@@ -0,0 +1,55 @@
+#ifndef LYRICS_H
+#define LYRICS_H
+
+#include <noatun/plugin.h>
+#include <noatun/player.h>
+#include <noatun/app.h>
+#include <kmainwindow.h>
+#include <qvaluevector.h>
+#include <khtml_part.h>
+#include <kaction.h>
+#include "cmodule.h"
+
+class HistoryManager;
+
+class Lyrics : public KMainWindow, public Plugin {
+Q_OBJECT
+
+public:
+ Lyrics();
+ ~Lyrics();
+ void go(const KURL &);
+ void setProviders( QValueVector<SearchProvider> &sites );
+
+public slots:
+ void viewLyrics(int index = -1);
+ void back();
+ void forward();
+
+protected:
+ bool queryClose();
+
+protected slots:
+ void changeUI(int, bool);
+ void openURLRequest( const KURL &, const KParts::URLArgs & );
+ void loadingURL(KIO::Job *);
+ void loadedURL();
+ void attach(bool);
+ void newSong();
+ void goTo();
+
+private:
+ int menuID;
+ KAction *back_act, *forward_act;
+ KToggleAction *follow_act;
+ KToggleAction *attach_act;
+ KSelectAction *site_act;
+ KHTMLPart *htmlpart;
+ QValueVector<SearchProvider> mSites;
+ HistoryManager *history;
+ bool active;
+
+};
+
+
+#endif
diff --git a/noatun-plugins/lyrics/lyrics.plugin b/noatun-plugins/lyrics/lyrics.plugin
new file mode 100644
index 0000000..cc9b3ad
--- /dev/null
+++ b/noatun-plugins/lyrics/lyrics.plugin
@@ -0,0 +1,117 @@
+Filename=noatunlyrics.la
+Author=Ismael Orenstein
+Site=http://noatun.derkarl.org/
+Email=perdig@linuxbr.com.br
+Type=other
+License=BSD
+Name=Lyrics
+Name[af]=Lirieke
+Name[ar]=الكلمات
+Name[az]=Mahnı Sözləri
+Name[bg]=Текстове
+Name[bs]=Tekstovi
+Name[cs]=Text skladby
+Name[cy]=Geiriau cân
+Name[da]=Sangtekst
+Name[de]=Liedtext
+Name[el]=Στίχοι
+Name[eo]=Kantoteksto
+Name[es]=Letras
+Name[et]=Laulusõnad
+Name[fa]=آهنگ
+Name[fi]=Sanat
+Name[fr]=Paroles
+Name[fy]=Liettekst
+Name[gl]=Letras
+Name[he]=מילים
+Name[hi]=लिरिक्स
+Name[hr]=Tekstovi pjesama
+Name[it]=Testi
+Name[ka]=სიმღერის ტექსტები
+Name[km]=អត្ថបទ​ចម្រៀង
+Name[lt]=Lyrika
+Name[mk]=Стихови
+Name[nb]=Tekst
+Name[nds]=Leedtexten
+Name[ne]=रचना
+Name[nl]=Liedtekst
+Name[nn]=Tekst
+Name[pa]=ਬੋਲ
+Name[pl]=Słowa piosenek
+Name[pt]=Letras
+Name[ro]=Versuri
+Name[ru]=Текст песни
+Name[sk]=Texty
+Name[sl]=Besedila pesmi
+Name[sr]=Текст песме
+Name[sr@Latn]=Tekst pesme
+Name[sv]=Sångtext
+Name[ta]= பாடல்வரிகள்
+Name[tg]=Матни сурудҳо
+Name[tr]=Şarkı Sözleri
+Name[uk]=Текст пісні
+Name[uz]=Qoʻshiqning soʻzlari
+Name[uz@cyrillic]=Қўшиқнинг сўзлари
+Name[vi]=Lời nhạc
+Name[xh]=Amazwi
+Name[zh_CN]=歌词
+Comment=Display the lyrics for the current song
+Comment[af]=Vertoon die lirieke vir die huidige liedjie
+Comment[ar]=يعرض كلمات الأغنية الحالية
+Comment[az]=Hazırkı mahnının sözlərini göstər
+Comment[bg]=Показване текста на текущата песента (лириката)
+Comment[bs]=Prikazuje tekst trenutne pjesme
+Comment[ca]=Mostra la lletra de la cançó actual
+Comment[cs]=Zobrazuje slova k současné skladbě
+Comment[cy]=Arddangos y geiriau am y gân gyfredol
+Comment[da]=Vis sangteksten for den aktuelle sang
+Comment[de]=Zeigt den Liedtext für das aktuelle Stück
+Comment[el]=Εμφανίζει τους στίχους για το τρέχον τραγούδι
+Comment[eo]=Montras la tekston de la nuna kantaĵo
+Comment[es]=Muestra las letras para la canción actual
+Comment[et]=Näitab aktiivse laulu sõnu
+Comment[eu]=Uneko kantaren letra bistaratzen du
+Comment[fa]=نمایش آهنگ برای ترانۀ جاری
+Comment[fi]=Näyttää kappaleen sanat
+Comment[fr]=Afficheur des paroles de la chanson en cours
+Comment[fy]=Toant de teksten fan it besteande nûmer
+Comment[ga]=Taispeáin liricí an amhráin reatha
+Comment[gl]=Mostra as letras da peza actual
+Comment[he]=הצגת מילות השיר הנוכחי
+Comment[hi]=मौज़ूदा गीत का काव्य दिखाता है
+Comment[hr]=Prikazivanje teksta trenutne pjesme
+Comment[hu]=Megjeleníti az aktuális szám szövegét
+Comment[is]=Sýnir texta lagsins
+Comment[it]=Mostra il testo della canzone corrente
+Comment[ja]=現在の曲の歌詞を表示
+Comment[ka]=მიმდინარე სიმღერის ტექსტს აჩვენებს
+Comment[kk]=Орындалып жатқан әннің сөздерін көрсету
+Comment[km]=បង្ហាញ​អត្ថបទ​ចម្រៀង​សម្រាប់​​បទចម្រៀង​បច្ចុប្បន្ន
+Comment[lt]=Rodo esamos dainos lyriką
+Comment[mk]=Ги прикажува стиховите на тековната песна
+Comment[ms]=Memaparkan lirik lagu semasa
+Comment[nb]=Vis teksten til den gjeldende sangen
+Comment[nds]=Wiest den Text vun dat aktuelle Leed
+Comment[ne]=हालको गीतका लागि रचना प्रदर्शन गर्नुहोस्
+Comment[nl]=Toont de teksten van het huidige nummer
+Comment[nn]=Visar teksten til den gjeldande songen
+Comment[pl]=Wyświetla słowa do aktualnej piosenki
+Comment[pt]=Mostra as letras da música actual
+Comment[pt_BR]=Exibe a letra da música para a canção atual
+Comment[ro]=Afişează versurile pentru cîntecul curent
+Comment[ru]=Показ текста песни произведения при его проигрывании
+Comment[sk]=Zobrazí text aktuálnej skladby
+Comment[sl]=Prikaže besedilo trenutne pesmi
+Comment[sr]=Приказује текст за текућу песму
+Comment[sr@Latn]=Prikazuje tekst za tekuću pesmu
+Comment[sv]=Visar texten för den aktuella sången
+Comment[ta]=இப்போதைய பாடலின் வரிகளை காட்டு
+Comment[tg]=Нишон додани матни суруд дар вақти ба кор андохтани ӯ
+Comment[tr]=Geçerli şarkı için sözleri gösterir
+Comment[uk]=Відображення тексту поточної пісні
+Comment[uz]=Joriy qoʻshiqning soʻzlarini koʻrsatish
+Comment[uz@cyrillic]=Жорий қўшиқнинг сўзларини кўрсатиш
+Comment[vi]=Hiển thị lời bài hát hiện thời
+Comment[xh]=Bonisa amazwi engoma ekhoyo
+Comment[zh_CN]=显示当前歌曲的歌词
+Comment[zh_TW]=顯示目前歌曲的歌詞
diff --git a/noatun-plugins/lyrics/lyricsui.rc b/noatun-plugins/lyrics/lyricsui.rc
new file mode 100644
index 0000000..09b72e3
--- /dev/null
+++ b/noatun-plugins/lyrics/lyricsui.rc
@@ -0,0 +1,24 @@
+<!DOCTYPE kpartgui>
+<kpartgui name="noatunlyrics">
+<MenuBar>
+ <Menu name="go_web">
+ <Action name="go_web_goTo"/>
+ </Menu>
+ <Menu name="settings">
+ <Action name="follow"/>
+ <Action name="attach_url"/>
+ <Action name="search_provider"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="mainToolBar">
+ <Action name="go_back"/>
+ <Action name="go_forward"/>
+ <Action name="view_redisplay"/>
+ <Separator/>
+ <Action name="follow"/>
+ <Separator/>
+ <Action name="attach_url"/>
+ <Action name="search_label"/>
+ <Action name="search_provider"/>
+</ToolBar>
+</kpartgui>
diff --git a/noatun-plugins/nexscope/Makefile.am b/noatun-plugins/nexscope/Makefile.am
new file mode 100644
index 0000000..d182ff1
--- /dev/null
+++ b/noatun-plugins/nexscope/Makefile.am
@@ -0,0 +1,22 @@
+INCLUDES= $(all_includes) $(SDL_CFLAGS)
+
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = noatunnexscope.la
+
+noatunnexscope_la_SOURCES = noatunplugin.cpp
+noatunnexscope_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+noatunnexscope_la_LIBADD = $(LIB_KFILE) -lnoatun
+
+bin_PROGRAMS = nexscope.bin
+
+#renderers.cpp must be first for enable-final
+nexscope_bin_SOURCES = renderers.cpp bitmappool.cpp nex.cpp output.cpp input.cpp gui.cpp regionwidget.cpp convolve.c
+nexscope_bin_LDFLAGS = $(all_libraries) $(KDE_RPATH) $(SDL_LIBS)
+nexscope_bin_LDADD = $(LIB_KDEUI) -lm -lnoatun $(SDL_LIBS)
+
+noatun_DATA = nexscope.plugin
+noatundir = $(kde_datadir)/noatun
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/nexscope.pot
diff --git a/noatun-plugins/nexscope/bitmappool.cpp b/noatun-plugins/nexscope/bitmappool.cpp
new file mode 100644
index 0000000..0a0ad78
--- /dev/null
+++ b/noatun-plugins/nexscope/bitmappool.cpp
@@ -0,0 +1,54 @@
+#include "nex.h"
+
+struct BitmapPool::PoolItem
+{
+ PoolItem() : used(false) {}
+
+ bool used;
+ Bitmap bitmap;
+};
+
+BitmapPool::BitmapPool()
+{
+
+}
+
+BitmapPool::~BitmapPool()
+{
+
+}
+
+Bitmap *BitmapPool::get(bool clear)
+{
+ mMutex.lock();
+ BitmapPool::PoolItem *p=0;
+ for (QPtrListIterator<BitmapPool::PoolItem> i(mBitmaps); i.current(); ++i)
+ {
+ if (!(*i)->used)
+ p=*i;
+ }
+ if (!p)
+ {
+ p=new BitmapPool::PoolItem;
+ p->bitmap.resize(width, height);
+ }
+
+ p->used=true;
+
+ if (clear) p->bitmap.clear();
+
+ mMutex.unlock();
+ return &(p->bitmap);
+}
+
+void BitmapPool::release(Bitmap *bitmap)
+{
+ mMutex.lock();
+ for (QPtrListIterator<BitmapPool::PoolItem> i(mBitmaps); i.current(); ++i)
+ {
+ if (&((*i)->bitmap)==bitmap)
+ (*i)->used=false;
+ }
+ mMutex.unlock();
+}
+
diff --git a/noatun-plugins/nexscope/convolve.c b/noatun-plugins/nexscope/convolve.c
new file mode 100644
index 0000000..03509eb
--- /dev/null
+++ b/noatun-plugins/nexscope/convolve.c
@@ -0,0 +1,297 @@
+/* Karatsuba convolution
+ *
+ * Copyright (C) 1999 Ralph Loader <suckfish@ihug.co.nz>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* The algorithm is based on the following. For the convolution of a pair
+ * of pairs, (a,b) * (c,d) = (0, a.c, a.d+b.c, b.d), we can reduce the four
+ * multiplications to three, by the formulae a.d+b.c = (a+b).(c+d) - a.c -
+ * b.d. A similar relation enables us to compute a 2n by 2n convolution
+ * using 3 n by n convolutions, and thus a 2^n by 2^n convolution using 3^n
+ * multiplications (as opposed to the 4^n that the quadratic algorithm
+ * takes. */
+
+/* For large n, this is slower than the O(n log n) that the FFT method
+ * takes, but we avoid using complex numbers, and we only have to compute
+ * one convolution, as opposed to 3 FFTs. We have good locality-of-
+ * reference as well, which will help on CPUs with tiny caches. */
+
+/* E.g., for a 512 x 512 convolution, the FFT method takes 55 * 512 = 28160
+ * (real) multiplications, as opposed to 3^9 = 19683 for the Karatsuba
+ * algorithm. We actually want 257 outputs of a 256 x 512 convolution;
+ * that doesn't appear to give an easy advantage for the FFT algorithm, but
+ * for the Karatsuba algorithm, it's easy to use two 256 x 256
+ * convolutions, taking 2 x 3^8 = 12312 multiplications. [This difference
+ * is that the FFT method "wraps" the arrays, doing a 2^n x 2^n -> 2^n,
+ * while the Karatsuba algorithm pads with zeros, doing 2^n x 2^n -> 2.2^n
+ * - 1]. */
+
+/* There's a big lie above, actually... for a 4x4 convolution, it's quicker
+ * to do it using 16 multiplications than the more complex Karatsuba
+ * algorithm... So the recursion bottoms out at 4x4s. This increases the
+ * number of multiplications by a factor of 16/9, but reduces the overheads
+ * dramatically. */
+
+/* The convolution algorithm is implemented as a stack machine. We have a
+ * stack of commands, each in one of the forms "do a 2^n x 2^n
+ * convolution", or "combine these three length 2^n outputs into one
+ * 2^{n+1} output." */
+
+#include <stdlib.h>
+#include "convolve.h"
+
+/*
+ * Initialisation routine - sets up tables and space to work in.
+ * Returns a pointer to internal state, to be used when performing calls.
+ * On error, returns NULL.
+ * The pointer should be freed when it is finished with, by convolve_close().
+ */
+convolve_state *convolve_init(void)
+{
+ return (convolve_state *) malloc (sizeof(convolve_state));
+}
+
+/*
+ * Free the state allocated with convolve_init().
+ */
+void convolve_close(convolve_state *state)
+{
+ if (state)
+ free(state);
+}
+
+static void convolve_4 (double * out, const double * left, const double * right)
+/* This does a 4x4 -> 7 convolution. For what it's worth, the slightly odd
+ * ordering gives about a 1% speed up on my Pentium II. */
+{
+ double l0, l1, l2, l3, r0, r1, r2, r3;
+ double a;
+ l0 = left[0];
+ r0 = right[0];
+ a = l0 * r0;
+ l1 = left[1];
+ r1 = right[1];
+ out[0] = a;
+ a = (l0 * r1) + (l1 * r0);
+ l2 = left[2];
+ r2 = right[2];
+ out[1] = a;
+ a = (l0 * r2) + (l1 * r1) + (l2 * r0);
+ l3 = left[3];
+ r3 = right[3];
+ out[2] = a;
+
+ out[3] = (l0 * r3) + (l1 * r2) + (l2 * r1) + (l3 * r0);
+ out[4] = (l1 * r3) + (l2 * r2) + (l3 * r1);
+ out[5] = (l2 * r3) + (l3 * r2);
+ out[6] = l3 * r3;
+}
+
+static void convolve_run (stack_entry * top, unsigned size, double * scratch)
+/* Interpret a stack of commands. The stack starts with two entries; the
+ * convolution to do, and an illegal entry used to mark the stack top. The
+ * size is the number of entries in each input, and must be a power of 2,
+ * and at least 8. It is OK to have out equal to left and/or right.
+ * scratch must have length 3*size. The number of stack entries needed is
+ * 3n-4 where size=2^n. */
+{
+ do {
+ const double * left;
+ const double * right;
+ double * out;
+
+ /* When we get here, the stack top is always a convolve,
+ * with size > 4. So we will split it. We repeatedly split
+ * the top entry until we get to size = 4. */
+
+ left = top->v.left;
+ right = top->v.right;
+ out = top->v.out;
+ top++;
+
+ do {
+ double * s_left, * s_right;
+ int i;
+
+ /* Halve the size. */
+ size >>= 1;
+
+ /* Allocate the scratch areas. */
+ s_left = scratch + size * 3;
+ /* s_right is a length 2*size buffer also used for
+ * intermediate output. */
+ s_right = scratch + size * 4;
+
+ /* Create the intermediate factors. */
+ for (i = 0; i < size; i++) {
+ double l = left[i] + left[i + size];
+ double r = right[i] + right[i + size];
+ s_left[i + size] = r;
+ s_left[i] = l;
+ }
+
+ /* Push the combine entry onto the stack. */
+ top -= 3;
+ top[2].b.main = out;
+ top[2].b.null = NULL;
+
+ /* Push the low entry onto the stack. This must be
+ * the last of the three sub-convolutions, because
+ * it may overwrite the arguments. */
+ top[1].v.left = left;
+ top[1].v.right = right;
+ top[1].v.out = out;
+
+ /* Push the mid entry onto the stack. */
+ top[0].v.left = s_left;
+ top[0].v.right = s_right;
+ top[0].v.out = s_right;
+
+ /* Leave the high entry in variables. */
+ left += size;
+ right += size;
+ out += size * 2;
+
+ } while (size > 4);
+
+ /* When we get here, the stack top is a group of 3
+ * convolves, with size = 4, followed by some combines. */
+ convolve_4 (out, left, right);
+ convolve_4 (top[0].v.out, top[0].v.left, top[0].v.right);
+ convolve_4 (top[1].v.out, top[1].v.left, top[1].v.right);
+ top += 2;
+
+ /* Now process combines. */
+ do {
+ /* b.main is the output buffer, mid is the middle
+ * part which needs to be adjusted in place, and
+ * then folded back into the output. We do this in
+ * a slightly strange way, so as to avoid having
+ * two loops. */
+ double * out = top->b.main;
+ double * mid = scratch + size * 4;
+ unsigned int i;
+ top++;
+ out[size * 2 - 1] = 0;
+ for (i = 0; i < size-1; i++) {
+ double lo;
+ double hi;
+ lo = mid[0] - (out[0] + out[2 * size]) + out[size];
+ hi = mid[size] - (out[size] + out[3 * size]) + out[2 * size];
+ out[size] = lo;
+ out[2 * size] = hi;
+ out++;
+ mid++;
+ }
+ size <<= 1;
+ } while (top->b.null == NULL);
+ } while (top->b.main != NULL);
+}
+
+int convolve_match (float * lastchoice,
+ float * input,
+ convolve_state * state)
+/* lastchoice is a 256 sized array. input is a 512 array. We find the
+ * contiguous length 256 sub-array of input that best matches lastchoice.
+ * A measure of how good a sub-array is compared with the lastchoice is
+ * given by the sum of the products of each pair of entries. We maximise
+ * that, by taking an appropriate convolution, and then finding the maximum
+ * entry in the convolutions. state is a (non-NULL) pointer returned by
+ * convolve_init. */
+{
+ double avg;
+ double best;
+ int p;
+ int i;
+ double * left = state->left;
+ double * right = state->right;
+ double * scratch = state->scratch;
+ stack_entry * top = state->stack + STACK_SIZE - 1;
+
+ for (i=0; i<512; i++)
+ left[i]=input[i];
+
+ avg = 0;
+ for (i = 0; i < 256; i++)
+ {
+ double a = lastchoice[255 - i];
+ right[i] = a;
+ avg += a;
+ }
+
+ /* We adjust the smaller of the two input arrays to have average
+ * value 0. This makes the eventual result insensitive to both
+ * constant offsets and positive multipliers of the inputs. */
+ avg /= 256;
+ for (i = 0; i < 256; i++)
+ right[i] -= avg;
+
+ /* End-of-stack marker. */
+ top[1].b.null = scratch;
+ top[1].b.main = NULL;
+
+ /* The low 256x256, of which we want the high 256 outputs. */
+ top->v.left = left;
+ top->v.right = right;
+ top->v.out = right + 256;
+ convolve_run (top, 256, scratch);
+
+ /* The high 256x256, of which we want the low 256 outputs. */
+ top->v.left = left + 256;
+ top->v.right = right;
+ top->v.out = right;
+ convolve_run (top, 256, scratch);
+
+ /* Now find the best position amoungs this. Apart from the first
+ * and last, the required convolution outputs are formed by adding
+ * outputs from the two convolutions above. */
+ best = right[511];
+ right[767] = 0;
+ p = -1;
+ for (i = 0; i < 256; i++) {
+ double a = right[i] + right[i + 512];
+ if (a > best) {
+ best = a;
+ p = i;
+ }
+ }
+ p++;
+
+#if 0
+ {
+ /* This is some debugging code... */
+ int bad = 0;
+ best = 0;
+ for (i = 0; i < 256; i++)
+ best += ((double) input[i+p]) * ((double) lastchoice[i] - avg);
+
+ for (i = 0; i < 257; i++) {
+ double tot = 0;
+ unsigned int j;
+ for (j = 0; j < 256; j++)
+ tot += ((double) input[i+j]) * ((double) lastchoice[j] - avg);
+ if (tot > best)
+ printf ("(%i)", i);
+ if (tot != left[i + 255])
+ printf ("!");
+ }
+
+ printf ("%i\n", p);
+ }
+#endif
+
+ return p;
+}
diff --git a/noatun-plugins/nexscope/convolve.h b/noatun-plugins/nexscope/convolve.h
new file mode 100644
index 0000000..4940c62
--- /dev/null
+++ b/noatun-plugins/nexscope/convolve.h
@@ -0,0 +1,61 @@
+/* convolve.h: Header for convolutions.
+ *
+ * Copyright (C) 1999 Ralph Loader <suckfish@ihug.co.nz>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef CONVOLVE_H
+#define CONVOLVE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* convolve_match takes two blocks, one twice the size of the other. The
+ * sizes of these are CONVOLVE_BIG and CONVOLVE_SMALL respectively. */
+#define CONVOLVE_DEPTH 8
+#define CONVOLVE_SMALL (1 << CONVOLVE_DEPTH)
+#define CONVOLVE_BIG (CONVOLVE_SMALL * 2)
+
+typedef union stack_entry_s
+{
+ struct {const double * left, * right; double * out;} v;
+ struct {double * main, * null;} b;
+
+} stack_entry;
+
+#define STACK_SIZE (CONVOLVE_DEPTH * 3)
+
+typedef struct convolve_state {
+ double left [CONVOLVE_BIG];
+ double right [CONVOLVE_SMALL * 3];
+ double scratch [CONVOLVE_SMALL * 3];
+ stack_entry stack[STACK_SIZE];
+} convolve_state;
+
+
+convolve_state *convolve_init (void);
+void convolve_close (convolve_state * state);
+
+int convolve_match (float * lastchoice,
+ float * input,
+ convolve_state * state);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/noatun-plugins/nexscope/gui.cpp b/noatun-plugins/nexscope/gui.cpp
new file mode 100644
index 0000000..912d8ea
--- /dev/null
+++ b/noatun-plugins/nexscope/gui.cpp
@@ -0,0 +1,197 @@
+#include <klocale.h>
+#include <qheader.h>
+#include <qlayout.h>
+#include <qdragobject.h>
+#include <kfiledialog.h>
+#include <kstdaction.h>
+#include <kaction.h>
+
+#include "gui.h"
+#include "renderers.h"
+#include "nex.h"
+
+class CreatorItem : public QListViewItem
+{
+public:
+ CreatorItem(QListView *parent, const QString &title)
+ : QListViewItem(parent, title)
+ {}
+};
+
+class TreeItem : public QListViewItem
+{
+public:
+ TreeItem(TreeItem *parent, TreeItem *after, CreatorItem *creator)
+ : QListViewItem(parent, after, creator->text(0))
+ {
+ RendererList *list;
+ if (parent)
+ list=static_cast<RendererList*>(parent->mRenderer);
+ else
+ list=nex->rendererList();
+
+ Renderer *afterRenderer=0;
+ if (after)
+ afterRenderer=after->mRenderer;
+
+ list->lock();
+ int pos=list->renderers().findRef(afterRenderer);
+ if (pos==-1) pos=list->renderers().count();
+
+ list->renderers().insert((uint)pos, mRenderer=nex->renderer(creator->text(0)));
+ list->unlock();
+ }
+
+ TreeItem(QListView *parent, TreeItem *after, const QString &title)
+ : QListViewItem(parent, after, title)
+ {
+ mRenderer=nex->rendererList();
+ setExpandable(true);
+ }
+
+ ~TreeItem()
+ {
+ RendererList *list;
+ if (parent())
+ list=static_cast<RendererList*>(static_cast<TreeItem*>(parent())->mRenderer);
+ else
+ return;
+
+ list->lock();
+ list->renderers().removeRef(mRenderer);
+ list->unlock();
+ delete mRenderer;
+ }
+
+ Renderer *renderer() { return mRenderer; }
+private:
+ Renderer *mRenderer;
+};
+
+Control::Control() : mConfigurator(0)
+{
+ {
+ KToolBar *tools=toolBar();
+ KStdAction::save(this, SLOT(save()), actionCollection())->plug(tools);
+ KStdAction::saveAs(this, SLOT(saveAs()), actionCollection())->plug(tools);
+ KStdAction::open(this, SLOT(open()), actionCollection())->plug(tools);
+
+ }
+
+ setCaption(i18n("Nex Configuration"));
+ QSplitter *mainSplitter=new QSplitter(this);
+ setCentralWidget(mainSplitter);
+ QSplitter *left=new QSplitter(Qt::Vertical, mainSplitter);
+ {
+ mTree=new RendererListView(left);
+ mTree->setItemsMovable(true);
+ mTree->setSorting(-1);
+ mTree->setRootIsDecorated(true);
+
+ connect(mTree, SIGNAL(dropped(QDropEvent*, QListViewItem*, QListViewItem*)),
+ SLOT(dropEvent(QDropEvent*, QListViewItem*, QListViewItem*)));
+
+ connect(mTree, SIGNAL(currentChanged(QListViewItem*)),
+ SLOT(currentChanged(QListViewItem*)));
+
+ mCreatorsList=new RendererListView(left);
+ mCreatorsList->addColumn(i18n("Name"));
+ mCreatorsList->header()->hide();
+ mCreatorsList->setDropVisualizer(false);
+ }
+
+ mRight=new QWidget(mainSplitter);
+ (new QHBoxLayout(mRight))->setAutoAdd(true);
+
+ QStringList list=nex->renderers();
+ for (QStringList::Iterator i=list.begin(); i!=list.end(); ++i)
+ addCreator(*i);
+
+ new TreeItem(mTree, 0, i18n("Main"));
+}
+
+void Control::save(const KURL &file)
+{
+// TODO
+}
+
+void Control::save()
+{
+ if (mCurrentURL.isEmpty())
+ saveAs();
+ else
+ save(mCurrentURL);
+}
+
+void Control::saveAs()
+{
+ KURL url;
+ url=KFileDialog::getSaveURL(0, "application/x-nexscope", this);
+ if (!url.isEmpty())
+ save(mCurrentURL=url);
+}
+
+void Control::open()
+{
+ KURL url=KFileDialog::getOpenURL(0, "application/x-nexscope");
+ if (!url.isEmpty())
+ open(mCurrentURL=url);
+}
+
+void Control::open(const KURL &file)
+{
+// TODO
+}
+
+
+void Control::addCreator(const QString &title)
+{
+ new CreatorItem(mCreatorsList, title);
+}
+
+void Control::dropEvent(QDropEvent *e, QListViewItem *parent, QListViewItem *pafter)
+{
+// if ((e->source() == mCreatorsList) && parent)
+ {
+ CreatorItem *i=static_cast<CreatorItem*>(mCreatorsList->currentItem());
+ if (!i)
+ {
+ std::cerr << "no creatoritem" << std::endl;
+
+ }
+ new TreeItem(static_cast<TreeItem*>(parent), static_cast<TreeItem*>(pafter), i);
+ }
+}
+
+void Control::currentChanged(QListViewItem *item)
+{
+ TreeItem *treeItem=static_cast<TreeItem*>(item);
+ delete mConfigurator;
+ mConfigurator=treeItem->renderer()->configure(mRight);
+ if (mConfigurator)
+ mConfigurator->show();
+}
+
+
+RendererListView::RendererListView(QWidget *p) : KListView(p)
+{
+ addColumn(i18n("Name"));
+ header()->hide();
+ setDragEnabled(true);
+ setAcceptDrops(true);
+ setSelectionMode(QListView::Single);
+}
+
+bool RendererListView::acceptDrag(QDropEvent *event) const
+{
+ return true; //QCString(event->format()) == "application/x-nex-rendererdrag";
+}
+
+QDragObject *RendererListView::dragObject() const
+{
+ if (!currentItem()) return 0;
+ return new QStoredDrag("application/x-nex-rendererdrag", (QWidget*)this);
+}
+
+
+#include "gui.moc"
diff --git a/noatun-plugins/nexscope/gui.h b/noatun-plugins/nexscope/gui.h
new file mode 100644
index 0000000..84fd2bf
--- /dev/null
+++ b/noatun-plugins/nexscope/gui.h
@@ -0,0 +1,54 @@
+#ifndef GUI_H
+#define GUI_H
+
+#include <kmainwindow.h>
+#include <klistview.h>
+#include <qsplitter.h>
+#include <qdict.h>
+#include <dcopobject.h>
+#include <kurl.h>
+
+class Renderer;
+
+class Control : public KMainWindow
+{
+Q_OBJECT
+
+public:
+ Control();
+
+ void addCreator(const QString &title);
+
+public slots:
+ void save(const KURL &file);
+ void save();
+ void saveAs();
+
+ void open();
+ void open(const KURL &file);
+
+protected slots:
+ void dropEvent(QDropEvent *e, QListViewItem *parent, QListViewItem *pafter);
+ void currentChanged(QListViewItem *item);
+
+private:
+ QWidget *mRight;
+ KListView *mTree, *mCreatorsList;
+ QWidget *mConfigurator;
+
+ KURL mCurrentURL;
+};
+
+class RendererListView : public KListView
+{
+Q_OBJECT
+public:
+ RendererListView(QWidget *p);
+
+protected:
+ virtual bool acceptDrag(QDropEvent *event) const;
+ virtual QDragObject *dragObject() const;
+};
+
+
+#endif
diff --git a/noatun-plugins/nexscope/input.cpp b/noatun-plugins/nexscope/input.cpp
new file mode 100644
index 0000000..4c787e7
--- /dev/null
+++ b/noatun-plugins/nexscope/input.cpp
@@ -0,0 +1,238 @@
+
+#include "nex.h"
+#include "convolve.h"
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <math.h>
+#include <noatun/plugin.h>
+
+Input::Input()
+{
+ memset(haystack, 0, sizeof(float)*512);
+ state=new convolve_state;
+
+ float d, *costab, *sintab;
+ long ul, ndiv2 = 512 / 2;
+
+ for (costab = fhtTab, sintab = fhtTab + 512 / 2 + 1, ul = 0; ul < 512; ul++)
+ {
+ d = PI * ul / ndiv2;
+ *costab = *sintab = ::cos(d);
+
+ costab += 2, sintab += 2;
+ if (sintab > fhtTab + 512 * 2)
+ sintab = fhtTab + 1;
+ }
+
+ notifier=0;
+ mScope=0;
+
+ connect();
+}
+
+Input::~Input()
+{
+ delete mScope;
+ std::cerr<< "Scope gone"<< std::endl;
+ delete notifier;
+// delete [] audio[2];
+// delete [] audio[3];
+// delete [] audio[4];
+// delete [] audio[5];
+}
+
+void Input::setConvolve(bool on)
+{
+ mConvolve=on;
+}
+
+void Input::connect()
+{
+ do
+ {
+ delete notifier;
+ delete mScope;
+ ok=true;
+ mScope=new StereoScope(10, Visualization::noatunPid());
+ mScope->setSamples(samples>(512+256) ? samples : samples+256);
+
+ notifier=new QObject;
+ new BoolNotifier(&ok, new ExitNotifier(Visualization::noatunPid(), notifier), notifier);
+ } while (!mScope->connected());
+}
+
+// [0] pcm left
+// [1] pcm right
+// [2] pcm center
+// [3] FFT (FHT) left
+// [4] FFT right
+// [5] FFT center
+
+void Input::getAudio(float **audio)
+{
+ static bool first=true;
+ if (first)
+ {
+ audio[2]=new float[samples];
+ audio[3]=new float[fhtsamples];
+ audio[4]=new float[fhtsamples];
+ audio[5]=new float[fhtsamples];
+ first=false;
+ }
+
+ if (!ok || !mScope->connected())
+ {
+ std::cerr << "reconnect" <<std::endl;
+ connect();
+ return;
+// delete mScope;
+// ::sleep(7);
+// mScope=new StereoScope(10, Visualization::noatunPid());
+// mScope->setSamples(samples);
+ }
+ std::vector<float> *left, *right;
+ mScope->scopeData(left, right);
+
+ register float *inleft=&*left->begin();
+ register float *inright=&*right->begin();
+
+
+ int offset=0;
+ if (mConvolve)
+ { // find the offset
+ for (register int i=0; i<512+256; ++i)
+ temp[i]=inleft[i]+inright[i];
+ offset=::convolve_match(haystack, temp, state);
+ if (offset==-1) offset=0;
+ inleft+=offset;
+ inright+=offset;
+
+ for (register int i=0; i<512; ++i)
+ {
+ haystack[i]*=.5;
+ haystack[i]+=temp[i+offset];
+ }
+ }
+
+ memcpy(outleft, inleft, samples*sizeof(float));
+ memcpy(outright, inright, samples*sizeof(float));
+
+ audio[0]=outleft;
+ audio[1]=outright;
+
+ // center channel
+ for (int i=0; i<samples; ++i)
+ audio[2][i]=(audio[0][i]+audio[1][i])*.5;
+
+ // perform the FFT (FHT in this case)
+ memcpy(audio[3], audio[0], fhtsamples);
+ memcpy(audio[4], audio[1], fhtsamples);
+
+ fht(audio[3]);
+ fht(audio[4]);
+
+ for (int i=0; i<fhtsamples; ++i)
+ {
+ audio[5][i]=(audio[3][i]+audio[4][i])*.5;
+ }
+
+
+ delete left;
+ delete right;
+}
+
+void Input::fht(float *p)
+{
+ long i;
+ float *q;
+ transform(p, fhtsamples, 0);
+
+ *p = (*p * *p), *p += *p, p++;
+
+ for (i = 1, q = p + fhtsamples - 2; i < (fhtsamples / 2); i++, --q)
+ *p++ = (*p * *p) + (*q * *q);
+
+ for (long i = 0; i < (fhtsamples / 2); i++)
+ *p++ *= .5;
+}
+
+void Input::transform(float *p, long n, long k)
+{
+ if (n == 8)
+ {
+ transform8(p + k);
+ return;
+ }
+
+ long i, j, ndiv2 = n / 2;
+ float a, *t1, *t2, *t3, *t4, *ptab, *pp;
+
+ for (i = 0, t1 = fhtBuf, t2 = fhtBuf + ndiv2, pp = &p[k]; i < ndiv2; i++)
+ *t1++ = *pp++, *t2++ = *pp++;
+
+ memcpy(p + k, fhtBuf, sizeof(float) * n);
+
+ transform(p, ndiv2, k);
+ transform(p, ndiv2, k + ndiv2);
+
+ j = 512 / ndiv2 - 1;
+ t1 = fhtBuf;
+ t2 = t1 + ndiv2;
+ t3 = p + k + ndiv2;
+ ptab = fhtTab;
+ pp = p + k;
+
+ a = *ptab++ * *t3++;
+ a += *ptab * *pp;
+ ptab += j;
+
+ *t1++ = *pp + a;
+ *t2++ = *pp++ - a;
+
+ for (i = 1, t4 = p + k + n; i < ndiv2; i++, ptab += j)
+ {
+ a = *ptab++ * *t3++;
+ a += *ptab * *--t4;
+
+ *t1++ = *pp + a;
+ *t2++ = *pp++ - a;
+ }
+
+ memcpy(p + k, fhtBuf, sizeof(float) * n);
+
+}
+
+void Input::transform8(float *p)
+{
+ float a, b, c, d, e, f, g, h,
+ b_f2, d_h2, sqrt2 = M_SQRT2,
+ a_c_eg, a_ce_g, ac_e_g, aceg,
+ b_df_h, bdfh;
+
+ a = *p++, b = *p++, c = *p++, d = *p++;
+ e = *p++, f = *p++, g = *p++, h = *p;
+ b_f2 = (b - f) * sqrt2;
+ d_h2 = (d - h) * sqrt2;
+
+ a_c_eg = a - c - e + g;
+ a_ce_g = a - c + e - g;
+ ac_e_g = a + c - e - g;
+ aceg = a + c + e + g;
+
+ b_df_h = b - d + f - h;
+ bdfh = b + d + f + h;
+
+ *p = a_c_eg - d_h2;
+ *--p = a_ce_g - b_df_h;
+ *--p = ac_e_g - b_f2;
+ *--p = aceg - bdfh;
+ *--p = a_c_eg + d_h2;
+ *--p = a_ce_g + b_df_h;
+ *--p = ac_e_g + b_f2;
+ *--p = aceg + bdfh;
+}
+
+
+
+
diff --git a/noatun-plugins/nexscope/nex.cpp b/noatun-plugins/nexscope/nex.cpp
new file mode 100644
index 0000000..af19409
--- /dev/null
+++ b/noatun-plugins/nexscope/nex.cpp
@@ -0,0 +1,597 @@
+#include "nex.h"
+#include "gui.h"
+
+#include <unistd.h>
+
+#include <kapplication.h>
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <klocale.h>
+
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qcheckbox.h>
+#include <qmultilineedit.h>
+
+#include "renderers.h"
+
+Mutex runLock;
+Nex *Nex::sNex=0;
+QTime timer;
+
+Renderer::Renderer() {}
+Renderer::~Renderer() {}
+
+Thread::Thread() : mThread(0)
+{
+
+}
+
+Thread::~Thread()
+{
+ if (mThread)
+ kill();
+}
+
+void Thread::start()
+{
+ mThread=SDL_CreateThread(&threadRun, (void*)this);
+}
+
+void Thread::kill()
+{
+ SDL_KillThread(mThread);
+}
+
+int Thread::wait()
+{
+ int val;
+ SDL_WaitThread(mThread, &val);
+ return val;
+}
+
+int Thread::threadRun(void *v)
+{
+ Thread *t=(Thread*)v;
+ return t->run();
+}
+
+NexCheckBox::NexCheckBox(QWidget *parent,
+ const QString &name, bool *v)
+ : QCheckBox(name, parent)
+{
+ value=v;
+ setChecked(*v);
+ connect(this, SIGNAL(toggled(bool)), SLOT(change(bool)));
+}
+void NexCheckBox::change(bool b)
+{
+ *value=b;
+}
+
+
+
+NexColorButton::NexColorButton(QWidget *parent, Pixel *color)
+ : KColorButton(parent)
+{
+ c=color;
+ QColor temp( (*c >> 16) & 0xFF, (*c >> 8) & 0xFF, *c & 0xFF);
+ setColor(temp);
+ connect(this, SIGNAL(changed(const QColor&)), SLOT(change(const QColor&)));
+}
+
+void NexColorButton::change(const QColor &co)
+{
+ *c= COLOR(qRed(co.rgb()), qGreen(co.rgb()), qBlue(co.rgb()));
+}
+
+void Bitmap::resize(int w, int h)
+{
+ delete [] mData;
+ mData=new Pixel[w*h];
+}
+
+void Bitmap::clear()
+{
+ memset(mData, 0, bytes());
+}
+
+void Bitmap::drawCircle(int x, int y, int r, Pixel color)
+{
+ int16_t cx = 0;
+ int16_t cy = r;
+ int16_t ocx = -1;
+ int16_t ocy = -1;
+ int16_t df = 1 - r;
+ int16_t d_e = 3;
+ int16_t d_se = -2 * r + 5;
+ int16_t xpcx, xmcx, xpcy, xmcy;
+ int16_t ypcy, ymcy, ypcx, ymcx;
+
+ do
+ { // Draw
+ if ((ocy!=cy) || (ocx!=cx))
+ {
+ xpcx=x+cx;
+ xmcx=x-cx;
+ if (cy>0)
+ {
+ ypcy=y+cy;
+ ymcy=y-cy;
+ setPixel(xmcx,ypcy,color);
+ setPixel(xpcx,ypcy,color);
+ setPixel(xmcx,ymcy,color);
+ setPixel(xpcx,ymcy,color);
+ }
+ else
+ {
+ setPixel(xmcx,y,color);
+ setPixel(xpcx,y,color);
+ }
+
+ ocy=cy;
+ xpcy=x+cy;
+ xmcy=x-cy;
+ if (cx>0)
+ {
+ ypcx=y+cx;
+ ymcx=y-cx;
+ setPixel(xmcy,ypcx,color);
+ setPixel(xpcy,ypcx,color);
+ setPixel(xmcy,ymcx,color);
+ setPixel(xpcy,ymcx,color);
+ }
+ else
+ {
+ setPixel(xmcy,y,color);
+ setPixel(xpcy,y,color);
+ }
+ ocx=cx;
+ }
+ // Update
+ if (df < 0)
+ {
+ df += d_e;
+ d_e += 2;
+ d_se += 2;
+ }
+ else
+ {
+ df += d_se;
+ d_e += 2;
+ d_se += 4;
+ cy--;
+ }
+ cx++;
+ } while(cx <= cy);
+}
+
+
+void Bitmap::fillCircle(int x, int y, int r, Pixel color)
+{
+ int16_t cx = 0;
+ int16_t cy = r;
+ int16_t ocx = -1;
+ int16_t ocy = -1;
+ int16_t df = 1 - r;
+ int16_t d_e = 3;
+ int16_t d_se = -2 * r + 5;
+ int16_t xpcx, xmcx, xpcy, xmcy;
+ int16_t ypcy, ymcy, ypcx, ymcx;
+
+ do
+ { // Draw
+ if ((ocy!=cy) || (ocx!=cx))
+ {
+ xpcx=x+cx;
+ xmcx=x-cx;
+ if (cy>0)
+ {
+ ypcy=y+cy;
+ ymcy=y-cy;
+ setPixel(xmcx,ypcy,color);
+ setPixel(xpcx,ypcy,color);
+ setPixel(xmcx,ymcy,color);
+ setPixel(xpcx,ymcy,color);
+ for (int h=xmcx; h<xpcx; h++)
+ setPixel(h, ypcy, color);
+
+ for (int h=xmcx; h<xpcx; h++)
+ setPixel(h, ymcy, color);
+ }
+ else
+ {
+ setPixel(xmcx,y,color);
+ setPixel(xpcx,y,color);
+ for (int h=xmcx; h<xpcx; h++)
+ setPixel(h, y, color);
+ }
+
+
+ ocy=cy;
+ xpcy=x+cy;
+ xmcy=x-cy;
+ if (cx>0)
+ {
+ ypcx=y+cx;
+ ymcx=y-cx;
+ setPixel(xmcy,ypcx,color);
+ setPixel(xpcy,ypcx,color);
+ setPixel(xmcy,ymcx,color);
+ setPixel(xpcy,ymcx,color);
+ for (int h=xmcy; h<xpcy; h++)
+ setPixel(h, ypcx, color);
+
+ for (int h=xmcy; h<xpcy; h++)
+ setPixel(h, ymcx, color);
+ }
+ else
+ {
+ setPixel(xmcy,y,color);
+ setPixel(xpcy,y,color);
+ for (int h=xmcy; h<xpcy; h++)
+ setPixel(h, y, color);
+ }
+ ocx=cx;
+ }
+ // Update
+ if (df < 0)
+ {
+ df += d_e;
+ d_e += 2;
+ d_se += 2;
+ }
+ else
+ {
+ df += d_se;
+ d_e += 2;
+ d_se += 4;
+ cy--;
+ }
+ cx++;
+ } while(cx <= cy);
+}
+
+
+void Bitmap::drawLine(int x1, int y1, int x2, int y2, Pixel color)
+{
+ // Variable setup
+ int dx = x2 - x1;
+ int sx = (dx >= 0) ? 1 : -1;
+ dx = sx * dx + 1;
+
+ int dy = y2 - y1;
+ int sy = (dy >= 0) ? 1 : -1;
+ dy = sy * dy + 1;
+
+
+ int pixx = sizeof(Pixel);
+ int pixy = width*sizeof(Pixel);
+ uint8_t *pixel = (uint8_t*)pixels() + pixx * x1 + pixy * y1;
+ pixx *= sx;
+ pixy *= sy;
+
+ if (dx < dy)
+ {
+ int swaptmp = dx;
+ dx = dy;
+ dy = swaptmp;
+ swaptmp = pixx;
+ pixx = pixy;
+ pixy = swaptmp;
+ }
+
+
+ // Draw
+ int y=0;
+
+ for(int x=0; x < dx; x++, pixel += pixx)
+ {
+ *(Pixel*)pixel=color;
+ y += dy;
+ if (y >= dx)
+ {
+ y -= dx;
+ pixel += pixy;
+ }
+ }
+
+}
+
+RendererList::RendererList() : mClearAfter(false)
+{
+ mFrame=nex->bitmapPool()->get(true);
+}
+
+RendererList::~RendererList()
+{
+ nex->bitmapPool()->release(mFrame);
+}
+
+Bitmap *RendererList::render(float *pcm[4], Bitmap *source)
+{
+ if (mClearAfter) mFrame->clear();
+
+ lock();
+ for (QPtrListIterator<Renderer> i(mRendererList); i.current(); ++i)
+ {
+ Bitmap *newframe=(*i)->render(pcm, mFrame);
+
+ if (newframe!=mFrame)
+ {
+ nex->bitmapPool()->release(mFrame);
+ mFrame=newframe;
+ }
+ }
+
+ unlock();
+
+ // add source+=source; return source;
+
+ uint8_t *d=(uint8_t*)source->pixels();
+ uint8_t *end=(uint8_t*)((uint8_t*)d+source->bytes());
+ uint8_t *s=(uint8_t*)mFrame->pixels();
+
+ while (d<end)
+ {
+ register int dest=*d;
+ if (dest && ((dest | *s) & 128))
+ {
+ // there's danger of going past 0xFF
+ dest+=*s;
+ if (dest & 256)
+ *d=0xFF; // oops, we did!
+ else
+ *d=dest;
+ }
+ else
+ {
+ // if neither touch the 128th bit, then the sum
+ // can't possibly be more than 0xFF
+ *d=dest+*s;
+ }
+
+
+ ++s;
+ ++d;
+ }
+
+ return source;
+}
+
+void RendererList::save(QDomElement &e)
+{
+ lock();
+ e.setTagName("List");
+
+ for (QPtrListIterator<Renderer> i(mRendererList); *i; ++i)
+ {
+ QDomElement item;
+ (*i)->save(item);
+ e.appendChild(item);
+ }
+
+ unlock();
+}
+
+void RendererList::load(const QDomElement &e)
+{
+ lock();
+
+ for (QDomNode n=e.firstChild(); !n.isNull(); n=n.nextSibling())
+ {
+ if (!n.isElement()) continue;
+ QDomElement child=n.toElement();
+
+ Renderer *r=0;
+
+ if (e.tagName()=="List")
+ r=new RendererList;
+ else
+ r=nex->renderer(e.tagName());
+
+ if (!r) continue;
+
+ r->load(child);
+ mRendererList.append(r);
+ }
+
+ unlock();
+}
+
+
+
+QWidget *RendererList::configure(QWidget *parent)
+{
+ return new RendererListConfigurator(this, parent);
+}
+
+RendererListConfigurator::RendererListConfigurator(RendererList *l, QWidget *parent)
+ : QWidget(parent), mList(l)
+{
+ (new QVBoxLayout(this))->setAutoAdd(true);
+ mErase=new QCheckBox(i18n("&Erase between frames"), this);
+ connect(mErase, SIGNAL(toggled(bool)), SLOT(eraseOn(bool)));
+ mErase->setChecked(mList->mClearAfter);
+
+ if (nex->rendererList()==l)
+ {
+ QCheckBox *mConvolve=new QCheckBox(i18n("&Convolve audio"), this);
+ connect(mConvolve, SIGNAL(toggled(bool)), SLOT(convolve(bool)));
+ mConvolve->setChecked(nex->input()->convolve());
+ }
+
+ new QLabel(i18n("Comments"), this);
+
+ mComments=new QMultiLineEdit(this);
+ mComments->setText(l->mComments);
+ mComments->setWordWrap(QMultiLineEdit::WidgetWidth);
+}
+
+RendererListConfigurator::~RendererListConfigurator()
+{
+ mList->mComments=mComments->text();
+}
+
+void RendererListConfigurator::eraseOn(bool state)
+{
+ mList->mClearAfter=state;
+}
+
+void RendererListConfigurator::convolve(bool state)
+{
+ nex->input()->setConvolve(state);
+}
+
+
+
+#define INSERT(name, func) mCreators.insert(name, new CreatorSig*(&func))
+
+Nex::Nex()
+{
+ sNex=this;
+ mBitmapPool=0;
+ mRendererList=0;
+
+ setupSize(width, height);
+
+ INSERT("Fade", Creators::fade);
+ INSERT("Doubler", Creators::doubler);
+ INSERT("Waveform", Creators::waveform);
+ INSERT("Hartley", Creators::hartley);
+}
+#undef INSERT
+
+void Nex::setupSize(int , int )
+{
+ mInput=new Input;
+ delete mBitmapPool;
+ delete mRendererList;
+ mBitmapPool=new BitmapPool();
+ mRendererList=new RendererList;
+}
+
+Nex::~Nex()
+{
+ delete mRendererList;
+ delete mBitmapPool;
+}
+
+#define NOTHREAD
+
+void Nex::go()
+{
+ runLock.unlock();
+ float *audio[6];
+
+ Bitmap *frame;
+ frame=mBitmapPool->get(true);
+
+ int frames=0;
+ QTime start(QTime::currentTime());
+
+ while (1)
+ {
+ mInput->getAudio(audio);
+ mRendererList->render(audio, frame);
+ int result=mOutput.display(frame);
+
+ frames++;
+
+ switch (result)
+ {
+ case OutputSDL::Exit:
+ std::cerr << "Trying" << std::endl;
+ delete mInput;
+ std::cerr << "Deleted" << std::endl;
+
+ std::cout << "Frames per Second: "
+ << frames/start.secsTo(QTime::currentTime()) << std::endl;
+ return;
+ case OutputSDL::Resize:
+// setupSize(width, height);
+ break;
+ }
+#ifdef NOTHREAD
+ kapp->processEvents();
+#endif
+ frame->clear();
+ }
+}
+
+
+Renderer *Nex::renderer(const QString &name)
+{
+ CreatorSig **sig=mCreators[name];
+ if (sig)
+ return (**sig)();
+ else
+ return 0;
+}
+
+QStringList Nex::renderers() const
+{
+ QDictIterator<CreatorSig*> i(mCreators);
+ QStringList list;
+
+ for (;i.current(); ++i)
+ list += i.currentKey();
+
+ return list;
+}
+
+
+#ifndef NOTHREAD
+class VisThread : public Thread
+{
+public:
+ virtual int run()
+ {
+ Nex::sNex->go();
+ exit(0);
+ return 0;
+ }
+};
+#endif
+
+int main(int argc, char **argv)
+{
+ Nex theNex;
+ Nex::sNex=&theNex;
+
+#ifndef NOTHREAD
+ runLock.lock();
+
+ VisThread vis;
+ vis.start();
+
+ runLock.lock();
+#endif
+
+ KAboutData aboutData("nex", I18N_NOOP("Nex"), "0.0.1",
+ I18N_NOOP("The awesome customizable scope"),
+ KAboutData::License_LGPL, "(C) 2001 Charles Samuels", 0,
+ "http://noatun.kde.org");
+
+ aboutData.addAuthor("Charles Samuels", I18N_NOOP("Nex Author"),
+ "charles@kde.org");
+
+ KCmdLineArgs::init( argc, argv, &aboutData );
+ KApplication app;
+
+
+ (new Control)->show();
+#ifdef NOTHREAD
+ theNex.go();
+
+#else
+ app.exec();
+
+ vis.wait();
+#endif
+ exit(0); //prevent segfault on exit, for some reason
+ return 0;
+}
+
+#include "nex.moc"
+
diff --git a/noatun-plugins/nexscope/nex.h b/noatun-plugins/nexscope/nex.h
new file mode 100644
index 0000000..05c7f81
--- /dev/null
+++ b/noatun-plugins/nexscope/nex.h
@@ -0,0 +1,352 @@
+#ifndef NEX_H
+#define NEX_H
+
+#include <qwidget.h>
+#include <qptrlist.h>
+#include <stdint.h>
+#include <vector>
+#include <qdict.h>
+
+#include <qdatetime.h>
+#include <iostream>
+
+#include <qdom.h>
+
+#include "SDL.h"
+#include "SDL_thread.h"
+
+typedef uint32_t Pixel;
+typedef uint8_t Byte;
+
+#define COLOR(r,g,b) ((r<<16) | (g<<8) | (b))
+#define COLORSTR(pixel) \
+ QString("#%1%2%3").arg(QString::number((pixel>>16) & 8, 16)) \
+ .arg(QString::number((pixel>>8) & 8, 16)).arg(QString::number(pixel& 8, 16))
+
+#define STRCOLOR(pixel) \
+ Pixel(((pixel.mid(1,2).toInt(0, 16)) <<16) \
+ | ((pixel.mid(3,2).toInt(0, 16)) <<8) \
+ | (pixel.mid(5,2).toInt(0, 16)))
+
+
+const int samples=512+256;
+const int fhtsamples=512;
+const int width=320*2;
+const int height=240*2;
+
+#define PI 3.141592654
+
+class Mutex
+{
+public:
+ Mutex() { mMutex=::SDL_CreateMutex(); }
+ ~Mutex() { ::SDL_DestroyMutex(mMutex); }
+
+ inline bool lock() { return !::SDL_mutexP(mMutex); }
+ inline bool unlock() { return !::SDL_mutexV(mMutex); }
+
+private:
+ SDL_mutex *mMutex;
+};
+
+class Thread
+{
+public:
+ Thread();
+
+ /**
+ * kill() the thread
+ **/
+ virtual ~Thread();
+
+ void start();
+ void kill();
+ int wait();
+
+protected:
+ virtual int run()=0;
+
+private:
+ static int threadRun(void *);
+
+ SDL_Thread *mThread;
+};
+
+class Spacer : public QWidget
+{
+Q_OBJECT
+public:
+ Spacer(QWidget *parent) : QWidget(parent)
+ {
+ setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding,
+ QSizePolicy::MinimumExpanding));
+ }
+};
+
+class Bitmap
+{
+public:
+ Bitmap() : mData(0)
+ { }
+ ~Bitmap() { delete [] mData; }
+
+ void resize(int w, int h);
+
+ inline void setPixel(int x, int y, Pixel c)
+ { mData[y*width+x] = c; }
+
+ inline void drawVerticalLine(int x, int yBottom, int yTop, Pixel c)
+ {
+ register int w=width;
+ Pixel *d=mData+x+yTop*w;
+ yBottom-=yTop;
+ do
+ {
+ *d=c;
+ d+=width;
+ } while (yBottom--);
+ }
+
+ inline void drawHorizontalLine(int left, int right, int y, Pixel c)
+ {
+ Pixel *d=mData+y*width+left;
+ right-=left;
+ do
+ {
+ *(d++)=c;
+ } while (right--);
+ }
+
+ void drawCircle(int x, int y, int radius, Pixel color);
+ void fillCircle(int x, int y, int radius, Pixel color);
+ void drawLine(int x1, int y1, int x2, int y2, Pixel color);
+
+ inline int bytes() const { return width*height*sizeof(Pixel); }
+ inline Pixel *pixels(int x, int y) { return &(mData[y*width+x]); }
+ inline Pixel *pixels() const { return mData; }
+ inline Pixel pixel(int x, int y) { return mData[y*width+x]; }
+ inline Pixel *lastPixel() { return pixels(width-1, height-1); }
+
+ void clear();
+
+private:
+ Pixel *mData;
+};
+
+
+
+
+/**
+ * maintains a list of bitmaps, so you
+ * can recycle allocated segments
+ *
+ * Thread safe
+ **/
+class BitmapPool
+{
+public:
+ BitmapPool();
+ ~BitmapPool();
+
+ Bitmap *get(bool clear=false);
+ void release(Bitmap *bitmap);
+
+private:
+ struct PoolItem;
+ QPtrList<BitmapPool::PoolItem> mBitmaps;
+ Mutex mMutex;
+};
+
+class StereoScope;
+
+struct convolve_state;
+
+class Input
+{
+public:
+ Input();
+ ~Input();
+
+ /**
+ * audio is a pair of pointers to the buffers,
+ * one for each channel
+ *
+ * get the amount stated in the const global
+ * samples
+ **/
+ void getAudio(float **audio);
+
+ void setConvolve(bool state);
+
+ bool convolve() { return state; }
+
+private:
+ void fht(float *p);
+ void transform(float *p, long n, long k);
+ void transform8(float *p);
+ void connect();
+
+private:
+ StereoScope *mScope;
+ float outleft[samples], outright[samples];
+ float haystack[512];
+ float temp[samples+256];
+ convolve_state *state;
+ volatile bool mConvolve;
+
+ float fhtBuf[samples-256];
+ float fhtTab[(samples-256)*2];
+
+ bool ok;
+ QObject *notifier;
+};
+
+class OutputSDL
+{
+public:
+ enum Event
+ { None=0, Resize, Exit };
+
+ OutputSDL();
+ ~OutputSDL();
+
+ int display(Bitmap *source);
+
+private:
+ // static for speed, since there can be only one anyway because SDL sucks
+ static SDL_Surface *surface;
+};
+
+#include <qcheckbox.h>
+#include <kcolorbutton.h>
+
+class NexCheckBox : public QCheckBox
+{
+Q_OBJECT
+public:
+ NexCheckBox(QWidget *parent, const QString &, bool *v);
+
+private slots:
+ void change(bool b);
+
+private:
+ bool *value;
+
+};
+
+class NexColorButton : public KColorButton
+{
+Q_OBJECT
+public:
+ NexColorButton(QWidget *parent, Pixel *color);
+
+private slots:
+ void change(const QColor &c);
+
+private:
+ Pixel *c;
+};
+
+class Renderer
+{
+public:
+ Renderer();
+ virtual ~Renderer();
+
+ virtual Bitmap *render(float *pcm[4], Bitmap *source) = 0;
+
+ virtual QWidget *configure(QWidget*) { return 0; }
+
+ virtual void save(QDomElement &) {}
+
+ virtual void load(const QDomElement &) {}
+};
+
+class QCheckBox;
+class QMultiLineEdit;
+class RendererList;
+
+class RendererListConfigurator : public QWidget
+{
+Q_OBJECT
+public:
+ RendererListConfigurator(RendererList *l, QWidget *parent);
+ ~RendererListConfigurator();
+
+public slots:
+ void eraseOn(bool state);
+ void convolve(bool state);
+
+private:
+ QCheckBox *mErase;
+ QMultiLineEdit *mComments;
+
+ RendererList *mList;
+};
+
+class RendererList : public Renderer, public Mutex
+{
+ friend class RendererListConfigurator;
+
+public:
+ RendererList();
+ virtual ~RendererList();
+ virtual Bitmap *render(float *pcm[4], Bitmap *source);
+
+ QPtrList<Renderer> &renderers() { return mRendererList; }
+ const QPtrList<Renderer> &renderers() const { return mRendererList; }
+
+ bool clearAfter() const { return mClearAfter; }
+ void setClearAfter(bool b) { mClearAfter=b; }
+
+ virtual QWidget *configure(QWidget *parent);
+
+ virtual void save(QDomElement &e);
+
+ virtual void load(const QDomElement &e);
+
+private:
+ QPtrList<Renderer> mRendererList;
+ volatile bool mClearAfter;
+ QString mComments;
+
+ Bitmap *mFrame;
+};
+
+typedef Renderer* (CreatorSig)();
+
+class Nex
+{
+public:
+ Nex();
+ ~Nex();
+
+ void go();
+ void setupSize(int w, int h);
+
+ static Nex *nex() { return sNex; }
+ BitmapPool *bitmapPool() { return mBitmapPool; }
+
+ RendererList *rendererList() { return mRendererList; }
+
+ Input *input() { return mInput; }
+
+ Renderer *renderer(const QString &name);
+
+ QStringList renderers() const;
+
+public:
+ static Nex *sNex;
+
+private:
+ Input *mInput;
+ OutputSDL mOutput;
+ BitmapPool *mBitmapPool;
+ RendererList *mRendererList;
+ QDict<CreatorSig*> mCreators;
+};
+
+#define nex Nex::nex()
+
+
+#endif
diff --git a/noatun-plugins/nexscope/nexscope.plugin b/noatun-plugins/nexscope/nexscope.plugin
new file mode 100644
index 0000000..ccd8ce2
--- /dev/null
+++ b/noatun-plugins/nexscope/nexscope.plugin
@@ -0,0 +1,72 @@
+Filename=noatunnexscope.la
+Author=Charles Samuels
+Site=http://noatun.kde.org/
+Email=charles@kde.org
+Type=visualization
+License=LGPL
+Name=NexScope
+Name[eo]=NeksoSkopo
+Name[es]=Siguiente Búsqueda
+Name[hi]=नेक्स्कोप
+Name[ru]=Зрительный образ Nex
+Name[sv]=Nexskop
+Name[ta]=Nex வரையெல்லை
+Name[tg]=Намуди тамошобини Nex
+Name[tr]=Nekskop
+Name[xh]=Iscope esilandelayo
+Comment=The ultra-customizable visualization
+Comment[az]=Ultra-ə'la əyani efektlər
+Comment[bg]=Визуализация, която може да се настройва лесно
+Comment[bs]=Ultra-prilagodljiva vizualizacija
+Comment[ca]=La visualització ultra-personalitzable
+Comment[cs]=Ultra přizpůsobitelná vizualizace
+Comment[cy]=Y dychmygydd tra-addasadwy
+Comment[da]=Den ultra-brugerdefinérbare visualisering
+Comment[de]=Sehr anpassbare Visualisierung
+Comment[el]=Η απόλυτα-ρυθμιζόμενη οπτικοποίηση
+Comment[en_GB]=The ultra-customisable visualisation
+Comment[es]=La visualización totalmente personalizable
+Comment[et]=Äärmiselt kohandatav ostsilloskoop
+Comment[eu]=Bisualizazio ultra pertsonalizagarria
+Comment[fa]=تجسم بسیار قابل سفارشی
+Comment[fi]=Erittäin säädettävä visualisaatio
+Comment[fr]=L'affichage ultra-configurable
+Comment[fy]=Tige goed oan te passen fisualisaasje
+Comment[ga]=An t-amharcléiriú fíor-in-saincheaptha
+Comment[gl]=A visualización ultra-configurábel
+Comment[he]=המחשה הניתנת להתאמה אישית מרבית
+Comment[hi]=एक अल्ट्रा-कस्टमाइजेबल विज़ुअलाइज़ेशन
+Comment[hr]=Totalno prilagodiva vizualizacija
+Comment[hu]=Százféle módon variálható vizualizációs modul
+Comment[is]=Sjónræm myndbrella sem er mjög stillanleg
+Comment[it]=Un visualizzatore ultra personalizzabile
+Comment[ja]=超カスタマイズ可能な視覚効果
+Comment[ka]=ულტრა მორგებადი ვიზუალიზაცია
+Comment[kk]=Баптауы бай көрінісі
+Comment[km]=រូបភាព​មើល​ឃើញ​​ដែល​អាច​ប្ដូរ​តាម​បំណងបាន​​ច្រើន​ហួស​​ពេក
+Comment[lt]=Ypač derinama vizualizacija
+Comment[mk]=Ултра-приспособлива визуелизација
+Comment[ms]=Visualisasi ultra boleh selenggara
+Comment[nb]=Den ekstremt tilpasningsdyktige visualiseringen
+Comment[nds]=Filmmaker mit bannig vele Instellen
+Comment[ne]=अति-अनुकूलनयोग्य दृश्टीकरण
+Comment[nl]=Zeer goed aan te passen visualisatie
+Comment[nn]=Den ekstremt tiplasningsdyktige visualiseringa
+Comment[pl]=Wizualizacja z bardzo wieloma możliwościami dostosowania
+Comment[pt]=A visualização ultra-configurável
+Comment[pt_BR]=Uma visualização ultra-personalizável
+Comment[ro]=O vizualizare sunet extrem de configurabilă
+Comment[ru]=Тонко настраиваемый зрительный образ
+Comment[sk]=Veľmi dobre nastaviteľná vizualizácia
+Comment[sl]=Ultra prilagodljiva vizualizacija
+Comment[sr]=Ултраприлагодљива визуелизација
+Comment[sr@Latn]=Ultraprilagodljiva vizuelizacija
+Comment[sv]=Den extremt anpassningsbara visualiseringen
+Comment[ta]=அல்ட்ரா-தனிப்பயனாக்கு காட்சியமைப்புகள்
+Comment[tg]=Мизроби борики намуди тамошобин
+Comment[tr]=Ultra-özelleştirilebilir görsellik
+Comment[uk]=Гнучкий втулок представлення
+Comment[vi]=Ô xem có thể tùy chỉnh suốt
+Comment[xh]=Okubonakalayo okungaphezulu kwemfuneko
+Comment[zh_CN]=极可定制的视觉化显示
+Comment[zh_TW]=可調整視覺化
diff --git a/noatun-plugins/nexscope/noatunplugin.cpp b/noatun-plugins/nexscope/noatunplugin.cpp
new file mode 100644
index 0000000..8bbc860
--- /dev/null
+++ b/noatun-plugins/nexscope/noatunplugin.cpp
@@ -0,0 +1,49 @@
+#include "nex.h"
+#include "noatunplugin.h"
+
+#include <kprocess.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+
+extern "C"
+{
+Plugin *create_plugin()
+{
+ KGlobal::locale()->insertCatalogue("nexscope");
+ return new NexPlugin();
+}
+}
+
+
+NexPlugin::NexPlugin()
+{
+ connect(&process, SIGNAL(processExited(KProcess *)), this, SLOT(processExited(KProcess *)));
+}
+
+NexPlugin::~NexPlugin()
+{
+ process.kill();
+}
+
+void NexPlugin::init()
+{
+ process << KStandardDirs::findExe("nexscope.bin");
+
+ // Note that process.start() will fail if findExe fails, so there's no real need
+ // for two separate checks.
+ if(!process.start(KProcess::NotifyOnExit, (KProcess::Communication)(KProcess::Stdin | KProcess::Stdout)))
+ {
+ KMessageBox::error(0, i18n("Unable to start noatunNex. Check your installation."));
+ unload();
+ }
+
+}
+
+void NexPlugin::processExited(KProcess *)
+{
+ unload();
+}
+
+#include "noatunplugin.moc"
+
diff --git a/noatun-plugins/nexscope/noatunplugin.h b/noatun-plugins/nexscope/noatunplugin.h
new file mode 100644
index 0000000..8f8abb2
--- /dev/null
+++ b/noatun-plugins/nexscope/noatunplugin.h
@@ -0,0 +1,25 @@
+#ifndef NEXPLUG_H
+#define NEXPLUG_H
+
+#include <kprocess.h>
+#include <noatun/plugin.h>
+
+class NexPlugin : public QObject, public Plugin
+{
+Q_OBJECT
+
+public:
+ NexPlugin();
+ virtual ~NexPlugin();
+
+ void init();
+
+private slots:
+ void processExited(KProcess *);
+
+private:
+ KProcess process;
+};
+
+
+#endif
diff --git a/noatun-plugins/nexscope/output.cpp b/noatun-plugins/nexscope/output.cpp
new file mode 100644
index 0000000..84885e2
--- /dev/null
+++ b/noatun-plugins/nexscope/output.cpp
@@ -0,0 +1,48 @@
+#include "nex.h"
+#include <stdlib.h>
+
+SDL_Surface *OutputSDL::surface=0;
+
+OutputSDL::OutputSDL()
+{
+ SDL_Init(SDL_INIT_VIDEO);
+
+ SDL_WM_SetCaption("Nex","noatun");
+
+ bool fullscreen=false;
+ Uint32 flags = SDL_SWSURFACE | (fullscreen ? SDL_FULLSCREEN : SDL_RESIZABLE);
+
+ surface = SDL_SetVideoMode(width, height, 32, flags);
+
+ SDL_ShowCursor(1);
+
+}
+
+
+OutputSDL::~OutputSDL()
+{
+ SDL_FreeSurface(surface);
+}
+
+
+int OutputSDL::display(Bitmap *source)
+{
+ memcpy(surface->pixels, source->pixels(), source->bytes());
+ SDL_UpdateRect(surface, 0, 0, 0, 0);
+
+ SDL_Event event;
+
+ while ( SDL_PollEvent(&event) > 0 )
+ {
+ switch (event.type)
+ {
+ case SDL_QUIT:
+ return Exit;
+ default:
+ break;
+ }
+ }
+ return None;
+}
+
+
diff --git a/noatun-plugins/nexscope/regionwidget.cpp b/noatun-plugins/nexscope/regionwidget.cpp
new file mode 100644
index 0000000..32e9987
--- /dev/null
+++ b/noatun-plugins/nexscope/regionwidget.cpp
@@ -0,0 +1,77 @@
+
+#include "regionwidget.h"
+
+RegionWidget::RegionWidget(QWidget *parent)
+{
+
+}
+
+RegionWidget::RegionWidget(const QSize &viewsize, QWidget *parent)
+{
+
+}
+RegionWidget::RegionWidget(int x, int y, int w, int h, const QSize &viewsize,
+ QWidget *parent)
+{
+
+}
+
+RegionWidget::RegionWidget(const QRect &region, const QSize &viewsize,
+ QWidget *parent)
+{
+
+}
+
+RegionWidget::~RegionWidget()
+{
+
+}
+
+
+QRect RegionWidget::region() const
+{
+ return QRect(0,0,0,0);
+}
+
+void RegionWidget::setX(int x)
+{
+
+}
+
+void RegionWidget::setY(int y)
+{
+
+}
+
+void RegionWidget::setWidth(int w)
+{
+
+}
+
+void RegionWidget::setHeight(int h)
+{
+
+}
+
+void RegionWidget::setRegion(const QRect &region)
+{
+
+}
+
+void RegionWidget::setViewSize(const QSize &size)
+{
+
+}
+
+void RegionWidget::moved(int x, int y)
+{
+
+}
+
+void RegionWidget::resized(int w, int h)
+{
+
+}
+
+#include "regionwidget.moc"
+
diff --git a/noatun-plugins/nexscope/regionwidget.h b/noatun-plugins/nexscope/regionwidget.h
new file mode 100644
index 0000000..eeac8b4
--- /dev/null
+++ b/noatun-plugins/nexscope/regionwidget.h
@@ -0,0 +1,47 @@
+#ifndef REGIONWIDGET_H
+#define REGIONWIDGET_H
+
+#include <qframe.h>
+
+/**
+ * show a widget with a field rectangle, and a mini-region inside
+ *
+ * text boxes allow the region to be resized and moved, along with
+ * click-n-drag
+ **/
+class RegionWidget : public QFrame
+{
+Q_OBJECT
+public:
+ RegionWidget(QWidget *parent);
+ RegionWidget(const QSize &viewsize, QWidget *parent);
+ RegionWidget(int x, int y, int w, int h, const QSize &viewsize,
+ QWidget *parent);
+ RegionWidget(const QRect &region, const QSize &viewsize, QWidget *parent);
+
+ ~RegionWidget();
+
+ QRect region() const;
+
+public slots:
+ void setX(int x);
+ void setY(int y);
+ void setWidth(int w);
+ void setHeight(int h);
+
+ void setRegion(const QRect &region);
+
+ void setViewSize(const QSize &size);
+
+signals:
+ void changed();
+ void changed(int x, int y, int w, int h);
+ void changed(const QRect &region);
+
+protected:
+ virtual void moved(int x, int y);
+ virtual void resized(int w, int h);
+};
+
+
+#endif
diff --git a/noatun-plugins/nexscope/renderers.cpp b/noatun-plugins/nexscope/renderers.cpp
new file mode 100644
index 0000000..830024b
--- /dev/null
+++ b/noatun-plugins/nexscope/renderers.cpp
@@ -0,0 +1,369 @@
+#include "nex.h"
+#include <stdlib.h>
+#include <time.h>
+#include <math.h>
+#include <iostream>
+#include <qlayout.h>
+#include <klocale.h>
+
+struct HorizontalPair : public Renderer
+{
+ HorizontalPair() : color(0x578cd8)
+ {
+ // 0x578cd8 0x3cff3f 0x10FFFF
+ horizontal=false;
+ pair=true;
+ }
+
+ QWidget *configure(QWidget *parent)
+ {
+ QWidget *config=new QWidget(parent);
+ (new QVBoxLayout(config))->setAutoAdd(true);
+
+ new NexColorButton(config, &color);
+ new NexCheckBox(config, i18n("Horizontal"), &horizontal);
+ new NexCheckBox(config, i18n("Pair"), &pair);
+ new NexCheckBox(config, i18n("Solid"), &solid);
+ new Spacer(config);
+
+ return config;
+ }
+
+ static inline void processV(int h, int start, int end, Bitmap *d,
+ float *ch, Pixel c, register bool solid)
+ {
+ int oldx=(start+end)/2;
+ int mid=oldx;
+ float quarter=(end-start)/2.0;
+ for (int y=0; y<h; ++y)
+ {
+ int newx=mid+(int)(ch[y]*quarter);
+ if (newx<start) newx=start;
+ if (newx>end) newx=end;
+ if (newx>oldx)
+ d->drawHorizontalLine(oldx, newx, y, c);
+ else
+ d->drawHorizontalLine(newx, oldx, y, c);
+ if (!solid)
+ oldx=newx;
+ }
+ }
+
+ static inline void processH(int h, int start, int end, Bitmap *d,
+ float *ch, Pixel c, register bool solid)
+ {
+ int oldx=(start+end)/2;
+ int mid=oldx;
+ float quarter=(end-start)/2.0;
+ for (int y=0; y<h; ++y)
+ {
+ int newx=mid+(int)(ch[y]*quarter);
+ if (newx<start) newx=start;
+ if (newx>end) newx=end;
+ if (newx>oldx)
+ d->drawVerticalLine(y, newx, oldx, c);
+ else
+ d->drawVerticalLine(y, oldx, newx, c);
+ if (!solid)
+ oldx=newx;
+ }
+ }
+
+ virtual Bitmap *render(float **pcm, Bitmap *src)
+ {
+ if (horizontal)
+ {
+ if (pair)
+ {
+ processH(width, 0, height/2, src, pcm[0], color, solid);
+ processH(width, height/2, height, src, pcm[1], color, solid);
+ }
+ else
+ {
+ processH(width, 0, height, src, pcm[0], color, solid);
+ }
+ }
+ else
+ {
+ if (pair)
+ {
+ processV(height, 0, width/2, src, pcm[0], color, solid);
+ processV(height, width/2, width, src, pcm[1], color, solid);
+ }
+ else
+ {
+ processV(height, 0, width, src, pcm[0], color, solid);
+ }
+ }
+
+ return src;
+ }
+
+ virtual void save(QDomElement &e)
+ {
+ e.setTagName("Waveform");
+ e.setAttribute("horizontal", (int)horizontal);
+ e.setAttribute("pair", (int)pair);
+ e.setAttribute("solid", (int)solid);
+ e.setAttribute("color", COLORSTR(color));
+ }
+
+ virtual void load(const QDomElement &e)
+ {
+ horizontal=(bool)e.attribute("horizontal", 0).toInt();
+ pair=(bool)e.attribute("pair", 0).toInt();
+ solid=(bool)e.attribute("solid", 0).toInt();
+ color=STRCOLOR(e.attribute("color", "#FFFFFF"));
+ }
+
+ Pixel color;
+ bool horizontal;
+ bool pair;
+ bool solid;
+};
+
+struct Hartley : public Renderer
+{
+ virtual Bitmap *render(float **pcm, Bitmap *src)
+ {
+ float mult=height/2.0;
+ for (int i=0; i<width; i++)
+ {
+ int h=pcm[3][i]*mult;
+ if (h>height) h=height;
+
+ src->drawVerticalLine(i, height, height-h,0xFFFFFF);
+ }
+ return src;
+ }
+};
+
+class Fade : public Renderer
+{
+public:
+ virtual Bitmap *render(float *[2], Bitmap *src)
+ {
+ register int i=src->bytes()/sizeof(Pixel);
+
+ register Pixel *d=src->pixels();
+ do
+ {
+ *d -= ((*d & 0xf0f0f0f0) >> 4) +
+ ((*d & 0xe0e0e0e0) >> 5);
+ ++d;
+ } while (--i > 0);
+ return src;
+ }
+};
+
+
+struct Doubler : public Renderer
+{
+ Doubler()
+ {
+ srcX=20;
+ srcY=100;
+ destX=240;
+ destY=160;
+ srcWidth=40;
+ srcHeight=40;
+
+ }
+
+ inline static void copyAndDouble(Pixel *src, Pixel *dest1,
+ Pixel *dest2, int w)
+ {
+ while (w--)
+ {
+ *dest1=*dest2=*src;
+ dest1++;
+ dest2++;
+ *dest1=*dest2=*src;
+ dest1++;
+ dest2++;
+ src++;
+ }
+ }
+
+ virtual Bitmap *render(float *[2], Bitmap *src)
+ {
+ for (int y=0; y<srcHeight; y++)
+ {
+ copyAndDouble(src->pixels(srcX, y+srcY),
+ src->pixels(destX, destY+y*2),
+ src->pixels(destX, destY+y*2+1),
+ srcWidth);
+ }
+ return src;
+ }
+
+ int srcX, srcY;
+ int destX, destY;
+ int srcWidth, srcHeight;
+};
+
+struct Blur : public Renderer
+{
+ virtual Bitmap *render(float *[2], Bitmap *src)
+ {
+ Bitmap *b=nex->bitmapPool()->get();
+
+ register Byte *buffer=(Byte*)b->pixels();
+ register unsigned short pitch=width*sizeof(Pixel);
+
+ // skip the first row
+ buffer+=pitch;
+
+ // skip the first pixel on the second row;
+ buffer+=sizeof(Pixel);
+
+ // we also don't want to do the last row
+ register Pixel *end=b->lastPixel();
+ end-=pitch;
+ // and the last pixel on the second-to-last row
+ end-=sizeof(Pixel);
+
+ while (buffer<(Byte*)end)
+ {
+
+
+ }
+ return b;
+ }
+};
+
+#ifdef cow
+struct FadeHeat : public Renderer
+{
+ inline void fadePixelHeat(Bitmap *out, int x, int y)
+ {
+ Pixel up = lastOutput->pixel(x, y-1);
+ Pixel down = lastOutput->pixel(x, y+1);
+ Pixel left = lastOutput->pixel(x-1, y);
+ Pixel right = lastOutput->pixel(x+1, y);
+
+ // assuming Pixel AARRGGBB
+ Pixel r, g, b, pixel;
+ const int rMask = 0xFFFF0000;
+ const int gMask = 0x00FFFF00;
+ const int bMask = 0x0000FFFF;
+
+ // average the up down left right for each component
+ r = up & rMask +
+ right & rMask +
+ left & rMask +
+ bottom & rMask;
+ r >>= 2;
+ r &= rMask;
+
+ g = up & gMask +
+ right & gMask +
+ left & gMask +
+ bottom & gMask;
+ g >>= 2;
+ g &= gMask;
+
+ b = up & bMask +
+ right & bMask +
+ left & bMask +
+ bottom & bMask;
+ b >>= 2;
+ b &= bMask;
+
+ Pixel all=r|g|b;
+ if(!all)
+ {
+ out->pixel(x, y, 0);
+ return;
+ }
+
+ // some more input
+ Pixel c=lastLastOutput->getPixel(x, y);
+ c+=0x00010101;
+
+
+
+ all -= c;
+
+ // bounds check
+/* slow: if (all & 0xFF000000) all=0;
+ else if (all & 0x7F000000) all = 0x00FFFFFF;
+ out->setPixel(x, y, all); */
+
+ // everything is normal
+ if(!(all & 0xFF000000)) out->setPixel(x,y, all);
+ // wraparound occured (0x80==0b10000000)
+ else if(all & 0x80000000) out->setPixel(x,y, 0);
+ else out->setPixel(x,y, 0x00FFFFFF);
+ }
+
+ virtual Bitmap *render(float *[2], Bitmap *src)
+ {
+ Bitmap *lastLastTemp = lastLastOutput;
+ lastLastOutput = lastOutput;
+ lastOutputBmp.data = src;
+ src = lastLastTemp;
+
+ int x,y,i,j,start,end;
+ int step = outWidth*2;
+ for(x=i=0, j=outWidth*(outHeight-1)*2;
+ x<outWidth;
+ x++, i+=2, j+=2)
+ {
+ fadePixelHeat(src, x,0,i);
+ fadePixelHeat(src, x,0,i+1);
+ fadePixelHeat(src, x,outHeight-1,j);
+ fadePixelHeat(src, x,outHeight-1,j+1);
+ }
+
+ for(y=1, i=outWidth*2, j=outWidth*4-2;
+ y<outHeight;
+ y++, i+=step, j+=step)
+ {
+ fadePixelHeat(src, 0, y,i);
+ fadePixelHeat(src, 0, y,i+1);
+ fadePixelHeat(src, outWidth-1,y,j);
+ fadePixelHeat(src, outWidth-1,y,j+1);
+ }
+
+
+ for(y=1,start=outWidth*2+2,
+ end=outWidth*4-2; y<outHeight-1;
+ y++,start+=step,end+=step)
+ {
+ int i = start;
+ do
+ {
+ short j =
+ ( short(Dlo[i-2])+
+ Dlo[i+2]+
+ +Dlo[i-step]
+ +Dlo[i+step]
+ >> 2)
+ +Dlo[i];
+ if (!j)
+ {
+ Do[i] = 0;
+ }
+ else
+ {
+ j = j-Dllo[i]+(Dllo[i] -Dlo[i]>>2)-1;
+ if (j < 0) Do[i] = 0;
+ else if (j & (255*256)) Do[i] = 255;
+ else Do[i] = j;
+ }
+ } while(++i < end);
+ }
+
+ return src;
+ }
+
+ Bitmap *lastOutput, Bitmap *lastLastOutput;
+};
+#endif
+
+#define RENDERERS_CPP
+#include "renderers.h"
+#undef RENDERERS_CPP
+
+
diff --git a/noatun-plugins/nexscope/renderers.h b/noatun-plugins/nexscope/renderers.h
new file mode 100644
index 0000000..3105849
--- /dev/null
+++ b/noatun-plugins/nexscope/renderers.h
@@ -0,0 +1,34 @@
+#ifndef RENDERERS_H
+#define RENDERERS_H
+
+#include <qstring.h>
+
+class Renderer;
+
+namespace Creators
+{
+
+
+
+#ifdef RENDERERS_CPP
+#define REGISTER(function, cl) \
+Renderer *function() \
+{ \
+ return new cl; \
+}
+#else
+#define REGISTER(function, cl) \
+Renderer *function();
+#endif
+
+REGISTER(fade, Fade)
+REGISTER(doubler, Doubler)
+REGISTER(waveform, HorizontalPair);
+REGISTER(hartley, Hartley);
+
+#undef REGISTER
+};
+
+
+#endif
+
diff --git a/noatun-plugins/noatunmadness/Makefile.am b/noatun-plugins/noatunmadness/Makefile.am
new file mode 100644
index 0000000..973ae51
--- /dev/null
+++ b/noatun-plugins/noatunmadness/Makefile.am
@@ -0,0 +1,10 @@
+INCLUDES= $(all_includes)
+
+kde_module_LTLIBRARIES = noatunmadness.la
+noatunmadness_la_SOURCES = madness.cpp
+noatunmadness_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+noatunmadness_la_LIBADD = $(LIB_KFILE) -lnoatun -lm
+noatunmadness_la_METASOURCES = AUTO
+
+noatun_DATA = madness.plugin
+noatundir = $(kde_datadir)/noatun
diff --git a/noatun-plugins/noatunmadness/madness.cpp b/noatun-plugins/noatunmadness/madness.cpp
new file mode 100644
index 0000000..0b0d086
--- /dev/null
+++ b/noatun-plugins/noatunmadness/madness.cpp
@@ -0,0 +1,123 @@
+/*****************************************************************
+
+Copyright (c) 2001 Charles Samuels <charles@kde.org>
+ 2000 Rik Hemsley <rik@kde.org>
+
+This code is released under the GNU General Public License 2.0, or any
+later version, at your option. I mean, you know the drill, just read
+RMS's novel that I'm supposed to put at the top of every story. He's insane.
+******************************************************************/
+
+#include "madness.h"
+
+#include <kwin.h>
+#include <kwinmodule.h>
+#include <kiconloader.h>
+#include <math.h>
+#include <iostream>
+
+#include <X11/Xlib.h>
+
+
+extern "C"
+{
+Plugin *create_plugin()
+{
+ return new Madness();
+}
+}
+
+Madness::Madness()
+ : MonoFFTScope(100), Plugin(), mWm(this)
+{
+ connect(&mWm, SIGNAL(currentDesktopChanged(int)), SLOT(update()));
+ connect(&mWm, SIGNAL(windowAdded(WId)), SLOT(update()));
+ connect(&mWm, SIGNAL(windowRemoved(WId)), SLOT(update()));
+ connect(&mWm, SIGNAL(strutChanged()), SLOT(update()));
+
+}
+
+Madness::~Madness()
+{
+ QMap<WId, QPoint>::ConstIterator it(mOriginalPositions.begin());
+
+ for (; it != mOriginalPositions.end(); ++it)
+ XMoveWindow(qt_xdisplay(), it.key(), (*it).x(), (*it).y());
+}
+
+void Madness::update()
+{
+ mWindowList = mWm.windows();
+ mWorkArea = mWm.workArea();
+
+ QValueList<WId>::ConstIterator it(mWindowList.begin());
+
+ for (; it != mWindowList.end(); ++it)
+ {
+ QRect area=KWin::info(*it).frameGeometry;
+ if (!mOriginalPositions.contains(*it))
+ mOriginalPositions.insert(*it, area.topLeft());
+ }
+}
+
+void Madness::init()
+{
+ update();
+ MonoFFTScope::start();
+}
+
+void Madness::scopeEvent(float *d, int size)
+{
+ int delta=0; // in pixels
+ for (int count=0; count<size; count++)
+ {
+ delta+=(int)((log10(d[count]+1)/log(2))*(size-count))/2;
+ }
+
+// cout << "delta: " << delta << endl;
+
+ QValueList<WId>::ConstIterator it(mWindowList.begin());
+
+ for (; it != mWindowList.end(); ++it)
+ {
+ KWin::Info i(KWin::info(*it));
+
+ if ((NET::Visible != i.mappingState) ||
+ ((NET::Unknown != i.windowType) &&
+ (NET::Normal != i.windowType) &&
+ (NET::Tool != i.windowType) &&
+ (NET::Menu != i.windowType) &&
+ (NET::Dialog != i.windowType)) || (NET::Max & i.state)
+ || (NET::Shaded & i.state)
+ || (mWm.currentDesktop() != i.desktop))
+ continue;
+
+ QRect area=i.frameGeometry;
+ float lightness=100000.0/(area.width()*area.height());
+
+ int x=area.x();
+ int y=area.y();
+
+
+ int dx=(int)((delta*lightness*(area.height()/10)/100))*(KApplication::random()%2 ? -1 : 1);
+ int dy=(int)((delta*lightness*(area.width()/10)/100))*(KApplication::random()%2 ? -1 : 1);
+
+ if (dx < 0 && (x - dx < mWorkArea.left()))
+ dx = -dx;
+
+ else if (dx > 0 && (x + dx + area.width() > mWorkArea.right()))
+ dx = -dx;
+
+ if (dy < 0 && (y - dy < mWorkArea.top()))
+ dy = -dy;
+
+ else if (dy > 0 && (y + dy + area.height() > mWorkArea.bottom()))
+ dy = -dy;
+
+
+ XMoveWindow(qt_xdisplay(), i.win, x + dx, y + dy);
+ }
+
+}
+
+#include "madness.moc"
diff --git a/noatun-plugins/noatunmadness/madness.h b/noatun-plugins/noatunmadness/madness.h
new file mode 100644
index 0000000..b36c468
--- /dev/null
+++ b/noatun-plugins/noatunmadness/madness.h
@@ -0,0 +1,32 @@
+#ifndef MADNESS_H
+#define MADNESS_H
+
+#include <noatun/plugin.h>
+#include <string.h>
+#include <qmap.h>
+#include <qvaluelist.h>
+#include <kwinmodule.h>
+
+class Madness : public QObject, public MonoFFTScope, public Plugin
+{
+Q_OBJECT
+public:
+ Madness();
+ virtual ~Madness();
+
+ void init();
+
+private slots:
+ void update();
+
+protected:
+ virtual void scopeEvent(float *data, int bands);
+
+private:
+ KWinModule mWm;
+ QValueList<WId> mWindowList;
+ QRect mWorkArea;
+ QMap<WId, QPoint> mOriginalPositions;
+};
+
+#endif
diff --git a/noatun-plugins/noatunmadness/madness.plugin b/noatun-plugins/noatunmadness/madness.plugin
new file mode 100644
index 0000000..ddfd136
--- /dev/null
+++ b/noatun-plugins/noatunmadness/madness.plugin
@@ -0,0 +1,105 @@
+Filename=noatunmadness.la
+Author=Charles Samuels
+Site=http://noatun.kde.org/
+Email=charles@kde.org
+Type=visualization
+License=GPL
+Name=Madness
+Name[ar]=جنون
+Name[az]=Dəlilik
+Name[br]=Fallentez
+Name[bs]=Ludilo
+Name[cs]=Šílenost
+Name[cy]=Gwallgofrwydd
+Name[da]=Galskab
+Name[de]=Verrücktheit
+Name[el]=Τρέλα
+Name[eo]=Delireco
+Name[es]=Locura
+Name[et]=Hullumeelsus
+Name[fa]=دیوانگی
+Name[fi]=Hulluus
+Name[fy]=Gekheid
+Name[gl]=Loucura
+Name[hi]=मेडनेस
+Name[hr]=Ludilo
+Name[ka]=სიგიჟე
+Name[km]=ភាពឆ្កួត
+Name[lt]=Beprotybė
+Name[mk]=Беснило
+Name[nds]=Mallheit
+Name[ne]=पागलपन
+Name[nl]=Gekheid
+Name[nn]=Galskap
+Name[nso]=Bogafa
+Name[pl]=Szaleństwo
+Name[pt]=Loucura
+Name[pt_BR]=Maldade
+Name[ro]=Nebunie
+Name[ru]=Безумие
+Name[sl]=Norost
+Name[sv]=Galenskap
+Name[ta]= முட்டாள்தனம்
+Name[tg]=Беандешагӣ
+Name[tr]=Çılgınlık
+Name[uk]=Божевілля
+Name[vi]=Chứng điên
+Name[xh]=Impambano
+Name[zh_CN]=疯狂
+Comment=A weird and annoying scope that moves your windows
+Comment[af]='n weird en irriterend skoop wat skuiwe jou vensters
+Comment[ar]=ملحق غريب و مزعج يقوم بتحريك نوافذك
+Comment[az]=Pəncərələrinizi daşıyan dəlicə və narahat edən dairə
+Comment[bg]=Досадна приставка за преместване на прозореца
+Comment[bs]=Čudan i neugodan scope koji pomjera rvaše prozore
+Comment[ca]=Un estrany i molest calidoscopi que mou les finestres
+Comment[cs]=Otravná vizualizace, který hýbe s vašimi okny
+Comment[cy]=Sgop annifyr a diflas sy'n symud eich ffenestri
+Comment[da]=Et underligt og irriterende virkefelt der flytter dine vinduer
+Comment[de]=Ein verrücktes und nervendes Oszilloskop, das Fenster verschiebt
+Comment[el]=Ένα περίεργο και ενοχλητικό καλειδοσκόπιο που μετακινεί τα παράθυρά σας
+Comment[eo]=Bizara kaj incita vidilo kiu movas viajn fenestrojn
+Comment[es]=Algo extraño y fastidioso se mueve por su pantalla
+Comment[et]=Veider ja ärritav ostsilloskoop, mis paneb aknad lendlema
+Comment[eu]=Zure leihoak mugitzen dituen esparru bitxi eta harrigarria
+Comment[fa]=دامنۀ رنجش‌آور و مرموزی که پنجره‌های شما را حرکت می‌دهد
+Comment[fi]=Outo ja rasittava oskiloskooppi, joka liikuttelee ikkunoitasi
+Comment[fr]=Un aperçu magique et ennuyeux qui déplace votre fenêtre
+Comment[fy]=In maffe en nerveuze Ossilloskoop dy't jo finsters ferpleatst
+Comment[ga]=Scóp corr ciapach a bhogann do chuid fuinneog
+Comment[gl]=Un osciloscópio estraño e irritante que move as suas fiestras
+Comment[he]=תחום מוזר ומעצבן שמזיז את החלונות שלך
+Comment[hi]=एक सनकी और चिढ़ाकू स्कोप जो आपके विंडो को खिसकाता है
+Comment[hr]=Neobičan i živcirajući osciloskop koji pomiče vaše prozore
+Comment[hu]=Egy különleges ablakmozgató vizualizációs modul
+Comment[is]=Undarlegur og pirrandi mælir sem færir gluggana þína
+Comment[it]=Uno strano e scocciante "scope" che muove le tue finestre
+Comment[ja]=奇妙で鬱しくあなたのウィンドウを動かすスコープ
+Comment[ka]=უცნაური გამოსახულებები, რომლებიც თქვენს ფანჯრებს გადააადგილებს
+Comment[kk]=Терезлеріңізді жылжытатын біртүрлі көрініс
+Comment[km]= វិសាល​ដែល​រំខាន ​និង​ចំឡែក​ដែល​ផ្លាស់ទី​បង្អួច​របស់​អ្នក​
+Comment[lt]=Keista ir erzinantis vaizdas, judinantis Jūsų langus
+Comment[mk]=Чуден и досаден осцилоскоп што Ви ги движи прозорците
+Comment[ms]=Skop yang pelik untuk memerhati pergerakan pada tetingkap anda
+Comment[nb]=En rar og irriterende ting som flytter vinduene dine
+Comment[nds]=En snaaksch un piesacken Frequenzkieker, de Finster verschufft
+Comment[ne]=तपाईँको सञ्झ्याल चलाउने एउटा भाग्य र कष्टप्रद क्षेत्र
+Comment[nl]=Een maffe en nerveuze Oscilloscoop die uw vensters verplaatst
+Comment[nn]=Ein rar og irriterande ting som flyttar vindauga dine
+Comment[pl]=Przesuwa twoje okna w rytm muzyki
+Comment[pt]=Um osciloscópio estranho e irritante que move as suas janelas
+Comment[pt_BR]= Um escopo estranho que move suas janelas
+Comment[ro]=Un modul de vizualizare care mişcă ferestrele
+Comment[ru]=Странный зрительный образ, перемещающий ваши окна
+Comment[sk]=Šialený a protivný rámec ktorý hýbe vašími oknami.
+Comment[sl]=Čudno in nadležno območje, ki premika vaša okna
+Comment[sr]=Чудан и иритирајући нишан који помера ваше прозоре
+Comment[sr@Latn]=Čudan i iritirajući nišan koji pomera vaše prozore
+Comment[sv]=Konstigt och påfrestande oscilloskop som flyttar fönster
+Comment[ta]=ஒரு புதிரான வரையெல்லை உங்கள் சாளரத்தை நகர்த்துகிறது
+Comment[tg]=Намуди тамошобини аҷиб, ки тирезаҳои шуморо бетартиб мекунад
+Comment[tr]=Pencerelerinizi taşıyan garip ve sinir bozucu bir alan
+Comment[uk]=Дивний та набридливий моноскоп, що пересуває ваші вікна
+Comment[vi]=Ô xem lạ di chuyển các cửa sổ
+Comment[xh]=Isibuko esingaqhelekanga nesidikayo sesibuko esi hambisa iiwindow zakho
+Comment[zh_CN]=一个会移动您的窗口的奇怪而有讨厌的观测器
diff --git a/noatun-plugins/oblique/COPYING b/noatun-plugins/oblique/COPYING
new file mode 100644
index 0000000..34364e3
--- /dev/null
+++ b/noatun-plugins/oblique/COPYING
@@ -0,0 +1,35 @@
+
+ This file is hereby licensed under the GNU General Public License version
+ 2 or later at your option.
+
+ This file is licensed under the Qt Public License version 1 with the
+ condition that the licensed will be governed under the Laws of California
+ (USA) instead of Norway. Disputes will be settled in Santa Clara county
+ courts.
+
+ This file is licensed under the following additional license. Be aware
+ that it is identical to the BSD license, except for the added clause 3:
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. By integrating this software into any other software codebase, you waive
+ all rights to any patents associated with the stated codebase.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/noatun-plugins/oblique/Makefile.am b/noatun-plugins/oblique/Makefile.am
new file mode 100644
index 0000000..09b200c
--- /dev/null
+++ b/noatun-plugins/oblique/Makefile.am
@@ -0,0 +1,18 @@
+SUBDIRS = . schemas
+
+INCLUDES= -I$(top_srcdir)/noatun/library $(all_includes)
+kde_module_LTLIBRARIES = noatun_oblique.la
+
+noatun_oblique_la_SOURCES = base.cpp kbuffer.cpp query.cpp oblique.cpp tree.cpp file.cpp selector.cpp menu.cpp cmodule.cpp kdatacollection.cpp view.cpp
+
+noatun_oblique_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+noatun_oblique_la_LIBADD = $(LIB_KIO) -lnoatun $(BERKELEY_DB_LIBS)
+
+noatun_oblique_la_METASOURCES = AUTO
+
+noatundata_DATA = oblique.plugin
+noatundatadir = $(kde_datadir)/noatun
+
+rc_DATA = obliqueui.rc
+rcdir = $(kde_datadir)/noatun
+
diff --git a/noatun-plugins/oblique/base.cpp b/noatun-plugins/oblique/base.cpp
new file mode 100644
index 0000000..60bb272
--- /dev/null
+++ b/noatun-plugins/oblique/base.cpp
@@ -0,0 +1,435 @@
+// Copyright (c) 2003 Charles Samuels <charles@kde.org>
+// See the file COPYING for redistribution terms.
+
+#include "base.h"
+#include "file.h"
+
+#include "kdbt.h"
+#include "kbuffer.h"
+
+#include <qstringlist.h>
+#include <qmap.h>
+#include <qfile.h>
+#include <qdom.h>
+
+#include <cstdlib>
+#include <assert.h>
+#include <db_cxx.h>
+
+
+
+struct Base::Private
+{
+ Private() : db(0, DB_CXX_NO_EXCEPTIONS) { }
+ Db db;
+ typedef KDbt<FileId> Key;
+ typedef KDbt<QStringList> Data;
+
+ FileId high;
+
+ FileId cachedId;
+ mutable QMap<QString,QString> cachedProperties;
+
+ QPtrList<Slice> slices;
+ int sliceHigh;
+};
+
+
+Base::Base(const QString &file)
+{
+ d = new Private;
+ d->cachedId = 0;
+
+ QCString filename = QFile::encodeName(file);
+
+ bool create = true;
+ if (d->db.open(
+#if DB_VERSION_MINOR > 0 && DB_VERSION_MAJOR >= 4
+ NULL,
+#endif
+ filename,
+ 0, DB_BTREE, DB_NOMMAP, 0
+ )==0)
+ { // success
+ Private::Data data;
+ Private::Key key(0);
+ if (d->db.get(0, &key, &data, 0)==0)
+ {
+ QStringList strs;
+ data.get(strs);
+
+ mFormatVersion = strs[0].toUInt(0, 16); // TODO
+ d->high = strs[1].toUInt();
+
+ if (strs.count() == 3)
+ loadMetaXML(strs[2]);
+ else
+ loadMetaXML("");
+
+ create=false;
+ }
+ }
+ if (create)
+ { // failure
+ QFile(filename).remove();
+ d->db.open(
+#if DB_VERSION_MINOR > 0 && DB_VERSION_MAJOR >= 4
+ NULL,
+#endif
+ filename,0, DB_BTREE, DB_NOMMAP|DB_CREATE,0
+ );
+
+ d->high=0;
+ QStringList strs;
+ strs << "00010002" << "0" << "";
+ resetFormatVersion();
+ loadMetaXML("");
+ Private::Data data(strs);
+ Private::Key key(0);
+ // in the stringlist for Key(0), we have the following list:
+ // { "version of the file",
+ // "the high extreme (auto-increment counter in SQL terminology)",
+ // "the metaxml"
+ // }
+ d->db.put(0, &key, &data, 0);
+ }
+}
+
+void Base::resetFormatVersion()
+{
+ mFormatVersion = 0x00010002;
+}
+
+Base::~Base()
+{
+ QStringList strs;
+ strs << QString::number(mFormatVersion, 16) << QString::number(d->high);
+ strs << saveMetaXML();
+
+ Private::Data data(strs);
+ Private::Key key(0);
+ d->db.put(0, &key, &data, 0);
+ d->db.sync(0);
+ d->db.close(0);
+ delete d;
+}
+
+File Base::add(const QString &file)
+{
+ Private::Key key(++d->high);
+ QStringList properties;
+ properties << "file" << file;
+ Private::Data data(properties);
+
+ unless (d->db.put(0, &key, &data, 0))
+ {
+ // success !
+ File f(this, d->high);
+ f.makeCache();
+ emit added(f);
+ return f;
+ }
+
+ return File();
+}
+
+File Base::find(FileId id)
+{
+ if (id == 0) return File();
+
+ Private::Key key(id);
+ Private::Data data;
+
+ unless (d->db.get(0, &key, &data, 0))
+ {
+ // exists
+ return File(this, id);
+ }
+ else
+ {
+ return File(); // null item
+ }
+}
+
+void Base::clear()
+{
+ for (FileId id = high(); id >= 1; id--)
+ {
+ File f = find(id);
+ if (f)
+ f.remove();
+ }
+}
+
+
+FileId Base::high() const
+{
+ return d->high;
+}
+
+File Base::first(FileId first)
+{
+ if (first > high()) return File();
+
+ while (!find(first))
+ {
+ ++first;
+ if (first > high())
+ return File();
+ }
+ return File(this, first);
+}
+
+QString Base::property(FileId id, const QString &property) const
+{
+ loadIntoCache(id);
+ if (!d->cachedProperties.contains(property)) return QString::null;
+ QMap<QString,QString>::Iterator i = d->cachedProperties.find(property);
+ return i.data();
+}
+
+void Base::setProperty(FileId id, const QString &key, const QString &value)
+{
+ loadIntoCache(id);
+ d->cachedProperties.insert(key, value);
+ // reinsert it into the DB
+
+ QStringList props;
+ for (
+ QMap<QString,QString>::Iterator i(d->cachedProperties.begin());
+ i != d->cachedProperties.end(); ++i
+ )
+ {
+ props << i.key() << i.data();
+ }
+
+ Private::Data data(props);
+ Private::Key dbkey(id);
+ d->db.put(0, &dbkey, &data, 0);
+ d->db.sync(0);
+
+ emit modified(File(this, id));
+}
+
+QStringList Base::properties(FileId id) const
+{
+ loadIntoCache(id);
+ QStringList props;
+ for (
+ QMap<QString,QString>::Iterator i(d->cachedProperties.begin());
+ i != d->cachedProperties.end(); ++i
+ )
+ {
+ props << i.key();
+ }
+ return props;
+}
+
+void Base::clearProperty(FileId id, const QString &key)
+{
+ loadIntoCache(id);
+ d->cachedProperties.remove(key);
+ // reinsert it into the DB
+
+ QStringList props;
+ for (
+ QMap<QString,QString>::Iterator i(d->cachedProperties.begin());
+ i != d->cachedProperties.end(); ++i
+ )
+ {
+ if (i.key() != key)
+ props << i.key() << i.data();
+ }
+
+ Private::Data data(props);
+ Private::Key dbkey(id);
+ d->db.put(0, &dbkey, &data, 0);
+ d->db.sync(0);
+
+ emit modified(File(this, id));
+}
+
+void Base::remove(File file)
+{
+ Private::Key key(file.id());
+
+ unless (d->db.del(0, &key, 0))
+ {
+ emit removed(file);
+ if (file.id() == d->high)
+ {
+ d->high--; // optimization
+ }
+ }
+ d->db.sync(0);
+}
+
+void Base::loadIntoCache(FileId id) const
+{
+ if (d->cachedId == id) return;
+
+ d->cachedId = id;
+ d->cachedProperties.clear();
+
+ Private::Key key(id);
+ Private::Data data;
+ unless (d->db.get(0, &key, &data, 0))
+ {
+ QStringList props;
+ data.get(props);
+
+ if (props.count() % 2)
+ { // corrupt?
+ const_cast<Base*>(this)->remove(File(const_cast<Base*>(this), id));
+ return;
+ }
+
+ for (QStringList::Iterator i(props.begin()); i != props.end(); ++i)
+ {
+ QString &key = *i;
+ QString &value = *++i;
+ d->cachedProperties.insert(key, value);
+ }
+ }
+}
+
+QString Base::saveMetaXML()
+{
+ QDomDocument doc;
+ doc.setContent(QString("<meta />"));
+ QDomElement doce = doc.documentElement();
+
+ QDomElement e = doc.createElement("slices");
+ e.setAttribute("highslice", QString::number(d->sliceHigh));
+ doce.appendChild(e);
+
+ for (QPtrListIterator<Slice> i(d->slices); *i; ++i)
+ {
+ QDomElement slice = doc.createElement("slice");
+ slice.setAttribute("id", (*i)->id());
+ slice.setAttribute("name", (*i)->name());
+ e.appendChild(slice);
+ }
+ return doc.toString();
+}
+
+void Base::move(FileId oldid, FileId newid)
+{
+ Private::Key key(oldid);
+ Private::Data data;
+ unless (d->db.get(0, &key, &data, 0))
+ {
+ QStringList props;
+ data.get(props);
+ d->db.del(0, &key, 0);
+
+ Private::Key key2(newid);
+ d->db.put(0, &key2, &data, 0);
+ }
+}
+
+void Base::dump()
+{
+ for (FileId id=1; id <= high(); id++)
+ {
+ QStringList props = properties(id);
+ std::cerr << id << '.';
+ for (QStringList::Iterator i(props.begin()); i != props.end(); ++i)
+ {
+ QString prop = *i;
+ std::cerr << ' ' << prop.latin1() << '=' << property(id, prop).latin1();
+ }
+ std::cerr << std::endl;
+ }
+}
+
+void Base::notifyChanged(const File &file)
+{
+ emit modified(file);
+}
+
+
+QPtrList<Slice> Base::slices()
+{
+ return d->slices;
+}
+
+Slice *Base::addSlice(const QString &name)
+{
+ Slice *sl = new Slice(this, d->sliceHigh++, name);
+ d->slices.append(sl);
+ slicesModified();
+ return sl;
+}
+
+Slice *Base::defaultSlice()
+{
+ for (QPtrListIterator<Slice> i(d->slices); *i; ++i)
+ {
+ if ((*i)->id() == 0) return *i;
+ }
+
+ abort();
+ return 0;
+}
+
+void Base::removeSlice(Slice *slice)
+{
+ assert(slice->id() > 0);
+ d->slices.removeRef(slice);
+ delete slice;
+}
+
+Slice *Base::sliceById(int id)
+{
+ for (QPtrListIterator<Slice> i(d->slices); *i; ++i)
+ {
+ if ((*i)->id() == id) return *i;
+ }
+ return 0;
+}
+
+
+void Base::loadMetaXML(const QString &xml)
+{
+ d->slices.setAutoDelete(true);
+ d->slices.clear();
+ d->slices.setAutoDelete(false);
+
+ QDomDocument doc;
+ doc.setContent(xml);
+ QDomElement doce = doc.documentElement();
+ bool loadedId0=false;
+
+ for (QDomNode n = doce.firstChild(); !n.isNull(); n = n.nextSibling())
+ {
+ QDomElement e = n.toElement();
+ if (e.isNull()) continue;
+
+ if (e.tagName().lower() == "slices")
+ {
+ d->sliceHigh = e.attribute("highslice", "1").toInt();
+ for (QDomNode n = e.firstChild(); !n.isNull(); n = n.nextSibling())
+ {
+ QDomElement e = n.toElement();
+ if (e.isNull()) continue;
+ if (e.tagName().lower() == "slice")
+ {
+ int id = e.attribute("id").toInt();
+ if (id==0 && loadedId0) break;
+ loadedId0=true;
+ QString name = e.attribute("name");
+ d->slices.append(new Slice(this, id, name));
+ }
+ }
+ }
+ }
+
+ if (d->slices.count() == 0)
+ {
+ // we must have a default
+ d->slices.append(new Slice(this, 0, ""));
+ }
+}
+
+#include "base.moc"
diff --git a/noatun-plugins/oblique/base.h b/noatun-plugins/oblique/base.h
new file mode 100644
index 0000000..c9cb8d4
--- /dev/null
+++ b/noatun-plugins/oblique/base.h
@@ -0,0 +1,105 @@
+// Copyright (c) 2003,2004 Charles Samuels <charles@kde.org>
+// See the file COPYING for redistribution terms.
+#ifndef BASE_H
+#define BASE_H
+
+// ;)
+#define unless(e) if(!(e))
+
+#include <qstring.h>
+#include <qobject.h>
+#include <qptrlist.h>
+
+class File;
+class Slice;
+
+typedef unsigned int FileId;
+
+class Base : public QObject
+{
+Q_OBJECT
+
+ struct Private;
+ Private *d; // not for BC, but for compile times :)
+ friend class Slice;
+ friend class File;
+ unsigned int mFormatVersion;
+
+public:
+ Base(const QString &file);
+ ~Base();
+
+ File add(const QString &file);
+
+ File find(FileId id);
+
+ void clear();
+
+ /**
+ * get the highest FileID
+ **/
+ FileId high() const;
+
+ /**
+ * @return first item after the given id (inclusive)
+ **/
+ File first(FileId id=1);
+
+ QString property(FileId id, const QString &property) const;
+ void setProperty(FileId id, const QString &key, const QString &value);
+ QStringList properties(FileId id) const;
+ void clearProperty(FileId, const QString &key);
+
+ /**
+ * same as File::remove
+ **/
+ void remove(File f);
+
+ /**
+ * change the id of a file
+ **/
+ void move(FileId oldid, FileId newid);
+
+ void dump();
+
+ QPtrList<Slice> slices();
+ Slice *addSlice(const QString &name);
+ Slice *defaultSlice();
+ Slice *sliceById(int id);
+
+ unsigned int formatVersion() const { return mFormatVersion; }
+ void resetFormatVersion();
+
+public slots:
+ void notifyChanged(const File &file);
+
+signals:
+ void added(File file);
+ void removed(File file);
+ void modified(File file);
+
+ void addedTo(Slice *slice, File file);
+ void removedFrom(Slice *slice, File file);
+
+ /**
+ * emitted when something of the slices gets modified
+ * @ref Slice calls this itself via a friendship
+ **/
+ void slicesModified();
+
+private:
+ void loadIntoCache(FileId id) const;
+
+private: // friends for Slice
+ void removeSlice(Slice *slice);
+
+private:
+ /**
+ * load the xml that lives at the head of the db and contains
+ * potentially lots of structured data
+ **/
+ void loadMetaXML(const QString &xml);
+ QString saveMetaXML();
+};
+
+#endif
diff --git a/noatun-plugins/oblique/cmodule.cpp b/noatun-plugins/oblique/cmodule.cpp
new file mode 100644
index 0000000..93b4069
--- /dev/null
+++ b/noatun-plugins/oblique/cmodule.cpp
@@ -0,0 +1,663 @@
+// Copyright (c) 2003 Charles Samuels <charles@kde.org>
+// See the file COPYING for redistribution terms.
+
+#include "cmodule.h"
+#include "oblique.h"
+#include "file.h"
+
+#include <kregexpeditorinterface.h>
+#include <kparts/componentfactory.h>
+#include <klocale.h>
+#include <klistview.h>
+#include <klineedit.h>
+#include <kiconloader.h>
+#include <kinputdialog.h>
+#include <kconfig.h>
+
+#include <qgroupbox.h>
+#include <qcheckbox.h>
+#include <qlabel.h>
+#include <qvbox.h>
+#include <qhbox.h>
+#include <qfileinfo.h>
+#include <qtooltip.h>
+#include <qpushbutton.h>
+#include <qlayout.h>
+#include <qcombobox.h>
+#include <qwhatsthis.h>
+#include <qtabwidget.h>
+#include <qheader.h>
+
+SchemaConfig::SchemaConfig(QWidget *parent, Oblique *oblique)
+ : QWidget(parent)
+{
+ mOblique = oblique;
+ mIgnore = true;
+ mRegexpEditor=0;
+
+ {
+ QVBoxLayout *layout = new QVBoxLayout(this, 11, 7);
+ layout->setAutoAdd(true);
+ layout->setSpacing(7);
+ }
+
+
+ {
+ QHBox *box = new QHBox(this);
+ box->setSpacing(7);
+ mSchemaList = new QComboBox(box);
+ connect(
+ mSchemaList, SIGNAL(activated(const QString&)),
+ SLOT(selectSchema(const QString&))
+ );
+
+ mAdd = new QPushButton(BarIconSet("filenew"), 0, box);
+ mAdd->setFixedWidth(mAdd->height());
+ QToolTip::add(mAdd, i18n("Create new schema"));
+ connect(mAdd, SIGNAL(clicked()), SLOT(newSchema()));
+
+ mRemove = new QPushButton(BarIconSet("editdelete"), 0, box);
+ mRemove->setFixedWidth(mRemove->height());
+ QToolTip::add(mRemove, i18n("Remove this schema"));
+ connect(mRemove, SIGNAL(clicked()), SLOT(removeSchema()));
+
+ mCopy = new QPushButton(BarIconSet("editcopy"), 0, box);
+ mCopy->setFixedWidth(mCopy->height());
+ QToolTip::add(mCopy, i18n("Copy this schema"));
+ connect(mCopy, SIGNAL(clicked()), SLOT(copySchema()));
+ }
+
+
+ {
+ QHBox *middle = new QHBox(this);
+ middle->setSpacing(7);
+
+ mSchemaTree = new KListView(middle);
+ connect(
+ mSchemaTree, SIGNAL(currentChanged(QListViewItem*)),
+ SLOT(setCurrent(QListViewItem*))
+ );
+ connect(
+ mSchemaTree, SIGNAL(moved(QListViewItem *, QListViewItem *, QListViewItem *)),
+ SLOT(move(QListViewItem *, QListViewItem *, QListViewItem *))
+ );
+
+ mSchemaTree->setAcceptDrops(true);
+ mSchemaTree->setSorting(-1);
+ mSchemaTree->setDropVisualizer(true);
+ mSchemaTree->setDragEnabled(true);
+ mSchemaTree->setItemsMovable(true);
+
+ mSchemaTree->addColumn(i18n("Property"));
+ mSchemaTree->addColumn(i18n("Value"));
+ mSchemaTree->addColumn(i18n("Presentation"));
+
+ QVBox *buttons = new QVBox(middle);
+
+ mAddSibling = new QPushButton(BarIconSet("1rightarrow", KIcon::SizeSmall), "",buttons);
+ mAddSibling->setFixedWidth(mAddSibling->height());
+ connect(mAddSibling, SIGNAL(clicked()), SLOT(addSibling()));
+ QToolTip::add(mAddSibling, i18n("Create a new item after the selected one"));
+
+ mAddChild = new QPushButton(BarIconSet("2rightarrow", KIcon::SizeSmall), "", buttons);
+ mAddChild->setFixedWidth(mAddChild->height());
+ connect(mAddChild, SIGNAL(clicked()), SLOT(addChild()));
+ QToolTip::add(mAddChild, i18n("Create a new child item under the selected one"));
+
+ mRemoveSelf = new QPushButton(BarIconSet("filenew", KIcon::SizeSmall), "", buttons);
+ mRemoveSelf->setFixedWidth(mRemoveSelf->height());
+ connect(mRemoveSelf, SIGNAL(clicked()), SLOT(removeSelf()));
+ QToolTip::add(mRemoveSelf, i18n("Remove the selected item"));
+
+ new QWidget(buttons);
+ }
+
+
+ {
+ QVBox *side = new QVBox(this);
+ side->setSpacing(7);
+ // the controllers
+ {
+ QWidget *topSide = new QWidget(side);
+ QGridLayout *grid = new QGridLayout(topSide);
+
+ QLabel *label;
+
+ label = new QLabel(i18n("&Property:"), topSide);
+ mPropertyEdit = new KLineEdit(topSide);
+ label->setBuddy(mPropertyEdit);
+ grid->addWidget(label, 0, 0);
+ grid->addMultiCellWidget(mPropertyEdit, 0, 0, 1, 2);
+ connect(mPropertyEdit, SIGNAL(textChanged(const QString&)), SLOT(updateCurrent()));
+
+ label = new QLabel(i18n("&Value:"), topSide);
+ mValueEdit = new KLineEdit(topSide);
+ label->setBuddy(mPropertyEdit);
+ grid->addWidget(label, 1, 0);
+ grid->addMultiCellWidget(mValueEdit, 1, 1, 1, 1);
+ connect(mValueEdit, SIGNAL(textChanged(const QString&)), SLOT(updateCurrent()));
+
+ QPushButton *editRe = new QPushButton(i18n("&Edit..."), topSide);
+ grid->addWidget(editRe, 1, 2);
+ connect(editRe, SIGNAL(clicked()), SLOT(editValueRegexp()));
+
+ label = new QLabel(i18n("Pre&sentation:"), topSide);
+ mPresentationEdit = new KLineEdit(topSide);
+ label->setBuddy(mPropertyEdit);
+ grid->addWidget(label, 2, 0);
+ grid->addMultiCellWidget(mPresentationEdit, 2, 2, 1, 2);
+ connect(mPresentationEdit, SIGNAL(textChanged(const QString&)), SLOT(updateCurrent()));
+ }
+
+ {
+ QGroupBox *groupbox = new QGroupBox(
+ 3, Qt::Horizontal, i18n("Options"), side
+ );
+
+ mOptionPlayable = new QCheckBox(i18n("Play&able"), groupbox);
+ QWhatsThis::add(mOptionPlayable, i18n("This branch represents an individual file. If two items' presentation match, two items are created."));
+ connect(mOptionPlayable, SIGNAL(toggled(bool)), SLOT(updateCurrent()));
+
+ mOptionChildrenVisible = new QCheckBox(i18n("&Children visible"), groupbox);
+ QWhatsThis::add(mOptionChildrenVisible, i18n("Don't create this node, this nodes children become direct children of this node's parent"));
+ connect(mOptionChildrenVisible, SIGNAL(toggled(bool)), SLOT(updateCurrent()));
+
+ mOptionAutoOpen = new QCheckBox(i18n("Auto &open"), groupbox);
+ QWhatsThis::add(mOptionAutoOpen, i18n("This branch is marked as open immediately."));
+ connect(mOptionAutoOpen, SIGNAL(toggled(bool)), SLOT(updateCurrent()));
+ }
+
+ }
+
+}
+
+class QueryGroupItem : public KListViewItem
+{
+ QueryGroup *mItem;
+
+public:
+ QueryGroupItem(QueryGroupItem *parent, QueryGroup *group, QueryGroupItem *after=0)
+ : KListViewItem(parent, after)
+ {
+ init(group);
+ }
+
+ QueryGroupItem(KListView *parent, QueryGroup *group, QueryGroupItem *after=0)
+ : KListViewItem(parent, after)
+ {
+ init(group);
+ }
+
+ QueryGroup *item() { return mItem; }
+ const QueryGroup *item() const { return mItem; }
+
+ void redisplay()
+ {
+ setText(0, item()->propertyName());
+ setText(1, item()->value().pattern());
+ setText(2, item()->presentation());
+ }
+
+ QueryGroupItem *parent()
+ { return static_cast<QueryGroupItem*>(KListViewItem::parent()); }
+
+ KListView *listView()
+ { return static_cast<KListView*>(KListViewItem::listView()); }
+
+private:
+ void init(QueryGroup *group)
+ {
+ mItem = group;
+ redisplay();
+
+ if (group->firstChild())
+ new QueryGroupItem(this, group->firstChild(), this);
+
+ // do siblings now iff I don't already have them
+ if (!nextSibling())
+ {
+ if (QueryGroup *after = group->nextSibling())
+ {
+ if (parent())
+ new QueryGroupItem(parent(), after, this);
+ else
+ new QueryGroupItem(listView(), after, this);
+ }
+ }
+
+ setOpen(true);
+ }
+};
+
+
+void SchemaConfig::reopen()
+{
+ mSchemaList->clear();
+ mQueries.clear();
+ mSchemaTree->clear();
+
+ QStringList names = oblique()->schemaNames();
+ QString firstTitle;
+
+ for (QStringList::Iterator i(names.begin()); i != names.end(); ++i)
+ {
+ QueryItem qi;
+ qi.title = oblique()->loadSchema(qi.query, *i);
+ qi.changed = false;
+ mQueries.insert(*i, qi);
+
+ if (!mSchemaList->count())
+ firstTitle = qi.title;
+ mSchemaList->insertItem(qi.title);
+ }
+ selectSchema(firstTitle);
+
+}
+
+void SchemaConfig::save()
+{
+ for (QMap<QString,QueryItem>::Iterator i(mQueries.begin()); i != mQueries.end(); ++i)
+ {
+ QString name = i.key();
+ name = QFileInfo(name).fileName();
+ if (i.data().changed)
+ {
+ oblique()->saveSchema(i.data().query, name, i.data().title);
+ // TODO update the trees.
+ }
+ }
+}
+
+
+QString SchemaConfig::nameToFilename(const QString &_name)
+{
+ QString name = _name;
+ name = name.replace(QRegExp("[^a-zA-Z0-9]"), "_");
+ return name;
+}
+
+void SchemaConfig::newSchema()
+{
+ bool ok;
+ QString str=KInputDialog::getText(
+ i18n("Name of Schema"),
+ i18n("Please enter the name of the new schema:"),
+ "", &ok, this
+ );
+ if (!ok) return;
+
+ QString filename = nameToFilename(str);
+
+ if (mQueries.contains(nameToFilename(filename))) return;
+
+ QueryItem queryitem;
+ queryitem.query = Query();
+ queryitem.title = str;
+ queryitem.changed=true;
+ mSchemaList->insertItem(str);
+ mQueries.insert(filename, queryitem);
+
+ selectSchema(str);
+}
+
+void SchemaConfig::copySchema()
+{
+ bool ok;
+ QString str=KInputDialog::getText(
+ i18n("Name of Schema"),
+ i18n("Please enter the name of the new schema:"),
+ "", &ok, this
+ );
+ if (!ok) return;
+
+ QString filename = nameToFilename(str);
+
+ if (mQueries.contains(nameToFilename(filename))) return;
+
+ QueryItem queryitem;
+ queryitem.query = currentQuery()->query;
+ queryitem.title = str;
+ queryitem.changed=true;
+ mSchemaList->insertItem(str);
+ mQueries.insert(filename, queryitem);
+
+ selectSchema(str);
+}
+
+void SchemaConfig::removeSchema()
+{
+ QueryItem *item = currentQuery();
+ mSchemaList->removeItem(mSchemaList->currentItem());
+ oblique()->removeSchema(nameToFilename(item->title));
+ selectSchema(mSchemaList->currentText());
+}
+
+void SchemaConfig::selectSchema(const QString &title)
+{
+ mSchemaTree->clear();
+ mSchemaList->setCurrentText(title);
+
+ mIgnore = true;
+ if (QueryItem *grp = currentQuery())
+ {
+ if (QueryGroup *g = grp->query.firstChild())
+ new QueryGroupItem(mSchemaTree, g);
+ }
+ mSchemaTree->setCurrentItem(mSchemaTree->firstChild());
+ setCurrent(mSchemaTree->firstChild());
+ mSchemaTree->setSelected(mSchemaTree->firstChild(), true);
+ mIgnore=false;
+}
+
+void SchemaConfig::editValueRegexp()
+{
+ unless (mRegexpEditor)
+ {
+ mRegexpEditor =
+ KParts::ComponentFactory::createInstanceFromQuery<QDialog>(
+ "KRegExpEditor/KRegExpEditor", QString::null, this
+ );
+ }
+
+ if ( mRegexpEditor )
+ {
+ KRegExpEditorInterface *iface =
+ static_cast<KRegExpEditorInterface*>(
+ mRegexpEditor->qt_cast( "KRegExpEditorInterface")
+ );
+
+ iface->setRegExp(mValueEdit->text());
+ if (mRegexpEditor->exec() == QDialog::Accepted)
+ mValueEdit->setText(iface->regExp());
+ }
+}
+
+void SchemaConfig::setCurrent(QListViewItem *_item)
+{
+ if (!_item) return;
+ QueryGroupItem *item = static_cast<QueryGroupItem*>(_item);
+ mIgnore = true;
+ mPropertyEdit->setText(item->item()->propertyName());
+ mValueEdit->setText(item->item()->value().pattern());
+ mPresentationEdit->setText(item->item()->presentation());
+
+ mOptionPlayable->setChecked(item->item()->option(QueryGroup::Playable));
+ mOptionAutoOpen->setChecked(item->item()->option(QueryGroup::AutoOpen));
+ mOptionChildrenVisible->setChecked(item->item()->option(QueryGroup::ChildrenVisible));
+ mIgnore = false;
+}
+
+
+void SchemaConfig::updateCurrent()
+{
+ QueryGroupItem *item = static_cast<QueryGroupItem*>(mSchemaTree->currentItem());
+ if (mIgnore || !item) return;
+ setCurrentModified();
+
+ QueryGroup *mod = item->item();
+
+ mod->setPropertyName(mPropertyEdit->text());
+ mod->setPresentation(mPresentationEdit->text());
+ mod->setValue(QRegExp(mValueEdit->text()));
+
+ mod->setOption(QueryGroup::AutoOpen, mOptionAutoOpen->isChecked());
+ mod->setOption(QueryGroup::Playable, mOptionPlayable->isChecked());
+ mod->setOption(QueryGroup::ChildrenVisible, mOptionChildrenVisible->isChecked());
+ item->redisplay();
+}
+
+void SchemaConfig::move(QListViewItem *_item, QListViewItem *, QListViewItem *_afterNow)
+{
+ setCurrentModified();
+ QueryGroupItem *item = static_cast<QueryGroupItem*>(_item);
+ QueryGroupItem *afterNow = static_cast<QueryGroupItem*>(_afterNow);
+
+ QueryGroup *after, *under;
+ under = item->parent() ? item->parent()->item() : 0;
+ after = afterNow ? afterNow->item() : 0;
+
+ item->item()->move(&currentQuery()->query, under, after);
+}
+
+
+void SchemaConfig::addSibling()
+{
+ QueryGroupItem *item = static_cast<QueryGroupItem*>(mSchemaTree->currentItem());
+ unless (item)
+ {
+ addChild();
+ return;
+ }
+ setCurrentModified();
+
+ // add it
+ QueryGroup * g = new QueryGroup;
+ item->item()->insertAfter(g);
+
+ // now match the action in the tree
+ QueryGroupItem *created;
+ if (item->parent())
+ created = new QueryGroupItem(item->parent(), g, item);
+ else
+ created = new QueryGroupItem(item->listView(), g, item);
+
+ // select it so the user can edit it now
+ item->listView()->setCurrentItem(created);
+ item->listView()->setSelected(created, true);
+}
+
+
+void SchemaConfig::addChild()
+{
+ QueryGroupItem *item = static_cast<QueryGroupItem*>(mSchemaTree->currentItem());
+ setCurrentModified();
+
+ // add it
+ QueryGroup * g = new QueryGroup;
+ if (item)
+ item->item()->insertUnder(g);
+ else
+ currentQuery()->query.setFirstChild(g);
+
+ // now match the action in the tree
+ QueryGroupItem *created;
+ if (item)
+ created = new QueryGroupItem(item, g);
+ else
+ created = new QueryGroupItem(mSchemaTree, g);
+
+ // select it so the user can edit it now
+ mSchemaTree->setCurrentItem(created);
+ mSchemaTree->setSelected(created, true);
+}
+
+void SchemaConfig::removeSelf()
+{
+ setCurrentModified();
+ QueryGroupItem *item = static_cast<QueryGroupItem*>(mSchemaTree->currentItem());
+ unless (item) return;
+ QueryGroup *grp = item->item();
+ delete item;
+ currentQuery()->query.take(grp);
+ delete grp;
+}
+
+void SchemaConfig::setCurrentModified()
+{
+ if (QueryItem *grp = currentQuery())
+ grp->changed = true;
+}
+
+SchemaConfig::QueryItem *SchemaConfig::currentQuery()
+{
+ QString title = mSchemaList->currentText();
+ for (QMap<QString,QueryItem>::Iterator i(mQueries.begin()); i != mQueries.end(); ++i)
+ {
+ if (i.data().title != title) continue;
+ return &i.data();
+ }
+ return 0;
+}
+
+
+SliceConfig::SliceConfig(QWidget *parent, Oblique *oblique)
+ : QWidget(parent)
+{
+ mOblique = oblique;
+ (new QVBoxLayout(this, 11, 7))->setAutoAdd(true);
+
+ {
+ QHBox *middle = new QHBox(this);
+ middle->setSpacing(7);
+
+ mSliceList = new KListView(middle);
+ QWhatsThis::add(mSliceList, i18n("The list of slices. A Slice is part of the full collection. This allows you to categorize your playlist. You can add an item to the list by right clicking on it and selecting the Slice you want it in."));
+ mSliceList->addColumn("");
+ mSliceList->header()->hide();
+
+ mSliceList->setSorting(0);
+ mSliceList->setItemsRenameable(true);
+
+ QVBox *buttons = new QVBox(middle);
+
+ mAdd = new QPushButton(BarIconSet("1rightarrow", KIcon::SizeSmall), "",buttons);
+ mAdd->setFixedWidth(mAdd->height());
+ connect(mAdd, SIGNAL(clicked()), SLOT(addSibling()));
+ QToolTip::add(mAdd, i18n("Create a new item"));
+
+ mRemove = new QPushButton(BarIconSet("filenew", KIcon::SizeSmall), "", buttons);
+ mRemove->setFixedWidth(mRemove->height());
+ connect(mRemove, SIGNAL(clicked()), SLOT(removeSelf()));
+ QToolTip::add(mRemove, i18n("Remove the selected item"));
+
+ new QWidget(buttons);
+ }
+}
+
+
+class SliceListItem : public KListViewItem
+{
+ Slice *mSlice;
+public:
+ SliceListItem(KListView *parent, Slice *slice)
+ : KListViewItem(parent, slice->name()), mSlice(slice)
+ {
+ }
+
+ /**
+ * new item
+ **/
+ SliceListItem(KListView *parent)
+ : KListViewItem(parent, i18n("New Slice")), mSlice(0)
+ {
+ }
+
+ Slice *slice() { return mSlice; }
+};
+
+SliceListItem *SliceConfig::currentItem()
+{
+ QListViewItem *c = mSliceList->currentItem();
+ return static_cast<SliceListItem*>(c);
+}
+
+
+void SliceConfig::reopen()
+{
+ mSliceList->clear();
+ mRemovedItems.clear();
+ mAddedItems.clear();
+
+ QPtrList<Slice> slices = oblique()->base()->slices();
+
+ for (QPtrListIterator<Slice> i(slices); *i; ++i)
+ {
+ Slice *slice = *i;
+ new SliceListItem(mSliceList, slice);
+ }
+}
+
+void SliceConfig::save()
+{
+ for (
+ QValueList<Slice*>::Iterator i(mRemovedItems.begin());
+ i != mRemovedItems.end();
+ ++i
+ )
+ {
+ (*i)->remove();
+ delete *i;
+ }
+
+ for (
+ QValueList<SliceListItem*>::Iterator i(mAddedItems.begin());
+ i != mAddedItems.end();
+ ++i
+ )
+ {
+ oblique()->base()->addSlice((*i)->text(0));
+ }
+
+ for (QListViewItem *i = mSliceList->firstChild(); i; i = i->nextSibling())
+ {
+ SliceListItem *si = static_cast<SliceListItem*>(i);
+
+ if (si->slice())
+ {
+ si->slice()->setName(si->text(0));
+ }
+ }
+
+ reopen();
+}
+
+
+void SliceConfig::addSibling()
+{
+ SliceListItem *si = new SliceListItem(mSliceList);
+ mAddedItems.append(si);
+}
+
+void SliceConfig::removeSelf()
+{
+ SliceListItem *r = currentItem();
+ if (mAddedItems.contains(r))
+ {
+ mAddedItems.remove(r);
+ }
+ else
+ {
+ Q_ASSERT(r->slice());
+ mRemovedItems.append(r->slice());
+ }
+
+ delete r;
+}
+
+
+
+Configure::Configure(Oblique *oblique)
+ : CModule(i18n("Oblique"), i18n("Configure Oblique Playlist"), "", oblique)
+{
+ (new QVBoxLayout(this))->setAutoAdd(true);
+ tabs = new QTabWidget(this);
+
+ tabs->addTab(slice = new SliceConfig(tabs, oblique), i18n("Slices"));
+ tabs->addTab(schema = new SchemaConfig(tabs, oblique), i18n("Schemas"));
+}
+
+void Configure::reopen()
+{
+ schema->reopen();
+ slice->reopen();
+}
+
+void Configure::save()
+{
+ schema->save();
+ slice->save();
+}
+
+
+#include "cmodule.moc"
+
diff --git a/noatun-plugins/oblique/cmodule.h b/noatun-plugins/oblique/cmodule.h
new file mode 100644
index 0000000..f60c6c3
--- /dev/null
+++ b/noatun-plugins/oblique/cmodule.h
@@ -0,0 +1,123 @@
+// Copyright (c) 2003 Charles Samuels <charles@kde.org>
+// See the file COPYING for redistribution terms.
+
+#ifndef CMODULE_H
+#define CMODULE_H
+
+#include <noatun/pref.h>
+#include "query.h"
+
+class KListView;
+class KLineEdit;
+class QDialog;
+class Oblique;
+class QCheckBox;
+class QComboBox;
+class QPushButton;
+class QTabWidget;
+
+class SchemaConfig : public QWidget
+{
+Q_OBJECT
+ Oblique *mOblique;
+
+ KListView *mSchemaTree;
+ KLineEdit *mPropertyEdit, *mValueEdit, *mPresentationEdit;
+ QComboBox *mSchemaList;
+
+ QCheckBox *mOptionPlayable, *mOptionChildrenVisible, *mOptionAutoOpen;
+
+ QPushButton *mAdd, *mRemove, *mCopy;
+
+ QPushButton *mAddSibling, *mAddChild, *mRemoveSelf;
+
+ QDialog *mRegexpEditor;
+ bool mIgnore;
+
+ struct QueryItem
+ {
+ Query query;
+ QString title;
+ bool changed;
+ };
+
+ QMap<QString, QueryItem> mQueries;
+
+public:
+ SchemaConfig(QWidget *parent, Oblique *oblique);
+
+ Oblique *oblique() { return mOblique; }
+
+ void reopen();
+ void save();
+
+ static QString nameToFilename(const QString &name);
+ static QString filenameToName(const QString &filename);
+
+public slots:
+ void newSchema();
+ void copySchema();
+ void removeSchema();
+
+ void selectSchema(const QString &title);
+
+ void addSibling();
+ void addChild();
+ void removeSelf();
+
+ void setCurrentModified();
+
+private slots:
+ void editValueRegexp();
+
+ void setCurrent(QListViewItem *_item);
+ void updateCurrent();
+
+ void move(QListViewItem *item, QListViewItem *afterFirst, QListViewItem *afterNow);
+
+private:
+ QueryItem *currentQuery();
+};
+
+class SliceListItem;
+
+class SliceConfig : public QWidget
+{
+Q_OBJECT
+ Oblique *mOblique;
+ KListView *mSliceList;
+ QPushButton *mAdd, *mRemove;
+ QValueList<SliceListItem*> mAddedItems;
+ QValueList<Slice*> mRemovedItems;
+
+public:
+ SliceConfig(QWidget *parent, Oblique *oblique);
+ Oblique *oblique() { return mOblique; }
+
+ void reopen();
+ void save();
+
+
+ SliceListItem *currentItem();
+
+private slots:
+ void addSibling();
+ void removeSelf();
+};
+
+class Configure : public CModule
+{
+Q_OBJECT
+ QTabWidget *tabs;
+ SchemaConfig *schema;
+ SliceConfig *slice;
+
+public:
+ Configure(Oblique *parent);
+
+ virtual void reopen();
+ virtual void save();
+};
+
+
+#endif
diff --git a/noatun-plugins/oblique/configure.in.in b/noatun-plugins/oblique/configure.in.in
new file mode 100644
index 0000000..7b7493f
--- /dev/null
+++ b/noatun-plugins/oblique/configure.in.in
@@ -0,0 +1,30 @@
+AC_ARG_WITH(berkeley-db,
+ [AC_HELP_STRING([--with-berkeley-db],[enable support for Berkeley DB++ @<:@default=check@:>@])],
+ [], with_berkeley_db=check)
+
+AC_ARG_WITH(db-lib,
+ [AC_HELP_STRING([--with-db-lib=NAME],[name of the Berkeley DB++ library @<:@default=db_cxx@:>@])],
+ [ac_db_name="$withval"], [ac_db_name="db_cxx"])
+
+berkeley_db=no
+if test "x$with_berkeley_db" != xno; then
+ berkeley_db=yes
+
+ KDE_CHECK_HEADER([db_cxx.h],
+ [:], [berkeley_db=no])
+
+ AC_CHECK_LIB([$ac_db_name], [main],
+ [:], [berkeley_db=no])
+
+ if test "x$berkeley_db" = xyes; then
+ AC_DEFINE(BERKELEY_DB, 1, [Define if you have Berkeley DB++ installed])
+ BERKELEY_DB_LIBS="-l$ac_db_name"
+ AC_SUBST(BERKELEY_DB_LIBS)
+ fi
+
+ if test "x$with_berkeley_db" != xcheck && test "x$berkeley_db" != xyes; then
+ AC_MSG_ERROR([--with-berkeley-db was given, but test for Berkeley DB++ failed])
+ fi
+fi
+
+AM_CONDITIONAL(include_BERKELEY_DB, test "$berkeley_db" = yes)
diff --git a/noatun-plugins/oblique/file.cpp b/noatun-plugins/oblique/file.cpp
new file mode 100644
index 0000000..b478e0f
--- /dev/null
+++ b/noatun-plugins/oblique/file.cpp
@@ -0,0 +1,248 @@
+// Copyright (c) 2003-2004 Charles Samuels <charles@kde.org>
+// See the file COPYING for redistribution terms.
+
+#include "file.h"
+#include "selector.h"
+#include "query.h"
+
+#include <iostream>
+
+#include <klocale.h>
+#include <kfilemetainfo.h>
+#include <kmimetype.h>
+
+
+File::File(Base *base, FileId id)
+{
+ mBase = base;
+ mId = id;
+
+}
+
+File::File(const File &ref)
+{
+ operator =(ref);
+}
+
+File::File()
+{
+ mBase=0;
+ mId = 0;
+}
+
+File &File::operator=(const File &ref)
+{
+ mBase = ref.mBase;
+ mId = ref.mId;
+
+ return *this;
+}
+
+QString File::file() const
+{
+ return property("file");
+}
+
+KURL File::url() const
+{
+ KURL url;
+ url.setPath(file());
+ return url;
+}
+
+struct Map { const char *kfmi; const char *noatun; };
+static const Map propertyMap[] =
+{
+ { "Title", "ob::title_" },
+ { "Artist", "ob::author_" },
+ { "Album", "ob::album_" },
+ { "Genre", "ob::genre_" },
+ { "Tracknumber", "ob::track_" },
+ { "Date", "ob::date_" },
+ { "Comment", "ob::comment_" },
+ { "Location", "ob::location_" },
+ { "Organization", "ob::organization_" },
+ { "Bitrate", "ob::bitrate_" },
+ { "Sample Rate", "ob::samplerate_" },
+ { "Channels", "ob::channels_" },
+ { 0, 0 }
+};
+
+QString File::property(const QString &property) const
+{
+ QString str = base()->property(id(), property);
+
+ if (!str)
+ {
+ QString mangled = "ob::" + property + "_";
+ str = base()->property(id(), mangled);
+ }
+
+ return str;
+}
+
+
+void File::makeCache()
+{
+ setProperty("ob::mimetype_", KMimeType::findByPath(file())->name());
+ KFileMetaInfo info(file());
+
+ for (int i=0; propertyMap[i].kfmi; i++)
+ {
+ QString kname(propertyMap[i].kfmi);
+ if (info.isValid() && kname.length())
+ {
+ QString val = info.item(kname).string(false);
+ if (val=="---" || !val.stripWhiteSpace().length())
+ { // grr
+ val = "";
+ }
+ if (val.length())
+ {
+ setProperty(propertyMap[i].noatun, val);
+ }
+ }
+ }
+}
+
+
+void File::setProperty(const QString &key, const QString &value)
+{
+ if (property(key) == value) return;
+ base()->setProperty(id(), key, value);
+ PlaylistItem p=new Item(*this);
+ p.data()->modified();
+}
+
+void File::clearProperty(const QString &key)
+{
+ if (property(key).isNull()) return;
+ base()->clearProperty(id(), key);
+ PlaylistItem p=new Item(*this);
+ p.data()->modified();
+}
+
+QStringList File::properties() const
+{
+ QStringList l = base()->properties(id());
+
+ for (int i=0; propertyMap[i].noatun; i++)
+ {
+ if (property(propertyMap[i].noatun).length())
+ {
+ l += propertyMap[i].noatun;
+ }
+ }
+ return l;
+}
+
+void File::setId(FileId id)
+{
+ base()->move(mId, id);
+ mId = id;
+}
+
+
+void File::setPosition(Query *query, const File &after)
+{
+ setProperty(
+ "Oblique:after_" + query->name() + '_',
+ QString::number(after.id())
+ );
+}
+
+bool File::getPosition(const Query *query, File *after) const
+{
+ assert(query);
+ assert(after);
+ QString name = "Oblique:after_" + query->name() + '_';
+ if (name.isEmpty()) return false;
+
+ QString val = property(name);
+ if (val.isEmpty())
+ return false;
+ *after = File(mBase, val.toUInt());
+ return true;
+}
+
+
+void File::remove()
+{
+ PlaylistItem p=new Item(*this);
+ p.data()->removed();
+ mBase->remove(*this);
+}
+
+void File::addTo(Slice *slice)
+{
+ QString slices = property("Oblique:slices_");
+ slices += "\n" + QString::number(slice->id(), 16);
+ setProperty("Oblique:slices_", slices);
+ emit mBase->addedTo(slice, *this);
+}
+
+void File::removeFrom(Slice *slice)
+{
+ QString slices = property("Oblique:slices_");
+ QStringList sliceList = QStringList::split('\n', slices);
+ QString sid = QString::number(slice->id(), 16);
+ sliceList.remove(sid);
+
+ slices = sliceList.join("\n");
+ setProperty("Oblique:slices_", slices);
+ emit mBase->removedFrom(slice, *this);
+}
+
+bool File::isIn(const Slice *slice) const
+{
+ int id = slice->id();
+ if (id==0) return true;
+
+ QString slices = property("Oblique:slices_");
+ QStringList sliceList = QStringList::split('\n', slices);
+ for (QStringList::Iterator i(sliceList.begin()); i!= sliceList.end(); ++i)
+ {
+ if ((*i).toInt(0, 16) == id) return true;
+ }
+ return false;
+}
+
+
+
+Slice::Slice(Base *base, int id, const QString &name)
+{
+ mId = id;
+ mBase = base;
+ mName = name;
+}
+
+QString Slice::name() const
+{
+ if (mId == 0) return i18n("Complete Collection");
+ return mName;
+}
+
+void Slice::setName(const QString &name)
+{
+ if (mId == 0) return;
+ mName = name;
+ emit mBase->slicesModified();
+}
+
+void Slice::remove()
+{
+ if (mId == 0) return;
+ mBase->removeSlice(this);
+ Base *base = mBase;
+
+ for (FileId fi=1; ; fi++)
+ {
+ File f = base->first(fi);
+ f.removeFrom(this);
+ fi = f.id();
+ }
+ emit base->slicesModified();
+}
+
+
+
diff --git a/noatun-plugins/oblique/file.h b/noatun-plugins/oblique/file.h
new file mode 100644
index 0000000..21d3be9
--- /dev/null
+++ b/noatun-plugins/oblique/file.h
@@ -0,0 +1,115 @@
+// Copyright (c) 2003,2004 Charles Samuels <charles@kde.org>
+// See the file COPYING for redistribution terms.
+
+#ifndef FILE_H
+#define FILE_H
+
+#include "base.h"
+#include <kurl.h>
+
+
+class Slice;
+class Query;
+
+/**
+ * just an file from the list in the database
+ **/
+class File
+{
+
+ friend class Base;
+ File(Base *base, FileId id);
+
+ mutable Base *mBase;
+ FileId mId;
+
+public:
+ /**
+ * create a copy of the reference
+ **/
+ File(const File &ref);
+ /**
+ * create a null reference
+ **/
+ File();
+
+ /**
+ * make me a copy of the reference
+ **/
+ File &operator=(const File &ref);
+
+ bool operator ==(const File &other) { return mId == other.mId; }
+
+ inline operator bool() const { return mId; }
+
+ QString file() const;
+ KURL url() const;
+ QString property(const QString &property) const;
+ void setProperty(const QString &key, const QString &value);
+ void clearProperty(const QString &key);
+ QStringList properties() const;
+ inline FileId id() const { return mId; }
+ void setId(FileId id);
+
+ inline Base *base() { return mBase; }
+ inline const Base *base() const { return mBase; }
+
+ /**
+ * when displaying me in @p query, place
+ * me immediately after @p after
+ **/
+ void setPosition(Query *query, const File &after);
+
+ /**
+ * when displaying @p query, set @p after according
+ * to what @ref setPosition was given.
+ *
+ * @return false if no position was set
+ **/
+ bool getPosition(const Query *query, File *after) const;
+
+ /**
+ * remove this file from the db, and emit Base::removed(File)
+ * the File objects don't change, but become invalid (careful!)
+ **/
+ void remove();
+
+ void addTo(Slice *slice);
+ void removeFrom(Slice *slice);
+ bool isIn(const Slice *slice) const;
+
+ /**
+ * load the tag information into the DB
+ **/
+ void makeCache();
+};
+
+class Slice
+{
+ int mId;
+ QString mName;
+ Base *mBase;
+
+public:
+ /**
+ * @internal
+ * create a slice based on its data
+ **/
+ Slice(Base *base, int id, const QString &name);
+
+ QString name() const;
+ void setName(const QString &name);
+
+ /**
+ * remove this slice from the list of slices
+ * and dereference all Files from this slice
+ **/
+ void remove();
+
+ int id() const { return mId; }
+};
+
+
+
+
+#endif
diff --git a/noatun-plugins/oblique/kbuffer.cpp b/noatun-plugins/oblique/kbuffer.cpp
new file mode 100644
index 0000000..f54110e
--- /dev/null
+++ b/noatun-plugins/oblique/kbuffer.cpp
@@ -0,0 +1,87 @@
+// Author: Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr>, (c) 2002
+//
+// Copyright: GNU LGPL: http://www.gnu.org/licenses/lgpl.html
+
+#include "kbuffer.h"
+#include <algorithm>
+#include <iostream>
+#include <iomanip>
+
+KBuffer::KBuffer()
+{
+ bufPos = buf.end(); // will become 0 in the beginning
+}
+
+KBuffer::~KBuffer(){
+}
+
+/** open a memory buffer */
+bool KBuffer::open(int ) {
+ // ignore mode
+ buf.erase(buf.begin(), buf.end()); // erase buffer
+ buf.reserve(8); // prevent iterators from ever being 0 and start with a reasonable mem
+ bufPos = buf.end(); // reset position
+ return true;
+}
+
+/** Close buffer */
+void KBuffer::close(){
+}
+
+/** No descriptions */
+void KBuffer::flush(){
+}
+
+/** query buffer size */
+Q_ULONG KBuffer::size() const {
+ return buf.size();
+}
+
+/** read a block of memory from buffer, advances read/write position */
+Q_LONG KBuffer::readBlock(char* data, long unsigned int maxLen) {
+ int len;
+ if ((long unsigned)(buf.end()-bufPos) > maxLen)
+ len = maxLen;
+ else
+ len = buf.end()-bufPos;
+ std::vector<char>::iterator bufPosNew = bufPos + len;
+ for (std::vector<char>::iterator it=bufPos; it < bufPosNew; it++, data++)
+ *data = *it;
+ bufPos = bufPosNew;
+ return len;
+}
+
+/** write a block of memory into buffer */
+Q_LONG KBuffer::writeBlock(const char *data, long unsigned int len){
+ int pos = bufPos-buf.begin();
+ copy(data, data+len, inserter(buf,bufPos));
+ bufPos = buf.begin() + pos + len;
+ return len;
+}
+
+/** read a byte */
+int KBuffer::getch() {
+ if (bufPos!=buf.end())
+ return *(bufPos++);
+ else
+ return -1;
+}
+
+/** write a byte */
+int KBuffer::putch(int c) {
+ int pos = bufPos-buf.begin();
+ buf.insert(bufPos, c);
+ bufPos = buf.begin() + pos + 1;
+ return c;
+}
+
+/** undo last getch()
+ */
+int KBuffer::ungetch(int c) {
+ if (bufPos!=buf.begin()) {
+ bufPos--;
+ return c;
+ }
+ else
+ return -1;
+}
diff --git a/noatun-plugins/oblique/kbuffer.h b/noatun-plugins/oblique/kbuffer.h
new file mode 100644
index 0000000..adc62ba
--- /dev/null
+++ b/noatun-plugins/oblique/kbuffer.h
@@ -0,0 +1,48 @@
+// Author: Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr>, (c) 2002
+//
+// Copyright: GNU LGPL: http://www.gnu.org/licenses/lgpl.html
+
+#ifndef KBUFFER_H
+#define KBUFFER_H
+
+#include <qiodevice.h>
+#include <vector>
+#include <queue>
+
+/**A buffer device for flexible and efficient buffers.
+
+ *@author Eray Ozkural (exa)
+ */
+
+class KBuffer : public QIODevice {
+public:
+ KBuffer();
+ ~KBuffer();
+ /** open a memory buffer */
+ bool open(int mode);
+ /** read in a block of memory */
+ Q_LONG readBlock(char* data, long unsigned int maxLen);
+ /** query buffer size */
+ Q_ULONG size() const;
+ /** No descriptions */
+ void flush();
+ /** Close buffer */
+ void close();
+ /** write a block of memory */
+ Q_LONG writeBlock(const char *data, long unsigned int maxLen);
+ /** read a byte */
+ int getch();
+ /** undo last getch()
+ */
+ int ungetch(int);
+ /** write a byte */
+ int putch(int);
+ void* data() {
+ return &buf[0];
+ }
+private:
+ std::vector<char> buf;
+ std::vector<char>::iterator bufPos;
+};
+
+#endif
diff --git a/noatun-plugins/oblique/kdatacollection.cpp b/noatun-plugins/oblique/kdatacollection.cpp
new file mode 100644
index 0000000..9e2ddac
--- /dev/null
+++ b/noatun-plugins/oblique/kdatacollection.cpp
@@ -0,0 +1,143 @@
+/*
+ This file is part of the KDE libraries
+ Copyright (C) 2003 Charles Samuels <charles@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include "kdatacollection.h"
+
+#include <kconfig.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+
+#include <qfile.h>
+#include <qfileinfo.h>
+
+
+KDataCollection::KDataCollection(
+ KConfig *config, const QString &group, const QString &entry,
+ const char *datadir, const QString &dir
+ )
+{
+ init(config, group, entry, datadir, dir);
+}
+
+KDataCollection::KDataCollection(
+ KConfig *config, const QString &group, const QString &entry,
+ const QString &dir
+ )
+{
+ init(config, group, entry, "appdata", dir);
+}
+
+KDataCollection::KDataCollection(
+ KConfig *config, const QString &group, const QString &dir
+ )
+{
+ init(config, group, dir, "appdata", dir);
+}
+
+KDataCollection::KDataCollection(KConfig *config, const QString &dir)
+{
+ init(config, "KDataCollection", dir, "appdata", dir);
+}
+
+KDataCollection::KDataCollection(const QString &dir)
+{
+ init(KGlobal::config(), "KDataCollection", dir, "appdata", dir);
+}
+
+void KDataCollection::init(
+ KConfig *config, const QString &group, const QString &entry,
+ const char *datadir, const QString &dir
+ )
+{
+ mConfig = config;
+ mGroup = group;
+ mEntry = entry;
+ mDir = dir;
+ mDatadir = datadir;
+}
+
+QStringList KDataCollection::names() const
+{
+ KConfigGroup g(mConfig, mGroup);
+
+ // these are the entries I have
+ QStringList n = g.readListEntry(mEntry);
+ QStringList fs = KGlobal::dirs()->findAllResources(mDatadir, mDir+"/*", false, true);
+ QStringList total;
+
+ for (QStringList::Iterator i(fs.begin()); i != fs.end(); ++i)
+ {
+ QFileInfo fi(*i);
+ QString name = fi.fileName();
+ if (!n.contains(name))
+ {
+ total.append(name);
+ }
+ }
+
+ return total;
+}
+
+void KDataCollection::remove(const QString &name)
+{
+ KConfigGroup g(mConfig, mGroup);
+ QString location = file(name);
+ if (location.isEmpty()) return;
+ if (location == saveFile(name, false))
+ {
+ QFile(location).remove();
+ // is there a system one too?
+ location = file(name, false);
+ if (location.isEmpty()) return;
+ }
+
+ QStringList n = g.readListEntry(mEntry);
+ if (n.contains(name)) return;
+ n.append(name);
+ g.writeEntry(mEntry, n);
+}
+
+QString KDataCollection::file(const QString &name, bool create)
+{
+ QString path = ::locate(mDatadir, mDir+"/"+name);
+
+ if (path.isEmpty() && create)
+ {
+ path = saveFile(name, true);
+ }
+ return path;
+}
+
+QString KDataCollection::saveFile(const QString &name, bool create)
+{
+ if (!KGlobal::dirs()->isRestrictedResource(mDatadir, mDir+"/"+name))
+ {
+ QString s = KGlobal::dirs()->saveLocation(mDatadir, mDir, create);
+
+ if (s.length() && create)
+ {
+ s += "/" + name;
+ QFile(s).open(IO_ReadWrite); // create it
+ }
+ return s;
+ }
+ return QString::null;
+}
+
+
diff --git a/noatun-plugins/oblique/kdatacollection.h b/noatun-plugins/oblique/kdatacollection.h
new file mode 100644
index 0000000..e8820f3
--- /dev/null
+++ b/noatun-plugins/oblique/kdatacollection.h
@@ -0,0 +1,144 @@
+/*
+ This file is part of the KDE libraries
+ Copyright (C) 2003 Charles Samuels <charles@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License version 2 as published by the Free Software Foundation.
+
+ This library 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 the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef KDATACOLLECTION_H
+#define KDATACOLLECTION_H
+
+#include <qstring.h>
+#include <qstringlist.h>
+
+class KConfig;
+
+/**
+ * This class allows you to have a set of files. Some of which can be included
+ * with your application, and some can be created by your users.
+ * Examples of a use for this function can be:
+ *<ul>
+ * <li>Noatun's Equalizer preset: Each Equalizer preset is in its own XML
+ * file, and the user can delete, create new ones, and modify old ones</li>
+ *</ul>
+ *
+ *<pre>
+ * KDataCollection profiles("appname/ui_profiles");
+ * QStringList letUserSelectOne = profiles.names();
+ * QString fileToOpen = profiles.file(theOneUserSelected);
+ * QString fileToWriteTo = profiles.saveFile(theOneUserSelected);
+ *</pre>
+ *
+ * @author Charles Samuels <charles@kde.org>
+ **/
+class KDataCollection
+{
+ KConfig *mConfig;
+ QString mGroup, mEntry, mDir;
+ const char *mDatadir;
+
+ struct Private;
+ Private *d;
+
+public:
+ /**
+ * constructor. This gives you most control over the destination of
+ * settings, @p dir is the second argument to locate(datadir, ...)
+ *
+ * @param datadir is what is passed to locate, this is "appdata" by default
+ **/
+ KDataCollection(
+ KConfig *config, const QString &group, const QString &entry,
+ const char *datadir, const QString &dir
+ );
+
+ /**
+ * constructor. This gives you most control over the destination of
+ * settings, @p dir is the second argument to locate("appdata", ...)
+ **/
+ KDataCollection(
+ KConfig *config, const QString &group, const QString &entry,
+ const QString &dir
+ );
+
+ /**
+ * constructor. The entry in the KConfig group will be named the same as
+ * @p dir.
+ *
+ * otherwise the same as the previous function
+ **/
+ KDataCollection(
+ KConfig *config, const QString &group,
+ const QString &dir
+ );
+
+ /**
+ * constructor. The group will be "KDataCollection", The entry in the
+ * KConfig group will be named the same as
+ * @p dir.
+ *
+ * otherwise the same as the previous function
+ **/
+ KDataCollection(KConfig *config, const QString &dir);
+
+ /**
+ * constructor. the KConfig is assumed to be KGlobal::config()
+ *
+ * otherwise the same as the previous function
+ **/
+ KDataCollection(const QString &dir);
+
+
+ /**
+ * returns a list of existant, non hidden files
+ **/
+ QStringList names() const;
+
+ /**
+ * deletes the file if it is in KDEHOME, or marks it as hidden if it's a
+ * system file
+ **/
+ void remove(const QString &name);
+
+ /**
+ * @returns the filename for a file named @p name, if @p create
+ * is true, it will create the file if it doesn't exist, if @p create is false,
+ * it will return an empty string, unless the file already exists
+ *
+ * if you want to modify this file, you should use saveFile instead
+ **/
+ QString file(const QString &name, bool create=true);
+
+ /**
+ * @returns the filename for a file you can save into. If @p create is
+ * false, it'll return an empty string if the file doesn't already exist in
+ * KDEHOME
+ *
+ * This function will not create the file, only return what the name is in
+ * theory.
+ *
+ * It will not return a file if the Kiosk framework claims that it's
+ * restricted
+ **/
+ QString saveFile(const QString &name, bool create=true);
+
+private:
+ void init(
+ KConfig *config, const QString &group, const QString &entry,
+ const char *datadir, const QString &dir
+ );
+};
+
+#endif
diff --git a/noatun-plugins/oblique/kdbt.h b/noatun-plugins/oblique/kdbt.h
new file mode 100644
index 0000000..acaae57
--- /dev/null
+++ b/noatun-plugins/oblique/kdbt.h
@@ -0,0 +1,59 @@
+// Author: Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr>, (c) 2002
+//
+// Copyright: GNU LGPL: http://www.gnu.org/licenses/lgpl.html
+
+
+#ifndef KDbt_Interface
+#define KDbt_Interface
+
+#include <db_cxx.h>
+#include <qdatastream.h>
+#include <qbuffer.h>
+#include "kbuffer.h"
+
+/**A generic wrapper for "database thang" class that abstracts binary streaming operations.
+ *@author Eray Ozkural (exa)
+ */
+
+template <typename T>
+class KDbt : public Dbt {
+public:
+ /* assume streaming operators on QDataStream
+ QDataStream & operator>> ( QDataStream& >>, T &);
+ QDataStream & operator<< ( QDataStream& >>, T &);
+ */
+ KDbt() {
+ }
+ /** construct a Dbt from obj */
+ KDbt(const T& obj) {
+ set(obj);
+ }
+// operator Dbt() {
+// return Dbt(thang.data(), thang.size());
+// }
+ /** set "thang" to the contents of obj */
+ void set(const T& obj) {
+// KBuffer buffer(thang);
+ QDataStream ds(&thang);
+ ds << obj;
+// std::cerr << "thang size " << thang.size() << endl;
+// buffer.close();
+// set_data(thang.data());
+// set_size(buffer.size());
+ set_data(thang.data());
+ set_size(thang.size());
+ }
+ void get(T& obj) {
+ QByteArray buffer;
+ buffer.setRawData((char*)get_data(),get_size());
+ QDataStream ds(buffer,IO_ReadWrite);
+ ds >> obj;
+ buffer.resetRawData((char*)get_data(),get_size());
+ }
+private:
+ /** Internal data */
+// QByteArray thang;
+ KBuffer thang;
+};
+
+#endif
diff --git a/noatun-plugins/oblique/menu.cpp b/noatun-plugins/oblique/menu.cpp
new file mode 100644
index 0000000..0556d88
--- /dev/null
+++ b/noatun-plugins/oblique/menu.cpp
@@ -0,0 +1,231 @@
+// Copyright (c) 2003,2004 Charles Samuels <charles@kde.org>
+// See the file COPYING for redistribution terms.
+
+#include "menu.h"
+#include <kiconloader.h>
+#include <klocale.h>
+
+#include "tree.h"
+
+FileMenu::FileMenu(QWidget *parent, Oblique *oblique, File file)
+ : KPopupMenu(parent)
+{
+ if (file)
+ mFiles.append(file);
+ insertItem(
+ BarIconSet("delete"), i18n("&Remove From Playlist"),
+ this, SLOT(removeFromList())
+ );
+ insertItem(i18n("&Properties"), this, SLOT(properties()));
+
+ (new SliceListAction(
+ i18n("&Slices"), oblique,
+ this, SLOT(toggleInSlice(Slice *)),
+ mFiles, this
+ ))->plug(this);
+}
+
+static void addTo(QValueList<File> &files, TreeItem *item)
+{
+ File f = item->file();
+ if (f) files.append(f);
+
+ item = item->firstChild();
+
+ while (item)
+ {
+ addTo(files, item);
+ item = item->nextSibling();
+ }
+}
+
+FileMenu::FileMenu(QWidget *parent, Oblique *oblique, TreeItem *items)
+ : KPopupMenu(parent)
+{
+ addTo(mFiles, items);
+
+ insertItem(
+ BarIconSet("delete"), i18n("&Remove From Playlist"),
+ this, SLOT(removeFromList())
+ );
+ insertItem(i18n("&Properties"), this, SLOT(properties()));
+
+ (new SliceListAction(
+ i18n("&Slices"), oblique,
+ this, SLOT(toggleInSlice(Slice *)),
+ mFiles, this
+ ))->plug(this);
+}
+
+void FileMenu::removeFromList()
+{
+ for (QValueList<File>::Iterator i(mFiles.begin()); i != mFiles.end(); ++i)
+ {
+ (*i).remove();
+ }
+}
+
+void FileMenu::properties()
+{
+ new ObliquePropertiesDialog(mFiles, parentWidget());
+}
+
+void FileMenu::toggleInSlice(Slice *slice)
+{
+ void (File::*task)(Slice*)=0;
+ for (QValueList<File>::Iterator i(mFiles.begin()); i != mFiles.end(); ++i)
+ {
+ if (!task)
+ { // we check with the first one
+ if ((*i).isIn(slice))
+ task = &File::removeFrom;
+ else
+ task = &File::addTo;
+ }
+
+ ((*i).*task)(slice);
+ }
+}
+
+
+
+SliceListAction::SliceListAction(
+ const QString &text, Oblique *oblique,
+ QObject *reciever, const char *slot,
+ const QValueList<File> &files, QObject *parent, const char *name
+ ) : KActionMenu(text, parent, name)
+{
+ mFiles = files;
+ mOblique = oblique;
+ slicesModified();
+ if (reciever)
+ connect(this, SIGNAL(activated(Slice*)), reciever, slot);
+ connect(popupMenu(), SIGNAL(activated(int)), SLOT(hit(int)));
+ connect(oblique->base(), SIGNAL(slicesModified()), SLOT(slicesModified()));
+}
+
+void SliceListAction::slicesModified()
+{
+ mIndexToSlices.clear();
+ KPopupMenu *menu = popupMenu();
+ menu->clear();
+
+ QPtrList<Slice> slices = mOblique->base()->slices();
+ int id=1;
+
+
+
+ for (QPtrListIterator<Slice> i(slices); *i; ++i)
+ {
+ Slice *s = *i;
+ if (s->id()==0 && mFiles.count())
+ {
+ continue;
+ }
+
+ menu->insertItem(s->name(), id);
+ if (mFiles.count())
+ {
+ menu->setItemChecked(id, mFiles.first().isIn(s));
+ }
+// else if (mOblique->slice() == s) // TODO: show the selected one
+// {
+// menu->setItemChecked(id, true);
+// }
+
+ if (mFiles.count() && s->id() == 0)
+ {
+ menu->setItemEnabled(id, false);
+ }
+
+ mIndexToSlices.insert(id, s);
+ id++;
+ }
+}
+
+void SliceListAction::hit(int index)
+{
+ emit activated(mIndexToSlices[index]);
+}
+
+
+
+SchemaListAction::SchemaListAction(
+ const QString &text,
+ QObject *reciever, const char *slot,
+ QObject *parent, const char *name
+ ) : KActionMenu(text, parent, name)
+{
+ mTree = 0;
+ if (reciever)
+ connect(this, SIGNAL(activated(const QString&)), reciever, slot);
+ connect(popupMenu(), SIGNAL(aboutToShow()), SLOT(prepare()));
+ connect(popupMenu(), SIGNAL(activated(int)), SLOT(hit(int)));
+}
+
+void SchemaListAction::prepare()
+{
+ assert(mTree);
+ mIndexToSchemas.clear();
+ KPopupMenu *menu = popupMenu();
+ menu->clear();
+
+ if (!mTree) return;
+
+ int id=1;
+
+ QStringList names = mTree->oblique()->schemaNames();
+
+ for (QStringList::Iterator i(names.begin()); i != names.end(); ++i)
+ {
+ Query q;
+ QString title = mTree->oblique()->loadSchema(q, *i);
+
+ menu->insertItem(title, id);
+
+ menu->setItemChecked(id, mTree->fileOfQuery() == *i);
+
+ mIndexToSchemas.insert(id, *i);
+ id++;
+ }
+}
+
+void SchemaListAction::hit(int index)
+{
+ emit activated(mIndexToSchemas[index]);
+}
+
+
+
+ObliquePropertiesDialog::ObliquePropertiesDialog(const QValueList<File> &files, QWidget *parent)
+ : KPropertiesDialog(makeItems(files), parent), mFiles(files)
+{
+ connect(this, SIGNAL(propertiesClosed()), SLOT(deleteLater()));
+ connect(this, SIGNAL(applied()), SLOT(modified()));
+
+ show();
+}
+
+void ObliquePropertiesDialog::modified()
+{
+ // TODO reload the file's info
+ for (QValueList<File>::Iterator i(mFiles.begin()); i != mFiles.end(); ++i)
+ {
+ (*i).makeCache();
+ (*i).base()->notifyChanged(*i);
+ }
+}
+
+KFileItemList ObliquePropertiesDialog::makeItems(const QValueList<File> &files)
+{
+ KFileItemList kl;
+ for (QValueList<File>::ConstIterator i(files.begin()); i != files.end(); ++i)
+ {
+ File f = *i;
+ kl.append(new KFileItem(f.url(), f.property("mimetype"), KFileItem::Unknown));
+ }
+ return kl;
+}
+
+#include "menu.moc"
+
diff --git a/noatun-plugins/oblique/menu.h b/noatun-plugins/oblique/menu.h
new file mode 100644
index 0000000..793180c
--- /dev/null
+++ b/noatun-plugins/oblique/menu.h
@@ -0,0 +1,99 @@
+// Copyright (c) 2003 Charles Samuels <charles@kde.org>
+// See the file COPYING for redistribution terms.
+
+#ifndef MENU_H
+#define MENU_H
+
+#include <kpopupmenu.h>
+#include <kpropertiesdialog.h>
+#include <kaction.h>
+
+#include "file.h"
+#include "oblique.h"
+
+/**
+ * a context menu for a item in the list
+ **/
+class FileMenu : public KPopupMenu
+{
+Q_OBJECT
+ QValueList<File> mFiles;
+
+public:
+ FileMenu(QWidget *parent, Oblique *oblique, File file);
+ /**
+ * @recursively uses everything under @p files
+ **/
+ FileMenu(QWidget *parent, Oblique *oblique, TreeItem *files);
+
+private slots:
+ void removeFromList();
+ void properties();
+ void toggleInSlice(Slice *slice);
+};
+
+class SliceListAction : public KActionMenu
+{
+Q_OBJECT
+ QMap<int, Slice*> mIndexToSlices;
+ QValueList<File> mFiles;
+ Oblique *mOblique;
+
+public:
+ SliceListAction(
+ const QString &text, Oblique *oblique,
+ QObject *reciever, const char *slot,
+ const QValueList<File> &files = QValueList<File>(), QObject *parent=0, const char *name=0
+ );
+
+signals:
+ void activated(Slice *slice);
+
+private slots:
+ void hit(int index);
+ void slicesModified();
+};
+
+
+class SchemaListAction : public KActionMenu
+{
+Q_OBJECT
+ QMap<int, QString> mIndexToSchemas;
+ Tree *mTree;
+
+public:
+ SchemaListAction(
+ const QString &text,
+ QObject *reciever, const char *slot,
+ QObject *parent, const char *name
+ );
+
+ void setTree(Tree *tree) { mTree = tree; }
+
+signals:
+ void activated(const QString &);
+
+private slots:
+ void hit(int index);
+ void prepare();
+};
+
+
+class ObliquePropertiesDialog : public KPropertiesDialog
+{
+Q_OBJECT
+ QValueList<File> mFiles;
+
+public:
+ ObliquePropertiesDialog(const QValueList<File> &files, QWidget *parent);
+
+private:
+ static KFileItemList makeItems(const QValueList<File> &files);
+
+private slots:
+ void modified();
+};
+
+
+#endif
+
diff --git a/noatun-plugins/oblique/oblique.cpp b/noatun-plugins/oblique/oblique.cpp
new file mode 100644
index 0000000..97e75be
--- /dev/null
+++ b/noatun-plugins/oblique/oblique.cpp
@@ -0,0 +1,325 @@
+// Copyright (c) 2003-2005 Charles Samuels <charles@kde.org>
+// See the file COPYING for redistribution terms.
+
+#include "oblique.h"
+#include "base.h"
+#include "view.h"
+#include "file.h"
+#include "selector.h"
+#include "cmodule.h"
+
+#include <noatun/player.h>
+
+#include <kconfig.h>
+#include <kstandarddirs.h>
+#include <kio/job.h>
+#include <kfileitem.h>
+
+#include <qtimer.h>
+
+extern "C" Plugin *create_plugin()
+{
+ return new Oblique();
+}
+
+
+
+Oblique::Oblique()
+ : Playlist(0, 0), mSchemaCollection("oblique/schemas")
+{
+ mView = 0;
+ mAdder = 0;
+
+ KConfigGroup g(KGlobal::config(), "oblique");
+
+ mBase = new Base(::locate("data", "noatun/")+"/oblique-list");
+
+ mView = new View(this);
+ connect(napp->player(), SIGNAL(loopTypeChange(int)), SLOT(loopTypeChange(int)));
+
+ mSelector = new SequentialSelector(mView->tree());
+
+ new Configure(this);
+
+ // psst, window's gone, pass it on!
+ connect(mView, SIGNAL(listHidden()), SIGNAL(listHidden()));
+ connect(mView, SIGNAL(listShown()), SIGNAL(listShown()));
+
+ loopTypeChange(napp->player()->loopStyle());
+}
+
+
+Oblique::~Oblique()
+{
+ adderDone();
+ delete mView;
+ delete mBase;
+}
+
+void Oblique::loopTypeChange(int i)
+{
+ PlaylistItem now = current();
+
+ if (i == Player::Random)
+ {
+ if (!dynamic_cast<RandomSelector*>(mSelector))
+ {
+ delete mSelector;
+ mSelector = new RandomSelector(mView->tree());
+ }
+ }
+ else
+ {
+ delete mSelector;
+ mSelector = new SequentialSelector(mView->tree());
+ }
+}
+
+void Oblique::adderDone()
+{
+ delete mAdder;
+ mAdder = 0;
+}
+
+
+void Oblique::reset()
+{
+ mView->tree()->setCurrent(0);
+ loopTypeChange(0);
+}
+
+void Oblique::clear()
+{
+ mBase->clear();
+}
+
+void Oblique::addFile(const KURL &url, bool play)
+{
+ KFileItem fileItem(KFileItem::Unknown, KFileItem::Unknown, url);
+ if (fileItem.isDir())
+ {
+ beginDirectoryAdd(url);
+ }
+ else
+ {
+ File f = mBase->add(url.path());
+ PlaylistItem p=new Item(f);
+ p.data()->added();
+ if (play) setCurrent(p);
+ }
+}
+
+
+PlaylistItem Oblique::next()
+{
+ return mSelector->next();
+}
+
+PlaylistItem Oblique::previous()
+{
+ return mSelector->previous();
+}
+
+
+PlaylistItem Oblique::current()
+{
+ return mSelector->current();
+}
+
+void Oblique::setCurrent(const PlaylistItem &item)
+{
+ if (!item) return;
+ mSelector->setCurrent(*static_cast<Item*>(const_cast<PlaylistItemData*>(item.data())));
+ emit playCurrent();
+}
+
+
+
+PlaylistItem Oblique::getFirst() const
+{
+ FileId first=1;
+ File item = mBase->first(first);
+
+ if (!item) return 0;
+
+ return new Item(item);
+}
+
+
+PlaylistItem Oblique::getAfter(const PlaylistItem &item) const
+{
+ File after = mBase->first(static_cast<const Item*>(item.data())->itemFile().id()+1);
+ if (!after) return 0;
+ return new Item(after);
+}
+
+bool Oblique::listVisible() const
+{
+ return mView->isVisible();
+}
+
+void Oblique::showList()
+{
+ mView->show();
+}
+
+void Oblique::hideList()
+{
+ mView->hide();
+}
+
+
+void Oblique::selected(TreeItem *cur)
+{
+ Item *item = new Item(cur->file());
+ PlaylistItem pli = item;
+ setCurrent(pli);
+}
+
+void Oblique::beginDirectoryAdd(const KURL &url)
+{
+ if (mAdder)
+ {
+ mAdder->add(url);
+ }
+ else
+ {
+ mAdder = new DirectoryAdder(url, this);
+ connect(mAdder, SIGNAL(done()), SLOT(adderDone()));
+ }
+}
+
+
+
+Loader::Loader(Tree *tree)
+ : QObject(tree)
+{
+ mTree = tree;
+ mBase = mTree->oblique()->base();
+ mDeferredLoaderAt=1;
+
+
+ QTimer::singleShot(0, this, SLOT(loadItemsDeferred()));
+}
+
+void Loader::loadItemsDeferred()
+{
+ // do/try 16 at a time
+ for (int xx=0; xx < 16; xx++)
+ {
+ if (mDeferredLoaderAt > mBase->high())
+ {
+ // finished
+ mBase->resetFormatVersion();
+ emit finished();
+ return;
+ }
+
+ File f = mBase->find(mDeferredLoaderAt);
+
+ if (f)
+ {
+ if (mBase->formatVersion() <= 0x00010001)
+ f.makeCache();
+
+ if (f.isIn(mTree->slice()))
+ mTree->insert(f);
+ }
+ mDeferredLoaderAt++;
+ }
+
+ QTimer::singleShot(0, this, SLOT(loadItemsDeferred()));
+}
+
+
+DirectoryAdder::DirectoryAdder(const KURL &dir, Oblique *oblique)
+{
+ listJob=0;
+ mOblique = oblique;
+
+ add(dir);
+}
+
+void DirectoryAdder::add(const KURL &dir)
+{
+ if (dir.upURL().equals(currentJobURL, true))
+ {
+ // We are a subdir of our currentJobURL and need to get listed next,
+ // NOT after all the other dirs that are on the same level as
+ // currentJobURL!
+ lastAddedSubDirectory = pendingAddDirectories.insert(lastAddedSubDirectory, dir);
+ lastAddedSubDirectory++;
+ }
+ else
+ {
+ pendingAddDirectories.append(dir);
+ }
+ addNextPending();
+}
+
+void DirectoryAdder::addNextPending()
+{
+ KURL::List::Iterator pendingIt= pendingAddDirectories.begin();
+ if (!listJob && (pendingIt!= pendingAddDirectories.end()))
+ {
+ currentJobURL= *pendingIt;
+ listJob = KIO::listDir(currentJobURL, false, false);
+ connect(
+ listJob, SIGNAL(entries(KIO::Job*, const KIO::UDSEntryList&)),
+ SLOT(slotEntries(KIO::Job*, const KIO::UDSEntryList&))
+ );
+ connect(
+ listJob, SIGNAL(result(KIO::Job *)),
+ SLOT(slotResult(KIO::Job *))
+ );
+ connect(
+ listJob, SIGNAL(redirection(KIO::Job *, const KURL &)),
+ SLOT(slotRedirection(KIO::Job *, const KURL &))
+ );
+ pendingAddDirectories.remove(pendingIt);
+ lastAddedSubDirectory = pendingAddDirectories.begin();
+ }
+}
+
+void DirectoryAdder::slotResult(KIO::Job *job)
+{
+ listJob= 0;
+ if (job && job->error())
+ job->showErrorDialog();
+ addNextPending();
+ if (!listJob)
+ emit done();
+}
+
+void DirectoryAdder::slotEntries(KIO::Job *, const KIO::UDSEntryList &entries)
+{
+ QMap<QString,KURL> __list; // temp list to sort entries
+
+ KIO::UDSEntryListConstIterator it = entries.begin();
+ KIO::UDSEntryListConstIterator end = entries.end();
+
+ for (; it != end; ++it)
+ {
+ KFileItem file(*it, currentJobURL, false /* no mimetype detection */, true);
+ // "prudhomm:
+ // insert the path + url in the map to sort automatically by path
+ // note also that you use audiocd to rip your CDs then it will be sorted the right way
+ // now it is an easy fix to have a nice sort BUT it is not the best
+ // we should sort based on the tracknumber"
+ // - copied over from old kdirlister hack <hans_meine@gmx.de>
+ __list.insert(file.url().path(), file.url());
+ }
+ QMap<QString,KURL>::Iterator __it;
+ for( __it = __list.begin(); __it != __list.end(); ++__it )
+ {
+ oblique()->addFile(__it.data(), false);
+ }
+}
+
+void DirectoryAdder::slotRedirection(KIO::Job *, const KURL & url)
+{
+ currentJobURL= url;
+}
+
+
+#include "oblique.moc"
diff --git a/noatun-plugins/oblique/oblique.h b/noatun-plugins/oblique/oblique.h
new file mode 100644
index 0000000..93d1e18
--- /dev/null
+++ b/noatun-plugins/oblique/oblique.h
@@ -0,0 +1,142 @@
+// Copyright (c) 2003-2005 Charles Samuels <charles@kde.org>
+// See the file COPYING for redistribution terms.
+
+#ifndef OBLIQUE_H
+#define OBLIQUE_H
+
+#include <noatun/playlist.h>
+#include <noatun/plugin.h>
+#include "query.h"
+#include "kdatacollection.h"
+
+#include <kio/global.h>
+
+class View;
+class Tree;
+class Base;
+class Selector;
+class TreeItem;
+class DirectoryAdder;
+
+namespace KIO
+{
+ class ListJob;
+ class Job;
+}
+
+class Oblique : public Playlist, public Plugin
+{
+Q_OBJECT
+ View *mView;
+ Base *mBase;
+ Selector *mSelector;
+ KDataCollection mSchemaCollection;
+ DirectoryAdder *mAdder;
+
+
+public:
+ Oblique();
+ ~Oblique();
+
+ Base *base() { return mBase; }
+
+ QStringList schemaNames() const { return mSchemaCollection.names(); }
+ QString loadSchema(Query &q, const QString &name)
+ {
+ QString t = q.load(mSchemaCollection.file(name));
+ if (t.length())
+ q.setName(name);
+ return t;
+ }
+
+ void saveSchema(Query &q, const QString &name, const QString &title)
+ {
+ q.save(title, mSchemaCollection.saveFile(name));
+ }
+
+ void removeSchema(const QString &name)
+ {
+ mSchemaCollection.remove(name);
+ }
+
+ virtual void reset();
+ virtual void clear();
+ virtual void addFile(const KURL&, bool play=false);
+ virtual PlaylistItem next();
+ virtual PlaylistItem previous();
+ virtual PlaylistItem current();
+ virtual void setCurrent(const PlaylistItem &);
+ virtual PlaylistItem getFirst() const;
+ virtual PlaylistItem getAfter(const PlaylistItem &item) const;
+ virtual bool listVisible() const;
+ virtual void showList();
+ virtual void hideList();
+
+ virtual Playlist *playlist() { return this; }
+
+public slots:
+ void selected(TreeItem *cur);
+ void beginDirectoryAdd(const KURL &url);
+
+private slots:
+ void loopTypeChange(int i);
+ void adderDone();
+};
+
+/**
+ * loads the database into a Tree
+ **/
+class Loader : public QObject
+{
+Q_OBJECT
+ // the id of the next file to load
+ FileId mDeferredLoaderAt;
+ Tree *mTree;
+ Base *mBase;
+
+public:
+ Loader(Tree *into);
+
+signals:
+ void finished();
+
+private slots:
+ void loadItemsDeferred();
+};
+
+/**
+ * Adds a directory to
+ * emits @ref done() when finished so you
+ * can delete it
+ **/
+class DirectoryAdder : public QObject
+{
+ Q_OBJECT
+ Oblique *mOblique;
+ KURL::List pendingAddDirectories;
+ KURL::List::Iterator lastAddedSubDirectory;
+ KIO::ListJob *listJob;
+ KURL currentJobURL;
+
+public:
+ DirectoryAdder(const KURL &dir, Oblique *oblique);
+
+ Oblique *oblique() { return mOblique; }
+
+public slots:
+ void add(const KURL &dir);
+
+signals:
+ void done();
+
+private slots:
+ void slotResult(KIO::Job *job);
+ void slotEntries(KIO::Job *job, const KIO::UDSEntryList &entries);
+ void slotRedirection(KIO::Job *, const KURL & url);
+
+private:
+
+ void addNextPending();
+};
+
+#endif
diff --git a/noatun-plugins/oblique/oblique.plugin b/noatun-plugins/oblique/oblique.plugin
new file mode 100644
index 0000000..c0b561c
--- /dev/null
+++ b/noatun-plugins/oblique/oblique.plugin
@@ -0,0 +1,73 @@
+Filename=noatun_oblique.la
+Author=Charles Samuels
+Site=http://noatun.kde.org/oblique
+Email=charles@kde.org
+Type=playlist
+License=GPL/QPL/Anti-Patent BSD
+Name=Oblique
+Name[az]=Oblik
+Name[cy]=Lletraws
+Name[eo]=Oblikva
+Name[es]=Oblicuo
+Name[fa]=مورب
+Name[hi]=ऑब्लिक
+Name[km]=បញ្ឆៀង
+Name[ne]=बक्र
+Name[pt_BR]=Oblíquo
+Name[ro]=Oblic
+Name[sl]=Ležeče
+Name[ta]= சாய்வான
+Name[tr]=Eğik
+Name[vi]=Xiên
+Comment=Auto-collating playlist
+Comment[bg]=Списък на файлове за изпълнение, който автоматично се сортира и проверява
+Comment[bs]=Auto-sortirajuća playlista
+Comment[ca]=Llista de reproducció ordenada automàticament
+Comment[cs]=Samořadící seznam skladeb
+Comment[da]=Auto-kollateret spilleliste
+Comment[de]=Selbständige Zusammenstellung der Wiedergabeliste
+Comment[el]=Λίστα αναπαραγωγής με αυτόματη ταξινόμηση
+Comment[eo]=Aŭtomate kunmetanta ludlisto
+Comment[es]=Crear lista de reproducción de forma automática
+Comment[et]=Automaatselt end kokkukeriv esitusnimekiri
+Comment[eu]=Erreproduzio-zerrendaren antolaketa automatikoa
+Comment[fa]=فهرست پخش تلفیق خودکار
+Comment[fi]=Automaattisesti järjestyvä soittolista
+Comment[fr]=Liste de lecture auto-assemblée
+Comment[fy]=Auto-plakkende ôfspyllist
+Comment[ga]=Seinmliosta uath-chomhordaithe
+Comment[gl]=Lista de reproduición auto-incorporante
+Comment[he]=רשימת ניגון נסגרת עצמאית
+Comment[hi]=ऑटो-कोलेटिंग प्लेलिस्ट
+Comment[hr]=Album s automatskim uspoređivanjem
+Comment[hu]=Automatikusan szelektáló lejátszási lista
+Comment[is]=Sjálfvirkur lagalisti
+Comment[it]=Raccoglie automaticamente la lista di selezione
+Comment[ja]=プレイリストの自動照合
+Comment[ka]=სიმღერათა სიის ავტო შეკუნშვა
+Comment[kk]=Автосұрыпталатың орындау тізімі
+Comment[km]=តម្រៀប​បញ្ជី​ចាក់​ដោយ​ស្វ័យ​ប្រវត្តិ​
+Comment[lt]=Automatiškai besikaupiantis gaidaraštis
+Comment[mk]=Самоподредувачка листа со нумери
+Comment[ms]=Mengumpul semak senarai main
+Comment[nb]=Selvjusterende spilleliste
+Comment[nds]=Automaatsch de Afspeellist tosamenstellen
+Comment[ne]=स्वत: समानुक्रमित प्लेसूची
+Comment[nl]=Auto-plakkende afspeellijst
+Comment[nn]=Sjølvjusterande speleliste
+Comment[pl]=Automatycznie zestawiająca się lista odtwarzania
+Comment[pt]=Lista de músicas autocolante
+Comment[pt_BR]=Lista de reprodução de colagem automática
+Comment[ru]=Автоматически собирающийся список воспроизведения
+Comment[sk]=Automaticky triedený playlist
+Comment[sl]=Samodejno zlagajoč predvajalni seznam
+Comment[sr]=Самосређујућа листа нумера
+Comment[sr@Latn]=Samosređujuća lista numera
+Comment[sv]=Spellista med automatiskt ordning
+Comment[ta]=தானாகாவே-சேர்க்கும் வாசிப்புப் பட்டியல்
+Comment[tg]=Худкорона ҷамъ кардани рӯйхати баровардҳо
+Comment[tr]=Otomatik karşılaştırılmış çalma listesi
+Comment[uk]=Список композицій, який автоматично об'єднується
+Comment[vi]=Danh mục nhạc tự động đối chiếu
+Comment[zh_CN]=自动收集播放列表
+Comment[zh_TW]=自動整理播放列表
diff --git a/noatun-plugins/oblique/obliqueui.rc b/noatun-plugins/oblique/obliqueui.rc
new file mode 100644
index 0000000..0ef4740
--- /dev/null
+++ b/noatun-plugins/oblique/obliqueui.rc
@@ -0,0 +1,31 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="Oblique" version="4">
+
+<MenuBar>
+ <Menu name="file" noMerge="1">
+ <text>&amp;Collection</text>
+ <Action name="add_files" />
+ <Action name="add_dir" />
+ <Action name="reload" />
+ <Separator />
+ <Action name="make_slice" />
+ <Action name="remove_slice" />
+ <Action name="slices" />
+ <Action name="schemas" />
+ </Menu>
+ <Menu name="window">
+ <text>&amp;Window</text>
+ <Action name="newtab" />
+ <Action name="removecurrenttab" />
+ </Menu>
+</MenuBar>
+
+
+
+<ToolBar noMerge="1" name="mainToolBar">
+ <text>Main Toolbar</text>
+ <Action name="add_files" />
+ <Action name="jump_label" />
+ <Action name="jump_text" />
+</ToolBar>
+</kpartgui>
diff --git a/noatun-plugins/oblique/query.cpp b/noatun-plugins/oblique/query.cpp
new file mode 100644
index 0000000..292ff16
--- /dev/null
+++ b/noatun-plugins/oblique/query.cpp
@@ -0,0 +1,570 @@
+// Copyright (c) 2003 Charles Samuels <charles@kde.org>
+// See the file COPYING for redistribution terms.
+
+#include "query.h"
+#include "file.h"
+
+#include <iostream>
+
+#include <klocale.h>
+
+#include <qdom.h>
+#include <qfile.h>
+
+QueryGroup::QueryGroup()
+{
+ mFirstChild=0;
+ mNextSibling=0;
+
+ mFuzzyness = Case | Spaces | Articles;
+ mOptions = AutoHide;
+}
+
+QueryGroup::QueryGroup(const QueryGroup &copy)
+{
+ mFirstChild=0;
+ mNextSibling=0;
+
+ operator=(copy);
+
+}
+
+QueryGroup &QueryGroup::operator =(const QueryGroup &copy)
+{
+ mFuzzyness = copy.mFuzzyness;
+ mOptions = copy.mOptions;
+ mPropertyName = copy.mPropertyName;
+ mPresentation = copy.mPresentation;
+ mValue = copy.mValue;
+ return *this;
+}
+
+QueryGroup::~QueryGroup()
+{
+ delete mFirstChild;
+ delete mNextSibling;
+}
+
+void QueryGroup::insertAfter(QueryGroup *insert)
+{
+ QueryGroup *oldAfter = mNextSibling;
+ insert->setNextSibling(oldAfter);
+ setNextSibling(insert);
+}
+
+void QueryGroup::insertUnder(QueryGroup *insert)
+{
+ QueryGroup *oldUnder = mFirstChild;
+ insert->setNextSibling(oldUnder);
+ setFirstChild(insert);
+
+}
+
+void QueryGroup::move(Query *query, QueryGroup *under, QueryGroup *after)
+{
+ query->dump();
+
+ query->take(this);
+ if (after) after->insertAfter(this);
+ else if (under) under->insertUnder(this);
+ else query->insertFirst(this);
+
+ query->dump();
+}
+
+
+QueryGroup *QueryGroup::previous(Query *query)
+{
+ QueryGroup *f = query->firstChild();
+ if (f == this) return 0;
+
+ return previous(f);
+}
+
+QueryGroup *QueryGroup::previous(QueryGroup *startWith)
+{
+ QueryGroup *current = startWith;
+ QueryGroup *after = 0;
+
+ while (current)
+ {
+ after = current->nextSibling();
+ if (after == this)
+ return current;
+
+ if (QueryGroup *child = current->firstChild())
+ {
+ if (child == this)
+ return current;
+ child = previous(child);
+ if (child) return child;
+ }
+ current = after;
+ }
+ return 0;
+}
+
+
+
+QueryGroup *QueryGroup::lastChild()
+{
+ QueryGroup *first = mFirstChild;
+ if (!first) return 0;
+ while (first->nextSibling())
+ first = first->nextSibling();
+ return first;
+}
+
+
+bool QueryGroup::fuzzyness(Fuzzyness f) const
+{
+ return mFuzzyness & f;
+}
+
+bool QueryGroup::option(Option option) const
+{
+ return mOptions & option;
+}
+
+void QueryGroup::setOption(Option option, bool on)
+{
+ if (on)
+ mOptions |= option;
+ else
+ mOptions &= ~option;
+}
+
+bool QueryGroup::matches(const File &file) const
+{
+ QString prop = file.property(propertyName());
+
+ prop = prop.simplifyWhiteSpace();
+ if (prop.isNull()) prop = "";
+
+ QRegExp re(value());
+ return re.search(prop) != -1;
+}
+
+
+
+QString QueryGroup::presentation(const File &file) const
+{
+ // "$(property)"
+ QString format=presentation();
+
+ QRegExp find("(?:(?:\\\\\\\\))*\\$\\((.*)");
+
+ int start=0;
+ while (start != -1)
+ {
+ start = find.search(format, start);
+ if (start == -1) break;
+
+ // test if there's an odd amount of backslashes
+ if (start>0 && format[start-1]=='\\')
+ {
+ // yes, so half the amount of backslashes
+
+ // count how many there are first
+ QRegExp counter("([\\\\]+)");
+ counter.search(format, start-1);
+ uint len=counter.cap(1).length()-1;
+
+ // and half them, and remove one more
+ format.replace(start-1, len/2+1, "");
+ start=start-1+len/2+find.cap(1).length()+3;
+ continue;
+ }
+
+ // now replace the backslashes with half as many
+
+ if (format[start]=='\\')
+ {
+ // count how many there are first
+ QRegExp counter("([\\\\]+)");
+ counter.search(format, start);
+ uint len=counter.cap(1).length();
+
+ // and half them
+ format.replace(start, len/2, "");
+ start=start+len/2;
+ }
+
+ // "sth"foo"sth"
+ QString cont(find.cap(1));
+ QString prefix,suffix,propname;
+ unsigned int i=0;
+ if (cont[i] == '"')
+ {
+ i++;
+ for (; i < cont.length(); i++)
+ {
+ if (cont[i] != '"')
+ prefix += cont[i];
+ else
+ break;
+ }
+ i++;
+ }
+
+
+ for (; i < cont.length(); ++i)
+ {
+ if (cont[i]!='"' && cont[i]!=')')
+ propname += cont[i];
+ else
+ break;
+ }
+
+ if (cont[i] == '"')
+ {
+ i++;
+ for (; i < cont.length(); i++)
+ {
+ if (cont[i] != '"')
+ suffix += cont[i];
+ else
+ break;
+ }
+ i++;
+ }
+ i++;
+
+
+ QString propval = file.property(propname);
+
+// the following code won't be enabled until the presentation is reloaded
+// at the best times
+/* if (propname == "length")
+ {
+ int len = propval.toInt();
+ if ( len < 0 ) // no file loaded
+ propval = "--:--";
+
+ int secs = length()/1000; // convert milliseconds -> seconds
+ int seconds = secs % 60;
+ propval.sprintf("%.2d:%.2d", ((secs-seconds)/60), seconds);
+ }
+*/
+
+ if (propval.length())
+ {
+ propval = prefix+propval+suffix;
+ format.replace(start, i+2, propval);
+ start += propval.length();
+ }
+ else
+ {
+ format.replace(start, i+2, "");
+ }
+ }
+ return format;
+}
+
+
+Query::Query()
+{
+ mGroupFirst=0;
+}
+
+Query::~Query()
+{
+ delete mGroupFirst;
+}
+
+Query::Query(const Query &copy)
+{
+ mGroupFirst = 0;
+ operator=(copy);
+}
+
+Query &Query::operator =(const Query &copy)
+{
+ if (&copy == this) return *this;
+ delete mGroupFirst;
+ mGroupFirst=0;
+ if (const QueryGroup *parent = copy.firstChild())
+ {
+ mGroupFirst = new QueryGroup(*parent);
+ deepCopy(parent->firstChild(), mGroupFirst);
+ }
+ return *this;
+}
+
+QueryGroup *Query::firstChild()
+{
+ return mGroupFirst;
+}
+
+const QueryGroup *Query::firstChild() const
+{
+ return mGroupFirst;
+}
+
+void Query::setFirstChild(QueryGroup *g)
+{
+ mGroupFirst = g;
+}
+
+void Query::insertFirst(QueryGroup *g)
+{
+ g->setNextSibling(mGroupFirst);
+ mGroupFirst = g;
+}
+
+void Query::clear()
+{
+ delete mGroupFirst;
+ mGroupFirst=0;
+}
+
+QString Query::load(const QString &filename)
+{
+ QFile file(filename);
+ unless (file.open(IO_ReadOnly)) return QString::null;
+
+ QDomDocument doc;
+ doc.setContent(&file);
+ return load(doc.documentElement());
+}
+
+QString Query::load(QDomElement element)
+{
+ clear();
+
+ if (element.tagName().lower() == "obliqueschema")
+ {
+ QDomNode node = element.firstChild();
+
+ while (!node.isNull())
+ {
+ QDomElement e = node.toElement();
+ if (e.tagName().lower() == "group")
+ loadGroup(e);
+ node = node.nextSibling();
+ }
+ }
+ else
+ {
+ return QString::null;
+ }
+
+ // for internationalization:
+ // Add these if you create new schemas and release them with Oblique
+ (void)I18N_NOOP("Standard");
+
+ QString title = element.attribute("title");
+ if (element.hasAttribute("standard"))
+ title = i18n(title.utf8());
+ return title;
+}
+
+void Query::save(const QString &name, QDomElement &element)
+{
+ element.setTagName("ObliqueSchema");
+ element.setAttribute("version", "1.0");
+ element.setAttribute("title", name);
+ for (QueryGroup *g = firstChild(); g; g = g->nextSibling())
+ saveGroup(element, g);
+}
+
+void Query::save(const QString &name, const QString &filename)
+{
+ QFile file(filename);
+ unless (file.open(IO_Truncate|IO_ReadWrite ))
+ return;
+ QDomDocument doc("ObliqueSchema");
+ doc.setContent(QString("<!DOCTYPE ObliqueSchema><ObliqueSchema/>"));
+ QDomElement e = doc.documentElement();
+ save(name, e);
+
+ QTextStream ts(&file);
+ ts.setEncoding(QTextStream::UnicodeUTF8);
+ // scourge elimination
+ QString data = doc.toString();
+ QString old = data;
+ while (data.replace(QRegExp("([\n\r]+)(\t*) "), "\\1\\2\t") != old)
+ {
+ old = data;
+ }
+ ts << data;
+}
+
+
+void Query::take(QueryGroup *item)
+{
+ QueryGroup *previous = item->previous(this);
+
+ if (!previous)
+ {
+ mGroupFirst = item->nextSibling();
+ item->setNextSibling(0);
+ return;
+ }
+
+ if (previous->nextSibling() == item)
+ {
+ previous->setNextSibling(item->nextSibling());
+ item->setNextSibling(0);
+ }
+ else if (previous->firstChild() == item)
+ {
+ previous->setFirstChild(item->nextSibling());
+ item->setNextSibling(0);
+ }
+}
+
+static void dump(QueryGroup *item, int depth)
+{
+ if (!item) return;
+
+ do
+ {
+ for (int d = 0; d < depth; d++)
+ std::cerr << " ";
+ std::cerr << "prop: " << item->propertyName().utf8() << " pres: "
+ << item->presentation().utf8() << std::endl;
+ dump(item->firstChild(), depth+1);
+
+ } while ((item = item->nextSibling()));
+
+}
+
+void Query::dump()
+{
+ ::dump(firstChild(), 0);
+}
+
+
+
+
+void Query::loadGroup(QDomElement element, QueryGroup *parent)
+{
+ QDomNode node = element.firstChild();
+
+ QueryGroup *group = new QueryGroup;
+ if (parent)
+ {
+ if (QueryGroup *last = parent->lastChild())
+ last->setNextSibling(group);
+ else
+ parent->setFirstChild(group);
+ }
+ else
+ {
+ mGroupFirst = group;
+ }
+
+ while (!node.isNull())
+ {
+ QDomElement e = node.toElement();
+ if (e.tagName().lower() == "group")
+ {
+ loadGroup(e, group);
+ }
+ else if (e.tagName().lower() == "property")
+ {
+ group->setPropertyName(e.text());
+ }
+ else if (e.tagName().lower() == "value")
+ {
+ group->setValue(QRegExp(e.text()));
+ }
+ else if (e.tagName().lower() == "presentation")
+ {
+ group->setPresentation(e.text());
+ }
+ else if (e.tagName().lower() == "options")
+ {
+ QDomNode node = e.firstChild();
+ while (!node.isNull())
+ {
+ QDomElement e = node.toElement();
+
+ if (e.tagName().lower() == "disabled")
+ group->setOption(QueryGroup::Disabled, true);
+ else if (e.tagName().lower() == "unique") // backwards compat (for now)
+ group->setOption(QueryGroup::Playable, true);
+ else if (e.tagName().lower() == "playable")
+ group->setOption(QueryGroup::Playable, true);
+ else if (e.tagName().lower() == "childrenvisible")
+ group->setOption(QueryGroup::ChildrenVisible, true);
+ else if (e.tagName().lower() == "autoopen")
+ group->setOption(QueryGroup::AutoOpen, true);
+
+ node = node.nextSibling();
+ }
+
+ }
+ node = node.nextSibling();
+ }
+}
+
+void Query::saveGroup(QDomElement &parent, QueryGroup *group)
+{
+ QDomDocument doc = parent.ownerDocument();
+ QDomElement element = doc.createElement("group");
+ parent.appendChild(element);
+
+ QDomElement childe;
+ QDomText childtext;
+ {
+ childe = doc.createElement("property");
+ element.appendChild(childe);
+ childtext = doc.createTextNode(group->propertyName());
+ childe.appendChild(childtext);
+ }
+ {
+ childe = doc.createElement("value");
+ element.appendChild(childe);
+ childtext = doc.createTextNode(group->value().pattern());
+ childe.appendChild(childtext);
+ }
+ {
+ childe = doc.createElement("presentation");
+ element.appendChild(childe);
+ childtext = doc.createTextNode(group->presentation());
+ childe.appendChild(childtext);
+ }
+ {
+ childe = doc.createElement("options");
+ element.appendChild(childe);
+ if (group->option(QueryGroup::Disabled))
+ childe.appendChild(doc.createElement("disabled"));
+ if (group->option(QueryGroup::Playable))
+ childe.appendChild(doc.createElement("playable"));
+ if (group->option(QueryGroup::ChildrenVisible))
+ childe.appendChild(doc.createElement("childrenvisible"));
+ if (group->option(QueryGroup::AutoOpen))
+ childe.appendChild(doc.createElement("autoopen"));
+ }
+
+ for (QueryGroup *c = group->firstChild(); c; c = c->nextSibling())
+ {
+ saveGroup(element, c);
+ }
+}
+
+void Query::deepCopy(const QueryGroup *from, QueryGroup *toParent)
+{
+ if (!from) return;
+ QueryGroup *last=0;
+
+ while (from)
+ {
+ QueryGroup *copy = new QueryGroup(*from);
+ if (last)
+ {
+ last->setNextSibling(copy);
+ last = copy;
+ }
+ else
+ {
+ toParent->setFirstChild(copy);
+ last = copy;
+ }
+ deepCopy(from->firstChild(), last);
+ from = from->nextSibling();
+ }
+}
+
diff --git a/noatun-plugins/oblique/query.h b/noatun-plugins/oblique/query.h
new file mode 100644
index 0000000..60a19ff
--- /dev/null
+++ b/noatun-plugins/oblique/query.h
@@ -0,0 +1,176 @@
+// Copyright (c) 2003 Charles Samuels <charles@kde.org>
+// See the file COPYING for redistribution terms.
+
+#ifndef QUERY_H
+#define QUERY_H
+
+#include "base.h"
+
+#include <qregexp.h>
+#include <qstring.h>
+
+class Query;
+class QDomElement;
+
+class QueryGroup
+{
+ friend class Query;
+
+ QueryGroup *mFirstChild;
+ QueryGroup *mNextSibling;
+
+ int mFuzzyness;
+ int mOptions;
+
+ QString mPropertyName;
+ QString mPresentation;
+ QRegExp mValue;
+
+public:
+ QueryGroup();
+ QueryGroup(const QueryGroup &copy);
+ QueryGroup &operator =(const QueryGroup &copy);
+
+
+ /**
+ * delete my first child, and my next sibling
+ **/
+ ~QueryGroup();
+ void setFirstChild(QueryGroup *g) { mFirstChild = g; }
+ void setNextSibling(QueryGroup *g) { mNextSibling = g; }
+
+
+ QueryGroup *firstChild() { return mFirstChild; }
+ const QueryGroup *firstChild() const { return mFirstChild; }
+ QueryGroup *lastChild();
+ QueryGroup *nextSibling() { return mNextSibling; }
+ const QueryGroup *nextSibling() const { return mNextSibling; }
+
+ /**
+ * insert @p after as a sibling immediately after this
+ **/
+ void insertAfter(QueryGroup *insert);
+
+ /**
+ * insert @p immediately after this as a child
+ **/
+ void insertUnder(QueryGroup *insert);
+
+ /**
+ * Try get the "best fit" for the two parameters
+ **/
+ void move(Query *query, QueryGroup *under, QueryGroup *after);
+
+ QString propertyName() const { return mPropertyName; }
+ QRegExp value() const { return mValue; }
+ QString presentation() const { return mPresentation; }
+
+ void setPropertyName(const QString &v) { mPropertyName = v; }
+ void setPresentation(const QString &v) { mPresentation = v; }
+ void setValue(const QRegExp &v) { mValue = v; }
+
+ enum Fuzzyness
+ {
+ Case = 1<<0, Spaces = 1<<1, Articles = 1<<2, Symbols = 1<<3
+ };
+
+ bool fuzzyness(Fuzzyness f) const;
+
+ enum Option
+ {
+ AutoHide = 1<<0, Disabled = 1<<1, Playable = 1<<2,
+ ChildrenVisible = 1<<3, AutoOpen = 1<<4
+ };
+
+ bool option(Option option) const;
+ void setOption(Option option, bool on);
+
+ /**
+ * @return if I match @p file
+ **/
+ bool matches(const File &file) const;
+
+ QString presentation(const File &file) const;
+
+private:
+ /**
+ * apply all the "normalizing" transformations according
+ * to the fuzzyness
+ **/
+ QString fuzzify(const QString &str) const;
+ /**
+ * @returns the previous or parent of this item (slow)
+ **/
+ QueryGroup *previous(Query *query);
+ QueryGroup *previous(QueryGroup *startWith);
+
+};
+
+
+
+
+/**
+ * a query is the tree structure that is shown to the user
+ **/
+class Query
+{
+ QueryGroup *mGroupFirst;
+ QString mName;
+
+public:
+ Query();
+ Query(const Query &copy);
+ ~Query();
+
+ Query &operator =(const Query &copy);
+
+ QueryGroup *firstChild();
+ const QueryGroup *firstChild() const;
+
+ void setFirstChild(QueryGroup *g);
+ void insertFirst(QueryGroup *g);
+
+ void clear();
+
+ /**
+ * @returns the name to be used internally
+ **/
+ QString name() const { return mName; }
+ void setName(const QString &name) { mName = name; }
+
+ /**
+ * @returns the name of the query
+ **/
+ QString load(const QString &filename);
+ void save(const QString &name, QDomElement &element);
+ void save(const QString &name, const QString &filename);
+
+ /**
+ * remove any trace of this from the tree, but don't actually delete it
+ **/
+ void take(QueryGroup *item);
+
+ void dump();
+
+ /**
+ * @returns the name of this query as used internally by the db.
+ *
+ * Will give it a name in the db if necessary
+ **/
+ QString dbname(Base *base);
+
+private:
+ void loadGroup(QDomElement element, QueryGroup *parent=0);
+ void saveGroup(QDomElement &parent, QueryGroup *group);
+
+ void deepCopy(const QueryGroup *from, QueryGroup *toParent);
+
+ /**
+ * @returns the name of the query
+ **/
+ QString load(QDomElement element);
+};
+
+
+
+#endif
diff --git a/noatun-plugins/oblique/schemas/Makefile.am b/noatun-plugins/oblique/schemas/Makefile.am
new file mode 100644
index 0000000..9bda17b
--- /dev/null
+++ b/noatun-plugins/oblique/schemas/Makefile.am
@@ -0,0 +1,3 @@
+schemasdir = $(kde_datadir)/noatun/oblique/schemas
+schemas_DATA = standard
+
diff --git a/noatun-plugins/oblique/schemas/obliqueschema.dtd b/noatun-plugins/oblique/schemas/obliqueschema.dtd
new file mode 100644
index 0000000..5fb45ea
--- /dev/null
+++ b/noatun-plugins/oblique/schemas/obliqueschema.dtd
@@ -0,0 +1,14 @@
+<!ELEMENT ObliqueSchema (group+)>
+<!ELEMENT group (property,value,presentation,options?,group*)>
+<!ELEMENT options (disabled|stoponhit|unique)*>
+<!ATTLIST ObliqueSchema version CDATA "1.0">
+
+<!ELEMENT disabled EMPTY>
+<!ELEMENT stoponhit EMPTY>
+<!ELEMENT unique EMPTY>
+
+
+<!ELEMENT property (#PCDATA)>
+<!ELEMENT value (#PCDATA)>
+<!ELEMENT presentation (#PCDATA)>
+
diff --git a/noatun-plugins/oblique/schemas/standard b/noatun-plugins/oblique/schemas/standard
new file mode 100644
index 0000000..1c00f18
--- /dev/null
+++ b/noatun-plugins/oblique/schemas/standard
@@ -0,0 +1,80 @@
+<!DOCTYPE ObliqueSchema SYSTEM "obliqueschema.dtd">
+<ObliqueSchema title="Standard" i18n="true">
+ <group>
+ <property>mimetype</property>
+ <value>^(?:audio/|.*/ogg$)</value>
+ <presentation>Music</presentation>
+ <options>
+ <autoopen/>
+ </options>
+ <group>
+ <property>author</property>
+ <value>^$</value>
+ <presentation>(Unknown Artist)</presentation>
+
+ <group>
+ <property>title</property>
+ <value>^$</value>
+ <presentation>$(track". ")$(file)$(" ("bitrate"kbps)")</presentation>
+ <options>
+ <playable />
+ </options>
+ </group>
+ </group>
+
+ <group>
+ <property>author</property>
+ <value></value>
+ <presentation>$(author)</presentation>
+
+ <group>
+ <property>album</property>
+ <value>^$</value>
+ <presentation>(Unknown Album)</presentation>
+
+ <group>
+ <property>title</property>
+ <value>^$</value>
+ <presentation>$(track". ")$(file)$(" ("bitrate"kbps)")</presentation>
+ <options>
+ <playable />
+ </options>
+ </group>
+
+ <group>
+ <property>title</property>
+ <value></value>
+ <presentation>$(track". ")$(title)$(" ("bitrate"kbps)")</presentation>
+ <options>
+ <playable />
+ </options>
+ </group>
+ </group>
+
+ <group>
+ <property>album</property>
+ <value></value>
+ <presentation>$(album)</presentation>
+
+ <group>
+ <property>title</property>
+ <value>^$</value>
+ <presentation>$(track". ")$(file)$(" ("bitrate"kbps)")</presentation>
+ <options>
+ <playable />
+ </options>
+ </group>
+
+ <group>
+ <property>title</property>
+ <value></value>
+ <presentation>$(track". ")$(title)$(" ("bitrate"kbps)")</presentation>
+ <options>
+ <playable />
+ </options>
+ </group>
+ </group>
+ </group>
+ </group>
+</ObliqueSchema>
+
diff --git a/noatun-plugins/oblique/selector.cpp b/noatun-plugins/oblique/selector.cpp
new file mode 100644
index 0000000..1c17650
--- /dev/null
+++ b/noatun-plugins/oblique/selector.cpp
@@ -0,0 +1,226 @@
+// Copyright (c) 2003 Charles Samuels <charles@kde.org>
+// See the file COPYING for redistribution terms.
+
+#include "tree.h"
+#include "selector.h"
+#include "oblique.h"
+
+#include <noatun/app.h>
+#include <noatun/player.h>
+
+Item::Item(const File &file)
+ : mFile(file)
+{
+
+}
+
+QString Item::property(const QString &key, const QString &def) const
+{
+ if (key == "url")
+ {
+ KURL url;
+ url.setPath(property("file"));
+ return url.url();
+ }
+
+ QString str = mFile.property(key);
+ if (str.isNull()) return def;
+ return str;
+}
+
+void Item::setProperty(const QString &key, const QString &property)
+{
+ mFile.setProperty(key, property);
+}
+
+void Item::clearProperty(const QString &key)
+{
+ mFile.clearProperty(key);
+}
+
+QStringList Item::properties() const
+{
+ return mFile.properties();
+}
+
+bool Item::isProperty(const QString &key) const
+{
+ return !mFile.property(key).isNull();
+}
+
+bool Item::operator==(const PlaylistItemData &d) const
+{
+ return mFile == static_cast<const Item&>(d).mFile;
+}
+
+void Item::remove()
+{
+ mFile.remove();
+}
+
+
+
+Selector::Selector()
+{
+}
+
+Selector::~Selector()
+{
+}
+
+
+SequentialSelector::SequentialSelector(Tree *tree)
+{
+ mTree = tree;
+}
+
+SequentialSelector::~SequentialSelector()
+{
+
+}
+
+Item *SequentialSelector::next()
+{
+ TreeItem *current = mTree->current();
+ if (current)
+ {
+ current = current->nextPlayable();
+ }
+ else
+ {
+ current = mTree->firstChild();
+ if (current && !current->playable())
+ {
+ current = current->nextPlayable();
+ }
+ }
+ setCurrent(current);
+ if (current && current->file())
+ return new Item(current->file());
+ return 0;
+}
+
+Item *SequentialSelector::previous()
+{
+ TreeItem *back = mTree->firstChild();
+ TreeItem *after;
+ TreeItem *current = mTree->current();
+ // now we just go forward on back until the item after back is me ;)
+ // this is terribly unoptimized, but I'm terribly lazy
+ while (back and (after = back->nextPlayable()) != current)
+ {
+ back = after;
+ }
+ current = back;
+ setCurrent(current);
+ if (current && current->file())
+ return new Item(current->file());
+ return 0;
+}
+
+Item *SequentialSelector::current()
+{
+ TreeItem *current = mTree->current();
+ if (!current) return next();
+ if (current->file())
+ return new Item(current->file());
+ return 0;
+}
+
+void SequentialSelector::setCurrent(const Item &item)
+{
+ TreeItem *current = mTree->find(item.itemFile());
+ setCurrent(current);
+}
+
+void SequentialSelector::setCurrent(TreeItem *current)
+{
+ if (current)
+ {
+ mTree->setCurrent(current);
+ }
+}
+
+
+
+RandomSelector::RandomSelector(Tree *tree)
+{
+ mTree = tree;
+ mPrevious = 0;
+}
+
+static TreeItem *randomItem(int &at, TreeItem *item)
+{
+ for ( ; item; item = item->nextSibling())
+ {
+ if (item->playable())
+ {
+ if (at==0)
+ return item;
+
+ at--;
+ }
+ if (TreeItem *i = randomItem(at, item->firstChild()))
+ {
+ return i;
+ }
+ }
+
+ return 0;
+}
+
+Item *RandomSelector::next()
+{
+ TreeItem *previous = mTree->current();
+ if (!mTree->playableItemCount())
+ {
+ return 0;
+ }
+
+ for (int tries=15; tries; tries--)
+ {
+ int randomIndex = KApplication::random() % (mTree->playableItemCount());
+
+ TreeItem *nowCurrent = randomItem(randomIndex, mTree->firstChild());
+ if (!nowCurrent) continue;
+
+ setCurrent(nowCurrent, previous);
+ return new Item(nowCurrent->file());
+ }
+
+ // !!!!
+ return 0;
+}
+
+Item *RandomSelector::previous()
+{
+ if (!mPrevious) return 0;
+ TreeItem *current = mPrevious;
+
+ mTree->setCurrent(current);
+ return new Item(current->file());
+}
+
+Item *RandomSelector::current()
+{
+ TreeItem *current = mTree->current();
+ if (!current) return 0;
+ return new Item(current->file());
+}
+
+void RandomSelector::setCurrent(const Item &item)
+{
+ setCurrent(mTree->find(item.itemFile()), 0);
+}
+
+void RandomSelector::setCurrent(TreeItem *item, TreeItem *previous)
+{
+ mPrevious = previous;
+ mTree->setCurrent(item);
+
+ napp->player()->stop();
+ napp->player()->play();
+}
+
+
+
diff --git a/noatun-plugins/oblique/selector.h b/noatun-plugins/oblique/selector.h
new file mode 100644
index 0000000..1447dec
--- /dev/null
+++ b/noatun-plugins/oblique/selector.h
@@ -0,0 +1,76 @@
+// Copyright (c) 2003 Charles Samuels <charles@kde.org>
+// See the file COPYING for redistribution terms.
+
+#ifndef SELECTOR_H
+#define SELECTOR_H
+
+#include <noatun/playlist.h>
+#include "file.h"
+
+class Item : public PlaylistItemData
+{
+ File mFile;
+
+public:
+ Item(const File &file);
+
+ File itemFile() const { return mFile; }
+
+ virtual QString property(const QString &key, const QString &def=0) const;
+ virtual void setProperty(const QString &key, const QString &property);
+ virtual void clearProperty (const QString &key);
+ virtual QStringList properties() const;
+
+ virtual bool isProperty(const QString &key) const;
+
+ virtual bool operator==(const PlaylistItemData &d) const;
+ virtual void remove();
+};
+
+/**
+ * a selector is an object that can get items from the
+ * playlist in a certain order
+ **/
+class Selector
+{
+public:
+ Selector();
+ virtual ~Selector();
+ virtual Item *next()=0;
+ virtual Item *previous()=0;
+ virtual Item *current()=0;
+ virtual void setCurrent(const Item &item)=0;
+};
+
+class Tree;
+class TreeItem;
+
+class SequentialSelector : public Selector
+{
+ Tree *mTree;
+
+public:
+ SequentialSelector(Tree *tree);
+ virtual ~SequentialSelector();
+ virtual Item *next();
+ virtual Item *previous();
+ virtual Item *current();
+ virtual void setCurrent(const Item &item);
+ virtual void setCurrent(TreeItem *current);
+};
+
+class RandomSelector : public Selector
+{
+ Tree *mTree;
+ TreeItem *mPrevious;
+public:
+ RandomSelector(Tree *tree);
+
+ virtual Item *next();
+ virtual Item *previous();
+ virtual Item *current();
+ virtual void setCurrent(const Item &item);
+ virtual void setCurrent(TreeItem *item, TreeItem *previous);
+};
+
+#endif
diff --git a/noatun-plugins/oblique/tree.cpp b/noatun-plugins/oblique/tree.cpp
new file mode 100644
index 0000000..4160650
--- /dev/null
+++ b/noatun-plugins/oblique/tree.cpp
@@ -0,0 +1,812 @@
+// Copyright (c) 2003 Charles Samuels <charles@kde.org>
+// See the file COPYING for redistribution terms.
+
+#include "tree.h"
+#include "file.h"
+#include "query.h"
+#include "menu.h"
+#include "oblique.h"
+
+#include <qpainter.h>
+#include <iostream>
+
+#include <klocale.h>
+#include <string.h>
+
+#include <noatun/player.h>
+
+// this is used for comparing pointers
+// (I should _not_ need this)
+template <typename T>
+inline static long subtract(const T *end, const T *begin)
+{
+ return long(end-begin);
+}
+
+static void treeItemMerge(
+ TreeItem **set,
+ TreeItem **intofirst, TreeItem **intolast,
+ TreeItem **fromfirst, TreeItem **fromlast
+ )
+{
+ const int items = subtract(intolast, intofirst) + subtract(fromlast, fromfirst)+2;
+ TreeItem **temp = new TreeItem*[items];
+ TreeItem **tempat = temp;
+
+ while (1)
+ {
+ if (intofirst[0]->compare(fromfirst[0], 0, true) >= 0)
+ {
+ // from goes before into
+ *tempat = *fromfirst;
+ tempat++;
+ fromfirst++;
+ if (fromfirst > fromlast) break;
+ }
+ else
+ {
+ *tempat = *intofirst;
+ tempat++;
+ intofirst++;
+ if (intofirst > intolast) break;
+ }
+ }
+ while (intofirst <= intolast)
+ *tempat++ = *intofirst++;
+ while (fromfirst <= fromlast)
+ *tempat++ = *fromfirst++;
+
+ ::memcpy(set, temp, items*sizeof(TreeItem**));
+ delete [] temp;
+}
+
+static void treeItemSort(TreeItem **begin, TreeItem **end)
+{
+ if (begin == end) return;
+ TreeItem **middle = subtract(end, begin)/2 + begin;
+
+ if (begin != middle)
+ treeItemSort(begin, middle);
+
+ if (middle+1 != end)
+ treeItemSort(middle+1, end);
+
+ treeItemMerge(begin, begin, middle, middle+1, end);
+}
+
+static void treeItemSort(TreeItem *first)
+{
+ const int count = first->parent() ? first->parent()->childCount() : first->listView()->childCount();
+ if (count < 2) return;
+
+ Query *q = first->tree()->query();
+ TreeItem **set = new TreeItem*[count];
+
+ int manually = 0; // I store these starting at the end (of set)
+ int at=0; // I store these starting at the beginning
+
+ for (TreeItem *i = first; i; i = i->nextSibling())
+ {
+ File after;
+ if (i->file() && i->file().getPosition(q, &after))
+ {
+ set[count-manually-1] = i;
+ manually++;
+ }
+ else
+ {
+ set[at] = i;
+ at++;
+ }
+ }
+
+ assert(count == at + manually);
+
+ if (at > 1)
+ treeItemSort(set, set+count-manually-1);
+
+ // grr, QListView sucks
+ set[0]->moveItem(set[1]);
+ TreeItem *previous = set[0];
+
+ int manualPosition = count - manually;
+
+ for (int i=1; i <count-manually; i++)
+ {
+ File maybeafter = previous->file();
+
+ // perhaps one of the manually sorted ones fit here..
+ for (int mi = manualPosition; mi < count; mi++)
+ {
+ TreeItem *now = set[mi];
+ File after;
+ if (now->file() && now->file().getPosition(q, &after))
+ {
+ if (after == maybeafter)
+ {
+ now->moveItem(previous);
+ previous = now;
+ // just try again now, as another manually sorted item
+ // may be after previous
+ maybeafter = previous->file();
+ manualPosition++;
+ }
+ }
+
+ }
+
+ set[i]->moveItem(previous);
+ previous = set[i];
+ }
+
+ delete [] set;
+}
+
+template <class T>
+inline static void sortify(T *item)
+{
+ treeItemSort(item->firstChild());
+}
+
+
+TreeItem::TreeItem(Tree *parent, QueryGroup *group, const File &file, const QString &p)
+ : KListViewItem(parent, p), mGroup(group), mUserOpened(false), mHidden(false)
+{
+ if (group->option(QueryGroup::Playable))
+ {
+ if (mFile = file)
+ parent->mPlayableItemCount++;
+ }
+
+ sortify(parent);
+}
+
+TreeItem::TreeItem(TreeItem *parent, QueryGroup *group, const File &file, const QString &p)
+ : KListViewItem(parent, p), mGroup(group), mUserOpened(false), mHidden(false)
+{
+ if (group->option(QueryGroup::Playable))
+ {
+ if (mFile = file)
+ parent->tree()->mPlayableItemCount++;
+ }
+
+ sortify(parent);
+}
+
+TreeItem::~TreeItem()
+{
+ if (playable())
+ {
+ tree()->mPlayableItemCount--;
+ }
+
+ // I have to remove my children, because they need their parent
+ // in tact for the below code
+ while (TreeItem *c = firstChild())
+ delete c;
+ tree()->deleted(this);
+}
+
+void Tree::deleted(TreeItem *item)
+{
+ mAutoExpanded.removeRef(item);
+ if (current() == item)
+ {
+ oblique()->next();
+ }
+}
+
+static void pad(QString &str)
+{
+ int len=str.length();
+ int at = 0;
+ int blocklen=0;
+
+ static const int paddingsize=12;
+
+ // not static for reason
+ const QChar chars[paddingsize] =
+ {
+ QChar('0'), QChar('0'), QChar('0'), QChar('0'),
+ QChar('0'), QChar('0'), QChar('0'), QChar('0'),
+ QChar('0'), QChar('0'), QChar('0'), QChar('0')
+ };
+
+ for (int i=0; i < len; i++)
+ {
+ if (str[i].isNumber())
+ {
+ if (!blocklen)
+ at = i;
+ blocklen++;
+ }
+ else if (blocklen)
+ {
+ int pads=paddingsize;
+ pads -= blocklen;
+ str.insert(at, chars, pads);
+ i += pads;
+ blocklen = 0;
+ }
+ }
+ if (blocklen)
+ {
+ int pads=paddingsize;
+ pads -= blocklen;
+ str.insert(at, chars, pads);
+ }
+}
+
+int TreeItem::compare(QListViewItem *i, int col, bool) const
+{
+ QString text1 = text(col);
+ QString text2 = i->text(col);
+
+ pad(text1);
+ pad(text2);
+ return text1.compare(text2);
+}
+
+
+Tree *TreeItem::tree()
+{
+ return static_cast<Tree*>(KListViewItem::listView());
+}
+
+QString TreeItem::presentation() const
+{
+ return text(0);
+}
+
+TreeItem *TreeItem::find(File item)
+{
+ TreeItem *i = firstChild();
+ while (i)
+ {
+ if (i->file() == item) return i;
+
+ TreeItem *found = i->find(item);
+ if (found and found->playable()) return found;
+ i = i->nextSibling();
+ }
+ return 0;
+}
+
+bool TreeItem::playable() const
+{
+ return mFile && mGroup->option(QueryGroup::Playable);
+}
+
+TreeItem *TreeItem::nextPlayable()
+{
+ TreeItem *next=this;
+ do
+ {
+ next = next->next();
+ } while (next && !next->playable());
+ return next;
+}
+
+void TreeItem::paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int align)
+{
+ QFont font = p->font();
+ if (tree()->current() == this)
+ {
+ font.setUnderline(true);
+ p->setFont(font);
+ }
+
+ QColorGroup newcg(cg);
+ if (parent() && parent()->isOpen() && !parent()->mUserOpened)
+ {
+ // slow, but not often used
+ QColor text = newcg.text();
+ QColor bg = newcg.background();
+
+ int r = text.red() + bg.red();
+ int g = text.green() + bg.green();
+ int b = text.blue() + bg.blue();
+ text.setRgb(r/2,g/2,b/2);
+ newcg.setColor(QColorGroup::Text, text);
+ }
+ KListViewItem::paintCell(p, newcg, column, width, align);
+
+ font.setUnderline(false);
+ p->setFont(font);
+}
+
+void TreeItem::setOpen(bool o)
+{
+ if (!tree()->autoExpanding())
+ {
+ mUserOpened = o;
+ tree()->removeAutoExpanded(this);
+ }
+ KListViewItem::setOpen(o);
+}
+
+void TreeItem::autoExpand()
+{
+ tree()->setAutoExpanding(true);
+ if (tree()->current() == this)
+ {
+ tree()->resetAutoExpanded();
+ forceAutoExpand();
+ }
+ tree()->setAutoExpanding(false);
+}
+
+void TreeItem::forceAutoExpand()
+{
+ if (parent())
+ parent()->forceAutoExpand();
+
+ if (!mUserOpened)
+ tree()->addAutoExpanded(this);
+ setOpen(true);
+}
+
+bool TreeItem::hideIfNoMatch(const QString &match)
+{
+ if (!firstChild())
+ {
+ if (match.length())
+ {
+ if (!text(0).contains(match, false))
+ {
+ setHidden(true);
+ return false;
+ }
+ }
+ setHidden(false);
+ return true;
+ }
+ else
+ {
+ bool visible=true;
+
+ if (match.length())
+ {
+ visible = text(0).contains(match, false);
+ }
+
+ if (visible)
+ {
+ QString empty;
+ for (TreeItem *ch = firstChild(); ch; ch = ch->nextSibling())
+ {
+ ch->hideIfNoMatch(empty);
+ }
+ }
+ else
+ {
+ for (TreeItem *ch = firstChild(); ch; ch = ch->nextSibling())
+ {
+ bool here = ch->hideIfNoMatch(match);
+ visible = visible || here;
+ }
+ }
+
+ setHidden(!visible);
+
+ return visible;
+ }
+}
+
+void TreeItem::setup()
+{
+ QListViewItem::setup();
+ if (mHidden)
+ setHeight(0);
+}
+
+void TreeItem::setHidden(bool h)
+{
+ mHidden = h;
+ setup();
+}
+
+TreeItem *TreeItem::next()
+{
+ if (firstChild())
+ {
+ return firstChild();
+ }
+ else
+ { // go up the tree
+ TreeItem *upYours = this;
+ do
+ {
+ if (upYours->nextSibling())
+ return upYours->nextSibling();
+ upYours = upYours->parent();
+ } while (upYours);
+ }
+ return 0;
+}
+
+
+
+
+
+
+
+Tree::Tree(Oblique *oblique, QWidget *parent)
+ : KListView(parent), mOblique(oblique), mAutoExpanding(0)
+{
+ mCurrent = 0;
+ lastMenu =0;
+ mPlayableItemCount = 0;
+ mLoader = 0;
+
+ addColumn("");
+ setCaption(i18n("Oblique"));
+ setRootIsDecorated(true);
+
+ setAcceptDrops(true);
+ setDragEnabled(true);
+ setItemsMovable(true);
+ setDropVisualizer(true);
+ setSorting(-1);
+
+ ((QWidget*)header())->hide();
+
+
+ connect(
+ this, SIGNAL(moved(QPtrList<QListViewItem>&, QPtrList<QListViewItem>&, QPtrList<QListViewItem>&)),
+ SLOT(dropped(QPtrList<QListViewItem>&, QPtrList<QListViewItem>&, QPtrList<QListViewItem>&))
+ );
+
+ connect(
+ this, SIGNAL(contextMenu(KListView*, QListViewItem*, const QPoint&)),
+ SLOT(contextMenu(KListView*, QListViewItem*, const QPoint&))
+ );
+ connect(
+ this, SIGNAL(executed(QListViewItem*)),
+ SLOT(play(QListViewItem*))
+ );
+
+ Base *base = oblique->base();
+ connect(base, SIGNAL(added(File)), SLOT(insert(File)));
+ connect(base, SIGNAL(removed(File)), SLOT(remove(File)));
+ connect(base, SIGNAL(modified(File)), SLOT(update(File)));
+
+ connect(base, SIGNAL(addedTo(Slice*, File)), SLOT(checkInsert(Slice*, File)));
+ connect(base, SIGNAL(removedFrom(Slice*, File)), SLOT(checkRemove(Slice*, File)));
+
+ connect(this, SIGNAL(selected(TreeItem*)), oblique, SLOT(selected(TreeItem*)));
+
+ mSlice = oblique->base()->defaultSlice();
+
+ KConfigGroup g(KGlobal::config(), "oblique");
+ mFileOfQuery = g.readEntry("schema", "standard");
+ if (!setSchema(mFileOfQuery))
+ {
+ setSchema("standard");
+ }
+
+}
+
+Tree::~Tree()
+{
+ // have to clear here to prevent sigsegv on exit
+ clear();
+}
+
+void Tree::clear()
+{
+ if (mCurrent)
+ {
+ napp->player()->stop();
+ setCurrent(0);
+ }
+ KListView::clear();
+}
+
+void Tree::movableDropEvent (QListViewItem* parent, QListViewItem* afterme)
+{
+ QPtrList<QListViewItem> items = selectedItems(true);
+ for (QPtrList<QListViewItem>::Iterator i(items.begin()); *i; ++i)
+ {
+ if ((*i)->parent() != parent)
+ return;
+ }
+
+ KListView::movableDropEvent(parent, afterme);
+}
+
+
+void Tree::dropped(QPtrList<QListViewItem> &items, QPtrList<QListViewItem> &, QPtrList<QListViewItem> &afterNow)
+{
+ QPtrList<QListViewItem>::Iterator itemi = items.begin();
+ QPtrList<QListViewItem>::Iterator afteri = afterNow.begin();
+ while (*itemi)
+ {
+ TreeItem *item = static_cast<TreeItem*>(*itemi);
+ TreeItem *after = static_cast<TreeItem*>(*afteri);
+ item->file().setPosition(query(), after ? after->file() : File());
+
+ ++itemi;
+ ++afteri;
+ }
+}
+
+
+TreeItem *Tree::firstChild()
+ { return static_cast<TreeItem*>(KListView::firstChild()); }
+
+TreeItem *Tree::find(File item)
+{
+ TreeItem *i = firstChild();
+
+ while (i)
+ {
+ if (i->file() == item) return i;
+
+ TreeItem *found = i->find(item);
+ if (found) return found;
+
+ i = i->nextSibling();
+ }
+ return i;
+}
+
+void Tree::insert(TreeItem *replace, File file)
+{
+ TreeItem *created = collate(replace, file);
+ if (mCurrent == replace)
+ {
+ mCurrent = created;
+ repaintItem(created);
+ if (isSelected(replace))
+ setSelected(created, true);
+ }
+ if (created != replace)
+ {
+ delete replace;
+ }
+}
+
+void Tree::insert(File file)
+{
+ collate(file);
+}
+
+void Tree::remove(File file)
+{
+ remove(firstChild(), file);
+}
+
+void Tree::checkInsert(Slice *slice, File f)
+{
+ if (slice == mSlice)
+ insert(f);
+}
+
+void Tree::checkRemove(Slice *slice, File f)
+{
+ if (slice == mSlice)
+ remove(f);
+}
+
+
+void Tree::update(File file)
+{
+ if (TreeItem *item = find(file))
+ {
+ insert(item, file);
+ }
+}
+
+void Tree::remove(TreeItem *ti, const File &file)
+{
+ while (ti)
+ {
+ if (ti->file() == file)
+ {
+ TreeItem *t = ti->nextSibling();
+ delete ti;
+ ti = t;
+ }
+ else
+ {
+ remove(ti->firstChild(), file);
+ ti = ti->nextSibling();
+ }
+ }
+}
+
+void Tree::setCurrent(TreeItem *cur)
+{
+ if (cur == mCurrent) return;
+ // undo the old one
+ TreeItem *old = mCurrent;
+ mCurrent = cur;
+ QPtrList<TreeItem> oldAutoExpanded = mAutoExpanded;
+ mAutoExpanded.clear();
+ repaintItem(old);
+ repaintItem(cur);
+ if (cur) cur->autoExpand();
+
+ // do an anti-intersection on oldAutoUpdated and the new mAutoExpanded
+ for (QPtrListIterator<TreeItem> i(mAutoExpanded); *i; ++i)
+ {
+ oldAutoExpanded.removeRef(*i);
+ }
+
+
+ bool user=false;
+ for (QPtrListIterator<TreeItem> i(oldAutoExpanded); *i; ++i)
+ {
+ if ((*i)->userOpened())
+ {
+ user = true;
+ break;
+ }
+ }
+ if (!user)
+ {
+ for (QPtrListIterator<TreeItem> i(oldAutoExpanded); *i; ++i)
+ {
+ (*i)->setOpen(false);
+ }
+ }
+
+ ensureItemVisible(cur);
+}
+
+void Tree::reload()
+{
+ delete mLoader;
+ clear();
+ mLoader = new Loader(this);
+ connect(mLoader, SIGNAL(finished()), SLOT(destroyLoader()));
+}
+
+void Tree::setSlice(Slice *slice)
+{
+ if (mSlice == slice) return;
+ mSlice = slice;
+ reload();
+}
+
+bool Tree::setSchema(const QString &name)
+{
+ mFileOfQuery = name;
+ if (!oblique()->loadSchema(mQuery, name))
+ return false;
+ reload();
+ return true;
+}
+
+QDragObject *Tree::dragObject()
+{
+ if (currentItem() && static_cast<TreeItem*>(currentItem())->file())
+ return KListView::dragObject();
+ return 0;
+}
+
+void Tree::destroyLoader()
+{
+ delete mLoader;
+ mLoader = 0;
+}
+
+void Tree::setLimit(const QString &text)
+{
+ for (TreeItem *ch = firstChild(); ch; ch = ch->nextSibling())
+ {
+ ch->hideIfNoMatch(text);
+ }
+}
+
+
+void Tree::contextMenu(KListView*, QListViewItem* i, const QPoint& p)
+{
+ if (!i) return;
+ delete lastMenu;
+ lastMenu = new FileMenu(this, oblique(), static_cast<TreeItem*>(i) );
+ lastMenu->popup(p);
+}
+
+void Tree::play(QListViewItem *_item)
+{
+ if (!_item) return;
+ TreeItem *item = static_cast<TreeItem*>(_item);
+ if (item->playable())
+ emit selected(item);
+ else
+ play(item->nextPlayable());
+}
+
+
+TreeItem *Tree::collate(TreeItem *fix, QueryGroup *group, const File &file, TreeItem *childOf)
+{
+ do
+ {
+ if (group->matches(file))
+ {
+ TreeItem *nodefix=0;
+ if (fix && fix->group() == group)
+ nodefix = fix;
+
+ TreeItem *item = node(nodefix, group, file, childOf);
+ TreeItem *ti=0;
+ if (group->firstChild())
+ {
+ ti = collate(fix, group->firstChild(), file, item);
+ }
+ if (ti && ti->playable())
+ return ti;
+ else if(item && item->playable())
+ return item;
+ else
+ return 0;
+ }
+
+ } while (( group = group->nextSibling()));
+ return 0;
+}
+
+TreeItem *Tree::node(TreeItem *fix, QueryGroup *group, const File &file, TreeItem *childOf)
+{
+ // search childOf's immediate children
+ TreeItem *children;
+ if (childOf)
+ children = childOf->firstChild();
+ else
+ children = firstChild();
+
+ QString presentation = group->presentation(file);
+ while (children)
+ {
+ // merging would be done here
+ bool matches=false;
+ if (group->fuzzyness(QueryGroup::Case))
+ {
+ matches = (children->text(0).lower() == presentation.lower());
+ }
+ else
+ {
+ matches = (children->text(0) == presentation);
+ }
+
+ matches = matches && !children->group()->option(QueryGroup::Playable);
+
+ if (matches)
+ {
+ children->setFile(File());
+ return children;
+ }
+
+ children = children->nextSibling();
+ }
+
+ TreeItem *item;
+ if (group->option(QueryGroup::ChildrenVisible))
+ {
+ item = childOf;
+ }
+ else if (fix)
+ {
+ item = fix;
+ if (fix->parent() != childOf)
+ moveItem(fix, childOf, 0);
+ item->setText(0, presentation);
+ }
+ else if (childOf)
+ {
+ item = new TreeItem(childOf, group, file, presentation);
+ }
+ else
+ {
+ item = new TreeItem(this, group, file, presentation);
+ }
+
+ item->setOpen(group->option(QueryGroup::AutoOpen));
+
+ return item;
+}
+
+#include "tree.moc"
+
diff --git a/noatun-plugins/oblique/tree.h b/noatun-plugins/oblique/tree.h
new file mode 100644
index 0000000..0d53732
--- /dev/null
+++ b/noatun-plugins/oblique/tree.h
@@ -0,0 +1,194 @@
+// Copyright (c) 2003 Charles Samuels <charles@kde.org>
+// See the file COPYING for redistribution terms.
+
+#ifndef TREE_H
+#define TREE_H
+
+#include <qwidget.h>
+#include <klistview.h>
+
+#include "base.h"
+#include "query.h"
+#include "file.h"
+
+class Oblique;
+class Tree;
+
+class TreeItem : public KListViewItem
+{
+ QueryGroup *mGroup;
+ File mFile;
+
+ bool mUserOpened:1;
+ bool mHidden:1;
+
+public:
+ TreeItem(Tree *parent, QueryGroup *group, const File &file, const QString &p=0);
+ TreeItem(TreeItem *parent, QueryGroup *group, const File &file, const QString &p=0);
+ ~TreeItem();
+
+ QueryGroup *group() { return mGroup; }
+ const QueryGroup *group() const { return mGroup; }
+ void setGroup(QueryGroup *group) { mGroup = group; }
+
+ TreeItem *parent() { return static_cast<TreeItem*>(KListViewItem::parent()); }
+ Tree *tree();
+ TreeItem *itemBelow() { return static_cast<TreeItem*>(KListViewItem::itemBelow()); }
+ TreeItem *firstChild() { return static_cast<TreeItem*>(KListViewItem::firstChild()); }
+ TreeItem *nextSibling() { return static_cast<TreeItem*>(KListViewItem::nextSibling()); }
+
+ // for gdb, which sucks.
+ QString presentation() const;
+
+ File file() { return mFile; }
+ void setFile(File file) { mFile = file; }
+
+ void setOpen(bool o);
+
+ TreeItem *find(File item);
+
+ bool playable() const;
+
+ /**
+ * get the next item that is playable logically.
+ * that is, if it has a File, and its parent hasn't a
+ * File
+ **/
+ TreeItem *nextPlayable();
+
+ void paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int align);
+
+ virtual int compare(QListViewItem * i, int col, bool) const;
+
+ /**
+ * open my parents so that I'm visible, if I'm playing or
+ * close my parents if I'm not playing, and the user
+ * didn't open
+ **/
+ void autoExpand();
+ bool userOpened() const { return mUserOpened; }
+ bool hideIfNoMatch(const QString &match);
+
+ void setHidden(bool on);
+
+ virtual void setup();
+
+private:
+ TreeItem *next();
+
+ void forceAutoExpand();
+
+};
+
+class FileMenu;
+class Loader;
+
+class Tree : public KListView
+{
+Q_OBJECT
+ Oblique *mOblique;
+
+ Query mQuery;
+ TreeItem *mCurrent;
+ FileMenu *lastMenu;
+ Slice *mSlice;
+ QString mFileOfQuery;
+
+ friend class TreeItem;
+ int mPlayableItemCount; // used by the friendship
+
+ QPtrList<TreeItem> mAutoExpanded;
+ unsigned int mAutoExpanding;
+
+ Loader *mLoader;
+
+public:
+ Tree(Oblique *oblique, QWidget *parent=0);
+ ~Tree();
+ TreeItem *firstChild();
+ TreeItem *find(File item);
+ TreeItem *current() { return mCurrent; }
+ Query *query() { return &mQuery; }
+ Oblique *oblique() { return mOblique; }
+ Slice *slice() { return mSlice; }
+ QString fileOfQuery() const { return mFileOfQuery; }
+
+ void clear();
+
+ int playableItemCount() const { return mPlayableItemCount; }
+
+ void addAutoExpanded(TreeItem *i) { mAutoExpanded.append(i); }
+ void removeAutoExpanded(TreeItem *i) { mAutoExpanded.removeRef(i); }
+ void resetAutoExpanded() { mAutoExpanded.clear(); }
+
+ void setAutoExpanding(bool e) { mAutoExpanding += e ? 1 : -1; }
+ bool autoExpanding() const { return mAutoExpanding; }
+
+ void deleted(TreeItem *item);
+ bool setSchema(const QString &name);
+
+protected:
+ virtual QDragObject *dragObject();
+ void movableDropEvent(QListViewItem* parent, QListViewItem* afterme);
+
+public slots:
+ void insert(TreeItem *replace, File file);
+ void insert(File file);
+ void remove(File file);
+ void update(File file);
+ void setCurrent(TreeItem *cur);
+ void setSlice(Slice *sl);
+
+ void checkInsert(Slice*, File);
+ void checkRemove(Slice*, File);
+
+ /**
+ * the resulting presentation of this item must contain the string @p text
+ * or it will not be displayed
+ * (used for Jump)
+ **/
+ void setLimit(const QString &text);
+
+private slots:
+ void contextMenu(KListView* l, QListViewItem* i, const QPoint& p);
+ void play(QListViewItem *item);
+
+ void destroyLoader();
+
+ void dropped(QPtrList<QListViewItem> &items, QPtrList<QListViewItem> &, QPtrList<QListViewItem> &afterNow);
+
+signals:
+ void selected(TreeItem *);
+
+private:
+ /**
+ * check if it fits into the group, and create
+ * the tree nodes for it
+ **/
+ TreeItem *collate(TreeItem *fix, QueryGroup *group, const File &file, TreeItem *childOf=0);
+ TreeItem *collate(const File &file, TreeItem *childOf=0)
+ {
+ if (!mQuery.firstChild()) return 0;
+ return collate(0, mQuery.firstChild(), file, childOf);
+ }
+
+ TreeItem *collate(TreeItem *fix, const File &file, TreeItem *childOf=0)
+ {
+ if (!mQuery.firstChild()) return 0;
+ return collate(fix, mQuery.firstChild(), file, childOf);
+ }
+
+ TreeItem *node(TreeItem *fix, QueryGroup *group, const File &file, TreeItem *childOf);
+
+ /**
+ * remove the siblings and children of the treeitem
+ **/
+ void remove(TreeItem *, const File &file);
+
+ void limitHide(TreeItem *i, const QString &text);
+
+ void reload();
+};
+
+
+#endif
diff --git a/noatun-plugins/oblique/view.cpp b/noatun-plugins/oblique/view.cpp
new file mode 100644
index 0000000..93b79ce
--- /dev/null
+++ b/noatun-plugins/oblique/view.cpp
@@ -0,0 +1,251 @@
+// Copyright (c) 2003-2005 Charles Samuels <charles@kde.org>
+// See the file COPYING for redistribution terms.
+
+#include "view.h"
+#include "oblique.h"
+#include "menu.h"
+
+#include <noatun/app.h>
+
+#include <kstdaction.h>
+#include <klocale.h>
+#include <kedittoolbar.h>
+#include <kfiledialog.h>
+#include <qlabel.h>
+#include <klineeditdlg.h>
+#include <kmessagebox.h>
+#include <ktabwidget.h>
+#include <qtabbar.h>
+
+class TabWidget : public KTabWidget
+{
+public:
+ TabWidget(QWidget *parent)
+ : KTabWidget(parent)
+ {
+ }
+public:
+ QTabBar *tabBar() const { return KTabWidget::tabBar(); }
+};
+
+
+View::View(Oblique *oblique)
+ : KMainWindow(0, 0)
+{
+ mOblique = oblique;
+ mTree = 0;
+
+ mTabs = new TabWidget(this);
+ mTabs->tabBar()->hide();
+ connect(mTabs, SIGNAL(currentChanged(QWidget*)), SLOT(currentTabChanged(QWidget*)));
+
+ setCentralWidget(mTabs);
+
+ KAction *ac;
+ ac = new KAction(i18n("Add &Files..."), "queue", 0, this, SLOT(addFiles()), actionCollection(), "add_files");
+ ac->setWhatsThis(i18n("Add a reference to a media file on disk to this collection."));
+ ac = new KAction(i18n("Add Fol&ders..."), "folder", 0, this, SLOT(addDirectory()), actionCollection(), "add_dir");
+
+
+// ac = new KAction(i18n("&Reload"), "reload", 0, oblique, SLOT(reload()), actionCollection(), "reload");
+// ac->setWhatsThis(i18n("Reread the collection and meta-information from its files."));
+
+ ac = new SliceListAction(
+ i18n("&Slices"), oblique,
+ this, SLOT(use(Slice*)), QValueList<File>(), actionCollection(), "slices"
+ );
+ ac->setWhatsThis(i18n("Select a sub-collection to display"));
+
+ mSchemaListAction = new SchemaListAction(
+ i18n("&Schemas"), this, SLOT(setSchema(const QString&)), actionCollection(), "schemas"
+ );
+ mSchemaListAction->setWhatsThis(i18n("Select a schema to use to collate the tree."));
+
+ ac = new KAction(
+ i18n("&New Tab"), "tab_new", "CTRL+SHIFT+N;CTRL+T", this, SLOT(addTab()),
+ actionCollection(), "newtab"
+ );
+
+ mRemoveTabAction = new KAction(
+ i18n("&Close Current Tab"), "tab_remove", CTRL+Key_W, this, SLOT(removeTab()),
+ actionCollection(), "removecurrenttab"
+ );
+
+ {
+ QLabel *l = new QLabel(i18n("&Jump:"), 0, "kde toolbar widget");
+ l->setBackgroundMode( Qt::PaletteButton );
+ l->setAlignment(
+ (QApplication::reverseLayout() ? Qt::AlignRight : Qt::AlignLeft) |
+ Qt::AlignVCenter | Qt::ShowPrefix
+ );
+ l->adjustSize();
+ new KWidgetAction(l, i18n("&Jump:"), KShortcut(ALT + Key_J), 0, 0, actionCollection(), "jump_label");
+
+ LineEditAction *jumpAction = new LineEditAction(i18n("Jump Bar"), 0, 0, actionCollection(), "jump_text");
+ jumpAction->setWhatsThis(i18n("Only display items which contain this string"));
+ l->setBuddy(jumpAction->lineEdit());
+ connect(jumpAction->lineEdit(), SIGNAL(textChanged(const QString&)), SLOT(jumpTextChanged(const QString&)));
+ }
+
+ KStdAction::configureToolbars(this, SLOT(configureToolBars()), actionCollection());
+
+ applyMainWindowSettings(KGlobal::config(), "Oblique View");
+ createGUI("obliqueui.rc");
+
+ KConfigGroup g(KGlobal::config(), "oblique");
+ QStringList tabids = g.readListEntry("tabids");
+
+ for (QStringList::Iterator i(tabids.begin()); i != tabids.end(); ++i)
+ {
+ QString t = *i;
+ int sliceid = t.section(':', 0, 0).toInt();
+ QString fileOfQuery = t.section(':', 1, 1);
+
+ Slice *slice = oblique->base()->sliceById(sliceid);
+ if (!slice)
+ slice = oblique->base()->defaultSlice();
+ Tree *tree = new Tree(oblique, mTabs);
+ mTrees.append(tree);
+ tree->setSlice(slice);
+ tree->setSchema(fileOfQuery);
+ mTabs->addTab(tree, slice->name());
+ }
+
+ if (mTabs->count() == 0)
+ { // no tabs, so use the "normal" route
+ addTab();
+ }
+ else
+ {
+ // ok, there's a tab, so make it present
+ if (mTabs->count() >= 1)
+ {
+ mTree = static_cast<Tree*>(mTrees.first());
+ currentTabChanged(mTrees.first());
+ }
+
+ if (mTabs->count() > 1)
+ mTabs->tabBar()->show();
+ }
+}
+
+View::~View()
+{
+ QStringList tabids;
+ for (int i=0; i < mTabs->count(); i++)
+ {
+ Tree *tree = static_cast<Tree*>(mTabs->page(i));
+ int slice = tree->slice()->id();
+ QString query = tree->fileOfQuery();
+
+ QString t = QString("%1:%2").arg(slice).arg(query);
+ tabids.append(t);
+ }
+
+ KConfigGroup g(KGlobal::config(), "oblique");
+ g.writeEntry("tabids", tabids);
+ g.sync();
+}
+
+void View::configureToolBars()
+{
+ saveMainWindowSettings(KGlobal::config(), "Oblique View");
+ KEditToolbar dlg(actionCollection(), "obliqueui.rc");
+ connect(&dlg, SIGNAL(newToolbarConfig()), SLOT(newToolBarConfig()));
+ dlg.exec();
+}
+
+void View::newToolBarConfig()
+{
+ createGUI("obliqueui.rc");
+ applyMainWindowSettings(KGlobal::config(), "Oblique View");
+}
+
+void View::closeEvent(QCloseEvent*)
+{
+ hide();
+}
+
+
+void View::addFiles()
+{
+ KURL::List files=KFileDialog::getOpenURLs(":mediadir", napp->mimeTypes(), this, i18n("Select Files to Add"));
+
+ for(KURL::List::Iterator it=files.begin(); it!=files.end(); ++it)
+ oblique()->addFile(KURL(*it));
+}
+
+void View::addDirectory()
+{
+ QString folder = KFileDialog::getExistingDirectory(":mediadir:", this,
+ i18n("Select Folder to Add"));
+
+ if (!folder)
+ return;
+
+ KURL url;
+ url.setPath(folder);
+ oblique()->beginDirectoryAdd(url);
+}
+
+void View::addTab()
+{
+ Tree *t = new Tree(oblique(), mTabs);
+ if (!mTree) mTree = t;
+ mTrees.append(t);
+
+ mTabs->addTab(t, t->slice()->name());
+ mTabs->showPage(t);
+ if (mTabs->count() > 1)
+ mTabs->tabBar()->show();
+ currentTabChanged(t);
+}
+
+void View::removeTab()
+{
+ Tree *current = static_cast<Tree*>(mTabs->currentPage());
+ if (current == mTree) return;
+ mTabs->removePage(current);
+ mTrees.remove(current);
+ delete current;
+
+ if (mTabs->count() == 1)
+ mTabs->tabBar()->hide();
+}
+
+void View::currentTabChanged(QWidget *w)
+{
+ mRemoveTabAction->setEnabled(w != mTree);
+ mSchemaListAction->setTree(static_cast<Tree*>(w));
+}
+
+void View::setSchema(const QString &file)
+{
+ Tree *current = static_cast<Tree*>(mTabs->currentPage());
+ current->setSchema(file);
+}
+
+
+void View::jumpTextChanged(const QString &text)
+{
+ Tree *current = static_cast<Tree*>(mTabs->currentPage());
+ current->setLimit(text);
+}
+
+void View::use(Slice *s)
+{
+ Tree *current = static_cast<Tree*>(mTabs->currentPage());
+ current->setSlice(s);
+ mTabs->setTabLabel(current, current->slice()->name());
+}
+
+
+
+LineEditAction::LineEditAction(const QString &text, const QObject *reciever, const char *slot, KActionCollection *parent, const char *name)
+ : KWidgetAction(new KLineEdit(0), text, KShortcut(0), reciever, slot, parent, name)
+{
+ setAutoSized(true);
+}
+
+#include "view.moc"
+
diff --git a/noatun-plugins/oblique/view.h b/noatun-plugins/oblique/view.h
new file mode 100644
index 0000000..598c0cc
--- /dev/null
+++ b/noatun-plugins/oblique/view.h
@@ -0,0 +1,71 @@
+// Copyright (c) 2003,2004 Charles Samuels <charles@kde.org>
+// See the file COPYING for redistribution terms.
+
+#ifndef VIEW_H
+#define VIEW_H
+
+#include <kmainwindow.h>
+#include <kaction.h>
+#include <klineedit.h>
+
+#include "tree.h"
+
+class SchemaListAction;
+class TabWidget;
+
+class View : public KMainWindow
+{
+Q_OBJECT
+ Oblique *mOblique;
+ Tree *mTree;
+ QValueList<Tree*> mTrees;
+ TabWidget *mTabs;
+ KAction *mRemoveTabAction;
+ SchemaListAction *mSchemaListAction;
+
+public:
+ View(Oblique *oblique);
+ ~View();
+
+ Tree *tree() { return mTree; }
+
+ Oblique *oblique() { return mOblique; }
+
+public slots:
+ void addFiles();
+ void addDirectory();
+ void addTab();
+ void removeTab();
+
+signals:
+ void listHidden();
+ void listShown();
+
+private slots:
+ void configureToolBars();
+ void newToolBarConfig();
+ void jumpTextChanged(const QString &text);
+ void use(Slice*);
+ void currentTabChanged(QWidget *);
+ void setSchema(const QString &file);
+
+protected:
+ virtual void showEvent(QShowEvent *) { emit listShown(); }
+ virtual void hideEvent(QHideEvent *) { emit listHidden(); }
+ void closeEvent(QCloseEvent*);
+};
+
+
+class LineEditAction : public KWidgetAction
+{
+Q_OBJECT
+public:
+ LineEditAction(const QString &text, const QObject *reciever, const char *slot, KActionCollection *parent, const char *name);
+
+ KLineEdit *widget() { return static_cast<KLineEdit*>(KWidgetAction::widget()); }
+ KLineEdit *lineEdit() { return widget(); }
+};
+
+
+#endif
+
diff --git a/noatun-plugins/pitchablespeed/Makefile.am b/noatun-plugins/pitchablespeed/Makefile.am
new file mode 100644
index 0000000..b994d98
--- /dev/null
+++ b/noatun-plugins/pitchablespeed/Makefile.am
@@ -0,0 +1,15 @@
+INCLUDES= -I$(kde_includes)/arts $(all_includes)
+
+kde_module_LTLIBRARIES = noatunpitchablespeed.la
+noatunpitchablespeed_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+noatunpitchablespeed_la_LIBADD = $(LIB_KFILE) -lnoatun -lm -lartsmodules
+
+noatunpitchablespeed_la_SOURCES = pitchablespeed.cpp speedtuner.ui
+noatunpitchablespeed_la_METASOURCES = AUTO
+noinst_HEADERS = pitchablespeed.h
+
+noatun_DATA = pitchablespeed.plugin
+noatundir = $(kde_datadir)/noatun
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/pitchablespeed.pot
diff --git a/noatun-plugins/pitchablespeed/pitchablespeed.cpp b/noatun-plugins/pitchablespeed/pitchablespeed.cpp
new file mode 100644
index 0000000..f091c72
--- /dev/null
+++ b/noatun-plugins/pitchablespeed/pitchablespeed.cpp
@@ -0,0 +1,167 @@
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+// (c) 2001 hans_meine@gmx.net
+
+#include "pitchablespeed.h"
+#include <arts/reference.h>
+#include <arts/soundserver.h>
+#include <arts/kmedia2.h>
+#include <noatun/app.h>
+#include <noatun/player.h>
+#include <noatun/engine.h>
+#include <noatun/noatunarts.h>
+#include <qslider.h>
+#include <qlineedit.h>
+#include <qcheckbox.h>
+#include <klocale.h>
+#include <knuminput.h>
+
+extern "C"
+{
+ Plugin *create_plugin()
+ {
+ KGlobal::locale()->insertCatalogue("pitchablespeed");
+ return new PitchableSpeed();
+ }
+}
+
+const int PitchableSpeed::DEFAULT_OFFSET = 5;
+const int PitchableSpeed::DEFAULT_RANGE = 10;
+
+PitchableSpeed::PitchableSpeed() : Plugin(),
+ offset(DEFAULT_OFFSET),
+ range(DEFAULT_RANGE)
+, frequenciesPreserved(false)
+{
+
+ rangeInput->setRange(2,150,1,false);
+ rangeInput->setValue(range);
+ offsetInput->setRange(-5,15,1,false);
+ offsetInput->setValue(offset);
+ setupSliderRange();
+ connect(napp->player(), SIGNAL(changed()),
+ this, SLOT(newSong()));
+ connect(preserveFrequencies, SIGNAL(toggled(bool)),
+ this, SLOT(preserveFrequenciesChanged(bool)));
+ //show();
+}
+
+PitchableSpeed::~PitchableSpeed()
+{
+ napp->pluginMenuRemove(pluginMenuItem);
+
+ Arts::PlayObject playobject= napp->player()->engine()->playObject();
+ Arts::PitchablePlayObject pitchable= Arts::DynamicCast(playobject);
+ if (!pitchable.isNull())
+ pitchable.speed(1.0);
+
+ if (frequenciesPreserved)
+ napp->player()->engine()->effectStack()->remove(pitchShiftEffectID);
+}
+
+void PitchableSpeed::newSong()
+{
+ setSpeed();
+
+ Arts::PlayObject playobject= napp->player()->engine()->playObject();
+ Arts::PitchablePlayObject pitchable= Arts::DynamicCast(playobject);
+ slider->setEnabled(!pitchable.isNull());
+}
+
+float PitchableSpeed::sliderSpeed()
+{
+ return 1.0f - slider->value()/1000.0f;
+}
+
+void PitchableSpeed::setSpeed()
+{
+ Arts::PlayObject playobject= napp->player()->engine()->playObject();
+ Arts::PitchablePlayObject pitchable= Arts::DynamicCast(playobject);
+ float newSpeed= 1.0f;
+ if (!pitchable.isNull())
+ {
+ newSpeed= sliderSpeed();
+ pitchable.speed(newSpeed);
+ if (frequenciesPreserved)
+ pitchShift.speed(1.f/newSpeed);
+ }
+
+ QString percentStr;
+ percentStr.setNum((newSpeed-1.f)*100.f,'f',1);
+ if (newSpeed<=0) percentStr.prepend('+').append(' ').append('%');
+ currentValEdit->setText(percentStr);
+}
+
+void PitchableSpeed::setupSliderRange()
+{
+ int min= (-offset+range)<99 ? (-offset+range)*10 : 990;
+ slider->setRange((-offset-range)*10,min);
+ slider->setTickInterval(10);
+}
+
+void PitchableSpeed::speedChanged(int )
+{
+ setSpeed();
+}
+
+void PitchableSpeed::offsetChanged(int newOffset)
+{
+ offset= newOffset;
+ setupSliderRange();
+}
+
+void PitchableSpeed::rangeChanged(int newRange)
+{
+ range= newRange;
+ setupSliderRange();
+}
+
+void PitchableSpeed::preserveFrequenciesChanged(bool preserveNow)
+{
+ if (preserveNow==frequenciesPreserved)
+ return;
+ if (preserveNow)
+ {
+ pitchShift = Arts::DynamicCast(napp->player()->engine()->server()->
+ createObject("Arts::Synth_STEREO_PITCH_SHIFT"));
+ pitchShift.frequency(10.f); // TODO: might have to experiment a bit with this
+ pitchShift.speed(1.f/sliderSpeed());
+ pitchShift.start();
+ pitchShiftEffectID= napp->player()->engine()->effectStack()->
+ insertTop(pitchShift, "correcting pitch shift");
+ }
+ else
+ {
+ napp->player()->engine()->effectStack()->remove(pitchShiftEffectID);
+ pitchShift.stop();
+ pitchShift = Arts::Synth_STEREO_PITCH_SHIFT::null();
+ }
+ frequenciesPreserved= preserveNow;
+}
+
+void PitchableSpeed::init()
+{
+ pluginMenuItem = napp->pluginMenuAdd(i18n("Toggle Speed Slider"),
+ this, SLOT(toggle(void)));
+}
+
+void PitchableSpeed::toggle(void)
+{
+ show();
+ raise();
+}
+
+void PitchableSpeed::closeEvent(QCloseEvent *)
+{
+ hide();
+}
+
+#include "pitchablespeed.moc"
+
diff --git a/noatun-plugins/pitchablespeed/pitchablespeed.h b/noatun-plugins/pitchablespeed/pitchablespeed.h
new file mode 100644
index 0000000..d11a7cc
--- /dev/null
+++ b/noatun-plugins/pitchablespeed/pitchablespeed.h
@@ -0,0 +1,63 @@
+#ifndef PITCHABLESPEED_H
+#define PITCHABLESPEED_H
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+// (c) 2001 hans_meine@gmx.net
+
+#include <noatun/plugin.h>
+#include <arts/artsmodules.h>
+#include "speedtuner.h"
+
+class QSlider;
+
+class PitchableSpeed : public SpeedTuner, public Plugin
+{
+Q_OBJECT
+
+public:
+ PitchableSpeed();
+ virtual ~PitchableSpeed();
+
+ void init();
+
+public slots:
+ void toggle(void);
+
+ void newSong();
+
+protected:
+ virtual void closeEvent(QCloseEvent *);
+
+ void setupSliderRange();
+ void setSpeed();
+ float sliderSpeed();
+
+protected slots:
+ void speedChanged(int);
+ void offsetChanged(int);
+ void rangeChanged(int);
+
+ void preserveFrequenciesChanged(bool);
+
+private:
+ static const int DEFAULT_OFFSET;
+ static const int DEFAULT_RANGE;
+
+ int offset, range; // in percent, defaults 5% offset +-10% range
+
+ bool frequenciesPreserved;
+ Arts::Synth_STEREO_PITCH_SHIFT pitchShift;
+ long pitchShiftEffectID;
+
+ int pluginMenuItem;
+};
+
+#endif // PITCHABLESPEED_H
diff --git a/noatun-plugins/pitchablespeed/pitchablespeed.plugin b/noatun-plugins/pitchablespeed/pitchablespeed.plugin
new file mode 100644
index 0000000..8b1dded
--- /dev/null
+++ b/noatun-plugins/pitchablespeed/pitchablespeed.plugin
@@ -0,0 +1,113 @@
+Filename=noatunpitchablespeed.la
+Author=Hans Meine
+Site=http://noatun.kde.org/
+Email=hans@meine.de
+Type=other
+License=GPL
+Name=Pitchable Playing Speed
+Name[az]=Dəyişdirilə Bilən Çalma Sür'əti
+Name[bs]=Prilagodljiva brzina sviranja
+Name[ca]=Velocitat de reproducció canviant
+Name[cs]=Přizpůsobitelná rychlost přehrávání
+Name[cy]=Cyflymder Chwarae Addasu Traw
+Name[da]=Indstillelig afspilningshastighed
+Name[de]=Anpassbare Abspielgeschwindigkeit
+Name[el]=Ρυθμιζόμενη ταχύτητα αναπαραγωγής
+Name[eo]=Altigebla ludrapideco
+Name[es]=Velocidad de juego ajustable
+Name[et]=Esituskiiruse muutja
+Name[eu]=Erreprodukzio abiadura aldagarria
+Name[fa]=زیروبمی سرعت پخش
+Name[fi]=Muutettava soittonopeus
+Name[fr]=Vitesse de lecture variable
+Name[fy]=Oanpasbere ôfspylsnelheid
+Name[gl]=Velocidade Variábel de Reprodución
+Name[he]=התאמת מהירות
+Name[hi]=पिचेबल प्लेइंग स्पीड
+Name[hr]=Promjenjiva brzina
+Name[hu]=Változtatható lejátszási sebesség
+Name[is]=Stillanlegur afspilunarhraði
+Name[it]=Modificatore di velocità di riproduzione
+Name[ka]=რეგულირებადი დაკვრის სიჩქარე
+Name[kk]=Орындау жылдамдығын басқару
+Name[km]=ល្បឿន​ចាក់​ដែល​អាច​កំណត់​កម្ពស់​​សំឡេង​​បាន
+Name[lt]=Keičiamo tono grojimo greitis
+Name[mk]=Приспособлива брзина на изведба
+Name[nb]=Tonehøyde-spillehastighet
+Name[nds]=Afspeelgauheit ännern
+Name[ne]=पीचयोग्य प्ले गति
+Name[nl]=Aanpasbare afspeelsnelheid
+Name[nn]=Tonehøgde-spelesnøggleik
+Name[pl]=Zmiana szybkości odtwarzania
+Name[pt]=Velocidade Variável de Reprodução
+Name[pt_BR]=Velocidade de Reprodução
+Name[ro]=Viteză de redare variabilă
+Name[ru]=Регулирование скорости проигрывания
+Name[sk]=Nastaviteľná rýchlosť prehrávania
+Name[sl]=Hitrost predvajanja
+Name[sr]=Подесива брзина пуштања
+Name[sr@Latn]=Podesiva brzina puštanja
+Name[sv]=Anpassningsbar uppspelningshastighet
+Name[ta]=அடர்வு வாசிப்பு வேகம்
+Name[tg]=Танзими суръати ба кор андохтан
+Name[tr]=Ayarlanabilir Çalma Hızı
+Name[uk]=Довільна швидкість програвання
+Name[vi]=Tốc độ phát có giọng
+Name[xh]=Isantya Sokudlala Esingabasezantsi Okanye phezulu
+Name[zh_CN]=可设定基准的播放速度
+Name[zh_TW]=可調整播放速度
+Comment=Makes playing speed adjustable with a slider
+Comment[az]=Çalma sür'ətini bir qulp ilə dəyişdirmə imkanı verir
+Comment[bg]=Регулиране скоростта на изпълнение чрез плъзгач
+Comment[bs]=Omogućuje prilagođavanje brzine sviranja pomoću klizača
+Comment[ca]=Fa que es puga variar la velocitat de reproducció amb un cursor
+Comment[cs]=Umožní měnit rychlost přehrávání pomocí posuvníku
+Comment[cy]=Newid cyflymder chwarae efo llithrydd
+Comment[da]=Gør afspilningshastigheden indstillelig med en skyder
+Comment[de]=Macht die Abspielgeschwindigkeit mit einem Schieberegler einstellbar
+Comment[el]=Κάνει την ταχύτητα αναπαραγωγής να ρυθμίζεται μέσω ενός ολισθητή
+Comment[eo]=Agordebligas ludrapidecon per rolumilo
+Comment[es]=Permite ajustar la velocidad de reproducción con un botón deslizante
+Comment[et]=Muudab mängimiskiiruse liuguriga kohandatavaks
+Comment[eu]=Erreprodukzio abiadura botoi irristagarri baten bitartez doitzen du
+Comment[fa]=سرعت پخش را توسط یک لغزان قابل تنظیم می‌سازد
+Comment[fi]=Voit muuttaa soittonopeutta liukusäätimellä
+Comment[fr]=Rend la vitesse de lecture ajustable avec un curseur
+Comment[fy]=Makket de ôfspylsnelheid ynstelber mei in skúfregelder
+Comment[gl]=Torna a velocidade de reproduición axustábel cunha barra
+Comment[he]=מאפשר התאמה של מהירות הניגון בעזרת מחוון
+Comment[hi]=प्लेइंग स्पीड एक स्लाइडर के द्वारा समायोजन योग्य बनाता है
+Comment[hr]=Omogućuje promjenu brzine sviranja pomoću klizača
+Comment[hu]=Változtatható lejátszási sebességet tesz lehetővé
+Comment[is]=Gerir afspilunarhraðan stillanlegan með rennislá
+Comment[it]=Permette di modificare la velocità di riproduzione tramite una barra
+Comment[ja]=再生スピードをスライダーで調節させる
+Comment[ka]=საშუალებას იძლევა დაკვრის სიჩქარე სოსიით შეცვალოთ
+Comment[kk]=Орындау жылдамдығын жүгірткі арқылы басқару
+Comment[km]=ធ្វើ​ឲ្យ​ល្បឿន​ការ​ចាក់អាច​លៃតម្រូវ​​បាន​ដោយ​ប្រើ​​គ្រាប់​រំកិល
+Comment[lt]=Leidžia keisti grojimo greitį su šliaužikliu
+Comment[mk]=Ја прави брзината на изведба на музиката приспособлива со потенциометар
+Comment[ms]=Menjadikan kelajuan pemain boleh laras dengan slider
+Comment[nb]=Gjør avspillingsfarten justerbar med en skyver
+Comment[nds]=De Afspeelgauheit mit en Schuver topassen
+Comment[ne]=स्लाइडरबाट प्ले गति समायोजनयोग्य बनाउछ
+Comment[nl]=Maakt de afspeelsnelheid instelbaar met een schuifregelaar
+Comment[nn]=Gjer spelefarten justerbar med ein skyvar
+Comment[pl]=Umożliwia łatwą zmianę szybkości odtwarzania
+Comment[pt]=Torna a velocidade de reprodução ajustável com uma barra
+Comment[pt_BR]=Torna a velocidade reprodução ajustável com uma barra deslizante
+Comment[ro]=Permite ajustarea vitezei de redare cu un potenţiometru
+Comment[ru]=Регулирование скорости проигрывания через бегунок
+Comment[sk]=Umožňuje zmeniť rýchlosť prehrávania pomocou posúvadla
+Comment[sl]=Naredi hitrost predvajanja prilagodljivo z drsnikom
+Comment[sr]=Чини брзину пуштања подесивом помоћу клизача
+Comment[sr@Latn]=Čini brzinu puštanja podesivom pomoću klizača
+Comment[sv]=Gör uppspelningshastigheten justerbar med ett skjutreglage
+Comment[ta]=ஸ்லைடருடன் வாசிப்பு வேகத்தை சரிபார்க்க கூடிய வகையில் அமைக்கிறது
+Comment[tg]=Танзими суръати ба кор андохтан бо даванда
+Comment[tr]=Bir kaydırma çubuğuyla oynatma hızını ayarlanabilir yapar
+Comment[uk]=Дозволяє змінювати швидкість програвання за допомогою повзунка
+Comment[vi]=Cung cấp khả năng điều chỉnh tốc độ phát bằng con trượt
+Comment[xh]=Yenza isantya sokudlalo sikwazi ukucutheka ngesityibilikisi
+Comment[zh_CN]=使播放速度可以使用滑动条来调整
+Comment[zh_TW]=讓播放速度可經由滑動器調整
diff --git a/noatun-plugins/pitchablespeed/speedtuner.ui b/noatun-plugins/pitchablespeed/speedtuner.ui
new file mode 100644
index 0000000..79844c4
--- /dev/null
+++ b/noatun-plugins/pitchablespeed/speedtuner.ui
@@ -0,0 +1,195 @@
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>SpeedTuner</class>
+<author>Hans Meine &lt;hans@meine.de&gt;</author>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>SpeedTuner</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>269</width>
+ <height>316</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Adjust Playing Speed</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QSlider">
+ <property name="name">
+ <cstring>slider</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="tickmarks">
+ <enum>Both</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>currentValEdit</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="font">
+ <font>
+ <family>Sans Serif</family>
+ <pointsize>24</pointsize>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="frame">
+ <bool>false</bool>
+ </property>
+ <property name="alignment">
+ <set>AlignHCenter</set>
+ </property>
+ <property name="hAlign" stdset="0">
+ </property>
+ </widget>
+ <spacer>
+ <property name="name" stdset="0">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>rangeLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Range:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>rangeInput</cstring>
+ </property>
+ </widget>
+ <widget class="KIntNumInput" row="0" column="1">
+ <property name="name">
+ <cstring>rangeInput</cstring>
+ </property>
+ <property name="value">
+ <number>10</number>
+ </property>
+ <property name="suffix">
+ <string> %</string>
+ </property>
+ <property name="prefix">
+ <string>+/- </string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>offsetLabel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Offset:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>offsetInput</cstring>
+ </property>
+ </widget>
+ <widget class="KIntNumInput" row="1" column="1">
+ <property name="name">
+ <cstring>offsetInput</cstring>
+ </property>
+ <property name="value">
+ <number>5</number>
+ </property>
+ <property name="suffix">
+ <string> %</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>preserveFrequencies</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Preserve frequencies</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+</widget>
+<connections>
+ <connection>
+ <sender>slider</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>SpeedTuner</receiver>
+ <slot>speedChanged(int)</slot>
+ </connection>
+ <connection>
+ <sender>rangeInput</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>SpeedTuner</receiver>
+ <slot>rangeChanged(int)</slot>
+ </connection>
+ <connection>
+ <sender>offsetInput</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>SpeedTuner</receiver>
+ <slot>offsetChanged(int)</slot>
+ </connection>
+</connections>
+<slots>
+ <slot access="protected">speedChanged(int)</slot>
+ <slot access="protected">offsetChanged(int)</slot>
+ <slot access="protected">rangeChanged(int)</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/noatun-plugins/synaescope/Makefile.am b/noatun-plugins/synaescope/Makefile.am
new file mode 100644
index 0000000..27c35cc
--- /dev/null
+++ b/noatun-plugins/synaescope/Makefile.am
@@ -0,0 +1,23 @@
+INCLUDES= $(all_includes) $(SDL_CFLAGS)
+
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = noatunsynaescope.la
+
+noatunsynaescope_la_SOURCES = synaescope.cpp cmodule.cpp
+noatunsynaescope_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+noatunsynaescope_la_LIBADD = $(LIB_KFILE) -lnoatun -lm
+
+bin_PROGRAMS = noatunsynaescope.bin
+
+noatunsynaescope_bin_SOURCES = core.cpp main.cpp sdlwrap.cpp ui.cpp
+noatunsynaescope_bin_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+noatunsynaescope_bin_LDADD = $(LIB_KDEUI) -lnoatun $(SDL_LIBS)
+
+noatun_DATA = synaescope.plugin
+noatundir = $(kde_datadir)/noatun
+
+KDE_ICON = AUTO
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/synaescope.pot
diff --git a/noatun-plugins/synaescope/cmodule.cpp b/noatun-plugins/synaescope/cmodule.cpp
new file mode 100644
index 0000000..4765eef
--- /dev/null
+++ b/noatun-plugins/synaescope/cmodule.cpp
@@ -0,0 +1,88 @@
+// Copyright (c) 2001 Neil Stevens <multivac@fcmail.com>
+//
+// 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 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.
+
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kglobal.h>
+#include <kglobalsettings.h>
+#include <klocale.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpushbutton.h>
+#include <qspinbox.h>
+
+#include "cmodule.h"
+#include "synaescope.h"
+
+SynaePrefs::SynaePrefs(QObject *parent)
+ : CModule(i18n("Synaescope"), i18n("Noatun Visualization"), "synaescope", parent)
+{
+// kdDebug(66666) << k_funcinfo << endl;
+ xRes = new QSpinBox(320, 1024, 16, this);
+ yRes = new QSpinBox(240, 768, 12, this);
+
+ QVBoxLayout *layout = new QVBoxLayout(this, 0, KDialog::spacingHint());
+ QHBoxLayout *xResLayout = new QHBoxLayout(0, 0, KDialog::spacingHint());
+ QHBoxLayout *yResLayout = new QHBoxLayout(0, 0, KDialog::spacingHint());
+
+ xResLayout->addWidget(new QLabel(i18n("Display width:"), this));
+ xResLayout->addWidget(xRes);
+
+ yResLayout->addWidget(new QLabel(i18n("Display height:"), this));
+ yResLayout->addWidget(yRes);
+
+ layout->addLayout(xResLayout);
+ layout->addLayout(yResLayout);
+ layout->addStretch();
+
+ changed=false;
+ connect(xRes, SIGNAL(valueChanged(int)), this, SLOT(slotChanges()));
+ connect(yRes, SIGNAL(valueChanged(int)), this, SLOT(slotChanges()));
+}
+
+void SynaePrefs::save()
+{
+// kdDebug(66666) << k_funcinfo << endl;
+ if(!changed)
+ return;
+
+ KConfig *c = KGlobal::config();
+ c->setGroup("Synaescope");
+ c->writeEntry("xResolution", xRes->value());
+ c->writeEntry("yResolution", yRes->value());
+ c->sync();
+ emit configChanged();
+}
+
+void SynaePrefs::reopen()
+{
+// kdDebug(66666) << k_funcinfo << endl;
+ KConfig *c = KGlobal::config();
+ c->setGroup("Synaescope");
+
+ xRes->setValue(c->readNumEntry("xResolution", 320));
+ yRes->setValue(c->readNumEntry("yResolution", 240));
+ changed=false;
+}
+
+void SynaePrefs::slotChanges()
+{
+ changed=true;
+}
+#include "cmodule.moc"
diff --git a/noatun-plugins/synaescope/cmodule.h b/noatun-plugins/synaescope/cmodule.h
new file mode 100644
index 0000000..0642e2e
--- /dev/null
+++ b/noatun-plugins/synaescope/cmodule.h
@@ -0,0 +1,49 @@
+// Copyright (c) 2001 Neil Stevens <multivac@fcmail.com>
+//
+// 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 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.
+
+#ifndef CMODULE_H
+#define CMODULE_H
+
+#include <noatun/pref.h>
+
+class QSpinBox;
+
+class SynaePrefs : public CModule
+{
+ Q_OBJECT
+
+ public:
+ SynaePrefs(QObject *parent);
+
+ virtual void save();
+ virtual void reopen();
+
+ signals:
+ void configChanged();
+
+ private slots:
+ void slotChanges();
+
+ private:
+ QSpinBox *xRes;
+ QSpinBox *yRes;
+ bool changed;
+};
+
+#endif
diff --git a/noatun-plugins/synaescope/core.cpp b/noatun-plugins/synaescope/core.cpp
new file mode 100644
index 0000000..56ff9c9
--- /dev/null
+++ b/noatun-plugins/synaescope/core.cpp
@@ -0,0 +1,432 @@
+/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia)
+ Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au>
+ 2001 Charles Samuels <charles@kde.org>
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+#include "syna.h"
+#include <unistd.h>
+#include <noatun/conversion.h>
+
+using namespace std;
+
+Core *core;
+
+#define outputs unsigned char *Dlo=(unsigned char*)lastOutputBmp.data; \
+unsigned char *Dllo=(unsigned char*)lastLastOutputBmp.data; \
+unsigned char *Do=(unsigned char*)outputBmp.data;
+
+void Core::setupPalette(double) { interface->setupPalette(); }
+
+int Core::bitReverser(int i)
+{
+ int sum=0,j;
+ for(j=0;j<LogSize;j++)
+ {
+ sum = (i&1)+sum*2;
+ i >>= 1;
+ }
+ return sum;
+}
+
+void Core::fft(double *x,double *y)
+{
+ int n2 = NumSamples, n1;
+ int twoToTheK;
+ for(twoToTheK=1;twoToTheK<NumSamples;twoToTheK*=2)
+ {
+ n1 = n2;
+ n2 /= 2;
+ for(int j=0;j<n2;j++)
+ {
+ double c = cosTable[j*twoToTheK&(NumSamples-1)],
+ s = negSinTable[j*twoToTheK&(NumSamples-1)];
+ for(int i=j;i<NumSamples;i+=n1)
+ {
+ int l = i+n2;
+ double xt = x[i] - x[l];
+ x[i] = (x[i] + x[l]);
+ double yt = y[i] - y[l];
+ y[i] = (y[i] + y[l]);
+ x[l] = xt*c - yt*s;
+ y[l] = xt*s + yt*c;
+ }
+ }
+ }
+}
+
+void Core::setStarSize(double size)
+{
+ //int factor = (fadeMode == Flame ? 100 :
+ // (fadeMode == Wave ? 150 : 200));
+
+ double fadeModeFudge = (fadeMode == Wave ? 0.4 :
+ (fadeMode == Flame ? 0.6 : 0.78));
+
+ int factor;
+ if (size > 0.0)
+ factor = int(exp(log(fadeModeFudge) / (size*8.0))*255);
+ else
+ factor = 0;
+
+ if (factor > 255) factor = 255;
+
+ for(int i=0;i<256;i++)
+ scaleDown[i] = i*factor>>8;
+
+ maxStarRadius = 1;
+ for(int i=255;i;i = scaleDown[i])
+ maxStarRadius++;
+}
+
+void Core::addPixel(int x,int y,int br1,int br2)
+{
+ if (x < 0 || x >= outWidth || y < 0 || y >= outHeight) return;
+
+ unsigned char *p = output()+x*2+y*outWidth*2;
+ if (p[0] < 255-br1) p[0] += br1; else p[0] = 255;
+ if (p[1] < 255-br2) p[1] += br2; else p[1] = 255;
+ //p += lastOutput()-output();
+ //if (p[0] < 255-br1) p[0] += br1; else p[0] = 255;
+ //if (p[1] < 255-br2) p[1] += br2; else p[1] = 255;
+}
+
+void Core::addPixelFast(unsigned char *p,int br1,int br2)
+{
+ if (p[0] < 255-br1) p[0] += br1; else p[0] = 255;
+ if (p[1] < 255-br2) p[1] += br2; else p[1] = 255;
+ //p += lastOutput()-output();
+ //if (p[0] < 255-br1) p[0] += br1; else p[0] = 255;
+ //if (p[1] < 255-br2) p[1] += br2; else p[1] = 255;
+}
+
+void Core::fadeFade()
+{
+ register unsigned long *ptr = (unsigned long*)output();
+ int i = outWidth*outHeight*2/4;
+ do {
+ //Bytewize version was: *(ptr++) -= *ptr+(*ptr>>1)>>4;
+ if (*ptr) {
+ //if (*ptr & 0xf0f0f0f0ul)
+ *ptr -= ((*ptr & 0xf0f0f0f0ul) >> 4) + ((*ptr & 0xe0e0e0e0ul) >> 5);
+ ptr++;
+ }
+ //else {
+ // *(ptr++) = (*ptr * 14 >> 4) & 0x0f0f0f0ful;
+ //}
+ else
+ ptr++;
+ } while(--i > 0);
+}
+
+void Core::fadePixelWave(int x,int y,int where,int step)
+{
+outputs
+ short j =
+ ( short(getPixel(x-1,y,where-2))+
+ getPixel(x+1,y,where+2)+
+ getPixel(x,y-1,where-step)+
+ getPixel(x,y+1,where+step)
+ >> 2)
+ +Dlo[where];
+ if (!j) { Do[where] = 0; return; }
+ j = j
+ -Dllo[where]
+ -1;
+ if (j < 0) Do[where] = 0;
+ else if (j & (255*256)) Do[where] = 255;
+ else Do[where] = j;
+}
+
+void Core::fadeWave()
+{
+ unsigned short *t = lastLastOutputBmp.data;
+ lastLastOutputBmp.data = lastOutputBmp.data;
+ lastOutputBmp.data = outputBmp.data;
+ outputBmp.data = t;
+
+ int x,y,i,j,start,end;
+ int step = outWidth*2;
+ for(x=0,i=0,j=outWidth*(outHeight-1)*2;x<outWidth;x++,i+=2,j+=2) {
+ fadePixelWave(x,0,i,step);
+ fadePixelWave(x,0,i+1,step);
+ fadePixelWave(x,outHeight-1,j,step);
+ fadePixelWave(x,outHeight-1,j+1,step);
+ }
+
+ for(y=1,i=outWidth*2,j=outWidth*4-2;y<outHeight;y++,i+=step,j+=step) {
+ fadePixelWave(0,y,i,step);
+ fadePixelWave(0,y,i+1,step);
+ fadePixelWave(outWidth-1,y,j,step);
+ fadePixelWave(outWidth-1,y,j+1,step);
+ }
+outputs
+
+ for(y=1,
+ start=outWidth*2+2,
+ end=outWidth*4-2; y<outHeight-1; y++,start+=step,end+=step) {
+ int i = start;
+ do {
+ short j =
+ ( short(Dlo[i-2])+
+ Dlo[i+2]+
+ Dlo[i-step]+
+ Dlo[i+step]
+ >> 2)
+ +Dlo[i];
+ if (!j) {
+ Do[i] = 0;
+ } else {
+ j = j
+ -Dllo[i]
+ -1;
+ if (j < 0) Do[i] = 0;
+ else if (j & (255*256)) Do[i] = 255;
+ else Do[i] = j;
+ }
+ } while(++i < end);
+ }
+}
+
+void Core::fadePixelHeat(int x,int y,int where,int step)
+{
+outputs
+ short j =
+ ( short(getPixel(x-1,y,where-2))+
+ getPixel(x+1,y,where+2)+
+ getPixel(x,y-1,where-step)+
+ getPixel(x,y+1,where+step)
+ >> 2)
+ +Dlo[where];
+ if (!j) { Do[where] = 0; return; }
+ j = j
+ -Dllo[where]
+ -1;
+ if (j < 0) Do[where] = 0;
+ else if (j & (255*256)) Do[where] = 255;
+ else Do[where] = j;
+}
+
+void Core::fadeHeat()
+{
+ unsigned short *t = lastLastOutputBmp.data;
+ lastLastOutputBmp.data = lastOutputBmp.data;
+ lastOutputBmp.data = outputBmp.data;
+ outputBmp.data = t;
+
+ int x,y,i,j,start,end;
+ int step = outWidth*2;
+ for(x=0,i=0,j=outWidth*(outHeight-1)*2;x<outWidth;x++,i+=2,j+=2)
+ {
+ fadePixelHeat(x,0,i,step);
+ fadePixelHeat(x,0,i+1,step);
+ fadePixelHeat(x,outHeight-1,j,step);
+ fadePixelHeat(x,outHeight-1,j+1,step);
+ }
+
+ for(y=1,i=outWidth*2,j=outWidth*4-2;y<outHeight;y++,i+=step,j+=step)
+ {
+ fadePixelHeat(0,y,i,step);
+ fadePixelHeat(0,y,i+1,step);
+ fadePixelHeat(outWidth-1,y,j,step);
+ fadePixelHeat(outWidth-1,y,j+1,step);
+ }
+
+outputs
+ for(y=1,start=outWidth*2+2,
+ end=outWidth*4-2; y<outHeight-1; y++,start+=step,end+=step)
+ {
+ int i = start;
+ do
+ {
+ short j =
+ ( short(Dlo[i-2])+
+ Dlo[i+2]+
+ +Dlo[i-step]
+ +Dlo[i+step]
+ >> 2)
+ +Dlo[i];
+ if (!j) {
+ Do[i] = 0;
+ }
+ else
+ {
+ j = j
+ -Dllo[i]
+ +(Dllo[i]
+ -Dlo[i]>>2)
+ -1;
+ if (j < 0) Do[i] = 0;
+ else if (j & (255*256)) Do[i] = 255;
+ else Do[i] = j;
+ }
+ } while(++i < end);
+ }
+}
+
+void Core::fade()
+{
+ switch(fadeMode)
+ {
+ case Stars :
+ fadeFade();
+ break;
+ case Flame :
+ fadeHeat();
+ break;
+ case Wave :
+ fadeWave();
+ break;
+ default:
+ break;
+ }
+}
+
+bool Core::calculate()
+{
+ double x[NumSamples], y[NumSamples];
+ double a[NumSamples], b[NumSamples];
+ int clarity[NumSamples]; //Surround sound
+ int i,j,k;
+#ifndef LITTLEENDIAN
+ register sampleType temp;
+#endif
+
+
+ int brightFactor = int(Brightness * brightnessTwiddler /(starSize+0.01));
+
+ {
+ vector<float> *left, *right;
+ scopeData(left, right);
+ Conversion::convertStereo2FloatToI16le(NumSamples, &left->front(), &right->front(), (unsigned char*)data);
+ delete left;
+ delete right;
+ }
+
+ for(i=0;i<NumSamples;i++)
+ {
+# ifdef LITTLEENDIAN
+ x[i] = data[i*2];
+ y[i] = data[i*2+1];
+# else
+ // Need to convert to big-endian
+ temp = data[i*2];
+ temp = (temp >> 8) | (temp << 8);
+ x[i] = temp;
+ temp = data[i*2+1];
+ temp = (temp << 8) | (temp >> 8);
+ y[i] = temp;
+# endif
+ }
+
+ fft(x,y);
+
+ for(i=0 +1;i<NumSamples;i++)
+ {
+ double x1 = x[bitReverse[i]],
+ y1 = y[bitReverse[i]],
+ x2 = x[bitReverse[NumSamples-i]],
+ y2 = y[bitReverse[NumSamples-i]],
+ aa,bb;
+ a[i] = sqrt(aa= (x1+x2)*(x1+x2) + (y1-y2)*(y1-y2) );
+ b[i] = sqrt(bb= (x1-x2)*(x1-x2) + (y1+y2)*(y1+y2) );
+ if (aa+bb != 0.0)
+ clarity[i] = (int)(
+ ( (x1+x2) * (x1-x2) + (y1+y2) * (y1-y2) )/(aa+bb) * 256 );
+ else
+ clarity[i] = 0;
+ }
+
+ int heightFactor = NumSamples/2 / outHeight + 1;
+ int actualHeight = NumSamples/2/heightFactor;
+ int heightAdd = outHeight + actualHeight >> 1;
+
+ // Correct for window size
+ double brightFactor2 = (brightFactor/65536.0/NumSamples)*
+ sqrt(actualHeight*outWidth/(320.0*200.0));
+
+ for(i=1;i<NumSamples/2;i++) {
+ //int h = (int)( b[i]*280 / (a[i]+b[i]+0.0001)+20 );
+ if (a[i] > 0 || b[i] > 0) {
+ int h = (int)( b[i]*outWidth / (a[i]+b[i]) );
+ int br1, br2, br = (int)(
+ (a[i]+b[i])*i*brightFactor2 );
+ br1 = br*(clarity[i]+128)>>8;
+ br2 = br*(128-clarity[i])>>8;
+ if (br1 < 0) br1 = 0; else if (br1 > 255) br1 = 255;
+ if (br2 < 0) br2 = 0; else if (br2 > 255) br2 = 255;
+ //unsigned char *p = output+ h*2+(164-((i<<8)>>m))*(outWidth*2);
+ int px = h,
+ py = heightAdd - i / heightFactor;
+
+ if (pointsAreDiamonds)
+ {
+ addPixel(px,py,br1,br2);
+ br1=scaleDown[br1];br2=scaleDown[br2];
+
+ //TODO: Use addpixelfast
+ for(j=1;br1>0||br2>0;j++,br1=scaleDown[br1],br2=scaleDown[br2])
+ {
+ for(k=0;k<j;k++)
+ {
+ addPixel(px-j+k,py-k,br1,br2);
+ addPixel(px+k,py-j+k,br1,br2);
+ addPixel(px+j-k,py+k,br1,br2);
+ addPixel(px-k,py+j-k,br1,br2);
+ }
+ }
+ }
+ else
+ {
+ if (px < maxStarRadius || py < maxStarRadius ||
+ px > outWidth-maxStarRadius || py > outHeight-maxStarRadius)
+ {
+ addPixel(px,py,br1,br2);
+ for(j=1;br1>0||br2>0;j++,br1=scaleDown[br1],br2=scaleDown[br2])
+ {
+ addPixel(px+j,py,br1,br2);
+ addPixel(px,py+j,br1,br2);
+ addPixel(px-j,py,br1,br2);
+ addPixel(px,py-j,br1,br2);
+ }
+ }
+ else
+ {
+ unsigned char *p = output()+px*2+py*outWidth*2, *p1=p, *p2=p, *p3=p, *p4=p;
+ addPixelFast(p,br1,br2);
+ for(;br1>0||br2>0;br1=scaleDown[br1],br2=scaleDown[br2])
+ {
+ p1 += 2;
+ addPixelFast(p1,br1,br2);
+ p2 -= 2;
+ addPixelFast(p2,br1,br2);
+ p3 += outWidth*2;
+ addPixelFast(p3,br1,br2);
+ p4 -= outWidth*2;
+ addPixelFast(p4,br1,br2);
+ }
+ }
+ }
+ }
+ }
+ return true;
+}
+
+#undef outputs
diff --git a/noatun-plugins/synaescope/cr16-app-synaescope.png b/noatun-plugins/synaescope/cr16-app-synaescope.png
new file mode 100644
index 0000000..5c29f7e
--- /dev/null
+++ b/noatun-plugins/synaescope/cr16-app-synaescope.png
Binary files differ
diff --git a/noatun-plugins/synaescope/font.h b/noatun-plugins/synaescope/font.h
new file mode 100644
index 0000000..94d2627
--- /dev/null
+++ b/noatun-plugins/synaescope/font.h
@@ -0,0 +1,258 @@
+unsigned char font[] = {
+ 0,0,0,0,0,0,0,0,
+ 126,129,165,129,189,129,126,0,
+ 126,255,219,255,195,255,126,0,
+ 54,127,127,127,62,28,8,0,
+ 8,28,62,127,62,28,8,0,
+ 28,28,8,107,127,107,8,28,
+ 8,28,62,127,62,8,28,62,
+ 0,0,24,60,60,24,0,0,
+ 255,255,231,195,195,231,255,255,
+ 0,60,102,66,66,102,60,0,
+ 255,195,153,189,189,153,195,255,
+ 15,7,13,60,102,102,102,60,
+ 60,102,102,102,60,24,126,24,
+ 48,56,60,54,52,112,240,224,
+ 127,99,127,99,99,103,230,192,
+ 24,219,126,102,102,126,219,24,
+ 64,112,124,127,124,112,64,0,
+ 1,7,31,127,31,7,1,0,
+ 24,60,126,24,24,126,60,24,
+ 102,102,102,102,102,0,102,0,
+ 63,122,122,58,10,10,10,0,
+ 30,51,28,54,54,28,102,60,
+ 0,0,0,0,126,126,126,0,
+ 24,60,126,24,126,60,24,126,
+ 24,60,126,24,24,24,24,0,
+ 24,24,24,24,126,60,24,0,
+ 0,12,14,127,14,12,0,0,
+ 0,24,56,127,56,24,0,0,
+ 0,0,96,96,96,127,0,0,
+ 0,36,102,255,102,36,0,0,
+ 0,24,60,126,255,255,0,0,
+ 0,255,255,126,60,24,0,0,
+ 0,0,0,0,0,0,0,0,
+ 24,24,24,24,24,0,24,0,
+ 102,102,102,0,0,0,0,0,
+ 108,108,254,108,254,108,108,0,
+ 16,124,208,124,22,124,16,0,
+ 0,198,204,24,48,102,198,0,
+ 56,108,56,118,220,204,118,0,
+ 24,24,48,0,0,0,0,0,
+ 12,24,48,48,48,24,12,0,
+ 48,24,12,12,12,24,48,0,
+ 0,108,56,254,56,108,0,0,
+ 0,24,24,126,24,24,0,0,
+ 0,0,0,0,0,24,24,48,
+ 0,0,0,126,0,0,0,0,
+ 0,0,0,0,0,48,48,0,
+ 0,6,12,24,48,96,192,0,
+ 60,102,110,126,118,102,60,0,
+ 12,28,60,12,12,12,12,0,
+ 60,102,6,28,48,96,126,0,
+ 60,102,6,28,6,102,60,0,
+ 28,60,108,204,254,12,12,0,
+ 126,96,96,124,6,102,60,0,
+ 60,96,96,124,102,102,60,0,
+ 126,6,6,12,24,48,48,0,
+ 60,102,102,60,102,102,60,0,
+ 60,102,102,62,6,6,60,0,
+ 0,48,48,0,0,48,48,0,
+ 0,24,24,0,0,24,24,48,
+ 12,24,48,96,48,24,12,0,
+ 0,0,126,0,0,126,0,0,
+ 48,24,12,6,12,24,48,0,
+ 60,102,6,12,24,0,24,0,
+ 60,102,110,110,108,96,60,0,
+ 24,60,102,102,126,102,102,0,
+ 124,102,102,124,102,102,124,0,
+ 60,102,96,96,96,102,60,0,
+ 124,102,102,102,102,102,124,0,
+ 126,96,96,124,96,96,126,0,
+ 126,96,96,124,96,96,96,0,
+ 60,102,96,110,102,102,60,0,
+ 102,102,102,126,102,102,102,0,
+ 60,24,24,24,24,24,60,0,
+ 6,6,6,6,102,102,60,0,
+ 102,108,120,112,120,108,102,0,
+ 96,96,96,96,96,96,126,0,
+ 198,238,254,214,198,198,198,0,
+ 102,118,126,110,102,102,102,0,
+ 60,102,102,102,102,102,60,0,
+ 124,102,102,124,96,96,96,0,
+ 60,102,102,102,102,110,60,6,
+ 124,102,102,124,102,102,102,0,
+ 60,102,96,60,6,102,60,0,
+ 126,24,24,24,24,24,24,0,
+ 102,102,102,102,102,102,60,0,
+ 102,102,102,102,102,60,24,0,
+ 198,198,198,214,254,238,198,0,
+ 102,102,60,24,60,102,102,0,
+ 102,102,102,60,24,24,24,0,
+ 126,6,12,24,48,96,126,0,
+ 60,48,48,48,48,48,60,0,
+ 0,192,96,48,24,12,6,0,
+ 60,12,12,12,12,12,60,0,
+ 24,60,102,0,0,0,0,0,
+ 0,0,0,0,0,0,0,255,
+ 24,24,12,0,0,0,0,0,
+ 0,0,60,6,62,102,62,0,
+ 96,96,96,124,102,102,124,0,
+ 0,0,60,102,96,102,60,0,
+ 6,6,6,62,102,102,62,0,
+ 0,0,60,102,126,96,62,0,
+ 28,54,48,124,48,48,48,0,
+ 0,0,62,102,102,62,6,60,
+ 96,96,124,102,102,102,102,0,
+ 24,0,24,24,24,24,24,0,
+ 12,0,12,12,12,12,108,56,
+ 96,96,102,108,120,108,102,0,
+ 48,48,48,48,48,48,24,0,
+ 0,0,236,254,214,214,198,0,
+ 0,0,124,102,102,102,102,0,
+ 0,0,60,102,102,102,60,0,
+ 0,0,124,102,102,124,96,96,
+ 0,0,62,102,102,62,6,6,
+ 0,0,124,102,96,96,96,0,
+ 0,0,62,96,60,6,124,0,
+ 48,48,124,48,48,54,28,0,
+ 0,0,102,102,102,102,62,0,
+ 0,0,102,102,102,60,24,0,
+ 0,0,198,214,254,238,68,0,
+ 0,0,102,60,24,60,102,0,
+ 0,0,102,102,102,62,6,60,
+ 0,0,126,12,24,48,126,0,
+ 28,48,48,96,48,48,28,0,
+ 24,24,24,24,24,24,24,0,
+ 56,12,12,6,12,12,56,0,
+ 118,220,0,0,0,0,0,0,
+ 0,0,24,60,102,102,126,0,
+ 60,102,96,96,102,60,24,48,
+ 102,0,102,102,102,102,62,0,
+ 14,0,60,102,126,96,60,0,
+ 60,102,60,6,62,102,62,0,
+ 102,0,60,6,62,102,62,0,
+ 112,0,60,6,62,102,62,0,
+ 24,24,60,6,62,102,62,0,
+ 0,0,62,96,96,62,24,48,
+ 60,102,60,102,126,96,60,0,
+ 102,0,60,102,126,96,60,0,
+ 112,0,60,102,126,96,60,0,
+ 102,0,24,24,24,24,24,0,
+ 60,102,24,24,24,24,24,0,
+ 112,0,24,24,24,24,24,0,
+ 198,56,108,198,254,198,198,0,
+ 24,24,0,60,102,126,102,0,
+ 14,0,124,96,120,96,124,0,
+ 0,0,126,26,126,216,126,0,
+ 62,120,216,222,248,216,222,0,
+ 60,102,60,102,102,102,60,0,
+ 102,0,60,102,102,102,60,0,
+ 112,0,60,102,102,102,60,0,
+ 60,102,0,102,102,102,62,0,
+ 112,0,102,102,102,102,62,0,
+ 102,0,102,102,102,62,6,60,
+ 102,60,102,102,102,102,60,0,
+ 102,0,102,102,102,102,60,0,
+ 12,12,62,96,96,62,12,12,
+ 56,108,96,240,96,102,252,0,
+ 102,102,60,24,126,24,126,24,
+ 124,102,102,124,102,111,102,99,
+ 14,27,24,60,24,24,120,48,
+ 14,0,60,6,62,102,62,0,
+ 14,0,24,24,24,24,24,0,
+ 14,0,60,102,102,102,60,0,
+ 14,0,102,102,102,102,62,0,
+ 118,220,0,124,102,102,102,0,
+ 126,0,102,118,126,110,102,0,
+ 62,102,102,62,0,126,0,0,
+ 60,102,102,60,0,126,0,0,
+ 24,0,24,48,96,102,60,0,
+ 0,0,0,126,96,96,0,0,
+ 0,0,0,126,6,6,0,0,
+ 198,204,216,62,99,198,12,31,
+ 198,204,216,54,110,214,31,6,
+ 24,0,24,24,24,24,24,0,
+ 0,54,108,216,108,54,0,0,
+ 0,216,108,54,108,216,0,0,
+ 34,136,34,136,34,136,34,136,
+ 85,170,85,170,85,170,85,170,
+ 221,119,221,119,221,119,221,119,
+ 8,8,8,8,8,8,8,8,
+ 8,8,8,8,248,8,8,8,
+ 8,8,8,248,248,8,8,8,
+ 28,28,28,28,252,28,28,28,
+ 0,0,0,0,252,28,28,28,
+ 0,0,0,248,248,8,8,8,
+ 28,28,28,252,252,28,28,28,
+ 28,28,28,28,28,28,28,28,
+ 0,0,0,252,252,28,28,28,
+ 28,28,28,252,252,0,0,0,
+ 28,28,28,28,252,0,0,0,
+ 8,8,8,248,248,0,0,0,
+ 0,0,0,0,248,8,8,8,
+ 8,8,8,8,15,0,0,0,
+ 8,8,8,8,255,0,0,0,
+ 0,0,0,0,255,8,8,8,
+ 8,8,8,8,15,8,8,8,
+ 0,0,0,0,255,0,0,0,
+ 8,8,8,8,255,8,8,8,
+ 8,8,8,15,15,8,8,8,
+ 28,28,28,28,31,28,28,28,
+ 28,28,28,31,31,0,0,0,
+ 0,0,0,31,31,28,28,28,
+ 28,28,28,255,255,0,0,0,
+ 0,0,0,255,255,28,28,28,
+ 28,28,28,31,31,28,28,28,
+ 0,0,0,255,255,0,0,0,
+ 28,28,28,255,255,28,28,28,
+ 8,8,8,255,255,0,0,0,
+ 28,28,28,28,255,0,0,0,
+ 0,0,0,255,255,8,8,8,
+ 0,0,0,0,255,28,28,28,
+ 28,28,28,28,31,0,0,0,
+ 8,8,8,15,15,0,0,0,
+ 0,0,0,15,15,8,8,8,
+ 0,0,0,0,31,28,28,28,
+ 28,28,28,28,255,28,28,28,
+ 8,8,8,255,255,8,8,8,
+ 8,8,8,8,248,0,0,0,
+ 0,0,0,0,15,8,8,8,
+ 255,255,255,255,255,255,255,255,
+ 0,0,0,0,255,255,255,255,
+ 240,240,240,240,240,240,240,240,
+ 15,15,15,15,15,15,15,15,
+ 255,255,255,255,0,0,0,0,
+ 0,0,118,204,204,204,118,0,
+ 60,102,102,124,102,102,124,96,
+ 126,102,96,96,96,96,96,0,
+ 0,0,254,108,108,108,102,0,
+ 126,102,48,24,48,102,126,0,
+ 0,0,62,108,108,108,56,0,
+ 0,0,102,102,102,102,127,192,
+ 0,0,126,216,24,24,12,0,
+ 124,56,124,214,214,124,56,124,
+ 124,198,198,254,198,198,124,0,
+ 124,198,198,198,108,108,238,0,
+ 30,48,24,60,102,102,60,0,
+ 0,0,126,219,219,126,0,0,
+ 3,6,62,107,115,62,96,192,
+ 30,48,96,126,96,48,30,0,
+ 124,198,198,198,198,198,198,0,
+ 0,126,0,126,0,126,0,0,
+ 24,24,126,24,24,0,126,0,
+ 48,24,12,24,48,0,126,0,
+ 12,24,48,24,12,0,126,0,
+ 14,27,27,24,24,24,24,24,
+ 24,24,24,24,24,216,216,112,
+ 24,24,0,126,0,24,24,0,
+ 0,118,220,0,118,220,0,0,
+ 60,102,102,60,0,0,0,0,
+ 0,0,0,24,24,0,0,0,
+ 0,0,0,0,24,0,0,0,
+ 30,24,24,24,24,216,120,56,
+ 120,108,108,108,108,0,0,0,
+ 56,12,24,48,60,0,0,0,
+ 0,0,60,60,60,60,0,0,
+ 0,0,0,0,0,0,0,0
+};
diff --git a/noatun-plugins/synaescope/icons.h b/noatun-plugins/synaescope/icons.h
new file mode 100644
index 0000000..6988dae
--- /dev/null
+++ b/noatun-plugins/synaescope/icons.h
@@ -0,0 +1,4868 @@
+double Icon0[][4] = {
+ {0.5,0,0.166666666666667,0.333333333333333},
+ {0.5,1,0.5,0},
+ {0.166666666666667,0.666666666666667,0.5,1},
+ {0,0.333333333333333,0,0.666666666666667},
+ {0,0,0,0}
+};
+
+double Icon1[][4] = {
+ {0.5,0.262222,0.487778,0.185},
+ {0.487778,0.185,0.452222666666667,0.115},
+ {0.452222666666667,0.115,0.397222666666667,0.0599999999999999},
+ {0.397222666666667,0.0599999999999999,0.327222666666667,0.0244446666666664},
+ {0.327222666666667,0.0244446666666664,0.25,0.0122220000000002},
+ {0.25,0.0122220000000002,0.172778,0.0244446666666664},
+ {0.172778,0.0244446666666664,0.102778,0.0599999999999999},
+ {0.102778,0.0599999999999999,0.047778,0.115},
+ {0.047778,0.115,0.0122226666666666,0.185},
+ {0.0122226666666666,0.185,0,0.262222},
+ {0,0.262222,0.0122226666666666,0.339444666666667},
+ {0.0122226666666666,0.339444666666667,0.047778,0.409444666666667},
+ {0.047778,0.409444666666667,0.102778,0.464444666666667},
+ {0.102778,0.464444666666667,0.172778,0.5},
+ {0.172778,0.5,0.25,0.512222},
+ {0.25,0.512222,0.327222666666667,0.5},
+ {0.327222666666667,0.5,0.397222666666667,0.464444666666667},
+ {0.397222666666667,0.464444666666667,0.452222666666667,0.409444666666667},
+ {0.452222666666667,0.409444666666667,0.487778,0.339444666666667},
+ {0.487778,0.339444666666667,0.5,0.262222},
+ {0.381111333333333,0.583333333333333,0.381111333333333,0.541666666666667},
+ {0.131111333333333,0.541666666666667,0.131111333333333,0.583333333333333},
+ {0.381111333333333,0.666666666666667,0.381111333333333,0.625},
+ {0.131111333333333,0.625,0.131111333333333,0.666666666666667},
+ {0.381111333333333,0.75,0.381111333333333,0.708333333333333},
+ {0.131111333333333,0.708333333333333,0.131111333333333,0.75},
+ {0.297778,0.833333333333333,0.339444666666667,0.791666666666667},
+ {0.172778,0.791666666666667,0.214444666666667,0.833333333333333},
+ {0,0,0,0}
+};
+
+double Icon2[][4] = {
+ {0,0.166666666666667,0,0.833333333333333},
+ {0,0.833333333333333,0.333333333333333,0.5},
+ {0.333333333333333,0.5,0,0.166666666666667},
+ {0,0,0,0}
+};
+
+double Icon3[][4] = {
+ {0.166666666666667,0.75,0.166666666666667,0.25},
+ {0,0.25,0,0.75},
+ {0.5,0.75,0.5,0.25},
+ {0.333333333333333,0.25,0.333333333333333,0.75},
+ {0,0,0,0}
+};
+
+double Icon4[][4] = {
+ {0.5,0.75,0.5,0.25},
+ {0,0.25,0,0.75},
+ {0,0,0,0}
+};
+
+double Icon5[][4] = {
+ {0,0.166666666666667,0,0.833333333333333},
+ {0,0.833333333333333,0.166666666666667,0.666666666666667},
+ {0.166666666666667,0.666666666666667,0.166666666666667,0.833333333333333},
+ {0.166666666666667,0.833333333333333,0.458333333333333,0.541666666666667},
+ {0.458333333333333,0.541666666666667,0.458333333333333,0.833333333333333},
+ {0.541666666666667,0.833333333333333,0.541666666666667,0.166666666666667},
+ {0.458333333333333,0.166666666666667,0.458333333333333,0.458333333333333},
+ {0.458333333333333,0.458333333333333,0.166666666666667,0.166666666666667},
+ {0.166666666666667,0.166666666666667,0.166666666666667,0.333333333333333},
+ {0.166666666666667,0.333333333333333,0,0.166666666666667},
+ {0,0,0,0}
+};
+
+double Icon6[][4] = {
+ {0.541666666666667,0.833333333333333,0.541666666666667,0.166666666666667},
+ {0.541666666666667,0.166666666666667,0.375,0.333333333333333},
+ {0.375,0.333333333333333,0.375,0.166666666666667},
+ {0.375,0.166666666666667,0.0833333333333333,0.458333333333333},
+ {0.0833333333333333,0.458333333333333,0.0833333333333333,0.166666666666667},
+ {0,0.166666666666667,0,0.833333333333333},
+ {0.0833333333333333,0.833333333333333,0.0833333333333333,0.541666666666667},
+ {0.0833333333333333,0.541666666666667,0.375,0.833333333333333},
+ {0.375,0.833333333333333,0.375,0.666666666666667},
+ {0.375,0.666666666666667,0.541666666666667,0.833333333333333},
+ {0,0,0,0}
+};
+
+double Icon7[][4] = {
+ {0,0,0,1},
+ {0,1,0.166666666666667,0.833333333333333},
+ {0.166666666666667,0.833333333333333,0.166666666666667,0.166666666666667},
+ {0.166666666666667,0.166666666666667,0,0},
+ {0.125,0.166666666666667,0.125,0.833333333333333},
+ {0.125,0.833333333333333,0.0833333333333333,0.875},
+ {0.0833333333333333,0.875,0.0833333333333333,0.125},
+ {0.0833333333333333,0.125,0.125,0.166666666666667},
+ {0,0,0,0}
+};
+
+double Icon8[][4] = {
+ {0,0,0.166666666666667,0.5},
+ {0.166666666666667,0.5,0.291666666666667,0.375},
+ {0.291666666666667,0.375,0.416666666666667,0.5},
+ {0.416666666666667,0.5,0.5,0.416666666666667},
+ {0.5,0.416666666666667,0.375,0.291666666666667},
+ {0.375,0.291666666666667,0.5,0.166666666666667},
+ {0.5,0.166666666666667,0,0},
+ {0,0,0,0}
+};
+
+double Icon9[][4] = {
+ {0.5,0.833333333333333,0.5,0.791666666666667},
+ {0,0.791666666666667,0,0.833333333333333},
+ {0.0833333333333333,0.625,0,0.791666666666667},
+ {0.5,0.791666666666667,0.416666666666667,0.625},
+ {0.5,0.541666666666667,0.416666666666667,0.375},
+ {0.0833333333333333,0.375,0,0.541666666666667},
+ {0,0.541666666666667,0,0.666666666666667},
+ {0.0416666666666667,0.666666666666667,0.0416666666666667,0.583333333333333},
+ {0.458333333333333,0.583333333333333,0.458333333333333,0.666666666666667},
+ {0.5,0.666666666666667,0.5,0.541666666666667},
+ {0.166666666666667,0.666666666666667,0.173888666666667,0.664444666666667},
+ {0.173888666666667,0.664444666666667,0.181666666666667,0.662778},
+ {0.181666666666667,0.662778,0.191111333333333,0.661111333333333},
+ {0.191111333333333,0.661111333333333,0.201111333333333,0.660555333333334},
+ {0.201111333333333,0.660555333333334,0.212778,0.659444666666667},
+ {0.224444666666667,0.659444666666667,0.237222,0.658888666666667},
+ {0.262778,0.658888666666667,0.275555333333333,0.659444666666667},
+ {0.287222,0.659444666666667,0.298888666666667,0.660555333333334},
+ {0.298888666666667,0.660555333333334,0.308888666666667,0.661111333333333},
+ {0.308888666666667,0.661111333333333,0.318333333333333,0.662778},
+ {0.318333333333333,0.662778,0.326111333333333,0.664444666666667},
+ {0.326111333333333,0.664444666666667,0.333333333333333,0.666666666666667},
+ {0.333333333333333,0.666666666666667,0.339444666666666,0.669444666666667},
+ {0.339444666666666,0.669444666666667,0.345,0.673333333333333},
+ {0.345,0.673333333333333,0.35,0.677778},
+ {0.35,0.677778,0.355,0.682778},
+ {0.355,0.682778,0.359999999999999,0.688888666666667},
+ {0.359999999999999,0.688888666666667,0.364444666666666,0.695},
+ {0.364444666666666,0.695,0.369444666666666,0.701666666666667},
+ {0.369444666666666,0.701666666666667,0.373888666666667,0.708333333333333},
+ {0.373888666666667,0.708333333333333,0.377778,0.715},
+ {0.377778,0.715,0.381111333333333,0.721666666666666},
+ {0.381111333333333,0.721666666666666,0.383888666666666,0.727778},
+ {0.383888666666666,0.727778,0.385,0.733888666666667},
+ {0.385,0.733888666666667,0.385,0.738888666666667},
+ {0.385,0.738888666666667,0.383888666666666,0.743333333333334},
+ {0.383888666666666,0.743333333333334,0.380555333333334,0.747222},
+ {0.380555333333334,0.747222,0.375,0.75},
+ {0.375,0.75,0.368888666666667,0.751666666666667},
+ {0.368888666666667,0.751666666666667,0.361666666666667,0.753333333333333},
+ {0.361666666666667,0.753333333333333,0.352222,0.754444666666667},
+ {0.352222,0.754444666666667,0.341111333333333,0.755555333333334},
+ {0.341111333333333,0.755555333333334,0.328888666666666,0.756111333333333},
+ {0.328888666666666,0.756111333333333,0.315,0.756666666666667},
+ {0.315,0.756666666666667,0.299444666666666,0.757222},
+ {0.299444666666666,0.757222,0.283888666666667,0.757778},
+ {0.216111333333333,0.757778,0.200555333333334,0.757222},
+ {0.200555333333334,0.757222,0.185,0.756666666666667},
+ {0.185,0.756666666666667,0.171111333333333,0.756111333333333},
+ {0.171111333333333,0.756111333333333,0.158888666666667,0.755555333333334},
+ {0.158888666666667,0.755555333333334,0.147778,0.754444666666667},
+ {0.147778,0.754444666666667,0.138333333333333,0.753333333333333},
+ {0.138333333333333,0.753333333333333,0.131111333333333,0.751666666666667},
+ {0.131111333333333,0.751666666666667,0.125,0.75},
+ {0.125,0.75,0.119444666666666,0.747222},
+ {0.119444666666666,0.747222,0.116111333333334,0.743333333333334},
+ {0.116111333333334,0.743333333333334,0.115,0.738888666666667},
+ {0.115,0.738888666666667,0.115,0.733888666666667},
+ {0.115,0.733888666666667,0.116111333333334,0.727778},
+ {0.116111333333334,0.727778,0.118888666666667,0.721666666666666},
+ {0.118888666666667,0.721666666666666,0.122222,0.715},
+ {0.122222,0.715,0.126111333333333,0.708333333333333},
+ {0.126111333333333,0.708333333333333,0.130555333333334,0.701666666666667},
+ {0.130555333333334,0.701666666666667,0.135555333333334,0.695},
+ {0.135555333333334,0.695,0.140000000000001,0.688888666666667},
+ {0.140000000000001,0.688888666666667,0.145,0.682778},
+ {0.145,0.682778,0.15,0.677778},
+ {0.15,0.677778,0.155,0.673333333333333},
+ {0.155,0.673333333333333,0.160555333333334,0.669444666666667},
+ {0.160555333333334,0.669444666666667,0.166666666666667,0.666666666666667},
+ {0,0,0,0}
+};
+
+double Icon10[][4] = {
+ {0.707221999999999,0.271111333333333,0.589444666666666,0.153333333333334},
+ {0.471111333333333,0.507222,0.707221999999999,0.271111333333333},
+ {0.707221999999999,0.742778,0.471111333333333,0.507222},
+ {0.589444666666666,0.860555333333333,0.707221999999999,0.742778},
+ {0.353333333333333,0.625,0.589444666666666,0.860555333333333},
+ {0.117778,0.860555333333333,0.353333333333333,0.625},
+ {0,0.742778,0.117778,0.860555333333333},
+ {0.235555333333333,0.507222,0,0.742778},
+ {0,0.271111333333333,0.235555333333333,0.507222},
+ {0.117778,0.153333333333334,0,0.271111333333333},
+ {0.353333333333333,0.388888666666666,0.117778,0.153333333333334},
+ {0.589444666666666,0.153333333333334,0.353333333333333,0.388888666666666},
+ {0,0,0,0}
+};
+
+double Icon11[][4] = {
+ {0.75,0.708333333333333,0.75,0.291666666666667},
+ {0,0.291666666666667,0,0.708333333333333},
+ {0.184444666666667,0.333333333333333,0.184444666666667,0.416666666666667},
+ {0.0894446666666665,0.416666666666667,0.0894446666666665,0.458333333333333},
+ {0.136666666666667,0.458333333333333,0.136666666666667,0.541666666666667},
+ {0.0894446666666665,0.541666666666667,0.0894446666666665,0.583333333333333},
+ {0.184444666666667,0.583333333333333,0.184444666666667,0.666666666666667},
+ {0.0416666666666667,0.666666666666667,0.0416666666666667,0.333333333333333},
+ {0.28,0.333333333333333,0.327778,0.458333333333333},
+ {0.327778,0.458333333333333,0.375,0.333333333333333},
+ {0.422222,0.333333333333333,0.363333333333333,0.5},
+ {0.363333333333333,0.5,0.422222,0.666666666666667},
+ {0.375,0.666666666666667,0.327778,0.541666666666667},
+ {0.327778,0.541666666666667,0.28,0.666666666666667},
+ {0.232222,0.666666666666667,0.291666666666667,0.5},
+ {0.291666666666667,0.5,0.232222,0.333333333333333},
+ {0.517778,0.333333333333333,0.517778,0.666666666666667},
+ {0.47,0.666666666666667,0.47,0.333333333333333},
+ {0.708333333333333,0.333333333333333,0.708333333333333,0.416666666666667},
+ {0.660555333333333,0.416666666666667,0.660555333333333,0.666666666666667},
+ {0.613333333333333,0.666666666666667,0.613333333333333,0.416666666666667},
+ {0.565555333333333,0.416666666666667,0.565555333333333,0.333333333333333},
+ {0,0,0,0}
+};
+
+double Icon12[][4] = {
+ {0.298333333333333,0.31,0.293888666666666,0.301666666666667},
+ {0.302221999999999,0.32,0.298333333333333,0.31},
+ {0.305555333333333,0.331111333333334,0.302221999999999,0.32},
+ {0.308333333333334,0.343888666666667,0.305555333333333,0.331111333333334},
+ {0.310555333333333,0.357222,0.308333333333334,0.343888666666667},
+ {0.312777333333333,0.372778,0.310555333333333,0.357222},
+ {0.314443999999999,0.388888666666666,0.312777333333333,0.372778},
+ {0.315555333333333,0.406111333333333,0.314443999999999,0.388888666666666},
+ {0.316666666666666,0.424444666666667,0.315555333333333,0.406111333333333},
+ {0.317777333333333,0.443888666666667,0.316666666666666,0.424444666666667},
+ {0.318333333333333,0.463333333333334,0.317777333333333,0.443888666666667},
+ {0.318888666666666,0.483888666666667,0.318333333333333,0.463333333333334},
+ {0.318888666666666,0.505,0.318888666666666,0.483888666666667},
+ {0.318888666666666,0.526111333333333,0.318888666666666,0.505},
+ {0.318888666666666,0.546666666666667,0.318888666666666,0.526111333333333},
+ {0.318888666666666,0.567778,0.318888666666666,0.546666666666667},
+ {0.318333333333333,0.588333333333334,0.318888666666666,0.567778},
+ {0.317777333333333,0.607778,0.318333333333333,0.588333333333334},
+ {0.316666666666666,0.627222,0.317777333333333,0.607778},
+ {0.315555333333333,0.645555333333334,0.316666666666666,0.627222},
+ {0.314443999999999,0.662778,0.315555333333333,0.645555333333334},
+ {0.312777333333333,0.678888666666667,0.314443999999999,0.662778},
+ {0.310555333333333,0.694444666666667,0.312777333333333,0.678888666666667},
+ {0.308333333333334,0.707778,0.310555333333333,0.694444666666667},
+ {0.305555333333333,0.720555333333333,0.308333333333334,0.707778},
+ {0.302221999999999,0.731666666666667,0.305555333333333,0.720555333333333},
+ {0.298333333333333,0.741666666666667,0.302221999999999,0.731666666666667},
+ {0.293888666666666,0.75,0.298333333333333,0.741666666666667},
+ {0.287777333333333,0.758333333333334,0.293888666666666,0.75},
+ {0.280555333333333,0.765555333333333,0.287777333333333,0.758333333333334},
+ {0.272777333333333,0.771666666666667,0.280555333333333,0.765555333333333},
+ {0.263333333333333,0.776666666666667,0.272777333333333,0.771666666666667},
+ {0.252777333333333,0.781111333333333,0.263333333333333,0.776666666666667},
+ {0.241666666666666,0.783888666666667,0.252777333333333,0.781111333333333},
+ {0.229444,0.786666666666667,0.241666666666666,0.783888666666667},
+ {0.216666666666666,0.788888666666667,0.229444,0.786666666666667},
+ {0.202777333333334,0.79,0.216666666666666,0.788888666666667},
+ {0.188888666666666,0.791111333333333,0.202777333333334,0.79},
+ {0.173888666666667,0.791666666666667,0.188888666666666,0.791111333333333},
+ {0.159443999999999,0.792222,0.173888666666667,0.791666666666667},
+ {0.145,0.791666666666667,0.159443999999999,0.792222},
+ {0.13,0.791111333333333,0.145,0.791666666666667},
+ {0.116110666666666,0.79,0.13,0.791111333333333},
+ {0.102222,0.788888666666667,0.116110666666666,0.79},
+ {0.0894440000000003,0.786666666666667,0.102222,0.788888666666667},
+ {0.0772220000000002,0.783888666666667,0.0894440000000003,0.786666666666667},
+ {0.0661106666666669,0.781111333333333,0.0772220000000002,0.783888666666667},
+ {0.0555553333333331,0.776666666666667,0.0661106666666669,0.781111333333333},
+ {0.0461106666666661,0.771666666666667,0.0555553333333331,0.776666666666667},
+ {0.0383333333333328,0.765555333333333,0.0461106666666661,0.771666666666667},
+ {0.0311106666666667,0.758333333333334,0.0383333333333328,0.765555333333333},
+ {0.0249999999999998,0.75,0.0311106666666667,0.758333333333334},
+ {0.020555333333333,0.741666666666667,0.0249999999999998,0.75},
+ {0.0166666666666669,0.731666666666667,0.020555333333333,0.741666666666667},
+ {0.013333333333333,0.720555333333333,0.0166666666666669,0.731666666666667},
+ {0.0105553333333326,0.707778,0.013333333333333,0.720555333333333},
+ {0.00833333333333286,0.694444666666667,0.0105553333333326,0.707778},
+ {0.00611066666666697,0.678888666666667,0.00833333333333286,0.694444666666667},
+ {0.00444399999999945,0.662778,0.00611066666666697,0.678888666666667},
+ {0.00333333333333267,0.645555333333334,0.00444399999999945,0.662778},
+ {0.00222199999999972,0.627222,0.00333333333333267,0.645555333333334},
+ {0.00111066666666678,0.607778,0.00222199999999972,0.627222},
+ {0.000555333333333389,0.588333333333334,0.00111066666666678,0.607778},
+ {0,0.567778,0.000555333333333389,0.588333333333334},
+ {0,0.546666666666667,0,0.567778},
+ {0,0.525555333333333,0,0.546666666666667},
+ {0,0.505,0,0.525555333333333},
+ {0,0.483888666666667,0,0.505},
+ {0.000555333333333389,0.463333333333334,0,0.483888666666667},
+ {0.00111066666666678,0.443888666666667,0.000555333333333389,0.463333333333334},
+ {0.00222199999999972,0.424444666666667,0.00111066666666678,0.443888666666667},
+ {0.00333333333333267,0.406111333333333,0.00222199999999972,0.424444666666667},
+ {0.00444399999999945,0.388888666666666,0.00333333333333267,0.406111333333333},
+ {0.00611066666666697,0.372778,0.00444399999999945,0.388888666666666},
+ {0.00833333333333286,0.357222,0.00611066666666697,0.372778},
+ {0.0105553333333326,0.343888666666667,0.00833333333333286,0.357222},
+ {0.013333333333333,0.331111333333334,0.0105553333333326,0.343888666666667},
+ {0.0166666666666669,0.32,0.013333333333333,0.331111333333334},
+ {0.020555333333333,0.31,0.0166666666666669,0.32},
+ {0.0249999999999998,0.301666666666667,0.020555333333333,0.31},
+ {0.0311106666666667,0.293333333333334,0.0249999999999998,0.301666666666667},
+ {0.0383333333333328,0.286111333333333,0.0311106666666667,0.293333333333334},
+ {0.0461106666666661,0.28,0.0383333333333328,0.286111333333333},
+ {0.0555553333333331,0.275,0.0461106666666661,0.28},
+ {0.0661106666666669,0.270555333333334,0.0555553333333331,0.275},
+ {0.0772220000000002,0.267778,0.0661106666666669,0.270555333333334},
+ {0.0894440000000003,0.265,0.0772220000000002,0.267778},
+ {0.102222,0.262778,0.0894440000000003,0.265},
+ {0.116110666666666,0.261666666666667,0.102222,0.262778},
+ {0.13,0.260555333333333,0.116110666666666,0.261666666666667},
+ {0.145,0.26,0.13,0.260555333333333},
+ {0.159443999999999,0.259444666666666,0.145,0.26},
+ {0.173888666666667,0.26,0.159443999999999,0.259444666666666},
+ {0.188888666666666,0.260555333333333,0.173888666666667,0.26},
+ {0.202777333333334,0.261666666666667,0.188888666666666,0.260555333333333},
+ {0.216666666666666,0.262778,0.202777333333334,0.261666666666667},
+ {0.229444,0.265,0.216666666666666,0.262778},
+ {0.241666666666666,0.267778,0.229444,0.265},
+ {0.252777333333333,0.270555333333334,0.241666666666666,0.267778},
+ {0.263333333333333,0.275,0.252777333333333,0.270555333333334},
+ {0.272777333333333,0.28,0.263333333333333,0.275},
+ {0.280555333333333,0.286111333333333,0.272777333333333,0.28},
+ {0.287777333333333,0.293333333333334,0.280555333333333,0.286111333333333},
+ {0.293888666666666,0.301666666666667,0.287777333333333,0.293333333333334},
+ {0.210555333333333,0.397222,0.212221999999999,0.403888666666666},
+ {0.212221999999999,0.403888666666666,0.213888666666667,0.411666666666667},
+ {0.213888666666667,0.411666666666667,0.215,0.421111333333334},
+ {0.215,0.421111333333334,0.216110666666667,0.431666666666667},
+ {0.216110666666667,0.431666666666667,0.217222,0.443333333333333},
+ {0.217222,0.443333333333333,0.217777333333333,0.456111333333334},
+ {0.217777333333333,0.456111333333334,0.218333333333333,0.47},
+ {0.218333333333333,0.47,0.218333333333333,0.485},
+ {0.218333333333333,0.485,0.218888666666666,0.5},
+ {0.218888666666666,0.5,0.218888666666666,0.516111333333334},
+ {0.218888666666666,0.516111333333334,0.218888666666666,0.532222},
+ {0.218888666666666,0.532222,0.218888666666666,0.547778},
+ {0.218888666666666,0.547778,0.218888666666666,0.563888666666667},
+ {0.218888666666666,0.563888666666667,0.218333333333333,0.578888666666667},
+ {0.218333333333333,0.578888666666667,0.218333333333333,0.593888666666667},
+ {0.218333333333333,0.593888666666667,0.217777333333333,0.607778},
+ {0.217777333333333,0.607778,0.217222,0.620555333333333},
+ {0.217222,0.620555333333333,0.216110666666667,0.632222},
+ {0.216110666666667,0.632222,0.215,0.642778},
+ {0.215,0.642778,0.213888666666667,0.652222},
+ {0.213888666666667,0.652222,0.212221999999999,0.66},
+ {0.212221999999999,0.66,0.210555333333333,0.666666666666667},
+ {0.210555333333333,0.666666666666667,0.208333333333333,0.672778},
+ {0.208333333333333,0.672778,0.204999999999999,0.677778},
+ {0.204999999999999,0.677778,0.201666666666667,0.681666666666667},
+ {0.201666666666667,0.681666666666667,0.197777333333333,0.685},
+ {0.197777333333333,0.685,0.193333333333333,0.687222},
+ {0.193333333333333,0.687222,0.188333333333333,0.688888666666667},
+ {0.188333333333333,0.688888666666667,0.182777333333333,0.690555333333334},
+ {0.182777333333333,0.690555333333334,0.177221999999999,0.691111333333333},
+ {0.177221999999999,0.691111333333333,0.171666666666667,0.691666666666666},
+ {0.159443999999999,0.691666666666666,0.153888666666666,0.691111333333333},
+ {0.153888666666666,0.691111333333333,0.148333333333333,0.690555333333334},
+ {0.148333333333333,0.690555333333334,0.142777333333332,0.688888666666667},
+ {0.142777333333332,0.688888666666667,0.137777333333333,0.687222},
+ {0.137777333333333,0.687222,0.133333333333333,0.685},
+ {0.133333333333333,0.685,0.129443999999999,0.681666666666667},
+ {0.129443999999999,0.681666666666667,0.126110666666667,0.677778},
+ {0.126110666666667,0.677778,0.122777333333333,0.672778},
+ {0.122777333333333,0.672778,0.120555333333333,0.666666666666667},
+ {0.120555333333333,0.666666666666667,0.118888666666667,0.66},
+ {0.118888666666667,0.66,0.117221999999999,0.652222},
+ {0.117221999999999,0.652222,0.116110666666666,0.642778},
+ {0.116110666666666,0.642778,0.115,0.632222},
+ {0.115,0.632222,0.113888666666667,0.620555333333333},
+ {0.113888666666667,0.620555333333333,0.113333333333333,0.607778},
+ {0.113333333333333,0.607778,0.112777333333333,0.593888666666667},
+ {0.112777333333333,0.593888666666667,0.112777333333333,0.578888666666667},
+ {0.112777333333333,0.578888666666667,0.112221999999999,0.563888666666667},
+ {0.112221999999999,0.563888666666667,0.112221999999999,0.547778},
+ {0.112221999999999,0.547778,0.112221999999999,0.531666666666667},
+ {0.112221999999999,0.531666666666667,0.112221999999999,0.516111333333334},
+ {0.112221999999999,0.516111333333334,0.112221999999999,0.5},
+ {0.112221999999999,0.5,0.112777333333333,0.485},
+ {0.112777333333333,0.485,0.112777333333333,0.47},
+ {0.112777333333333,0.47,0.113333333333333,0.456111333333334},
+ {0.113333333333333,0.456111333333334,0.113888666666667,0.443333333333333},
+ {0.113888666666667,0.443333333333333,0.115,0.431666666666667},
+ {0.115,0.431666666666667,0.116110666666666,0.421111333333334},
+ {0.116110666666666,0.421111333333334,0.117221999999999,0.411666666666667},
+ {0.117221999999999,0.411666666666667,0.118888666666667,0.403888666666666},
+ {0.118888666666667,0.403888666666666,0.120555333333333,0.397222},
+ {0.120555333333333,0.397222,0.122777333333333,0.391111333333334},
+ {0.122777333333333,0.391111333333334,0.126110666666667,0.386111333333333},
+ {0.126110666666667,0.386111333333333,0.129443999999999,0.382222},
+ {0.129443999999999,0.382222,0.133333333333333,0.378888666666667},
+ {0.133333333333333,0.378888666666667,0.137777333333333,0.376666666666667},
+ {0.137777333333333,0.376666666666667,0.142777333333332,0.375},
+ {0.142777333333332,0.375,0.148333333333333,0.373333333333333},
+ {0.148333333333333,0.373333333333333,0.153888666666666,0.372778},
+ {0.153888666666666,0.372778,0.159443999999999,0.372222},
+ {0.171666666666667,0.372222,0.177221999999999,0.372778},
+ {0.177221999999999,0.372778,0.182777333333333,0.373333333333333},
+ {0.182777333333333,0.373333333333333,0.188333333333333,0.375},
+ {0.188333333333333,0.375,0.193333333333333,0.376666666666667},
+ {0.193333333333333,0.376666666666667,0.197777333333333,0.378888666666667},
+ {0.197777333333333,0.378888666666667,0.201666666666667,0.382222},
+ {0.201666666666667,0.382222,0.204999999999999,0.386111333333333},
+ {0.204999999999999,0.386111333333333,0.208333333333333,0.391111333333334},
+ {0.208333333333333,0.391111333333334,0.210555333333333,0.397222},
+ {0,0,0,0}
+};
+
+double Icon13[][4] = {
+ {0.0994446666666668,0.297222,0.0977779999999993,0.288888666666667},
+ {0.100555333333332,0.307222,0.0994446666666668,0.297222},
+ {0.101666666666667,0.318333333333333,0.100555333333332,0.307222},
+ {0.102778,0.331111333333334,0.101666666666667,0.318333333333333},
+ {0.103333333333333,0.344444666666667,0.102778,0.331111333333334},
+ {0.103888666666666,0.36,0.103333333333333,0.344444666666667},
+ {0.104444666666666,0.376111333333334,0.103888666666666,0.36},
+ {0.104999999999999,0.393333333333333,0.104444666666666,0.376111333333334},
+ {0.105555333333333,0.411666666666667,0.104999999999999,0.393333333333333},
+ {0.105555333333333,0.431111333333333,0.105555333333333,0.411666666666667},
+ {0.106111333333333,0.450555333333333,0.105555333333333,0.431111333333333},
+ {0.106111333333333,0.471111333333334,0.106111333333333,0.450555333333333},
+ {0.106111333333333,0.492222,0.106111333333333,0.471111333333334},
+ {0.106111333333333,0.513333333333333,0.106111333333333,0.492222},
+ {0.106111333333333,0.533888666666667,0.106111333333333,0.513333333333333},
+ {0.106111333333333,0.555,0.106111333333333,0.533888666666667},
+ {0.106111333333333,0.575555333333333,0.106111333333333,0.555},
+ {0.105555333333333,0.595,0.106111333333333,0.575555333333333},
+ {0.105555333333333,0.614444666666667,0.105555333333333,0.595},
+ {0.104999999999999,0.632778,0.105555333333333,0.614444666666667},
+ {0.104444666666666,0.65,0.104999999999999,0.632778},
+ {0.103888666666666,0.666111333333333,0.104444666666666,0.65},
+ {0.103333333333333,0.681666666666667,0.103888666666666,0.666111333333333},
+ {0.102778,0.695,0.103333333333333,0.681666666666667},
+ {0.101666666666667,0.707778,0.102778,0.695},
+ {0.100555333333332,0.718888666666667,0.101666666666667,0.707778},
+ {0.0994446666666668,0.728888666666667,0.100555333333332,0.718888666666667},
+ {0.0977779999999993,0.737222,0.0994446666666668,0.728888666666667},
+ {0.096111333333333,0.744444666666666,0.0977779999999993,0.737222},
+ {0.0944446666666666,0.750555333333333,0.096111333333333,0.744444666666666},
+ {0.0922219999999996,0.755555333333334,0.0944446666666666,0.750555333333333},
+ {0.0899999999999999,0.76,0.0922219999999996,0.755555333333334},
+ {0.0877780000000001,0.763888666666666,0.0899999999999999,0.76},
+ {0.0849999999999997,0.767222,0.0877780000000001,0.763888666666666},
+ {0.0816666666666658,0.77,0.0849999999999997,0.767222},
+ {0.0788886666666665,0.772222,0.0816666666666658,0.77},
+ {0.0755553333333327,0.774444666666666,0.0788886666666665,0.772222},
+ {0.072222,0.776111333333333,0.0755553333333327,0.774444666666666},
+ {0.0683333333333328,0.777222,0.072222,0.776111333333333},
+ {0.0644446666666667,0.778333333333334,0.0683333333333328,0.777222},
+ {0.0611113333333329,0.778888666666666,0.0644446666666667,0.778333333333334},
+ {0.052778,0.779444666666667,0.0572219999999994,0.778888666666666},
+ {0.0488886666666666,0.778888666666666,0.052778,0.779444666666667},
+ {0.0416666666666667,0.778333333333334,0.0449999999999993,0.778888666666666},
+ {0.0377779999999994,0.777222,0.0416666666666667,0.778333333333334},
+ {0.033888666666666,0.776111333333333,0.0377779999999994,0.777222},
+ {0.0305553333333333,0.774444666666666,0.033888666666666,0.776111333333333},
+ {0.0272219999999995,0.772222,0.0305553333333333,0.774444666666666},
+ {0.0244446666666664,0.77,0.0272219999999995,0.772222},
+ {0.0211113333333325,0.767222,0.0244446666666664,0.77},
+ {0.0183333333333332,0.763888666666666,0.0211113333333325,0.767222},
+ {0.0161113333333335,0.76,0.0183333333333332,0.763888666666666},
+ {0.0138886666666664,0.755555333333334,0.0161113333333335,0.76},
+ {0.0116666666666667,0.750555333333333,0.0138886666666664,0.755555333333334},
+ {0.00999999999999919,0.744444666666666,0.0116666666666667,0.750555333333333},
+ {0.00833333333333286,0.737222,0.00999999999999919,0.744444666666666},
+ {0.00666666666666652,0.728888666666667,0.00833333333333286,0.737222},
+ {0.00555533333333358,0.718888666666667,0.00666666666666652,0.728888666666667},
+ {0.0044446666666668,0.707778,0.00555533333333358,0.718888666666667},
+ {0.00333333333333267,0.695,0.0044446666666668,0.707778},
+ {0.00277799999999928,0.681666666666667,0.00333333333333267,0.695},
+ {0.00222199999999972,0.666111333333333,0.00277799999999928,0.681666666666667},
+ {0.00166666666666634,0.65,0.00222199999999972,0.666111333333333},
+ {0.00111133333333295,0.632778,0.00166666666666634,0.65},
+ {0.000555333333333389,0.614444666666667,0.00111133333333295,0.632778},
+ {0.000555333333333389,0.595,0.000555333333333389,0.614444666666667},
+ {0,0.575555333333333,0.000555333333333389,0.595},
+ {0,0.555,0,0.575555333333333},
+ {0,0.533888666666667,0,0.555},
+ {0,0.512778,0,0.533888666666667},
+ {0,0.492222,0,0.512778},
+ {0,0.471111333333334,0,0.492222},
+ {0,0.450555333333333,0,0.471111333333334},
+ {0.000555333333333389,0.431111333333333,0,0.450555333333333},
+ {0.000555333333333389,0.411666666666667,0.000555333333333389,0.431111333333333},
+ {0.00111133333333295,0.393333333333333,0.000555333333333389,0.411666666666667},
+ {0.00166666666666634,0.376111333333334,0.00111133333333295,0.393333333333333},
+ {0.00222199999999972,0.36,0.00166666666666634,0.376111333333334},
+ {0.00277799999999928,0.344444666666667,0.00222199999999972,0.36},
+ {0.00333333333333267,0.331111333333334,0.00277799999999928,0.344444666666667},
+ {0.0044446666666668,0.318333333333333,0.00333333333333267,0.331111333333334},
+ {0.00555533333333358,0.307222,0.0044446666666668,0.318333333333333},
+ {0.00666666666666652,0.297222,0.00555533333333358,0.307222},
+ {0.00833333333333286,0.288888666666667,0.00666666666666652,0.297222},
+ {0.00999999999999919,0.281666666666667,0.00833333333333286,0.288888666666667},
+ {0.0116666666666667,0.275555333333333,0.00999999999999919,0.281666666666667},
+ {0.0138886666666664,0.270555333333334,0.0116666666666667,0.275555333333333},
+ {0.0161113333333335,0.266111333333334,0.0138886666666664,0.270555333333334},
+ {0.0183333333333332,0.262222,0.0161113333333335,0.266111333333334},
+ {0.0211113333333325,0.258888666666667,0.0183333333333332,0.262222},
+ {0.0244446666666664,0.256111333333333,0.0211113333333325,0.258888666666667},
+ {0.0272219999999995,0.253888666666667,0.0244446666666664,0.256111333333333},
+ {0.0305553333333333,0.251666666666667,0.0272219999999995,0.253888666666667},
+ {0.033888666666666,0.25,0.0305553333333333,0.251666666666667},
+ {0.0377779999999994,0.248888666666667,0.033888666666666,0.25},
+ {0.0416666666666667,0.247778,0.0377779999999994,0.248888666666667},
+ {0.0449999999999993,0.247222,0.0416666666666667,0.247778},
+ {0.0533333333333334,0.246666666666667,0.0488886666666666,0.247222},
+ {0.0572219999999994,0.247222,0.0533333333333334,0.246666666666667},
+ {0.0644446666666667,0.247778,0.0611113333333329,0.247222},
+ {0.0683333333333328,0.248888666666667,0.0644446666666667,0.247778},
+ {0.072222,0.25,0.0683333333333328,0.248888666666667},
+ {0.0755553333333327,0.251666666666667,0.072222,0.25},
+ {0.0788886666666665,0.253888666666667,0.0755553333333327,0.251666666666667},
+ {0.0816666666666658,0.256111333333333,0.0788886666666665,0.253888666666667},
+ {0.0849999999999997,0.258888666666667,0.0816666666666658,0.256111333333333},
+ {0.0877780000000001,0.262222,0.0849999999999997,0.258888666666667},
+ {0.0899999999999999,0.266111333333334,0.0877780000000001,0.262222},
+ {0.0922219999999996,0.270555333333334,0.0899999999999999,0.266111333333334},
+ {0.0944446666666666,0.275555333333333,0.0922219999999996,0.270555333333334},
+ {0.096111333333333,0.281666666666667,0.0944446666666666,0.275555333333333},
+ {0.0977779999999993,0.288888666666667,0.096111333333333,0.281666666666667},
+ {0,0,0,0}
+};
+
+double Icon14[][4] = {
+ {0.296110666666666,0.295555333333333,0.290555333333332,0.288888666666667},
+ {0.300555333333333,0.303333333333333,0.296110666666666,0.295555333333333},
+ {0.304444,0.312778,0.300555333333333,0.303333333333333},
+ {0.307221999999999,0.323333333333334,0.304444,0.312778},
+ {0.309443999999999,0.335,0.307221999999999,0.323333333333334},
+ {0.310555333333333,0.347778,0.309443999999999,0.335},
+ {0.311666666666666,0.361666666666667,0.310555333333333,0.347778},
+ {0.312222,0.376111333333334,0.311666666666666,0.361666666666667},
+ {0.312222,0.391666666666667,0.312222,0.376111333333334},
+ {0.312222,0.407222,0.312222,0.391666666666667},
+ {0.311666666666666,0.423333333333333,0.312222,0.407222},
+ {0.310555333333333,0.439444666666667,0.311666666666666,0.423333333333333},
+ {0.31,0.455,0.310555333333333,0.439444666666667},
+ {0.308888666666667,0.470555333333333,0.31,0.455},
+ {0.307221999999999,0.485,0.308888666666667,0.470555333333333},
+ {0.306110666666666,0.498888666666667,0.307221999999999,0.485},
+ {0.304444,0.511666666666667,0.306110666666666,0.498888666666667},
+ {0.302221999999999,0.523333333333333,0.304444,0.511666666666667},
+ {0.299999999999999,0.533888666666667,0.302221999999999,0.523333333333333},
+ {0.297222,0.543333333333334,0.299999999999999,0.533888666666667},
+ {0.294444,0.551111333333333,0.297222,0.543333333333334},
+ {0.290555333333332,0.557778,0.294444,0.551111333333333},
+ {0.284443999999999,0.565,0.290555333333332,0.557778},
+ {0.276110666666667,0.570555333333333,0.284443999999999,0.565},
+ {0.266666666666667,0.573333333333334,0.276110666666667,0.570555333333333},
+ {0.255555333333334,0.574444666666666,0.266666666666667,0.573333333333334},
+ {0.243333333333333,0.573888666666667,0.255555333333334,0.574444666666666},
+ {0.229999999999999,0.572222,0.243333333333333,0.573888666666667},
+ {0.215555333333333,0.569444666666667,0.229999999999999,0.572222},
+ {0.201110666666666,0.566111333333333,0.215555333333333,0.569444666666667},
+ {0.186110666666667,0.562778,0.201110666666666,0.566111333333333},
+ {0.171666666666667,0.559444666666667,0.186110666666667,0.562778},
+ {0.158333333333333,0.556666666666667,0.171666666666667,0.559444666666667},
+ {0.146110666666666,0.554444666666667,0.158333333333333,0.556666666666667},
+ {0.134999999999999,0.553888666666667,0.146110666666666,0.554444666666667},
+ {0.117221999999999,0.555555333333333,0.125555333333333,0.553888666666667},
+ {0.111110666666666,0.557778,0.117221999999999,0.555555333333333},
+ {0.106110666666666,0.561111333333334,0.111110666666666,0.557778},
+ {0.102222,0.565,0.106110666666666,0.561111333333334},
+ {0.0994439999999995,0.569444666666667,0.102222,0.565},
+ {0.0972219999999998,0.575,0.0994439999999995,0.569444666666667},
+ {0.0961106666666668,0.581666666666666,0.0972219999999998,0.575},
+ {0.095,0.588333333333334,0.0961106666666668,0.581666666666666},
+ {0.0944439999999993,0.595555333333333,0.095,0.588333333333334},
+ {0.0944439999999993,0.602778,0.0944439999999993,0.595555333333333},
+ {0.0944439999999993,0.61,0.0944439999999993,0.602778},
+ {0.095,0.617222,0.0944439999999993,0.61},
+ {0.0961106666666668,0.623888666666667,0.095,0.617222},
+ {0.0972219999999998,0.630555333333334,0.0961106666666668,0.623888666666667},
+ {0.0994439999999995,0.636111333333333,0.0972219999999998,0.630555333333334},
+ {0.102222,0.640555333333333,0.0994439999999995,0.636111333333333},
+ {0.106110666666666,0.644444666666667,0.102222,0.640555333333333},
+ {0.111110666666666,0.647778,0.106110666666666,0.644444666666667},
+ {0.117221999999999,0.65,0.111110666666666,0.647778},
+ {0.125555333333333,0.651666666666667,0.117221999999999,0.65},
+ {0.134999999999999,0.652778,0.125555333333333,0.651666666666667},
+ {0.158333333333333,0.652222,0.146110666666666,0.652778},
+ {0.171666666666667,0.651111333333333,0.158333333333333,0.652222},
+ {0.186110666666667,0.649444666666666,0.171666666666667,0.651111333333333},
+ {0.201110666666666,0.647778,0.186110666666667,0.649444666666666},
+ {0.215555333333333,0.646111333333333,0.201110666666666,0.647778},
+ {0.229999999999999,0.644444666666667,0.215555333333333,0.646111333333333},
+ {0.243333333333333,0.643333333333333,0.229999999999999,0.644444666666667},
+ {0.255555333333334,0.642778,0.243333333333333,0.643333333333333},
+ {0.276110666666667,0.643888666666667,0.266666666666667,0.642778},
+ {0.284443999999999,0.645555333333334,0.276110666666667,0.643888666666667},
+ {0.290555333333332,0.647778,0.284443999999999,0.645555333333334},
+ {0.294999999999999,0.650555333333333,0.290555333333332,0.647778},
+ {0.298888666666667,0.653888666666666,0.294999999999999,0.650555333333333},
+ {0.301666666666666,0.657778,0.298888666666667,0.653888666666666},
+ {0.303888666666667,0.662778,0.301666666666666,0.657778},
+ {0.306110666666666,0.667778,0.303888666666667,0.662778},
+ {0.307777333333333,0.673333333333333,0.306110666666666,0.667778},
+ {0.309443999999999,0.679444666666667,0.307777333333333,0.673333333333333},
+ {0.310555333333333,0.686111333333334,0.309443999999999,0.679444666666667},
+ {0.311666666666666,0.692778,0.310555333333333,0.686111333333334},
+ {0.312222,0.698888666666667,0.311666666666666,0.692778},
+ {0.312222,0.705555333333334,0.312222,0.698888666666667},
+ {0.312222,0.711666666666667,0.312222,0.705555333333334},
+ {0.311110666666667,0.717222,0.312222,0.711666666666667},
+ {0.308888666666667,0.722222,0.311110666666667,0.717222},
+ {0.306110666666666,0.727222,0.308888666666667,0.722222},
+ {0.302221999999999,0.731111333333333,0.306110666666666,0.727222},
+ {0.297222,0.734444666666667,0.302221999999999,0.731111333333333},
+ {0.290555333333332,0.737222,0.297222,0.734444666666667},
+ {0.283888666666666,0.738888666666667,0.290555333333332,0.737222},
+ {0.276110666666667,0.740555333333334,0.283888666666666,0.738888666666667},
+ {0.266666666666667,0.742222,0.276110666666667,0.740555333333334},
+ {0.256110666666667,0.743888666666667,0.266666666666667,0.742222},
+ {0.244444,0.745,0.256110666666667,0.743888666666667},
+ {0.231666666666667,0.746666666666667,0.244444,0.745},
+ {0.217777333333333,0.748333333333333,0.231666666666667,0.746666666666667},
+ {0.203333333333333,0.749444666666667,0.217777333333333,0.748333333333333},
+ {0.187777333333333,0.751111333333334,0.203333333333333,0.749444666666667},
+ {0.172222,0.752778,0.187777333333333,0.751111333333334},
+ {0.156110666666667,0.753888666666667,0.172222,0.752778},
+ {0.139999999999999,0.755,0.156110666666667,0.753888666666667},
+ {0.124443999999999,0.756111333333333,0.139999999999999,0.755},
+ {0.108888666666666,0.756666666666667,0.124443999999999,0.756111333333333},
+ {0.0805553333333329,0.756111333333333,0.0944439999999993,0.756666666666667},
+ {0.0677773333333332,0.755,0.0805553333333329,0.756111333333333},
+ {0.0561106666666665,0.753333333333333,0.0677773333333332,0.755},
+ {0.0455553333333327,0.750555333333333,0.0561106666666665,0.753333333333333},
+ {0.0361106666666669,0.747222,0.0455553333333327,0.750555333333333},
+ {0.0283333333333336,0.742778,0.0361106666666669,0.747222},
+ {0.0216666666666659,0.737222,0.0283333333333336,0.742778},
+ {0.0161106666666662,0.730555333333333,0.0216666666666659,0.737222},
+ {0.0116666666666667,0.722778,0.0161106666666662,0.730555333333333},
+ {0.0077773333333333,0.713333333333334,0.0116666666666667,0.722778},
+ {0.00500000000000019,0.702778,0.0077773333333333,0.713333333333334},
+ {0.00277733333333311,0.691111333333333,0.00500000000000019,0.702778},
+ {0.00166666666666634,0.678333333333333,0.00277733333333311,0.691111333333333},
+ {0.000555333333333389,0.664444666666667,0.00166666666666634,0.678333333333333},
+ {0,0.65,0.000555333333333389,0.664444666666667},
+ {0,0.634444666666666,0,0.65},
+ {0,0.618888666666667,0,0.634444666666666},
+ {0.000555333333333389,0.602778,0,0.618888666666667},
+ {0.00166666666666634,0.586666666666667,0.000555333333333389,0.602778},
+ {0.00222199999999972,0.571111333333333,0.00166666666666634,0.586666666666667},
+ {0.00333333333333267,0.555555333333333,0.00222199999999972,0.571111333333333},
+ {0.00500000000000019,0.541111333333333,0.00333333333333267,0.555555333333333},
+ {0.00611066666666697,0.527222,0.00500000000000019,0.541111333333333},
+ {0.0077773333333333,0.514444666666667,0.00611066666666697,0.527222},
+ {0.00999999999999919,0.502778,0.0077773333333333,0.514444666666667},
+ {0.0122220000000001,0.492222,0.00999999999999919,0.502778},
+ {0.0149999999999994,0.482778,0.0122220000000001,0.492222},
+ {0.0177773333333325,0.475,0.0149999999999994,0.482778},
+ {0.0216666666666659,0.468333333333333,0.0177773333333325,0.475},
+ {0.0277773333333329,0.461111333333333,0.0216666666666659,0.468333333333333},
+ {0.0361106666666669,0.455555333333334,0.0277773333333329,0.461111333333333},
+ {0.0455553333333327,0.452778,0.0361106666666669,0.455555333333334},
+ {0.056666666666666,0.451666666666667,0.0455553333333327,0.452778},
+ {0.0688886666666662,0.452222,0.056666666666666,0.451666666666667},
+ {0.0822219999999992,0.453888666666667,0.0688886666666662,0.452222},
+ {0.0966666666666664,0.456666666666666,0.0822219999999992,0.453888666666667},
+ {0.111666666666667,0.46,0.0966666666666664,0.456666666666666},
+ {0.126110666666667,0.463333333333334,0.111666666666667,0.46},
+ {0.140555333333333,0.466666666666667,0.126110666666667,0.463333333333334},
+ {0.153888666666666,0.469444666666667,0.140555333333333,0.466666666666667},
+ {0.166110666666666,0.471666666666666,0.153888666666666,0.469444666666667},
+ {0.177221999999999,0.472222,0.166110666666666,0.471666666666666},
+ {0.195,0.470555333333333,0.186666666666666,0.472222},
+ {0.201110666666666,0.468333333333333,0.195,0.470555333333333},
+ {0.206110666666666,0.465,0.201110666666666,0.468333333333333},
+ {0.21,0.461111333333333,0.206110666666666,0.465},
+ {0.212777333333333,0.456666666666666,0.21,0.461111333333333},
+ {0.215,0.451111333333333,0.212777333333333,0.456666666666666},
+ {0.216110666666667,0.444444666666667,0.215,0.451111333333333},
+ {0.217222,0.437778,0.216110666666667,0.444444666666667},
+ {0.217777333333333,0.430555333333333,0.217222,0.437778},
+ {0.217777333333333,0.423333333333333,0.217777333333333,0.430555333333333},
+ {0.217777333333333,0.416111333333333,0.217777333333333,0.423333333333333},
+ {0.217222,0.408888666666667,0.217777333333333,0.416111333333333},
+ {0.216110666666667,0.402222,0.217222,0.408888666666667},
+ {0.215,0.395555333333334,0.216110666666667,0.402222},
+ {0.212777333333333,0.39,0.215,0.395555333333334},
+ {0.21,0.385555333333333,0.212777333333333,0.39},
+ {0.206110666666666,0.381666666666667,0.21,0.385555333333333},
+ {0.201110666666666,0.378333333333333,0.206110666666666,0.381666666666667},
+ {0.195,0.376111333333334,0.201110666666666,0.378333333333333},
+ {0.186666666666666,0.374444666666667,0.195,0.376111333333334},
+ {0.177221999999999,0.373333333333333,0.186666666666666,0.374444666666667},
+ {0.153888666666666,0.373888666666667,0.166110666666666,0.373333333333333},
+ {0.140555333333333,0.375,0.153888666666666,0.373888666666667},
+ {0.126110666666667,0.376666666666667,0.140555333333333,0.375},
+ {0.111666666666667,0.378333333333333,0.126110666666667,0.376666666666667},
+ {0.0966666666666664,0.38,0.111666666666667,0.378333333333333},
+ {0.0822219999999992,0.381666666666667,0.0966666666666664,0.38},
+ {0.0688886666666662,0.382778,0.0822219999999992,0.381666666666667},
+ {0.056666666666666,0.383333333333334,0.0688886666666662,0.382778},
+ {0.0361106666666669,0.382222,0.0455553333333327,0.383333333333334},
+ {0.0277773333333329,0.380555333333334,0.0361106666666669,0.382222},
+ {0.0216666666666659,0.378333333333333,0.0277773333333329,0.380555333333334},
+ {0.0172220000000003,0.375555333333333,0.0216666666666659,0.378333333333333},
+ {0.013333333333333,0.372222,0.0172220000000003,0.375555333333333},
+ {0.0105553333333326,0.368333333333334,0.013333333333333,0.372222},
+ {0.00833333333333286,0.363333333333333,0.0105553333333326,0.368333333333334},
+ {0.00611066666666697,0.358333333333333,0.00833333333333286,0.363333333333333},
+ {0.00444399999999945,0.352778,0.00611066666666697,0.358333333333333},
+ {0.00277733333333311,0.346666666666666,0.00444399999999945,0.352778},
+ {0.00166666666666634,0.34,0.00277733333333311,0.346666666666666},
+ {0.000555333333333389,0.333333333333333,0.00166666666666634,0.34},
+ {0,0.327222,0.000555333333333389,0.333333333333333},
+ {0,0.320555333333333,0,0.327222},
+ {0,0.314444666666667,0,0.320555333333333},
+ {0.00111066666666678,0.308888666666667,0,0.314444666666667},
+ {0.00333333333333267,0.303888666666667,0.00111066666666678,0.308888666666667},
+ {0.00611066666666697,0.298888666666667,0.00333333333333267,0.303888666666667},
+ {0.00999999999999919,0.295,0.00611066666666697,0.298888666666667},
+ {0.0149999999999994,0.291666666666667,0.00999999999999919,0.295},
+ {0.0216666666666659,0.288888666666667,0.0149999999999994,0.291666666666667},
+ {0.0283333333333336,0.287222,0.0216666666666659,0.288888666666667},
+ {0.0361106666666669,0.285555333333334,0.0283333333333336,0.287222},
+ {0.0455553333333327,0.283888666666667,0.0361106666666669,0.285555333333334},
+ {0.0561106666666665,0.282222,0.0455553333333327,0.283888666666667},
+ {0.0677773333333332,0.281111333333333,0.0561106666666665,0.282222},
+ {0.0805553333333329,0.279444666666667,0.0677773333333332,0.281111333333333},
+ {0.0944439999999993,0.277778,0.0805553333333329,0.279444666666667},
+ {0.108888666666666,0.276666666666667,0.0944439999999993,0.277778},
+ {0.124443999999999,0.275,0.108888666666666,0.276666666666667},
+ {0.139999999999999,0.273333333333333,0.124443999999999,0.275},
+ {0.156110666666667,0.272222,0.139999999999999,0.273333333333333},
+ {0.172222,0.271111333333333,0.156110666666667,0.272222},
+ {0.187777333333333,0.27,0.172222,0.271111333333333},
+ {0.203333333333333,0.269444666666667,0.187777333333333,0.27},
+ {0.231666666666667,0.27,0.217777333333333,0.269444666666667},
+ {0.244444,0.271111333333333,0.231666666666667,0.27},
+ {0.256110666666667,0.272778,0.244444,0.271111333333333},
+ {0.266666666666667,0.275555333333333,0.256110666666667,0.272778},
+ {0.276110666666667,0.278888666666666,0.266666666666667,0.275555333333333},
+ {0.283888666666666,0.283333333333333,0.276110666666667,0.278888666666666},
+ {0.290555333333332,0.288888666666667,0.283888666666666,0.283333333333333},
+ {0,0,0,0}
+};
+
+double Icon15[][4] = {
+ {0.294999999999999,0.297222,0.290555333333334,0.288888666666667},
+ {0.298888666666667,0.307222,0.294999999999999,0.297222},
+ {0.302222,0.318333333333333,0.298888666666667,0.307222},
+ {0.305,0.331111333333334,0.302222,0.318333333333333},
+ {0.307221999999999,0.344444666666667,0.305,0.331111333333334},
+ {0.309444666666666,0.36,0.307221999999999,0.344444666666667},
+ {0.311111333333333,0.376111333333334,0.309444666666666,0.36},
+ {0.312222,0.393333333333333,0.311111333333333,0.376111333333334},
+ {0.313333333333334,0.411666666666667,0.312222,0.393333333333333},
+ {0.314444666666667,0.431111333333333,0.313333333333334,0.411666666666667},
+ {0.315,0.450555333333333,0.314444666666667,0.431111333333333},
+ {0.315555333333333,0.471111333333334,0.315,0.450555333333333},
+ {0.315555333333333,0.492222,0.315555333333333,0.471111333333334},
+ {0.315555333333333,0.513333333333333,0.315555333333333,0.492222},
+ {0.315555333333333,0.533888666666667,0.315555333333333,0.513333333333333},
+ {0.315555333333333,0.555,0.315555333333333,0.533888666666667},
+ {0.315,0.575555333333333,0.315555333333333,0.555},
+ {0.314444666666667,0.595,0.315,0.575555333333333},
+ {0.313333333333334,0.614444666666667,0.314444666666667,0.595},
+ {0.312222,0.632778,0.313333333333334,0.614444666666667},
+ {0.311111333333333,0.65,0.312222,0.632778},
+ {0.309444666666666,0.666111333333333,0.311111333333333,0.65},
+ {0.307221999999999,0.681666666666667,0.309444666666666,0.666111333333333},
+ {0.305,0.695,0.307221999999999,0.681666666666667},
+ {0.302222,0.707778,0.305,0.695},
+ {0.298888666666667,0.718888666666667,0.302222,0.707778},
+ {0.294999999999999,0.728888666666667,0.298888666666667,0.718888666666667},
+ {0.290555333333334,0.737222,0.294999999999999,0.728888666666667},
+ {0.283888666666666,0.746666666666667,0.290555333333334,0.737222},
+ {0.276111333333333,0.753888666666667,0.283888666666666,0.746666666666667},
+ {0.266666666666667,0.76,0.276111333333333,0.753888666666667},
+ {0.256111333333333,0.763888666666666,0.266666666666667,0.76},
+ {0.244444666666666,0.766666666666667,0.256111333333333,0.763888666666666},
+ {0.231666666666667,0.768333333333333,0.244444666666666,0.766666666666667},
+ {0.217778,0.768888666666667,0.231666666666667,0.768333333333333},
+ {0.203333333333333,0.768333333333333,0.217778,0.768888666666667},
+ {0.187778,0.766666666666667,0.203333333333333,0.768333333333333},
+ {0.172222,0.765,0.187778,0.766666666666667},
+ {0.156111333333333,0.762222,0.172222,0.765},
+ {0.139999999999999,0.76,0.156111333333333,0.762222},
+ {0.124444666666667,0.757222,0.139999999999999,0.76},
+ {0.108888666666666,0.753888666666667,0.124444666666667,0.757222},
+ {0.0944446666666666,0.751666666666667,0.108888666666666,0.753888666666667},
+ {0.0805553333333329,0.748888666666667,0.0944446666666666,0.751666666666667},
+ {0.0677779999999994,0.746666666666667,0.0805553333333329,0.748888666666667},
+ {0.0561113333333327,0.744444666666666,0.0677779999999994,0.746666666666667},
+ {0.0455553333333327,0.742778,0.0561113333333327,0.744444666666666},
+ {0.0361113333333331,0.741111333333333,0.0455553333333327,0.742778},
+ {0.0283333333333336,0.738888666666667,0.0361113333333331,0.741111333333333},
+ {0.0216666666666671,0.737222,0.0283333333333336,0.738888666666667},
+ {0.0149999999999994,0.734444666666667,0.0216666666666671,0.737222},
+ {0.0100000000000004,0.731111333333333,0.0149999999999994,0.734444666666667},
+ {0.00611133333333314,0.727222,0.0100000000000004,0.731111333333333},
+ {0.00333333333333267,0.722222,0.00611133333333314,0.727222},
+ {0.00111133333333295,0.717222,0.00333333333333267,0.722222},
+ {0,0.711666666666667,0.00111133333333295,0.717222},
+ {0,0.705555333333334,0,0.711666666666667},
+ {0,0.698888666666667,0,0.705555333333334},
+ {0.000555333333333389,0.692222,0,0.698888666666667},
+ {0.00166666666666634,0.686111333333334,0.000555333333333389,0.692222},
+ {0.00277800000000046,0.679444666666667,0.00166666666666634,0.686111333333334},
+ {0.0044446666666668,0.673333333333333,0.00277800000000046,0.679444666666667},
+ {0.00611133333333314,0.667778,0.0044446666666668,0.673333333333333},
+ {0.00833333333333286,0.662778,0.00611133333333314,0.667778},
+ {0.0105553333333338,0.657778,0.00833333333333286,0.662778},
+ {0.013333333333333,0.653888666666666,0.0105553333333338,0.657778},
+ {0.0172220000000003,0.650555333333333,0.013333333333333,0.653888666666666},
+ {0.0216666666666671,0.647778,0.0172220000000003,0.650555333333333},
+ {0.0277780000000002,0.645555333333334,0.0216666666666671,0.647778},
+ {0.0361113333333331,0.643888666666667,0.0277780000000002,0.645555333333334},
+ {0.0455553333333327,0.642778,0.0361113333333331,0.643888666666667},
+ {0.0688886666666662,0.643333333333333,0.056666666666666,0.642778},
+ {0.0822220000000004,0.644444666666667,0.0688886666666662,0.643333333333333},
+ {0.0966666666666664,0.646111333333333,0.0822220000000004,0.644444666666667},
+ {0.111666666666667,0.647778,0.0966666666666664,0.646111333333333},
+ {0.126111333333333,0.649444666666666,0.111666666666667,0.647778},
+ {0.140555333333333,0.651111333333333,0.126111333333333,0.649444666666666},
+ {0.153888666666667,0.652222,0.140555333333333,0.651111333333333},
+ {0.166111333333333,0.652778,0.153888666666667,0.652222},
+ {0.186666666666666,0.651666666666667,0.177222,0.652778},
+ {0.195,0.65,0.186666666666666,0.651666666666667},
+ {0.201111333333333,0.647778,0.195,0.65},
+ {0.206666666666667,0.643888666666667,0.201111333333333,0.647778},
+ {0.210555333333333,0.639444666666667,0.206666666666667,0.643888666666667},
+ {0.213333333333334,0.633333333333334,0.210555333333333,0.639444666666667},
+ {0.214444666666666,0.626666666666667,0.213333333333334,0.633333333333334},
+ {0.215,0.619444666666666,0.214444666666666,0.626666666666667},
+ {0.214444666666666,0.611111333333334,0.215,0.619444666666666},
+ {0.213888666666667,0.602778,0.214444666666666,0.611111333333334},
+ {0.212778,0.594444666666667,0.213888666666667,0.602778},
+ {0.211111333333334,0.586111333333333,0.212778,0.594444666666667},
+ {0.209444666666666,0.578888666666667,0.211111333333334,0.586111333333333},
+ {0.207778,0.572222,0.209444666666666,0.578888666666667},
+ {0.206111333333334,0.566111333333333,0.207778,0.572222},
+ {0.203888666666667,0.561666666666667,0.206111333333334,0.566111333333333},
+ {0.201111333333333,0.557778,0.203888666666667,0.561666666666667},
+ {0.196666666666667,0.554444666666667,0.201111333333333,0.557778},
+ {0.191111333333333,0.552778,0.196666666666667,0.554444666666667},
+ {0.175,0.553888666666667,0.183888666666667,0.552778},
+ {0.166111333333333,0.555555333333333,0.175,0.553888666666667},
+ {0.156111333333333,0.557778,0.166111333333333,0.555555333333333},
+ {0.146111333333334,0.56,0.156111333333333,0.557778},
+ {0.137222,0.561666666666667,0.146111333333334,0.56},
+ {0.128333333333333,0.562778,0.137222,0.561666666666667},
+ {0.121111333333333,0.562222,0.128333333333333,0.562778},
+ {0.115555333333333,0.561111333333334,0.121111333333333,0.562222},
+ {0.111111333333334,0.557778,0.115555333333333,0.561111333333334},
+ {0.107778,0.553333333333333,0.111111333333334,0.557778},
+ {0.105555333333334,0.547778,0.107778,0.553333333333333},
+ {0.104444666666667,0.540555333333333,0.105555333333334,0.547778},
+ {0.103333333333333,0.532222,0.104444666666667,0.540555333333333},
+ {0.102778,0.522778,0.103333333333333,0.532222},
+ {0.102778,0.512778,0.102778,0.522778},
+ {0.102778,0.503333333333333,0.102778,0.512778},
+ {0.103333333333333,0.493888666666667,0.102778,0.503333333333333},
+ {0.104444666666667,0.485555333333333,0.103333333333333,0.493888666666667},
+ {0.105555333333334,0.478333333333333,0.104444666666667,0.485555333333333},
+ {0.107778,0.472778,0.105555333333334,0.478333333333333},
+ {0.111111333333334,0.468333333333333,0.107778,0.472778},
+ {0.115555333333333,0.465,0.111111333333334,0.468333333333333},
+ {0.121111333333333,0.463888666666667,0.115555333333333,0.465},
+ {0.128333333333333,0.463333333333334,0.121111333333333,0.463888666666667},
+ {0.137222,0.464444666666667,0.128333333333333,0.463333333333334},
+ {0.146111333333334,0.466111333333333,0.137222,0.464444666666667},
+ {0.156111333333333,0.468333333333333,0.146111333333334,0.466111333333333},
+ {0.166111333333333,0.470555333333333,0.156111333333333,0.468333333333333},
+ {0.175,0.472222,0.166111333333333,0.470555333333333},
+ {0.183888666666667,0.473333333333333,0.175,0.472222},
+ {0.196666666666667,0.471666666666666,0.191111333333333,0.473333333333333},
+ {0.201111333333333,0.468333333333333,0.196666666666667,0.471666666666666},
+ {0.203888666666667,0.464444666666667,0.201111333333333,0.468333333333333},
+ {0.206111333333334,0.46,0.203888666666667,0.464444666666667},
+ {0.207778,0.453888666666667,0.206111333333334,0.46},
+ {0.209444666666666,0.447222,0.207778,0.453888666666667},
+ {0.211111333333334,0.44,0.209444666666666,0.447222},
+ {0.212778,0.431666666666667,0.211111333333334,0.44},
+ {0.213888666666667,0.423333333333333,0.212778,0.431666666666667},
+ {0.214444666666666,0.415,0.213888666666667,0.423333333333333},
+ {0.215,0.406666666666667,0.214444666666666,0.415},
+ {0.214444666666666,0.399444666666666,0.215,0.406666666666667},
+ {0.213333333333334,0.392778,0.214444666666666,0.399444666666666},
+ {0.210555333333333,0.386666666666667,0.213333333333334,0.392778},
+ {0.206666666666667,0.382222,0.210555333333333,0.386666666666667},
+ {0.201111333333333,0.378333333333333,0.206666666666667,0.382222},
+ {0.195,0.376111333333334,0.201111333333333,0.378333333333333},
+ {0.186666666666666,0.374444666666667,0.195,0.376111333333334},
+ {0.177222,0.373333333333333,0.186666666666666,0.374444666666667},
+ {0.153888666666667,0.373888666666667,0.166111333333333,0.373333333333333},
+ {0.140555333333333,0.375,0.153888666666667,0.373888666666667},
+ {0.126111333333333,0.376666666666667,0.140555333333333,0.375},
+ {0.111666666666667,0.378333333333333,0.126111333333333,0.376666666666667},
+ {0.0966666666666664,0.38,0.111666666666667,0.378333333333333},
+ {0.0822220000000004,0.381666666666667,0.0966666666666664,0.38},
+ {0.0688886666666662,0.382778,0.0822220000000004,0.381666666666667},
+ {0.056666666666666,0.383333333333334,0.0688886666666662,0.382778},
+ {0.0361113333333331,0.382222,0.0455553333333327,0.383333333333334},
+ {0.0277780000000002,0.380555333333334,0.0361113333333331,0.382222},
+ {0.0216666666666671,0.378333333333333,0.0277780000000002,0.380555333333334},
+ {0.0172220000000003,0.375555333333333,0.0216666666666671,0.378333333333333},
+ {0.013333333333333,0.372222,0.0172220000000003,0.375555333333333},
+ {0.0105553333333338,0.368333333333334,0.013333333333333,0.372222},
+ {0.00833333333333286,0.363333333333333,0.0105553333333338,0.368333333333334},
+ {0.00611133333333314,0.358333333333333,0.00833333333333286,0.363333333333333},
+ {0.0044446666666668,0.352778,0.00611133333333314,0.358333333333333},
+ {0.00277800000000046,0.346666666666666,0.0044446666666668,0.352778},
+ {0.00166666666666634,0.34,0.00277800000000046,0.346666666666666},
+ {0.000555333333333389,0.333333333333333,0.00166666666666634,0.34},
+ {0,0.327222,0.000555333333333389,0.333333333333333},
+ {0,0.320555333333333,0,0.327222},
+ {0,0.314444666666667,0,0.320555333333333},
+ {0.00111133333333295,0.308888666666667,0,0.314444666666667},
+ {0.00333333333333267,0.303888666666667,0.00111133333333295,0.308888666666667},
+ {0.00611133333333314,0.298888666666667,0.00333333333333267,0.303888666666667},
+ {0.0100000000000004,0.295,0.00611133333333314,0.298888666666667},
+ {0.0149999999999994,0.291666666666667,0.0100000000000004,0.295},
+ {0.0216666666666671,0.288888666666667,0.0149999999999994,0.291666666666667},
+ {0.0283333333333336,0.287222,0.0216666666666671,0.288888666666667},
+ {0.0361113333333331,0.285,0.0283333333333336,0.287222},
+ {0.0455553333333327,0.283333333333333,0.0361113333333331,0.285},
+ {0.0561113333333327,0.281666666666667,0.0455553333333327,0.283333333333333},
+ {0.0677779999999994,0.279444666666667,0.0561113333333327,0.281666666666667},
+ {0.0805553333333329,0.277222,0.0677779999999994,0.279444666666667},
+ {0.0944446666666666,0.274444666666666,0.0805553333333329,0.277222},
+ {0.108888666666666,0.272222,0.0944446666666666,0.274444666666666},
+ {0.124444666666667,0.268888666666667,0.108888666666666,0.272222},
+ {0.139999999999999,0.266111333333334,0.124444666666667,0.268888666666667},
+ {0.156111333333333,0.263888666666666,0.139999999999999,0.266111333333334},
+ {0.172222,0.261111333333333,0.156111333333333,0.263888666666666},
+ {0.187778,0.259444666666666,0.172222,0.261111333333333},
+ {0.203333333333333,0.257778,0.187778,0.259444666666666},
+ {0.217778,0.257222,0.203333333333333,0.257778},
+ {0.231666666666667,0.257778,0.217778,0.257222},
+ {0.244444666666666,0.259444666666666,0.231666666666667,0.257778},
+ {0.256111333333333,0.262222,0.244444666666666,0.259444666666666},
+ {0.266666666666667,0.266111333333334,0.256111333333333,0.262222},
+ {0.276111333333333,0.272222,0.266666666666667,0.266111333333334},
+ {0.283888666666666,0.279444666666667,0.276111333333333,0.272222},
+ {0.290555333333334,0.288888666666667,0.283888666666666,0.279444666666667},
+ {0,0,0,0}
+};
+
+double Icon16[][4] = {
+ {0.105555333333333,0.295,0.103333333333333,0.288888666666667},
+ {0.107221999999999,0.303333333333333,0.105555333333333,0.295},
+ {0.108333333333333,0.312778,0.107221999999999,0.303333333333333},
+ {0.108333333333333,0.323888666666667,0.108333333333333,0.312778},
+ {0.107778,0.336111333333333,0.108333333333333,0.323888666666667},
+ {0.106666666666666,0.349444666666667,0.107778,0.336111333333333},
+ {0.104999999999999,0.363888666666667,0.106666666666666,0.349444666666667},
+ {0.103333333333333,0.378888666666667,0.104999999999999,0.363888666666667},
+ {0.101666666666667,0.393333333333333,0.103333333333333,0.378888666666667},
+ {0.099999999999999,0.407778,0.101666666666667,0.393333333333333},
+ {0.0988886666666661,0.421111333333334,0.099999999999999,0.407778},
+ {0.0983333333333327,0.433333333333334,0.0988886666666661,0.421111333333334},
+ {0.0983333333333327,0.444444666666667,0.0983333333333327,0.433333333333334},
+ {0.0994446666666657,0.453888666666667,0.0983333333333327,0.444444666666667},
+ {0.101111333333333,0.462222,0.0994446666666657,0.453888666666667},
+ {0.103333333333333,0.468333333333333,0.101111333333333,0.462222},
+ {0.106666666666666,0.473333333333333,0.103333333333333,0.468333333333333},
+ {0.110555333333333,0.477222,0.106666666666666,0.473333333333333},
+ {0.115,0.48,0.110555333333333,0.477222},
+ {0.120555333333333,0.482222,0.115,0.48},
+ {0.127222,0.483333333333333,0.120555333333333,0.482222},
+ {0.133888666666666,0.484444666666667,0.127222,0.483333333333333},
+ {0.141111333333332,0.485,0.133888666666666,0.484444666666667},
+ {0.162777999999999,0.484444666666667,0.155555333333333,0.485},
+ {0.169444666666666,0.483333333333333,0.162777999999999,0.484444666666667},
+ {0.176111333333332,0.482222,0.169444666666666,0.483333333333333},
+ {0.181666666666666,0.48,0.176111333333332,0.482222},
+ {0.186111333333333,0.477222,0.181666666666666,0.48},
+ {0.189999999999999,0.473333333333333,0.186111333333333,0.477222},
+ {0.193333333333333,0.468333333333333,0.189999999999999,0.473333333333333},
+ {0.195555333333332,0.462222,0.193333333333333,0.468333333333333},
+ {0.197222,0.453888666666667,0.195555333333332,0.462222},
+ {0.198333333333333,0.444444666666667,0.197222,0.453888666666667},
+ {0.198333333333333,0.433333333333334,0.198333333333333,0.444444666666667},
+ {0.197778,0.421111333333334,0.198333333333333,0.433333333333334},
+ {0.196666666666667,0.407778,0.197778,0.421111333333334},
+ {0.194999999999999,0.393333333333333,0.196666666666667,0.407778},
+ {0.193333333333333,0.378888666666667,0.194999999999999,0.393333333333333},
+ {0.191666666666666,0.363888666666667,0.193333333333333,0.378888666666667},
+ {0.189999999999999,0.349444666666667,0.191666666666666,0.363888666666667},
+ {0.188888666666666,0.336111333333333,0.189999999999999,0.349444666666667},
+ {0.188333333333333,0.323888666666667,0.188888666666666,0.336111333333333},
+ {0.188333333333333,0.312778,0.188333333333333,0.323888666666667},
+ {0.189444666666666,0.303333333333333,0.188333333333333,0.312778},
+ {0.191111333333333,0.295,0.189444666666666,0.303333333333333},
+ {0.193333333333333,0.288888666666667,0.191111333333333,0.295},
+ {0.195555333333332,0.285,0.193333333333333,0.288888666666667},
+ {0.198333333333333,0.281666666666667,0.195555333333332,0.285},
+ {0.201111333333332,0.278888666666666,0.198333333333333,0.281666666666667},
+ {0.204999999999999,0.276111333333333,0.201111333333332,0.278888666666666},
+ {0.208888666666666,0.273888666666667,0.204999999999999,0.276111333333333},
+ {0.212777999999999,0.271111333333333,0.208888666666666,0.273888666666667},
+ {0.217777999999999,0.268888666666667,0.212777999999999,0.271111333333333},
+ {0.222777999999999,0.266111333333334,0.217777999999999,0.268888666666667},
+ {0.227778,0.263888666666666,0.222777999999999,0.266111333333334},
+ {0.232778,0.261666666666667,0.227778,0.263888666666666},
+ {0.238333333333333,0.259444666666666,0.232778,0.261666666666667},
+ {0.243888666666666,0.257778,0.238333333333333,0.259444666666666},
+ {0.248888666666666,0.256666666666667,0.243888666666666,0.257778},
+ {0.253888666666666,0.255555333333334,0.248888666666666,0.256666666666667},
+ {0.263888666666666,0.256666666666667,0.258888666666666,0.255555333333334},
+ {0.267778,0.258333333333334,0.263888666666666,0.256666666666667},
+ {0.271666666666666,0.261666666666667,0.267778,0.258333333333334},
+ {0.275555333333333,0.266111333333334,0.271666666666666,0.261666666666667},
+ {0.278333333333332,0.272222,0.275555333333333,0.266111333333334},
+ {0.281111333333333,0.279444666666667,0.278333333333332,0.272222},
+ {0.283333333333333,0.288888666666667,0.281111333333333,0.279444666666667},
+ {0.284999999999999,0.297222,0.283333333333333,0.288888666666667},
+ {0.286111333333333,0.307222,0.284999999999999,0.297222},
+ {0.287222,0.318333333333333,0.286111333333333,0.307222},
+ {0.288333333333333,0.331111333333334,0.287222,0.318333333333333},
+ {0.288888666666666,0.344444666666667,0.288333333333333,0.331111333333334},
+ {0.289444666666666,0.36,0.288888666666666,0.344444666666667},
+ {0.289999999999999,0.376111333333334,0.289444666666666,0.36},
+ {0.290555333333332,0.393333333333333,0.289999999999999,0.376111333333334},
+ {0.291111333333333,0.411666666666667,0.290555333333332,0.393333333333333},
+ {0.291111333333333,0.431111333333333,0.291111333333333,0.411666666666667},
+ {0.291666666666667,0.450555333333333,0.291111333333333,0.431111333333333},
+ {0.291666666666667,0.471111333333334,0.291666666666667,0.450555333333333},
+ {0.291666666666667,0.492222,0.291666666666667,0.471111333333334},
+ {0.291666666666667,0.513333333333333,0.291666666666667,0.492222},
+ {0.291666666666667,0.533888666666667,0.291666666666667,0.513333333333333},
+ {0.291666666666667,0.555,0.291666666666667,0.533888666666667},
+ {0.291666666666667,0.575555333333333,0.291666666666667,0.555},
+ {0.291111333333333,0.595,0.291666666666667,0.575555333333333},
+ {0.291111333333333,0.614444666666667,0.291111333333333,0.595},
+ {0.290555333333332,0.632778,0.291111333333333,0.614444666666667},
+ {0.289999999999999,0.65,0.290555333333332,0.632778},
+ {0.289444666666666,0.666111333333333,0.289999999999999,0.65},
+ {0.288888666666666,0.681666666666667,0.289444666666666,0.666111333333333},
+ {0.288333333333333,0.695,0.288888666666666,0.681666666666667},
+ {0.287222,0.707778,0.288333333333333,0.695},
+ {0.286111333333333,0.718888666666667,0.287222,0.707778},
+ {0.284999999999999,0.728888666666667,0.286111333333333,0.718888666666667},
+ {0.283333333333333,0.737222,0.284999999999999,0.728888666666667},
+ {0.281111333333333,0.746666666666667,0.283333333333333,0.737222},
+ {0.278333333333332,0.753888666666667,0.281111333333333,0.746666666666667},
+ {0.275555333333333,0.76,0.278333333333332,0.753888666666667},
+ {0.271666666666666,0.764444666666667,0.275555333333333,0.76},
+ {0.267778,0.767778,0.271666666666666,0.764444666666667},
+ {0.263888666666666,0.769444666666667,0.267778,0.767778},
+ {0.258888666666666,0.770555333333334,0.263888666666666,0.769444666666667},
+ {0.248888666666666,0.769444666666667,0.253888666666666,0.770555333333334},
+ {0.243888666666666,0.768333333333333,0.248888666666666,0.769444666666667},
+ {0.238333333333333,0.766666666666667,0.243888666666666,0.768333333333333},
+ {0.232778,0.764444666666667,0.238333333333333,0.766666666666667},
+ {0.227778,0.762222,0.232778,0.764444666666667},
+ {0.222777999999999,0.76,0.227778,0.762222},
+ {0.217777999999999,0.757222,0.222777999999999,0.76},
+ {0.212777999999999,0.755,0.217777999999999,0.757222},
+ {0.208888666666666,0.752222,0.212777999999999,0.755},
+ {0.204999999999999,0.75,0.208888666666666,0.752222},
+ {0.201111333333332,0.747222,0.204999999999999,0.75},
+ {0.198333333333333,0.744444666666666,0.201111333333332,0.747222},
+ {0.195555333333332,0.741111333333333,0.198333333333333,0.744444666666666},
+ {0.193333333333333,0.737222,0.195555333333332,0.741111333333333},
+ {0.191111333333333,0.731111333333333,0.193333333333333,0.737222},
+ {0.189444666666666,0.722778,0.191111333333333,0.731111333333333},
+ {0.188888666666666,0.713333333333334,0.189444666666666,0.722778},
+ {0.189444666666666,0.702222,0.188888666666666,0.713333333333334},
+ {0.190555333333332,0.69,0.189444666666666,0.702222},
+ {0.192222,0.676666666666667,0.190555333333332,0.69},
+ {0.194999999999999,0.662222,0.192222,0.676666666666667},
+ {0.197778,0.647778,0.194999999999999,0.662222},
+ {0.199999999999999,0.632778,0.197778,0.647778},
+ {0.202221999999999,0.618333333333334,0.199999999999999,0.632778},
+ {0.203888666666667,0.605,0.202221999999999,0.618333333333334},
+ {0.204444666666666,0.592778,0.203888666666667,0.605},
+ {0.203888666666667,0.581666666666666,0.204444666666666,0.592778},
+ {0.201666666666666,0.572222,0.203888666666667,0.581666666666666},
+ {0.198333333333333,0.563888666666667,0.201666666666666,0.572222},
+ {0.193333333333333,0.557778,0.198333333333333,0.563888666666667},
+ {0.187222,0.552778,0.193333333333333,0.557778},
+ {0.178888666666666,0.55,0.187222,0.552778},
+ {0.169444666666666,0.548333333333333,0.178888666666666,0.55},
+ {0.158333333333333,0.548888666666667,0.169444666666666,0.548333333333333},
+ {0.146111333333333,0.550555333333334,0.158333333333333,0.548888666666667},
+ {0.132777999999999,0.553888666666667,0.146111333333333,0.550555333333334},
+ {0.118333333333332,0.557778,0.132777999999999,0.553888666666667},
+ {0.103888666666666,0.562222,0.118333333333332,0.557778},
+ {0.0888886666666657,0.566111333333333,0.103888666666666,0.562222},
+ {0.0744446666666659,0.57,0.0888886666666657,0.566111333333333},
+ {0.0611113333333329,0.572778,0.0744446666666659,0.57},
+ {0.0488886666666666,0.573888666666667,0.0611113333333329,0.572778},
+ {0.0377779999999994,0.572778,0.0488886666666666,0.573888666666667},
+ {0.0283333333333324,0.57,0.0377779999999994,0.572778},
+ {0.0199999999999996,0.565,0.0283333333333324,0.57},
+ {0.0138886666666664,0.557778,0.0199999999999996,0.565},
+ {0.00999999999999919,0.551111333333333,0.0138886666666664,0.557778},
+ {0.00722199999999991,0.543333333333334,0.00999999999999919,0.551111333333333},
+ {0.00499999999999901,0.533888666666667,0.00722199999999991,0.543333333333334},
+ {0.00277799999999928,0.523333333333333,0.00499999999999901,0.533888666666667},
+ {0.00166666666666634,0.511666666666667,0.00277799999999928,0.523333333333333},
+ {0.000555333333332205,0.498888666666667,0.00166666666666634,0.511666666666667},
+ {0.000555333333332205,0.485,0.000555333333332205,0.498888666666667},
+ {0,0.470555333333333,0.000555333333332205,0.485},
+ {0.000555333333332205,0.455,0,0.470555333333333},
+ {0.000555333333332205,0.439444666666667,0.000555333333332205,0.455},
+ {0.00111133333333295,0.423333333333333,0.000555333333332205,0.439444666666667},
+ {0.00222199999999972,0.407222,0.00111133333333295,0.423333333333333},
+ {0.00277799999999928,0.391666666666667,0.00222199999999972,0.407222},
+ {0.00388866666666606,0.376111333333334,0.00277799999999928,0.391666666666667},
+ {0.00444466666666562,0.361666666666667,0.00388866666666606,0.376111333333334},
+ {0.00555533333333239,0.347778,0.00444466666666562,0.361666666666667},
+ {0.00666666666666652,0.335,0.00555533333333239,0.347778},
+ {0.00777799999999947,0.323333333333334,0.00666666666666652,0.335},
+ {0.00888866666666625,0.312778,0.00777799999999947,0.323333333333334},
+ {0.0105553333333326,0.303333333333333,0.00888866666666625,0.312778},
+ {0.0122219999999989,0.295555333333333,0.0105553333333326,0.303333333333333},
+ {0.0138886666666664,0.288888666666667,0.0122219999999989,0.295555333333333},
+ {0.0166666666666657,0.282222,0.0138886666666664,0.288888666666667},
+ {0.0199999999999996,0.277222,0.0166666666666657,0.282222},
+ {0.0238886666666656,0.273333333333333,0.0199999999999996,0.277222},
+ {0.0288886666666658,0.270555333333334,0.0238886666666656,0.273333333333333},
+ {0.033888666666666,0.268333333333333,0.0288886666666658,0.270555333333334},
+ {0.0394446666666658,0.267222,0.033888666666666,0.268333333333333},
+ {0.0588886666666658,0.267778,0.0522219999999992,0.267222},
+ {0.0649999999999989,0.268888666666667,0.0588886666666658,0.267778},
+ {0.0716666666666666,0.27,0.0649999999999989,0.268888666666667},
+ {0.0777779999999998,0.271666666666667,0.0716666666666666,0.27},
+ {0.0833333333333333,0.273333333333333,0.0777779999999998,0.271666666666667},
+ {0.0883333333333323,0.275555333333333,0.0833333333333333,0.273333333333333},
+ {0.0933333333333325,0.277778,0.0883333333333323,0.275555333333333},
+ {0.0972219999999998,0.280555333333333,0.0933333333333325,0.277778},
+ {0.100555333333332,0.284444666666667,0.0972219999999998,0.280555333333333},
+ {0.103333333333333,0.288888666666667,0.100555333333332,0.284444666666667},
+ {0,0,0,0}
+};
+
+double Icon17[][4] = {
+ {0.297777333333332,0.291666666666667,0.291110666666666,0.288888666666667},
+ {0.302777333333333,0.295,0.297777333333332,0.291666666666667},
+ {0.306666666666666,0.298888666666667,0.302777333333333,0.295},
+ {0.309443999999999,0.303888666666667,0.306666666666666,0.298888666666667},
+ {0.311666666666666,0.308888666666667,0.309443999999999,0.303888666666667},
+ {0.312777333333333,0.314444666666667,0.311666666666666,0.308888666666667},
+ {0.312777333333333,0.320555333333333,0.312777333333333,0.314444666666667},
+ {0.312777333333333,0.327222,0.312777333333333,0.320555333333333},
+ {0.312222,0.333888666666667,0.312777333333333,0.327222},
+ {0.311110666666667,0.34,0.312222,0.333888666666667},
+ {0.31,0.346666666666666,0.311110666666667,0.34},
+ {0.308333333333332,0.352778,0.31,0.346666666666666},
+ {0.306666666666666,0.358333333333333,0.308333333333332,0.352778},
+ {0.304444,0.363333333333333,0.306666666666666,0.358333333333333},
+ {0.302221999999999,0.368333333333334,0.304444,0.363333333333333},
+ {0.299444,0.372222,0.302221999999999,0.368333333333334},
+ {0.295555333333333,0.375555333333333,0.299444,0.372222},
+ {0.291110666666666,0.378333333333333,0.295555333333333,0.375555333333333},
+ {0.285,0.380555333333334,0.291110666666666,0.378333333333333},
+ {0.276666666666666,0.382222,0.285,0.380555333333334},
+ {0.267221999999999,0.383333333333334,0.276666666666666,0.382222},
+ {0.243888666666666,0.382778,0.256110666666666,0.383333333333334},
+ {0.230555333333333,0.381666666666667,0.243888666666666,0.382778},
+ {0.216110666666667,0.38,0.230555333333333,0.381666666666667},
+ {0.201666666666667,0.378333333333333,0.216110666666667,0.38},
+ {0.186666666666666,0.376666666666667,0.201666666666667,0.378333333333333},
+ {0.172221999999999,0.375,0.186666666666666,0.376666666666667},
+ {0.158888666666666,0.373888666666667,0.172221999999999,0.375},
+ {0.146666666666666,0.373333333333333,0.158888666666666,0.373888666666667},
+ {0.126110666666667,0.374444666666667,0.135555333333333,0.373333333333333},
+ {0.117777333333333,0.376111333333334,0.126110666666667,0.374444666666667},
+ {0.111666666666666,0.378333333333333,0.117777333333333,0.376111333333334},
+ {0.106666666666667,0.381666666666667,0.111666666666666,0.378333333333333},
+ {0.102777333333333,0.385555333333333,0.106666666666667,0.381666666666667},
+ {0.099999999999999,0.39,0.102777333333333,0.385555333333333},
+ {0.0977773333333332,0.395555333333334,0.099999999999999,0.39},
+ {0.0966666666666664,0.402222,0.0977773333333332,0.395555333333334},
+ {0.0955553333333334,0.408888666666667,0.0966666666666664,0.402222},
+ {0.095,0.416111333333333,0.0955553333333334,0.408888666666667},
+ {0.095,0.423333333333333,0.095,0.416111333333333},
+ {0.095,0.430555333333333,0.095,0.423333333333333},
+ {0.0955553333333334,0.437778,0.095,0.430555333333333},
+ {0.0966666666666664,0.444444666666667,0.0955553333333334,0.437778},
+ {0.0977773333333332,0.451111333333333,0.0966666666666664,0.444444666666667},
+ {0.099999999999999,0.456666666666666,0.0977773333333332,0.451111333333333},
+ {0.102777333333333,0.461111333333333,0.099999999999999,0.456666666666666},
+ {0.106666666666667,0.465,0.102777333333333,0.461111333333333},
+ {0.111666666666666,0.468333333333333,0.106666666666667,0.465},
+ {0.117777333333333,0.470555333333333,0.111666666666666,0.468333333333333},
+ {0.126110666666667,0.472222,0.117777333333333,0.470555333333333},
+ {0.146666666666666,0.471666666666666,0.135555333333333,0.472222},
+ {0.158888666666666,0.469444666666667,0.146666666666666,0.471666666666666},
+ {0.172221999999999,0.466666666666667,0.158888666666666,0.469444666666667},
+ {0.186666666666666,0.463333333333334,0.172221999999999,0.466666666666667},
+ {0.201666666666667,0.46,0.186666666666666,0.463333333333334},
+ {0.216110666666667,0.456666666666666,0.201666666666667,0.46},
+ {0.230555333333333,0.453888666666667,0.216110666666667,0.456666666666666},
+ {0.243888666666666,0.452222,0.230555333333333,0.453888666666667},
+ {0.256110666666666,0.451666666666667,0.243888666666666,0.452222},
+ {0.267221999999999,0.452778,0.256110666666666,0.451666666666667},
+ {0.276666666666666,0.455555333333334,0.267221999999999,0.452778},
+ {0.285,0.461111333333333,0.276666666666666,0.455555333333334},
+ {0.291110666666666,0.468333333333333,0.285,0.461111333333333},
+ {0.294999999999999,0.475,0.291110666666666,0.468333333333333},
+ {0.297777333333332,0.482778,0.294999999999999,0.475},
+ {0.300555333333333,0.492222,0.297777333333332,0.482778},
+ {0.302777333333333,0.502778,0.300555333333333,0.492222},
+ {0.305,0.514444666666667,0.302777333333333,0.502778},
+ {0.306666666666666,0.527222,0.305,0.514444666666667},
+ {0.307777333333333,0.541111333333333,0.306666666666666,0.527222},
+ {0.309443999999999,0.555555333333333,0.307777333333333,0.541111333333333},
+ {0.310555333333333,0.571111333333333,0.309443999999999,0.555555333333333},
+ {0.311666666666666,0.586666666666667,0.310555333333333,0.571111333333333},
+ {0.312222,0.602778,0.311666666666666,0.586666666666667},
+ {0.312777333333333,0.618888666666667,0.312222,0.602778},
+ {0.312777333333333,0.634444666666666,0.312777333333333,0.618888666666667},
+ {0.312777333333333,0.65,0.312777333333333,0.634444666666666},
+ {0.312222,0.664444666666667,0.312777333333333,0.65},
+ {0.311110666666667,0.678333333333333,0.312222,0.664444666666667},
+ {0.31,0.691111333333333,0.311110666666667,0.678333333333333},
+ {0.307777333333333,0.702778,0.31,0.691111333333333},
+ {0.305,0.713333333333334,0.307777333333333,0.702778},
+ {0.301110666666666,0.722778,0.305,0.713333333333334},
+ {0.296666666666666,0.730555333333333,0.301110666666666,0.722778},
+ {0.291110666666666,0.737222,0.296666666666666,0.730555333333333},
+ {0.284443999999999,0.742778,0.291110666666666,0.737222},
+ {0.276666666666666,0.747222,0.284443999999999,0.742778},
+ {0.267221999999999,0.750555333333333,0.276666666666666,0.747222},
+ {0.256666666666666,0.753333333333333,0.267221999999999,0.750555333333333},
+ {0.245,0.755,0.256666666666666,0.753333333333333},
+ {0.232222,0.756111333333333,0.245,0.755},
+ {0.218333333333333,0.756666666666667,0.232222,0.756111333333333},
+ {0.188333333333333,0.756111333333333,0.203333333333333,0.756666666666667},
+ {0.172221999999999,0.755,0.188333333333333,0.756111333333333},
+ {0.156110666666667,0.753888666666667,0.172221999999999,0.755},
+ {0.140555333333333,0.752778,0.156110666666667,0.753888666666667},
+ {0.124443999999999,0.751111333333334,0.140555333333333,0.752778},
+ {0.109444,0.749444666666667,0.124443999999999,0.751111333333334},
+ {0.0944439999999993,0.748333333333333,0.109444,0.749444666666667},
+ {0.0805553333333329,0.746666666666667,0.0944439999999993,0.748333333333333},
+ {0.0677773333333332,0.745,0.0805553333333329,0.746666666666667},
+ {0.0561106666666665,0.743888666666667,0.0677773333333332,0.745},
+ {0.0455553333333327,0.742222,0.0561106666666665,0.743888666666667},
+ {0.0361106666666657,0.740555333333334,0.0455553333333327,0.742222},
+ {0.0283333333333324,0.738888666666667,0.0361106666666657,0.740555333333334},
+ {0.0216666666666659,0.737222,0.0283333333333324,0.738888666666667},
+ {0.0149999999999994,0.734444666666667,0.0216666666666659,0.737222},
+ {0.00999999999999919,0.731111333333333,0.0149999999999994,0.734444666666667},
+ {0.00611066666666578,0.727222,0.00999999999999919,0.731111333333333},
+ {0.00333333333333267,0.722222,0.00611066666666578,0.727222},
+ {0.00111066666666678,0.717222,0.00333333333333267,0.722222},
+ {0,0.711666666666667,0.00111066666666678,0.717222},
+ {0,0.705555333333334,0,0.711666666666667},
+ {0,0.698888666666667,0,0.705555333333334},
+ {0.000555333333333389,0.692222,0,0.698888666666667},
+ {0.00166666666666634,0.686111333333334,0.000555333333333389,0.692222},
+ {0.00277733333333311,0.679444666666667,0.00166666666666634,0.686111333333334},
+ {0.00444399999999945,0.673333333333333,0.00277733333333311,0.679444666666667},
+ {0.00611066666666578,0.667778,0.00444399999999945,0.673333333333333},
+ {0.00833333333333286,0.662778,0.00611066666666578,0.667778},
+ {0.0105553333333326,0.657778,0.00833333333333286,0.662778},
+ {0.013333333333333,0.653888666666666,0.0105553333333326,0.657778},
+ {0.0172219999999991,0.650555333333333,0.013333333333333,0.653888666666666},
+ {0.0216666666666659,0.647778,0.0172219999999991,0.650555333333333},
+ {0.0277773333333329,0.645555333333334,0.0216666666666659,0.647778},
+ {0.0361106666666657,0.643888666666667,0.0277773333333329,0.645555333333334},
+ {0.0455553333333327,0.642778,0.0361106666666657,0.643888666666667},
+ {0.0688886666666662,0.643333333333333,0.056666666666666,0.642778},
+ {0.0822219999999992,0.644444666666667,0.0688886666666662,0.643333333333333},
+ {0.0966666666666664,0.646111333333333,0.0822219999999992,0.644444666666667},
+ {0.111666666666666,0.647778,0.0966666666666664,0.646111333333333},
+ {0.126110666666667,0.649444666666666,0.111666666666666,0.647778},
+ {0.140555333333333,0.651111333333333,0.126110666666667,0.649444666666666},
+ {0.153888666666666,0.652222,0.140555333333333,0.651111333333333},
+ {0.166110666666666,0.652778,0.153888666666666,0.652222},
+ {0.186666666666666,0.651666666666667,0.177221999999999,0.652778},
+ {0.194999999999999,0.65,0.186666666666666,0.651666666666667},
+ {0.201110666666666,0.647778,0.194999999999999,0.65},
+ {0.206110666666666,0.644444666666667,0.201110666666666,0.647778},
+ {0.21,0.640555333333333,0.206110666666666,0.644444666666667},
+ {0.212777333333333,0.636111333333333,0.21,0.640555333333333},
+ {0.215,0.630555333333334,0.212777333333333,0.636111333333333},
+ {0.216110666666667,0.623888666666667,0.215,0.630555333333334},
+ {0.217222,0.617222,0.216110666666667,0.623888666666667},
+ {0.217777333333333,0.61,0.217222,0.617222},
+ {0.217777333333333,0.602778,0.217777333333333,0.61},
+ {0.217777333333333,0.595555333333333,0.217777333333333,0.602778},
+ {0.217222,0.588333333333334,0.217777333333333,0.595555333333333},
+ {0.216110666666667,0.581666666666666,0.217222,0.588333333333334},
+ {0.215,0.575,0.216110666666667,0.581666666666666},
+ {0.212777333333333,0.569444666666667,0.215,0.575},
+ {0.21,0.565,0.212777333333333,0.569444666666667},
+ {0.206110666666666,0.561111333333334,0.21,0.565},
+ {0.201110666666666,0.557778,0.206110666666666,0.561111333333334},
+ {0.194999999999999,0.555555333333333,0.201110666666666,0.557778},
+ {0.186666666666666,0.553888666666667,0.194999999999999,0.555555333333333},
+ {0.166110666666666,0.554444666666667,0.177221999999999,0.553888666666667},
+ {0.153888666666666,0.556666666666667,0.166110666666666,0.554444666666667},
+ {0.140555333333333,0.559444666666667,0.153888666666666,0.556666666666667},
+ {0.126110666666667,0.562778,0.140555333333333,0.559444666666667},
+ {0.111666666666666,0.566111333333333,0.126110666666667,0.562778},
+ {0.0966666666666664,0.569444666666667,0.111666666666666,0.566111333333333},
+ {0.0822219999999992,0.572222,0.0966666666666664,0.569444666666667},
+ {0.0688886666666662,0.573888666666667,0.0822219999999992,0.572222},
+ {0.056666666666666,0.574444666666666,0.0688886666666662,0.573888666666667},
+ {0.0455553333333327,0.573333333333334,0.056666666666666,0.574444666666666},
+ {0.0361106666666657,0.570555333333333,0.0455553333333327,0.573333333333334},
+ {0.0277773333333329,0.565,0.0361106666666657,0.570555333333333},
+ {0.0216666666666659,0.557778,0.0277773333333329,0.565},
+ {0.0177773333333325,0.551111333333333,0.0216666666666659,0.557778},
+ {0.0149999999999994,0.543333333333334,0.0177773333333325,0.551111333333333},
+ {0.0122220000000001,0.533888666666667,0.0149999999999994,0.543333333333334},
+ {0.00999999999999919,0.523333333333333,0.0122220000000001,0.533888666666667},
+ {0.0077773333333333,0.511666666666667,0.00999999999999919,0.523333333333333},
+ {0.00611066666666578,0.498888666666667,0.0077773333333333,0.511666666666667},
+ {0.00499999999999901,0.485,0.00611066666666578,0.498888666666667},
+ {0.00333333333333267,0.470555333333333,0.00499999999999901,0.485},
+ {0.00222199999999972,0.455,0.00333333333333267,0.470555333333333},
+ {0.00111066666666678,0.439444666666667,0.00222199999999972,0.455},
+ {0.000555333333333389,0.423333333333333,0.00111066666666678,0.439444666666667},
+ {0,0.407222,0.000555333333333389,0.423333333333333},
+ {0,0.391666666666667,0,0.407222},
+ {0,0.376111333333334,0,0.391666666666667},
+ {0.000555333333333389,0.361666666666667,0,0.376111333333334},
+ {0.00166666666666634,0.347778,0.000555333333333389,0.361666666666667},
+ {0.00277733333333311,0.335,0.00166666666666634,0.347778},
+ {0.00499999999999901,0.323333333333334,0.00277733333333311,0.335},
+ {0.0077773333333333,0.312778,0.00499999999999901,0.323333333333334},
+ {0.0116666666666667,0.303333333333333,0.0077773333333333,0.312778},
+ {0.0161106666666662,0.295555333333333,0.0116666666666667,0.303333333333333},
+ {0.0216666666666659,0.288888666666667,0.0161106666666662,0.295555333333333},
+ {0.0283333333333324,0.283333333333333,0.0216666666666659,0.288888666666667},
+ {0.0361106666666657,0.278888666666666,0.0283333333333324,0.283333333333333},
+ {0.0455553333333327,0.275555333333333,0.0361106666666657,0.278888666666666},
+ {0.0561106666666665,0.272778,0.0455553333333327,0.275555333333333},
+ {0.0677773333333332,0.271111333333333,0.0561106666666665,0.272778},
+ {0.0805553333333329,0.27,0.0677773333333332,0.271111333333333},
+ {0.0944439999999993,0.269444666666667,0.0805553333333329,0.27},
+ {0.124443999999999,0.27,0.109444,0.269444666666667},
+ {0.140555333333333,0.271111333333333,0.124443999999999,0.27},
+ {0.156666666666666,0.272222,0.140555333333333,0.271111333333333},
+ {0.172221999999999,0.273333333333333,0.156666666666666,0.272222},
+ {0.188333333333333,0.275,0.172221999999999,0.273333333333333},
+ {0.203333333333333,0.276666666666667,0.188333333333333,0.275},
+ {0.218333333333333,0.277778,0.203333333333333,0.276666666666667},
+ {0.232222,0.279444666666667,0.218333333333333,0.277778},
+ {0.245,0.281111333333333,0.232222,0.279444666666667},
+ {0.256666666666666,0.282222,0.245,0.281111333333333},
+ {0.267221999999999,0.283888666666667,0.256666666666666,0.282222},
+ {0.276666666666666,0.285555333333334,0.267221999999999,0.283888666666667},
+ {0.284443999999999,0.287222,0.276666666666666,0.285555333333334},
+ {0.291110666666666,0.288888666666667,0.284443999999999,0.287222},
+ {0,0,0,0}
+};
+
+double Icon18[][4] = {
+ {0.0249999999999998,0.288888666666667,0.0205553333333341,0.297222},
+ {0.0205553333333341,0.297222,0.0166666666666669,0.307222},
+ {0.0166666666666669,0.307222,0.013333333333333,0.318333333333333},
+ {0.013333333333333,0.318333333333333,0.0105553333333338,0.331111333333334},
+ {0.0105553333333338,0.331111333333334,0.00833333333333404,0.344444666666667},
+ {0.00833333333333404,0.344444666666667,0.00611133333333314,0.36},
+ {0.00611133333333314,0.36,0.0044446666666668,0.376111333333334},
+ {0.0044446666666668,0.376111333333334,0.00333333333333385,0.393333333333333},
+ {0.00333333333333385,0.393333333333333,0.00222199999999972,0.411666666666667},
+ {0.00222199999999972,0.411666666666667,0.00111133333333413,0.431111333333333},
+ {0.00111133333333413,0.431111333333333,0.000555333333333389,0.450555333333333},
+ {0.000555333333333389,0.450555333333333,0,0.471111333333334},
+ {0,0.471111333333334,0,0.492222},
+ {0,0.492222,0,0.513333333333333},
+ {0,0.513333333333333,0,0.533888666666667},
+ {0,0.533888666666667,0,0.555},
+ {0,0.555,0.000555333333333389,0.575555333333333},
+ {0.000555333333333389,0.575555333333333,0.00111133333333413,0.595},
+ {0.00111133333333413,0.595,0.00222199999999972,0.614444666666667},
+ {0.00222199999999972,0.614444666666667,0.00333333333333385,0.632778},
+ {0.00333333333333385,0.632778,0.0044446666666668,0.65},
+ {0.0044446666666668,0.65,0.00611133333333314,0.666111333333333},
+ {0.00611133333333314,0.666111333333333,0.00833333333333404,0.681666666666667},
+ {0.00833333333333404,0.681666666666667,0.0105553333333338,0.695},
+ {0.0105553333333338,0.695,0.013333333333333,0.707778},
+ {0.013333333333333,0.707778,0.0166666666666669,0.718888666666667},
+ {0.0166666666666669,0.718888666666667,0.0205553333333341,0.728888666666667},
+ {0.0205553333333341,0.728888666666667,0.0249999999999998,0.737222},
+ {0.0249999999999998,0.737222,0.0311113333333341,0.745555333333333},
+ {0.0311113333333341,0.745555333333333,0.038333333333334,0.752778},
+ {0.038333333333334,0.752778,0.0466666666666669,0.758888666666667},
+ {0.0466666666666669,0.758888666666667,0.0555553333333331,0.763333333333333},
+ {0.0555553333333331,0.763333333333333,0.066111333333333,0.767222},
+ {0.066111333333333,0.767222,0.0772220000000002,0.769444666666667},
+ {0.0772220000000002,0.769444666666667,0.0894446666666665,0.771111333333333},
+ {0.0894446666666665,0.771111333333333,0.102778000000001,0.772222},
+ {0.102778000000001,0.772222,0.116111333333334,0.772778},
+ {0.116111333333334,0.772778,0.130555333333334,0.772222},
+ {0.130555333333334,0.772222,0.145000000000001,0.771666666666667},
+ {0.145000000000001,0.771666666666667,0.16,0.771111333333333},
+ {0.16,0.771111333333333,0.174444666666667,0.769444666666667},
+ {0.174444666666667,0.769444666666667,0.188888666666667,0.767778},
+ {0.188888666666667,0.767778,0.203333333333333,0.766111333333334},
+ {0.203333333333333,0.766111333333334,0.216666666666667,0.763888666666666},
+ {0.216666666666667,0.763888666666666,0.23,0.762222},
+ {0.23,0.762222,0.242222000000001,0.759444666666666},
+ {0.242222000000001,0.759444666666666,0.253333333333334,0.756666666666667},
+ {0.253333333333334,0.756666666666667,0.263888666666666,0.753888666666667},
+ {0.263888666666666,0.753888666666667,0.272778,0.750555333333333},
+ {0.272778,0.750555333333333,0.281111333333334,0.746666666666667},
+ {0.281111333333334,0.746666666666667,0.288333333333334,0.742222},
+ {0.288333333333334,0.742222,0.294444666666667,0.737222},
+ {0.294444666666667,0.737222,0.300000000000001,0.730555333333333},
+ {0.300000000000001,0.730555333333333,0.304444666666667,0.722778},
+ {0.304444666666667,0.722778,0.308333333333334,0.713333333333334},
+ {0.308333333333334,0.713333333333334,0.311111333333334,0.702778},
+ {0.311111333333334,0.702778,0.313333333333334,0.691111333333333},
+ {0.313333333333334,0.691111333333333,0.314444666666667,0.678333333333333},
+ {0.314444666666667,0.678333333333333,0.315555333333333,0.664444666666667},
+ {0.315555333333333,0.664444666666667,0.316111333333333,0.65},
+ {0.316111333333333,0.65,0.316111333333333,0.634444666666666},
+ {0.316111333333333,0.634444666666666,0.316111333333333,0.618888666666667},
+ {0.316111333333333,0.618888666666667,0.315555333333333,0.602778},
+ {0.315555333333333,0.602778,0.315,0.586666666666667},
+ {0.315,0.586666666666667,0.313888666666667,0.571111333333333},
+ {0.313888666666667,0.571111333333333,0.312778,0.555555333333333},
+ {0.312778,0.555555333333333,0.311111333333334,0.541111333333333},
+ {0.311111333333334,0.541111333333333,0.31,0.527222},
+ {0.31,0.527222,0.308333333333334,0.514444666666667},
+ {0.308333333333334,0.514444666666667,0.306111333333334,0.502778},
+ {0.306111333333334,0.502778,0.303888666666667,0.492222},
+ {0.303888666666667,0.492222,0.301111333333334,0.482778},
+ {0.301111333333334,0.482778,0.298333333333333,0.475},
+ {0.298333333333333,0.475,0.294444666666667,0.468333333333333},
+ {0.294444666666667,0.468333333333333,0.288333333333334,0.461111333333333},
+ {0.288333333333334,0.461111333333333,0.28,0.455555333333334},
+ {0.28,0.455555333333334,0.270555333333334,0.452778},
+ {0.270555333333334,0.452778,0.259444666666667,0.451666666666667},
+ {0.259444666666667,0.451666666666667,0.247222000000001,0.452222},
+ {0.247222000000001,0.452222,0.233888666666666,0.453888666666667},
+ {0.233888666666666,0.453888666666667,0.219444666666667,0.456666666666666},
+ {0.219444666666667,0.456666666666666,0.205000000000001,0.46},
+ {0.205000000000001,0.46,0.19,0.463333333333334},
+ {0.19,0.463333333333334,0.175555333333334,0.466666666666667},
+ {0.175555333333334,0.466666666666667,0.162222,0.469444666666667},
+ {0.162222,0.469444666666667,0.15,0.471666666666666},
+ {0.15,0.471666666666666,0.138888666666666,0.472222},
+ {0.129444666666667,0.472222,0.121111333333334,0.470555333333333},
+ {0.121111333333334,0.470555333333333,0.115000000000001,0.468333333333333},
+ {0.115000000000001,0.468333333333333,0.110000000000001,0.465},
+ {0.110000000000001,0.465,0.106111333333333,0.461111333333333},
+ {0.106111333333333,0.461111333333333,0.103333333333334,0.456666666666666},
+ {0.103333333333334,0.456666666666666,0.101111333333333,0.451111333333333},
+ {0.101111333333333,0.451111333333333,0.1,0.444444666666667},
+ {0.1,0.444444666666667,0.0988886666666673,0.437778},
+ {0.0988886666666673,0.437778,0.0983333333333339,0.430555333333333},
+ {0.0983333333333339,0.430555333333333,0.0983333333333339,0.423333333333333},
+ {0.0983333333333339,0.423333333333333,0.0983333333333339,0.416111333333333},
+ {0.0983333333333339,0.416111333333333,0.0988886666666673,0.408888666666667},
+ {0.0988886666666673,0.408888666666667,0.1,0.402222},
+ {0.1,0.402222,0.101111333333333,0.395555333333334},
+ {0.101111333333333,0.395555333333334,0.103333333333334,0.39},
+ {0.103333333333334,0.39,0.106111333333333,0.385555333333333},
+ {0.106111333333333,0.385555333333333,0.110000000000001,0.381666666666667},
+ {0.110000000000001,0.381666666666667,0.115000000000001,0.378333333333333},
+ {0.115000000000001,0.378333333333333,0.121111333333334,0.376111333333334},
+ {0.121111333333334,0.376111333333334,0.129444666666667,0.374444666666667},
+ {0.129444666666667,0.374444666666667,0.138888666666666,0.373333333333333},
+ {0.15,0.373333333333333,0.162222,0.373888666666667},
+ {0.162222,0.373888666666667,0.175555333333334,0.375},
+ {0.175555333333334,0.375,0.19,0.376666666666667},
+ {0.19,0.376666666666667,0.205000000000001,0.378333333333333},
+ {0.205000000000001,0.378333333333333,0.219444666666667,0.38},
+ {0.219444666666667,0.38,0.233888666666666,0.381666666666667},
+ {0.233888666666666,0.381666666666667,0.247222000000001,0.382778},
+ {0.247222000000001,0.382778,0.259444666666667,0.383333333333334},
+ {0.270555333333334,0.383333333333334,0.28,0.382222},
+ {0.28,0.382222,0.288333333333334,0.380555333333334},
+ {0.288333333333334,0.380555333333334,0.294444666666667,0.378333333333333},
+ {0.294444666666667,0.378333333333333,0.298888666666667,0.375555333333333},
+ {0.298888666666667,0.375555333333333,0.302778,0.372222},
+ {0.302778,0.372222,0.305555333333333,0.368333333333334},
+ {0.305555333333333,0.368333333333334,0.307778,0.363333333333333},
+ {0.307778,0.363333333333333,0.31,0.358333333333333},
+ {0.31,0.358333333333333,0.311666666666667,0.352778},
+ {0.311666666666667,0.352778,0.313333333333334,0.346666666666666},
+ {0.313333333333334,0.346666666666666,0.314444666666667,0.34},
+ {0.314444666666667,0.34,0.315555333333333,0.333333333333333},
+ {0.315555333333333,0.333333333333333,0.316111333333333,0.327222},
+ {0.316111333333333,0.327222,0.316111333333333,0.320555333333333},
+ {0.316111333333333,0.320555333333333,0.316111333333333,0.314444666666667},
+ {0.316111333333333,0.314444666666667,0.315,0.308888666666667},
+ {0.315,0.308888666666667,0.312778,0.303888666666667},
+ {0.312778,0.303888666666667,0.31,0.298888666666667},
+ {0.31,0.298888666666667,0.306111333333334,0.295},
+ {0.306111333333334,0.295,0.301111333333334,0.291666666666667},
+ {0.301111333333334,0.291666666666667,0.294444666666667,0.288888666666667},
+ {0.294444666666667,0.288888666666667,0.287778000000001,0.287222},
+ {0.287778000000001,0.287222,0.28,0.285},
+ {0.28,0.285,0.270555333333334,0.283333333333333},
+ {0.270555333333334,0.283333333333333,0.26,0.281666666666667},
+ {0.26,0.281666666666667,0.248333333333334,0.279444666666667},
+ {0.248333333333334,0.279444666666667,0.235555333333334,0.277222},
+ {0.235555333333334,0.277222,0.221666666666666,0.274444666666666},
+ {0.221666666666666,0.274444666666666,0.206666666666667,0.272222},
+ {0.206666666666667,0.272222,0.191666666666666,0.268888666666667},
+ {0.191666666666666,0.268888666666667,0.175555333333334,0.266111333333334},
+ {0.175555333333334,0.266111333333334,0.159444666666667,0.263888666666666},
+ {0.159444666666667,0.263888666666666,0.143888666666667,0.261111333333333},
+ {0.143888666666667,0.261111333333333,0.127778,0.259444666666666},
+ {0.127778,0.259444666666666,0.112778,0.257778},
+ {0.112778,0.257778,0.0977780000000005,0.257222},
+ {0.0977780000000005,0.257222,0.0838886666666667,0.257778},
+ {0.0838886666666667,0.257778,0.0711113333333332,0.259444666666666},
+ {0.0711113333333332,0.259444666666666,0.0594446666666665,0.262222},
+ {0.0594446666666665,0.262222,0.0488886666666666,0.266111333333334},
+ {0.0488886666666666,0.266111333333334,0.0394446666666669,0.272222},
+ {0.0394446666666669,0.272222,0.0316666666666675,0.279444666666667},
+ {0.0316666666666675,0.279444666666667,0.0249999999999998,0.288888666666667},
+ {0.204444666666667,0.557778,0.207778,0.562222},
+ {0.207778,0.562222,0.210000000000001,0.567778},
+ {0.210000000000001,0.567778,0.211111333333334,0.575},
+ {0.211111333333334,0.575,0.212222000000001,0.583888666666667},
+ {0.212222000000001,0.583888666666667,0.212778,0.592778},
+ {0.212778,0.592778,0.212778,0.602778},
+ {0.212778,0.602778,0.212778,0.612778},
+ {0.212778,0.612778,0.212222000000001,0.621666666666667},
+ {0.212222000000001,0.621666666666667,0.211111333333334,0.630555333333334},
+ {0.211111333333334,0.630555333333334,0.210000000000001,0.637778},
+ {0.210000000000001,0.637778,0.207778,0.643333333333333},
+ {0.207778,0.643333333333333,0.204444666666667,0.647778},
+ {0.204444666666667,0.647778,0.2,0.651111333333333},
+ {0.2,0.651111333333333,0.194444666666667,0.653333333333334},
+ {0.194444666666667,0.653333333333334,0.187222000000001,0.654444666666667},
+ {0.187222000000001,0.654444666666667,0.178888666666667,0.655555333333333},
+ {0.178888666666667,0.655555333333333,0.169444666666667,0.656111333333333},
+ {0.15,0.656111333333333,0.140555333333334,0.655555333333333},
+ {0.140555333333334,0.655555333333333,0.132222,0.654444666666667},
+ {0.132222,0.654444666666667,0.125,0.653333333333334},
+ {0.125,0.653333333333334,0.119444666666666,0.651111333333333},
+ {0.119444666666666,0.651111333333333,0.115000000000001,0.647778},
+ {0.115000000000001,0.647778,0.111666666666667,0.643333333333333},
+ {0.111666666666667,0.643333333333333,0.109444666666667,0.637778},
+ {0.109444666666667,0.637778,0.108333333333333,0.630555333333334},
+ {0.108333333333333,0.630555333333334,0.107222,0.621666666666667},
+ {0.107222,0.621666666666667,0.106666666666667,0.612778},
+ {0.106666666666667,0.612778,0.106666666666667,0.602778},
+ {0.106666666666667,0.602778,0.106666666666667,0.592778},
+ {0.106666666666667,0.592778,0.107222,0.583888666666667},
+ {0.107222,0.583888666666667,0.108333333333333,0.575},
+ {0.108333333333333,0.575,0.109444666666667,0.567778},
+ {0.109444666666667,0.567778,0.111666666666667,0.562222},
+ {0.111666666666667,0.562222,0.115000000000001,0.557778},
+ {0.115000000000001,0.557778,0.119444666666666,0.554444666666667},
+ {0.119444666666666,0.554444666666667,0.125,0.552222},
+ {0.125,0.552222,0.132222,0.551111333333333},
+ {0.132222,0.551111333333333,0.140555333333334,0.55},
+ {0.140555333333334,0.55,0.15,0.549444666666667},
+ {0.169444666666667,0.549444666666667,0.178888666666667,0.55},
+ {0.178888666666667,0.55,0.187222000000001,0.551111333333333},
+ {0.187222000000001,0.551111333333333,0.194444666666667,0.552222},
+ {0.194444666666667,0.552222,0.2,0.554444666666667},
+ {0.2,0.554444666666667,0.204444666666667,0.557778},
+ {0,0,0,0}
+};
+
+double Icon19[][4] = {
+ {0.293889333333333,0.297222,0.291111333333333,0.288888666666667},
+ {0.295556,0.307222,0.293889333333333,0.297222},
+ {0.296666666666667,0.318333333333333,0.295556,0.307222},
+ {0.296666666666667,0.331111333333334,0.296666666666667,0.318333333333333},
+ {0.296111333333333,0.344444666666667,0.296666666666667,0.331111333333334},
+ {0.294444666666666,0.36,0.296111333333333,0.344444666666667},
+ {0.292222666666667,0.376111333333334,0.294444666666666,0.36},
+ {0.289444666666666,0.393333333333333,0.292222666666667,0.376111333333334},
+ {0.286111333333333,0.411666666666667,0.289444666666666,0.393333333333333},
+ {0.282222666666667,0.431111333333333,0.286111333333333,0.411666666666667},
+ {0.277778,0.450555333333333,0.282222666666667,0.431111333333333},
+ {0.272778,0.471111333333334,0.277778,0.450555333333333},
+ {0.268333333333333,0.492222,0.272778,0.471111333333334},
+ {0.262778,0.513333333333333,0.268333333333333,0.492222},
+ {0.257777999999999,0.533888666666667,0.262778,0.513333333333333},
+ {0.252222666666666,0.555,0.257777999999999,0.533888666666667},
+ {0.247222666666666,0.575555333333333,0.252222666666666,0.555},
+ {0.241666666666667,0.595,0.247222666666666,0.575555333333333},
+ {0.236666666666667,0.614444666666667,0.241666666666667,0.595},
+ {0.231666666666667,0.632778,0.236666666666667,0.614444666666667},
+ {0.227222666666667,0.65,0.231666666666667,0.632778},
+ {0.222778000000001,0.666111333333333,0.227222666666667,0.65},
+ {0.218889333333334,0.681666666666667,0.222778000000001,0.666111333333333},
+ {0.215000000000001,0.695,0.218889333333334,0.681666666666667},
+ {0.211111333333333,0.707778,0.215000000000001,0.695},
+ {0.207778,0.718888666666667,0.211111333333333,0.707778},
+ {0.204444666666667,0.728888666666667,0.207778,0.718888666666667},
+ {0.201111333333332,0.737222,0.204444666666667,0.728888666666667},
+ {0.197778,0.744444666666666,0.201111333333332,0.737222},
+ {0.194444666666667,0.751111333333334,0.197778,0.744444666666666},
+ {0.191111333333334,0.756666666666667,0.194444666666667,0.751111333333334},
+ {0.187777999999999,0.761111333333333,0.191111333333334,0.756666666666667},
+ {0.184444666666667,0.765,0.187777999999999,0.761111333333333},
+ {0.180556,0.767778,0.184444666666667,0.765},
+ {0.176666666666667,0.770555333333334,0.180556,0.767778},
+ {0.172778000000001,0.772222,0.176666666666667,0.770555333333334},
+ {0.168889333333333,0.773888666666667,0.172778000000001,0.772222},
+ {0.164999999999999,0.774444666666666,0.168889333333333,0.773888666666667},
+ {0.160556,0.775555333333333,0.164999999999999,0.774444666666666},
+ {0.147778,0.775,0.152222666666667,0.775555333333333},
+ {0.143889333333334,0.774444666666666,0.147778,0.775},
+ {0.140000000000001,0.773333333333333,0.143889333333334,0.774444666666666},
+ {0.136111333333332,0.772222,0.140000000000001,0.773333333333333},
+ {0.132222666666666,0.771111333333333,0.136111333333332,0.772222},
+ {0.128333333333333,0.769444666666667,0.132222666666666,0.771111333333333},
+ {0.125,0.767778,0.128333333333333,0.769444666666667},
+ {0.122222666666666,0.765555333333333,0.125,0.767778},
+ {0.119444666666666,0.762778,0.122222666666666,0.765555333333333},
+ {0.117222666666666,0.76,0.119444666666666,0.762778},
+ {0.115,0.756666666666667,0.117222666666666,0.76},
+ {0.113889333333333,0.752778,0.115,0.756666666666667},
+ {0.112778000000001,0.748333333333333,0.113889333333333,0.752778},
+ {0.111666666666667,0.743333333333334,0.112778000000001,0.748333333333333},
+ {0.111666666666667,0.737222,0.111666666666667,0.743333333333334},
+ {0.112222666666668,0.728888666666667,0.111666666666667,0.737222},
+ {0.112778000000001,0.719444666666667,0.112222666666668,0.728888666666667},
+ {0.115,0.708888666666667,0.112778000000001,0.719444666666667},
+ {0.117222666666666,0.696111333333333,0.115,0.708888666666667},
+ {0.121111333333334,0.682778,0.117222666666666,0.696111333333333},
+ {0.125,0.667222,0.121111333333334,0.682778},
+ {0.13,0.651111333333333,0.125,0.667222},
+ {0.135,0.633888666666667,0.13,0.651111333333333},
+ {0.141111333333332,0.615555333333334,0.135,0.633888666666667},
+ {0.147222666666667,0.596666666666666,0.141111333333332,0.615555333333334},
+ {0.153889333333334,0.577222,0.147222666666667,0.596666666666666},
+ {0.160556,0.557778,0.153889333333334,0.577222},
+ {0.167222666666667,0.538333333333333,0.160556,0.557778},
+ {0.173889333333333,0.518888666666667,0.167222666666667,0.538333333333333},
+ {0.179444666666666,0.5,0.173889333333333,0.518888666666667},
+ {0.185556000000001,0.481666666666667,0.179444666666666,0.5},
+ {0.190556000000001,0.464444666666667,0.185556000000001,0.481666666666667},
+ {0.194444666666667,0.448333333333334,0.190556000000001,0.464444666666667},
+ {0.198333333333333,0.432778,0.194444666666667,0.448333333333334},
+ {0.200555999999999,0.419444666666667,0.198333333333333,0.432778},
+ {0.202222666666666,0.406666666666667,0.200555999999999,0.419444666666667},
+ {0.202778,0.396111333333333,0.202222666666666,0.406666666666667},
+ {0.202778,0.386666666666667,0.202778,0.396111333333333},
+ {0.201111333333332,0.378333333333333,0.202778,0.386666666666667},
+ {0.197222666666666,0.368333333333334,0.201111333333332,0.378333333333333},
+ {0.191111333333334,0.361666666666667,0.197222666666666,0.368333333333334},
+ {0.182777999999999,0.357222,0.191111333333334,0.361666666666667},
+ {0.172222666666668,0.355555333333333,0.182777999999999,0.357222},
+ {0.159999999999999,0.356111333333333,0.172222666666668,0.355555333333333},
+ {0.146111333333333,0.358333333333333,0.159999999999999,0.356111333333333},
+ {0.131111333333334,0.361666666666667,0.146111333333333,0.358333333333333},
+ {0.115556,0.365555333333334,0.131111333333334,0.361666666666667},
+ {0.099999999999999,0.37,0.115556,0.365555333333334},
+ {0.0850000000000009,0.374444666666667,0.099999999999999,0.37},
+ {0.070556000000001,0.377778,0.0850000000000009,0.374444666666667},
+ {0.0572226666666656,0.380555333333334,0.070556000000001,0.377778},
+ {0.0461113333333335,0.381666666666667,0.0572226666666656,0.380555333333334},
+ {0.0361113333333331,0.382222,0.0461113333333335,0.381666666666667},
+ {0.0277780000000002,0.380555333333334,0.0361113333333331,0.382222},
+ {0.0216666666666671,0.378333333333333,0.0277780000000002,0.380555333333334},
+ {0.0172226666666665,0.375555333333333,0.0216666666666671,0.378333333333333},
+ {0.013333333333333,0.372222,0.0172226666666665,0.375555333333333},
+ {0.0105559999999999,0.368333333333334,0.013333333333333,0.372222},
+ {0.00833333333333286,0.363333333333333,0.0105559999999999,0.368333333333334},
+ {0.00611133333333314,0.358333333333333,0.00833333333333286,0.363333333333333},
+ {0.0044446666666668,0.352778,0.00611133333333314,0.358333333333333},
+ {0.00277800000000046,0.346666666666666,0.0044446666666668,0.352778},
+ {0.00166666666666634,0.34,0.00277800000000046,0.346666666666666},
+ {0.000555999999999557,0.333333333333333,0.00166666666666634,0.34},
+ {0,0.327222,0.000555999999999557,0.333333333333333},
+ {0,0.320555333333333,0,0.327222},
+ {0,0.314444666666667,0,0.320555333333333},
+ {0.00111133333333295,0.308888666666667,0,0.314444666666667},
+ {0.00333333333333385,0.303888666666667,0.00111133333333295,0.308888666666667},
+ {0.00611133333333314,0.298888666666667,0.00333333333333385,0.303888666666667},
+ {0.0100000000000004,0.295,0.00611133333333314,0.298888666666667},
+ {0.0149999999999994,0.291666666666667,0.0100000000000004,0.295},
+ {0.0216666666666671,0.288888666666667,0.0149999999999994,0.291666666666667},
+ {0.0283333333333336,0.287222,0.0216666666666671,0.288888666666667},
+ {0.0361113333333331,0.285,0.0283333333333336,0.287222},
+ {0.0455560000000001,0.283333333333333,0.0361113333333331,0.285},
+ {0.0566666666666672,0.281666666666667,0.0455560000000001,0.283333333333333},
+ {0.0683333333333328,0.279444666666667,0.0566666666666672,0.281666666666667},
+ {0.0816666666666658,0.277222,0.0683333333333328,0.279444666666667},
+ {0.096111333333333,0.274444666666666,0.0816666666666658,0.277222},
+ {0.111666666666667,0.272222,0.096111333333333,0.274444666666666},
+ {0.127222666666666,0.268888666666667,0.111666666666667,0.272222},
+ {0.143889333333334,0.266111333333334,0.127222666666666,0.268888666666667},
+ {0.160556,0.263888666666666,0.143889333333334,0.266111333333334},
+ {0.177222666666668,0.261111333333333,0.160556,0.263888666666666},
+ {0.193333333333333,0.259444666666666,0.177222666666668,0.261111333333333},
+ {0.209444666666667,0.257778,0.193333333333333,0.259444666666666},
+ {0.224444666666666,0.257222,0.209444666666667,0.257778},
+ {0.238333333333332,0.257778,0.224444666666666,0.257222},
+ {0.251111333333334,0.259444666666666,0.238333333333332,0.257778},
+ {0.262222666666666,0.262222,0.251111333333334,0.259444666666666},
+ {0.271666666666666,0.266111333333334,0.262222666666666,0.262222},
+ {0.279999999999999,0.272222,0.271666666666666,0.266111333333334},
+ {0.286111333333333,0.279444666666667,0.279999999999999,0.272222},
+ {0.291111333333333,0.288888666666667,0.286111333333333,0.279444666666667},
+ {0,0,0,0}
+};
+
+double Icon20[][4] = {
+ {0.0988886666666673,0.285555333333334,0.0916666666666662,0.288888666666667},
+ {0.106666666666667,0.283333333333333,0.0988886666666673,0.285555333333334},
+ {0.113888666666665,0.282222,0.106666666666667,0.283333333333333},
+ {0.121666666666667,0.281111333333333,0.113888666666665,0.282222},
+ {0.128888666666666,0.280555333333333,0.121666666666667,0.281111333333333},
+ {0.151666666666666,0.281111333333333,0.144444,0.280555333333333},
+ {0.159444000000001,0.282222,0.151666666666666,0.281111333333333},
+ {0.166666666666667,0.283333333333333,0.159444000000001,0.282222},
+ {0.174443999999999,0.285555333333334,0.166666666666667,0.283333333333333},
+ {0.181666666666667,0.288888666666667,0.174443999999999,0.285555333333334},
+ {0.188333333333333,0.292778,0.181666666666667,0.288888666666667},
+ {0.195,0.297222,0.188333333333333,0.292778},
+ {0.201666666666666,0.302222,0.195,0.297222},
+ {0.208888666666667,0.307778,0.201666666666666,0.302222},
+ {0.216110666666665,0.313888666666667,0.208888666666667,0.307778},
+ {0.223888666666667,0.320555333333333,0.216110666666665,0.313888666666667},
+ {0.231666666666667,0.327222,0.223888666666667,0.320555333333333},
+ {0.239443999999999,0.334444666666667,0.231666666666667,0.327222},
+ {0.246110666666667,0.341111333333333,0.239443999999999,0.334444666666667},
+ {0.252777333333334,0.348333333333333,0.246110666666667,0.341111333333333},
+ {0.258888666666666,0.355555333333333,0.252777333333334,0.348333333333333},
+ {0.263888666666666,0.362778,0.258888666666666,0.355555333333333},
+ {0.268333333333333,0.370555333333333,0.263888666666666,0.362778},
+ {0.271110666666667,0.378333333333333,0.268333333333333,0.370555333333333},
+ {0.272777333333333,0.386666666666667,0.271110666666667,0.378333333333333},
+ {0.273333333333333,0.395555333333334,0.272777333333333,0.386666666666667},
+ {0.273333333333333,0.404444666666667,0.273333333333333,0.395555333333334},
+ {0.271666666666666,0.413888666666667,0.273333333333333,0.404444666666667},
+ {0.269444,0.423888666666667,0.271666666666666,0.413888666666667},
+ {0.266666666666666,0.433333333333334,0.269444,0.423888666666667},
+ {0.263333333333333,0.443888666666667,0.266666666666666,0.433333333333334},
+ {0.26,0.453888666666667,0.263333333333333,0.443888666666667},
+ {0.256666666666668,0.463888666666667,0.26,0.453888666666667},
+ {0.253888666666666,0.473888666666667,0.256666666666668,0.463888666666667},
+ {0.251666666666667,0.483888666666667,0.253888666666666,0.473888666666667},
+ {0.25,0.493888666666667,0.251666666666667,0.483888666666667},
+ {0.248888666666666,0.503888666666667,0.25,0.493888666666667},
+ {0.248888666666666,0.513333333333333,0.248888666666666,0.503888666666667},
+ {0.248888666666666,0.522778,0.248888666666666,0.513333333333333},
+ {0.25,0.532778,0.248888666666666,0.522778},
+ {0.251666666666667,0.542222,0.25,0.532778},
+ {0.253888666666666,0.552222,0.251666666666667,0.542222},
+ {0.256666666666668,0.562222,0.253888666666666,0.552222},
+ {0.26,0.572778,0.256666666666668,0.562222},
+ {0.263333333333333,0.582778,0.26,0.572778},
+ {0.266666666666666,0.592778,0.263333333333333,0.582778},
+ {0.269444,0.602778,0.266666666666666,0.592778},
+ {0.271666666666666,0.612222,0.269444,0.602778},
+ {0.273333333333333,0.621666666666667,0.271666666666666,0.612222},
+ {0.273333333333333,0.631111333333333,0.273333333333333,0.621666666666667},
+ {0.272777333333333,0.639444666666667,0.273333333333333,0.631111333333333},
+ {0.271110666666667,0.647778,0.272777333333333,0.639444666666667},
+ {0.268333333333333,0.655555333333333,0.271110666666667,0.647778},
+ {0.263888666666666,0.663333333333333,0.268333333333333,0.655555333333333},
+ {0.258888666666666,0.670555333333333,0.263888666666666,0.663333333333333},
+ {0.252777333333334,0.677778,0.258888666666666,0.670555333333333},
+ {0.246110666666667,0.685,0.252777333333334,0.677778},
+ {0.239443999999999,0.691666666666666,0.246110666666667,0.685},
+ {0.231666666666667,0.698888666666667,0.239443999999999,0.691666666666666},
+ {0.223888666666667,0.705555333333334,0.231666666666667,0.698888666666667},
+ {0.216110666666665,0.712222,0.223888666666667,0.705555333333334},
+ {0.208888666666667,0.718333333333333,0.216110666666665,0.712222},
+ {0.201666666666666,0.723888666666667,0.208888666666667,0.718333333333333},
+ {0.195,0.728888666666667,0.201666666666666,0.723888666666667},
+ {0.188333333333333,0.733333333333333,0.195,0.728888666666667},
+ {0.181666666666667,0.737222,0.188333333333333,0.733333333333333},
+ {0.174443999999999,0.740555333333334,0.181666666666667,0.737222},
+ {0.166666666666667,0.742778,0.174443999999999,0.740555333333334},
+ {0.159444000000001,0.743888666666667,0.166666666666667,0.742778},
+ {0.151666666666666,0.745,0.159444000000001,0.743888666666667},
+ {0.144444,0.745555333333333,0.151666666666666,0.745},
+ {0.121666666666667,0.745,0.128888666666666,0.745555333333333},
+ {0.113888666666665,0.743888666666667,0.121666666666667,0.745},
+ {0.106666666666667,0.742778,0.113888666666665,0.743888666666667},
+ {0.0988886666666673,0.740555333333334,0.106666666666667,0.742778},
+ {0.0916666666666662,0.737222,0.0988886666666673,0.740555333333334},
+ {0.0850000000000009,0.733333333333333,0.0916666666666662,0.737222},
+ {0.0783333333333331,0.728888666666667,0.0850000000000009,0.733333333333333},
+ {0.0716666666666654,0.723888666666667,0.0783333333333331,0.728888666666667},
+ {0.0644439999999993,0.718333333333333,0.0716666666666654,0.723888666666667},
+ {0.0572220000000006,0.712222,0.0644439999999993,0.718333333333333},
+ {0.0494439999999988,0.705555333333334,0.0572220000000006,0.712222},
+ {0.0416666666666667,0.698888666666667,0.0494439999999988,0.705555333333334},
+ {0.0338886666666672,0.691666666666666,0.0416666666666667,0.698888666666667},
+ {0.0272219999999995,0.685,0.0338886666666672,0.691666666666666},
+ {0.0205553333333341,0.677778,0.0272219999999995,0.685},
+ {0.0144439999999998,0.670555333333333,0.0205553333333341,0.677778},
+ {0.00944399999999964,0.663333333333333,0.0144439999999998,0.670555333333333},
+ {0.00500000000000019,0.655555333333333,0.00944399999999964,0.663333333333333},
+ {0.00222200000000091,0.647778,0.00500000000000019,0.655555333333333},
+ {0.000555333333333389,0.639444666666667,0.00222200000000091,0.647778},
+ {0,0.631111333333333,0.000555333333333389,0.639444666666667},
+ {0,0.621666666666667,0,0.631111333333333},
+ {0.00166666666666752,0.612222,0,0.621666666666667},
+ {0.00388866666666606,0.602778,0.00166666666666752,0.612222},
+ {0.00666666666666771,0.592778,0.00388866666666606,0.602778},
+ {0.0100000000000004,0.582778,0.00666666666666771,0.592778},
+ {0.013333333333333,0.572778,0.0100000000000004,0.582778},
+ {0.0166666666666657,0.562222,0.013333333333333,0.572778},
+ {0.019444,0.552222,0.0166666666666657,0.562222},
+ {0.0216666666666659,0.542222,0.019444,0.552222},
+ {0.0233333333333334,0.532778,0.0216666666666659,0.542222},
+ {0.0244440000000002,0.522778,0.0233333333333334,0.532778},
+ {0.0244440000000002,0.513333333333333,0.0244440000000002,0.522778},
+ {0.0244440000000002,0.503888666666667,0.0244440000000002,0.513333333333333},
+ {0.0233333333333334,0.493888666666667,0.0244440000000002,0.503888666666667},
+ {0.0216666666666659,0.483888666666667,0.0233333333333334,0.493888666666667},
+ {0.019444,0.473888666666667,0.0216666666666659,0.483888666666667},
+ {0.0166666666666657,0.463888666666667,0.019444,0.473888666666667},
+ {0.013333333333333,0.453888666666667,0.0166666666666657,0.463888666666667},
+ {0.0100000000000004,0.443888666666667,0.013333333333333,0.453888666666667},
+ {0.00666666666666771,0.433333333333334,0.0100000000000004,0.443888666666667},
+ {0.00388866666666606,0.423888666666667,0.00666666666666771,0.433333333333334},
+ {0.00166666666666752,0.413888666666667,0.00388866666666606,0.423888666666667},
+ {0,0.404444666666667,0.00166666666666752,0.413888666666667},
+ {0,0.395555333333334,0,0.404444666666667},
+ {0.000555333333333389,0.386666666666667,0,0.395555333333334},
+ {0.00222200000000091,0.378333333333333,0.000555333333333389,0.386666666666667},
+ {0.00500000000000019,0.370555333333333,0.00222200000000091,0.378333333333333},
+ {0.00944399999999964,0.362778,0.00500000000000019,0.370555333333333},
+ {0.0144439999999998,0.355555333333333,0.00944399999999964,0.362778},
+ {0.0205553333333341,0.348333333333333,0.0144439999999998,0.355555333333333},
+ {0.0272219999999995,0.341111333333333,0.0205553333333341,0.348333333333333},
+ {0.0338886666666672,0.334444666666667,0.0272219999999995,0.341111333333333},
+ {0.0416666666666667,0.327222,0.0338886666666672,0.334444666666667},
+ {0.0494439999999988,0.320555333333333,0.0416666666666667,0.327222},
+ {0.0572220000000006,0.313888666666667,0.0494439999999988,0.320555333333333},
+ {0.0644439999999993,0.307778,0.0572220000000006,0.313888666666667},
+ {0.0716666666666654,0.302222,0.0644439999999993,0.307778},
+ {0.0783333333333331,0.297222,0.0716666666666654,0.302222},
+ {0.0850000000000009,0.292778,0.0783333333333331,0.297222},
+ {0.0916666666666662,0.288888666666667,0.0850000000000009,0.292778},
+ {0.181666666666667,0.557778,0.185,0.562222},
+ {0.185,0.562222,0.187222000000001,0.567778},
+ {0.187222000000001,0.567778,0.188333333333333,0.575},
+ {0.188333333333333,0.575,0.189443999999999,0.583888666666667},
+ {0.189443999999999,0.583888666666667,0.19,0.592778},
+ {0.19,0.592778,0.19,0.602778},
+ {0.19,0.602778,0.19,0.612778},
+ {0.19,0.612778,0.189443999999999,0.621666666666667},
+ {0.189443999999999,0.621666666666667,0.188333333333333,0.630555333333334},
+ {0.188333333333333,0.630555333333334,0.187222000000001,0.637778},
+ {0.187222000000001,0.637778,0.185,0.643333333333333},
+ {0.185,0.643333333333333,0.181666666666667,0.647778},
+ {0.181666666666667,0.647778,0.177222,0.651111333333333},
+ {0.177222,0.651111333333333,0.171666666666667,0.653333333333334},
+ {0.171666666666667,0.653333333333334,0.164444000000001,0.654444666666667},
+ {0.164444000000001,0.654444666666667,0.155555333333332,0.655555333333333},
+ {0.155555333333332,0.655555333333333,0.146666666666666,0.656111333333333},
+ {0.126666666666668,0.656111333333333,0.117777333333334,0.655555333333333},
+ {0.117777333333334,0.655555333333333,0.108888666666668,0.654444666666667},
+ {0.108888666666668,0.654444666666667,0.101666666666667,0.653333333333334},
+ {0.101666666666667,0.653333333333334,0.0961106666666656,0.651111333333333},
+ {0.0961106666666656,0.651111333333333,0.0916666666666662,0.647778},
+ {0.0916666666666662,0.647778,0.0883333333333335,0.643333333333333},
+ {0.0883333333333335,0.643333333333333,0.0861106666666676,0.637778},
+ {0.0861106666666676,0.637778,0.0850000000000009,0.630555333333334},
+ {0.0850000000000009,0.630555333333334,0.0838886666666667,0.621666666666667},
+ {0.0838886666666667,0.621666666666667,0.0833333333333333,0.612778},
+ {0.0833333333333333,0.612778,0.0833333333333333,0.602778},
+ {0.0833333333333333,0.602778,0.0833333333333333,0.592778},
+ {0.0833333333333333,0.592778,0.0838886666666667,0.583888666666667},
+ {0.0838886666666667,0.583888666666667,0.0850000000000009,0.575},
+ {0.0850000000000009,0.575,0.0861106666666676,0.567778},
+ {0.0861106666666676,0.567778,0.0883333333333335,0.562222},
+ {0.0883333333333335,0.562222,0.0916666666666662,0.557778},
+ {0.0916666666666662,0.557778,0.0961106666666656,0.554444666666667},
+ {0.0961106666666656,0.554444666666667,0.101666666666667,0.552222},
+ {0.101666666666667,0.552222,0.108888666666668,0.551111333333333},
+ {0.108888666666668,0.551111333333333,0.117777333333334,0.55},
+ {0.117777333333334,0.55,0.126666666666668,0.549444666666667},
+ {0.146666666666666,0.549444666666667,0.155555333333332,0.55},
+ {0.155555333333332,0.55,0.164444000000001,0.551111333333333},
+ {0.164444000000001,0.551111333333333,0.171666666666667,0.552222},
+ {0.171666666666667,0.552222,0.177222,0.554444666666667},
+ {0.177222,0.554444666666667,0.181666666666667,0.557778},
+ {0.181666666666667,0.378333333333333,0.185,0.382778},
+ {0.185,0.382778,0.187222000000001,0.388333333333333},
+ {0.187222000000001,0.388333333333333,0.188333333333333,0.395555333333334},
+ {0.188333333333333,0.395555333333334,0.189443999999999,0.404444666666667},
+ {0.189443999999999,0.404444666666667,0.19,0.413333333333333},
+ {0.19,0.413333333333333,0.19,0.423333333333333},
+ {0.19,0.423333333333333,0.19,0.433333333333334},
+ {0.19,0.433333333333334,0.189443999999999,0.442222},
+ {0.189443999999999,0.442222,0.188333333333333,0.451111333333333},
+ {0.188333333333333,0.451111333333333,0.187222000000001,0.458333333333333},
+ {0.187222000000001,0.458333333333333,0.185,0.463888666666667},
+ {0.185,0.463888666666667,0.181666666666667,0.468333333333333},
+ {0.181666666666667,0.468333333333333,0.177222,0.471666666666666},
+ {0.177222,0.471666666666666,0.171666666666667,0.473888666666667},
+ {0.171666666666667,0.473888666666667,0.164444000000001,0.475},
+ {0.164444000000001,0.475,0.155555333333332,0.476111333333333},
+ {0.155555333333332,0.476111333333333,0.146666666666666,0.476666666666667},
+ {0.126666666666668,0.476666666666667,0.117777333333334,0.476111333333333},
+ {0.117777333333334,0.476111333333333,0.108888666666668,0.475},
+ {0.108888666666668,0.475,0.101666666666667,0.473888666666667},
+ {0.101666666666667,0.473888666666667,0.0961106666666656,0.471666666666666},
+ {0.0961106666666656,0.471666666666666,0.0916666666666662,0.468333333333333},
+ {0.0916666666666662,0.468333333333333,0.0883333333333335,0.463888666666667},
+ {0.0883333333333335,0.463888666666667,0.0861106666666676,0.458333333333333},
+ {0.0861106666666676,0.458333333333333,0.0850000000000009,0.451111333333333},
+ {0.0850000000000009,0.451111333333333,0.0838886666666667,0.442222},
+ {0.0838886666666667,0.442222,0.0833333333333333,0.433333333333334},
+ {0.0833333333333333,0.433333333333334,0.0833333333333333,0.423333333333333},
+ {0.0833333333333333,0.423333333333333,0.0833333333333333,0.413333333333333},
+ {0.0833333333333333,0.413333333333333,0.0838886666666667,0.404444666666667},
+ {0.0838886666666667,0.404444666666667,0.0850000000000009,0.395555333333334},
+ {0.0850000000000009,0.395555333333334,0.0861106666666676,0.388333333333333},
+ {0.0861106666666676,0.388333333333333,0.0883333333333335,0.382778},
+ {0.0883333333333335,0.382778,0.0916666666666662,0.378333333333333},
+ {0.0916666666666662,0.378333333333333,0.0961106666666656,0.375},
+ {0.0961106666666656,0.375,0.101666666666667,0.372778},
+ {0.101666666666667,0.372778,0.108888666666668,0.371666666666667},
+ {0.108888666666668,0.371666666666667,0.117777333333334,0.370555333333333},
+ {0.117777333333334,0.370555333333333,0.126666666666668,0.37},
+ {0.146666666666666,0.37,0.155555333333332,0.370555333333333},
+ {0.155555333333332,0.370555333333333,0.164444000000001,0.371666666666667},
+ {0.164444000000001,0.371666666666667,0.171666666666667,0.372778},
+ {0.171666666666667,0.372778,0.177222,0.375},
+ {0.177222,0.375,0.181666666666667,0.378333333333333},
+ {0,0,0,0}
+};
+
+double Icon21[][4] = {
+ {0.0277780000000002,0.283888666666667,0.0216666666666659,0.288888666666667},
+ {0.034999999999999,0.279444666666667,0.0277780000000002,0.283888666666667},
+ {0.0427779999999984,0.275555333333333,0.034999999999999,0.279444666666667},
+ {0.0522226666666654,0.272222,0.0427779999999984,0.275555333333333},
+ {0.0627779999999992,0.269444666666667,0.0522226666666654,0.272222},
+ {0.0738893333333337,0.266666666666667,0.0627779999999992,0.269444666666667},
+ {0.0861113333333326,0.263888666666666,0.0738893333333337,0.266666666666667},
+ {0.0988893333333323,0.262222,0.0861113333333326,0.263888666666666},
+ {0.112777999999999,0.26,0.0988893333333323,0.262222},
+ {0.126666666666665,0.258333333333334,0.112777999999999,0.26},
+ {0.141666666666666,0.256666666666667,0.126666666666665,0.258333333333334},
+ {0.156111333333333,0.255,0.141666666666666,0.256666666666667},
+ {0.170556,0.254444666666667,0.156111333333333,0.255},
+ {0.185556000000001,0.253888666666667,0.170556,0.254444666666667},
+ {0.199444666666667,0.253333333333333,0.185556000000001,0.253888666666667},
+ {0.213333333333334,0.253888666666667,0.199444666666667,0.253333333333333},
+ {0.226111333333333,0.255,0.213333333333334,0.253888666666667},
+ {0.238333333333332,0.256666666666667,0.226111333333333,0.255},
+ {0.249444666666667,0.258888666666667,0.238333333333332,0.256666666666667},
+ {0.26,0.262778,0.249444666666667,0.258888666666667},
+ {0.269444666666667,0.267222,0.26,0.262778},
+ {0.277222666666667,0.273333333333333,0.269444666666667,0.267222},
+ {0.284444666666666,0.280555333333333,0.277222666666667,0.273333333333333},
+ {0.290556,0.288888666666667,0.284444666666666,0.280555333333333},
+ {0.294999999999999,0.297222,0.290556,0.288888666666667},
+ {0.298889333333333,0.307222,0.294999999999999,0.297222},
+ {0.302222666666665,0.318333333333333,0.298889333333333,0.307222},
+ {0.304444666666666,0.331111333333334,0.302222666666665,0.318333333333333},
+ {0.306666666666667,0.344444666666667,0.304444666666666,0.331111333333334},
+ {0.308333333333332,0.36,0.306666666666667,0.344444666666667},
+ {0.309444666666666,0.376111333333334,0.308333333333332,0.36},
+ {0.31,0.393333333333333,0.309444666666666,0.376111333333334},
+ {0.31,0.411666666666667,0.31,0.393333333333333},
+ {0.31,0.431111333333333,0.31,0.411666666666667},
+ {0.309444666666666,0.450555333333333,0.31,0.431111333333333},
+ {0.308889333333333,0.471111333333334,0.309444666666666,0.450555333333333},
+ {0.308333333333332,0.492222,0.308889333333333,0.471111333333334},
+ {0.307222666666666,0.513333333333333,0.308333333333332,0.492222},
+ {0.306111333333334,0.533888666666667,0.307222666666666,0.513333333333333},
+ {0.305,0.555,0.306111333333334,0.533888666666667},
+ {0.303889333333333,0.575555333333333,0.305,0.555},
+ {0.302777999999999,0.595,0.303889333333333,0.575555333333333},
+ {0.301666666666667,0.614444666666667,0.302777999999999,0.595},
+ {0.300556,0.632778,0.301666666666667,0.614444666666667},
+ {0.299444666666666,0.65,0.300556,0.632778},
+ {0.298333333333332,0.666111333333333,0.299444666666666,0.65},
+ {0.296666666666667,0.681666666666667,0.298333333333332,0.666111333333333},
+ {0.295556,0.695,0.296666666666667,0.681666666666667},
+ {0.294444666666666,0.707778,0.295556,0.695},
+ {0.293333333333332,0.718888666666667,0.294444666666666,0.707778},
+ {0.292222666666667,0.728888666666667,0.293333333333332,0.718888666666667},
+ {0.290556,0.737222,0.292222666666667,0.728888666666667},
+ {0.288333333333334,0.745555333333333,0.290556,0.737222},
+ {0.286111333333333,0.752778,0.288333333333334,0.745555333333333},
+ {0.283333333333334,0.758888666666667,0.286111333333333,0.752778},
+ {0.280555999999999,0.763333333333333,0.283333333333334,0.758888666666667},
+ {0.276666666666666,0.766111333333334,0.280555999999999,0.763333333333333},
+ {0.273333333333333,0.768888666666667,0.276666666666666,0.766111333333334},
+ {0.268889333333334,0.77,0.273333333333333,0.768888666666667},
+ {0.265000000000001,0.770555333333334,0.268889333333334,0.77},
+ {0.26,0.77,0.265000000000001,0.770555333333334},
+ {0.255555999999999,0.769444666666667,0.26,0.77},
+ {0.250556000000001,0.768333333333333,0.255555999999999,0.769444666666667},
+ {0.245556000000001,0.766666666666667,0.250556000000001,0.768333333333333},
+ {0.241111333333334,0.765,0.245556000000001,0.766666666666667},
+ {0.236111333333334,0.762778,0.241111333333334,0.765},
+ {0.231666666666667,0.760555333333333,0.236111333333334,0.762778},
+ {0.226666666666667,0.758333333333334,0.231666666666667,0.760555333333333},
+ {0.222778000000001,0.756111333333333,0.226666666666667,0.758333333333334},
+ {0.218333333333334,0.753888666666667,0.222778000000001,0.756111333333333},
+ {0.214999999999999,0.751111333333334,0.218333333333334,0.753888666666667},
+ {0.211111333333333,0.748888666666667,0.214999999999999,0.751111333333334},
+ {0.208333333333333,0.746666666666667,0.211111333333333,0.748888666666667},
+ {0.205555999999999,0.743888666666667,0.208333333333333,0.746666666666667},
+ {0.203333333333333,0.740555333333334,0.205555999999999,0.743888666666667},
+ {0.201111333333332,0.737222,0.203333333333333,0.740555333333334},
+ {0.198889333333334,0.731111333333333,0.201111333333332,0.737222},
+ {0.197222666666666,0.722778,0.198889333333334,0.731111333333333},
+ {0.196666666666665,0.713333333333334,0.197222666666666,0.722778},
+ {0.197222666666666,0.702222,0.196666666666665,0.713333333333334},
+ {0.198333333333333,0.69,0.197222666666666,0.702222},
+ {0.200555999999999,0.676666666666667,0.198333333333333,0.69},
+ {0.202778,0.662222,0.200555999999999,0.676666666666667},
+ {0.205555999999999,0.647778,0.202778,0.662222},
+ {0.207778,0.632778,0.205555999999999,0.647778},
+ {0.209999999999998,0.618333333333334,0.207778,0.632778},
+ {0.211666666666666,0.605,0.209999999999998,0.618333333333334},
+ {0.212222666666667,0.592778,0.211666666666666,0.605},
+ {0.211666666666666,0.581666666666666,0.212222666666667,0.592778},
+ {0.209444666666665,0.572222,0.211666666666666,0.581666666666666},
+ {0.206111333333332,0.563888666666667,0.209444666666665,0.572222},
+ {0.201111333333332,0.557778,0.206111333333332,0.563888666666667},
+ {0.195,0.552778,0.201111333333332,0.557778},
+ {0.186666666666665,0.55,0.195,0.552778},
+ {0.177222666666665,0.548333333333333,0.186666666666665,0.55},
+ {0.166111333333333,0.548888666666667,0.177222666666665,0.548333333333333},
+ {0.153889333333332,0.550555333333334,0.166111333333333,0.548888666666667},
+ {0.140555999999999,0.553888666666667,0.153889333333332,0.550555333333334},
+ {0.126111333333332,0.557778,0.140555999999999,0.553888666666667},
+ {0.111666666666667,0.562222,0.126111333333332,0.557778},
+ {0.0966666666666664,0.566111333333333,0.111666666666667,0.562222},
+ {0.0822226666666666,0.57,0.0966666666666664,0.566111333333333},
+ {0.0688893333333335,0.572778,0.0822226666666666,0.57},
+ {0.0566666666666672,0.573888666666667,0.0688893333333335,0.572778},
+ {0.0455560000000001,0.572778,0.0566666666666672,0.573888666666667},
+ {0.0361113333333331,0.57,0.0455560000000001,0.572778},
+ {0.0277780000000002,0.565,0.0361113333333331,0.57},
+ {0.0216666666666659,0.557778,0.0277780000000002,0.565},
+ {0.0177779999999998,0.551111333333333,0.0216666666666659,0.557778},
+ {0.0150000000000006,0.543333333333334,0.0177779999999998,0.551111333333333},
+ {0.0122226666666663,0.533888666666667,0.0150000000000006,0.543333333333334},
+ {0.0100000000000004,0.523333333333333,0.0122226666666663,0.533888666666667},
+ {0.00777799999999947,0.511666666666667,0.0100000000000004,0.523333333333333},
+ {0.00611133333333195,0.498888666666667,0.00777799999999947,0.511666666666667},
+ {0.00500000000000019,0.485,0.00611133333333195,0.498888666666667},
+ {0.00333333333333267,0.470555333333333,0.00500000000000019,0.485},
+ {0.00222266666666589,0.455,0.00333333333333267,0.470555333333333},
+ {0.00166666666666515,0.439444666666667,0.00222266666666589,0.455},
+ {0.000556000000000741,0.423333333333333,0.00166666666666515,0.439444666666667},
+ {0,0.407222,0.000556000000000741,0.423333333333333},
+ {0,0.391666666666667,0,0.407222},
+ {0,0.376111333333334,0,0.391666666666667},
+ {0.000556000000000741,0.361666666666667,0,0.376111333333334},
+ {0.00166666666666515,0.347778,0.000556000000000741,0.361666666666667},
+ {0.00277799999999928,0.335,0.00166666666666515,0.347778},
+ {0.00500000000000019,0.323333333333334,0.00277799999999928,0.335},
+ {0.00777799999999947,0.312778,0.00500000000000019,0.323333333333334},
+ {0.0116666666666655,0.303333333333333,0.00777799999999947,0.312778},
+ {0.0161113333333323,0.295555333333333,0.0116666666666655,0.303333333333333},
+ {0.0216666666666659,0.288888666666667,0.0161113333333323,0.295555333333333},
+ {0.201111333333332,0.378333333333333,0.204444666666667,0.382778},
+ {0.204444666666667,0.382778,0.206666666666666,0.388333333333333},
+ {0.206666666666666,0.388333333333333,0.207778,0.395555333333334},
+ {0.207778,0.395555333333334,0.208889333333334,0.404444666666667},
+ {0.208889333333334,0.404444666666667,0.209444666666665,0.413333333333333},
+ {0.209444666666665,0.413333333333333,0.209444666666665,0.423333333333333},
+ {0.209444666666665,0.423333333333333,0.209444666666665,0.433333333333334},
+ {0.209444666666665,0.433333333333334,0.208889333333334,0.442222},
+ {0.208889333333334,0.442222,0.207778,0.451111333333333},
+ {0.207778,0.451111333333333,0.206666666666666,0.458333333333333},
+ {0.206666666666666,0.458333333333333,0.204444666666667,0.463888666666667},
+ {0.204444666666667,0.463888666666667,0.201111333333332,0.468333333333333},
+ {0.201111333333332,0.468333333333333,0.196666666666665,0.471666666666666},
+ {0.196666666666665,0.471666666666666,0.191111333333332,0.473888666666667},
+ {0.191111333333332,0.473888666666667,0.183889333333333,0.475},
+ {0.183889333333333,0.475,0.175,0.476111333333333},
+ {0.175,0.476111333333333,0.166111333333333,0.476666666666667},
+ {0.146111333333333,0.476666666666667,0.137222666666666,0.476111333333333},
+ {0.137222666666666,0.476111333333333,0.128333333333333,0.475},
+ {0.128333333333333,0.475,0.121111333333334,0.473888666666667},
+ {0.121111333333334,0.473888666666667,0.115556,0.471666666666666},
+ {0.115556,0.471666666666666,0.111111333333334,0.468333333333333},
+ {0.111111333333334,0.468333333333333,0.107777999999999,0.463888666666667},
+ {0.107777999999999,0.463888666666667,0.105556,0.458333333333333},
+ {0.105556,0.458333333333333,0.104444666666666,0.451111333333333},
+ {0.104444666666666,0.451111333333333,0.103333333333332,0.442222},
+ {0.103333333333332,0.442222,0.102778000000001,0.433333333333334},
+ {0.102778000000001,0.433333333333334,0.102778000000001,0.423333333333333},
+ {0.102778000000001,0.423333333333333,0.102778000000001,0.413333333333333},
+ {0.102778000000001,0.413333333333333,0.103333333333332,0.404444666666667},
+ {0.103333333333332,0.404444666666667,0.104444666666666,0.395555333333334},
+ {0.104444666666666,0.395555333333334,0.105556,0.388333333333333},
+ {0.105556,0.388333333333333,0.107777999999999,0.382778},
+ {0.107777999999999,0.382778,0.111111333333334,0.378333333333333},
+ {0.111111333333334,0.378333333333333,0.115556,0.375},
+ {0.115556,0.375,0.121111333333334,0.372778},
+ {0.121111333333334,0.372778,0.128333333333333,0.371666666666667},
+ {0.128333333333333,0.371666666666667,0.137222666666666,0.370555333333333},
+ {0.137222666666666,0.370555333333333,0.146111333333333,0.37},
+ {0.166111333333333,0.37,0.175,0.370555333333333},
+ {0.175,0.370555333333333,0.183889333333333,0.371666666666667},
+ {0.183889333333333,0.371666666666667,0.191111333333332,0.372778},
+ {0.191111333333332,0.372778,0.196666666666665,0.375},
+ {0.196666666666665,0.375,0.201111333333332,0.378333333333333},
+ {0,0,0,0}
+};
+
+double Icon22[][4] = {
+ {0.0416666666666667,0.208333333333333,0,0.25},
+ {0.166666666666667,0.25,0.125,0.208333333333333},
+ {0.166666666666667,0.75,0.166666666666667,0.25},
+ {0.125,0.791666666666667,0.166666666666667,0.75},
+ {0,0.75,0.0416666666666667,0.791666666666667},
+ {0,0.25,0,0.75},
+ {0.125,0.375,0.125,0.416666666666667},
+ {0.0416666666666667,0.416666666666667,0.0416666666666667,0.375},
+ {0.125,0.458333333333333,0.125,0.541666666666667},
+ {0.0416666666666667,0.541666666666667,0.0416666666666667,0.458333333333333},
+ {0.125,0.583333333333333,0.125,0.625},
+ {0.0416666666666667,0.625,0.0416666666666667,0.583333333333333},
+ {0,0,0,0}
+};
+
+double Icon23[][4] = {
+ {0.0416666666666667,0.208333333333333,0,0.25},
+ {0.166666666666667,0.25,0.125,0.208333333333333},
+ {0.166666666666667,0.75,0.166666666666667,0.25},
+ {0.125,0.791666666666667,0.166666666666667,0.75},
+ {0,0.75,0.0416666666666667,0.791666666666667},
+ {0,0.25,0,0.75},
+ {0.0416666666666667,0.291666666666667,0.0833333333333333,0.25},
+ {0.0833333333333333,0.25,0.125,0.291666666666667},
+ {0.125,0.291666666666667,0.125,0.708333333333333},
+ {0.125,0.708333333333333,0.0833333333333333,0.75},
+ {0.0833333333333333,0.75,0.0416666666666667,0.708333333333333},
+ {0.0416666666666667,0.708333333333333,0.0416666666666667,0.291666666666667},
+ {0,0,0,0}
+};
+
+double Icon24[][4] = {
+ {0.0377780000000006,0.191666666666666,0.0377780000000006,0.341666666666667},
+ {0.0377780000000006,0.153888666666666,0.0750000000000005,0.191666666666666},
+ {0.112778000000001,0.0416666666666667,0.0377780000000006,0.153888666666666},
+ {0.187777999999999,0.153888666666666,0.112778000000001,0.0416666666666667},
+ {0.150000000000001,0.191666666666666,0.187777999999999,0.153888666666666},
+ {0.187777999999999,0.341666666666667,0.187777999999999,0.191666666666666},
+ {0.224999999999999,0.678888666666667,0.224999999999999,0.341666666666667},
+ {0,0.341666666666667,0,0.678888666666667},
+ {0.0750000000000005,0.678888666666667,0.112778000000001,0.941666666666666},
+ {0.112778000000001,0.941666666666666,0.150000000000001,0.978888666666667},
+ {0.375,0.978888666666667,0.375,0.866666666666667},
+ {0.224999999999999,0.866666666666667,0.187777999999999,0.828888666666667},
+ {0.187777999999999,0.828888666666667,0.150000000000001,0.678888666666667},
+ {0,0,0,0}
+};
+
+double Icon25[][4] = {
+ {0.166666666666667,0.583333333333333,0.333333333333333,0.416666666666667},
+ {0,0.416666666666667,0.166666666666667,0.583333333333333},
+ {0,0,0,0}
+};
+
+double Icon26[][4] = {
+ {0.148888666666664,0.0399999999999998,0.136666666666666,0.0416666666666667},
+ {0.161666666666666,0.0383333333333334,0.148888666666664,0.0399999999999998},
+ {0.176111333333331,0.0372219999999999,0.161666666666666,0.0383333333333334},
+ {0.191111333333332,0.0361113333333332,0.176111333333331,0.0372219999999999},
+ {0.207778,0.0350000000000001,0.191111333333332,0.0361113333333332},
+ {0.224999999999999,0.0338886666666667,0.207778,0.0350000000000001},
+ {0.243888666666666,0.0333333333333332,0.224999999999999,0.0338886666666667},
+ {0.263333333333333,0.0322220000000003,0.243888666666666,0.0333333333333332},
+ {0.283333333333331,0.031666666666667,0.263333333333333,0.0322220000000003},
+ {0.305,0.0311113333333335,0.283333333333331,0.031666666666667},
+ {0.349444666666666,0.0305553333333334,0.326666666666666,0.0311113333333335},
+ {0.396666666666666,0.03,0.372777999999999,0.0305553333333334},
+ {0.567221999999999,0.0305553333333334,0.543333333333332,0.03},
+ {0.613333333333332,0.0311113333333335,0.590555333333332,0.0305553333333334},
+ {0.656666666666666,0.031666666666667,0.634999999999998,0.0311113333333335},
+ {0.676666666666665,0.0322220000000003,0.656666666666666,0.031666666666667},
+ {0.696111333333332,0.0333333333333332,0.676666666666665,0.0322220000000003},
+ {0.714999999999999,0.0338886666666667,0.696111333333332,0.0333333333333332},
+ {0.732221999999998,0.0350000000000001,0.714999999999999,0.0338886666666667},
+ {0.748888666666666,0.0361113333333332,0.732221999999998,0.0350000000000001},
+ {0.763888666666666,0.0372219999999999,0.748888666666666,0.0361113333333332},
+ {0.778333333333331,0.0383333333333334,0.763888666666666,0.0372219999999999},
+ {0.791111333333333,0.0399999999999998,0.778333333333331,0.0383333333333334},
+ {0.803333333333332,0.0416666666666667,0.791111333333333,0.0399999999999998},
+ {0.818888666666666,0.0444446666666666,0.803333333333332,0.0416666666666667},
+ {0.832778,0.0472220000000003,0.818888666666666,0.0444446666666666},
+ {0.844444666666665,0.0505553333333335,0.832778,0.0472220000000003},
+ {0.854999999999999,0.0533333333333335,0.844444666666665,0.0505553333333335},
+ {0.863888666666665,0.0566666666666666,0.854999999999999,0.0533333333333335},
+ {0.871666666666665,0.058888666666667,0.863888666666665,0.0566666666666666},
+ {0.877777999999999,0.0616666666666669,0.871666666666665,0.058888666666667},
+ {0.883333333333333,0.0638886666666666,0.877777999999999,0.0616666666666669},
+ {0.887778,0.0661113333333331,0.883333333333333,0.0638886666666666},
+ {0.891111333333332,0.0683333333333334,0.887778,0.0661113333333331},
+ {0.894444666666665,0.0705553333333331,0.891111333333332,0.0683333333333334},
+ {0.897221999999999,0.0727780000000002,0.894444666666665,0.0705553333333331},
+ {0.899444666666665,0.0755553333333333,0.897221999999999,0.0727780000000002},
+ {0.901666666666666,0.0788886666666666,0.899444666666665,0.0755553333333333},
+ {0.903888666666665,0.0822219999999998,0.901666666666666,0.0788886666666666},
+ {0.906111333333333,0.0866666666666667,0.903888666666665,0.0822219999999998},
+ {0.908333333333331,0.0922220000000002,0.906111333333333,0.0866666666666667},
+ {0.911111333333333,0.0983333333333334,0.908333333333331,0.0922220000000002},
+ {0.913333333333332,0.106111333333333,0.911111333333333,0.0983333333333334},
+ {0.916666666666667,0.115,0.913333333333332,0.106111333333333},
+ {0.919444666666666,0.125555333333333,0.916666666666667,0.115},
+ {0.922777999999999,0.137222,0.919444666666666,0.125555333333333},
+ {0.925555333333333,0.151111333333333,0.922777999999999,0.137222},
+ {0.928333333333332,0.166666666666667,0.925555333333333,0.151111333333333},
+ {0.93,0.178888666666667,0.928333333333332,0.166666666666667},
+ {0.931666666666665,0.191666666666666,0.93,0.178888666666667},
+ {0.932777999999999,0.206111333333334,0.931666666666665,0.191666666666666},
+ {0.933888666666666,0.221111333333334,0.932777999999999,0.206111333333334},
+ {0.935,0.237778,0.933888666666666,0.221111333333334},
+ {0.936111333333332,0.255,0.935,0.237778},
+ {0.936666666666665,0.273888666666667,0.936111333333332,0.255},
+ {0.937777999999999,0.293333333333334,0.936666666666665,0.273888666666667},
+ {0.938333333333333,0.313333333333333,0.937777999999999,0.293333333333334},
+ {0.938888666666666,0.335,0.938333333333333,0.313333333333333},
+ {0.938888666666666,0.356666666666667,0.938888666666666,0.335},
+ {0.939444666666667,0.379444666666667,0.938888666666666,0.356666666666667},
+ {0.939444666666667,0.402778,0.939444666666667,0.379444666666667},
+ {0.939999999999998,0.426666666666667,0.939444666666667,0.402778},
+ {0.939999999999998,0.451111333333333,0.939999999999998,0.426666666666667},
+ {0.939999999999998,0.475555333333334,0.939999999999998,0.451111333333333},
+ {0.939999999999998,0.5,0.939999999999998,0.475555333333334},
+ {0.939999999999998,0.524444666666666,0.939999999999998,0.5},
+ {0.939999999999998,0.548888666666667,0.939999999999998,0.524444666666666},
+ {0.939999999999998,0.573333333333334,0.939999999999998,0.548888666666667},
+ {0.939444666666667,0.597222,0.939999999999998,0.573333333333334},
+ {0.939444666666667,0.620555333333333,0.939444666666667,0.597222},
+ {0.938888666666666,0.643333333333333,0.939444666666667,0.620555333333333},
+ {0.938888666666666,0.665,0.938888666666666,0.643333333333333},
+ {0.938333333333333,0.686666666666667,0.938888666666666,0.665},
+ {0.937777999999999,0.706666666666666,0.938333333333333,0.686666666666667},
+ {0.936666666666665,0.726111333333333,0.937777999999999,0.706666666666666},
+ {0.936111333333332,0.745,0.936666666666665,0.726111333333333},
+ {0.935,0.762222,0.936111333333332,0.745},
+ {0.933888666666666,0.778888666666666,0.935,0.762222},
+ {0.932777999999999,0.793888666666666,0.933888666666666,0.778888666666666},
+ {0.931666666666665,0.808333333333334,0.932777999999999,0.793888666666666},
+ {0.93,0.821111333333333,0.931666666666665,0.808333333333334},
+ {0.928333333333332,0.833333333333333,0.93,0.821111333333333},
+ {0.925555333333333,0.848888666666667,0.928333333333332,0.833333333333333},
+ {0.922777999999999,0.862778,0.925555333333333,0.848888666666667},
+ {0.919444666666666,0.874444666666667,0.922777999999999,0.862778},
+ {0.916666666666667,0.885,0.919444666666666,0.874444666666667},
+ {0.913333333333332,0.893888666666667,0.916666666666667,0.885},
+ {0.911111333333333,0.901666666666667,0.913333333333332,0.893888666666667},
+ {0.908333333333331,0.907778,0.911111333333333,0.901666666666667},
+ {0.906111333333333,0.913333333333333,0.908333333333331,0.907778},
+ {0.903888666666665,0.917778,0.906111333333333,0.913333333333333},
+ {0.901666666666666,0.921111333333334,0.903888666666665,0.917778},
+ {0.899444666666665,0.924444666666667,0.901666666666666,0.921111333333334},
+ {0.897221999999999,0.927222,0.899444666666665,0.924444666666667},
+ {0.894444666666665,0.929444666666667,0.897221999999999,0.927222},
+ {0.891111333333332,0.931666666666667,0.894444666666665,0.929444666666667},
+ {0.887778,0.933888666666667,0.891111333333332,0.931666666666667},
+ {0.883333333333333,0.936111333333333,0.887778,0.933888666666667},
+ {0.877777999999999,0.938333333333333,0.883333333333333,0.936111333333333},
+ {0.871666666666665,0.941111333333333,0.877777999999999,0.938333333333333},
+ {0.863888666666665,0.943333333333333,0.871666666666665,0.941111333333333},
+ {0.854999999999999,0.946666666666667,0.863888666666665,0.943333333333333},
+ {0.844444666666665,0.949444666666666,0.854999999999999,0.946666666666667},
+ {0.832778,0.952778,0.844444666666665,0.949444666666666},
+ {0.818888666666666,0.955555333333333,0.832778,0.952778},
+ {0.803333333333332,0.958333333333333,0.818888666666666,0.955555333333333},
+ {0.791111333333333,0.96,0.803333333333332,0.958333333333333},
+ {0.778333333333331,0.961666666666667,0.791111333333333,0.96},
+ {0.763888666666666,0.962778,0.778333333333331,0.961666666666667},
+ {0.748888666666666,0.963888666666667,0.763888666666666,0.962778},
+ {0.732221999999998,0.965,0.748888666666666,0.963888666666667},
+ {0.714999999999999,0.966111333333333,0.732221999999998,0.965},
+ {0.696111333333332,0.966666666666667,0.714999999999999,0.966111333333333},
+ {0.676666666666665,0.967778,0.696111333333332,0.966666666666667},
+ {0.656666666666666,0.968333333333333,0.676666666666665,0.967778},
+ {0.634999999999998,0.968888666666667,0.656666666666666,0.968333333333333},
+ {0.590555333333332,0.969444666666667,0.613333333333332,0.968888666666667},
+ {0.543333333333332,0.97,0.567221999999999,0.969444666666667},
+ {0.372777999999999,0.969444666666667,0.396666666666666,0.97},
+ {0.326666666666666,0.968888666666667,0.349444666666666,0.969444666666667},
+ {0.283333333333331,0.968333333333333,0.305,0.968888666666667},
+ {0.263333333333333,0.967778,0.283333333333331,0.968333333333333},
+ {0.243888666666666,0.966666666666667,0.263333333333333,0.967778},
+ {0.224999999999999,0.966111333333333,0.243888666666666,0.966666666666667},
+ {0.207778,0.965,0.224999999999999,0.966111333333333},
+ {0.191111333333332,0.963888666666667,0.207778,0.965},
+ {0.176111333333331,0.962778,0.191111333333332,0.963888666666667},
+ {0.161666666666666,0.961666666666667,0.176111333333331,0.962778},
+ {0.148888666666664,0.96,0.161666666666666,0.961666666666667},
+ {0.136666666666666,0.958333333333333,0.148888666666664,0.96},
+ {0.121111333333332,0.955555333333333,0.136666666666666,0.958333333333333},
+ {0.107221999999998,0.952778,0.121111333333332,0.955555333333333},
+ {0.0955553333333322,0.949444666666666,0.107221999999998,0.952778},
+ {0.0849999999999985,0.946666666666667,0.0955553333333322,0.949444666666666},
+ {0.0761113333333322,0.943333333333333,0.0849999999999985,0.946666666666667},
+ {0.0683333333333328,0.941111333333333,0.0761113333333322,0.943333333333333},
+ {0.0622219999999984,0.938333333333333,0.0683333333333328,0.941111333333333},
+ {0.0566666666666649,0.936111333333333,0.0622219999999984,0.938333333333333},
+ {0.0522219999999981,0.933888666666667,0.0566666666666649,0.936111333333333},
+ {0.0488886666666654,0.931666666666667,0.0522219999999981,0.933888666666667},
+ {0.0455553333333327,0.929444666666667,0.0488886666666654,0.931666666666667},
+ {0.0427779999999984,0.927222,0.0455553333333327,0.929444666666667},
+ {0.0405553333333325,0.924444666666667,0.0427779999999984,0.927222},
+ {0.0383333333333316,0.921111333333334,0.0405553333333325,0.924444666666667},
+ {0.0361113333333331,0.917778,0.0383333333333316,0.921111333333334},
+ {0.0338886666666648,0.913333333333333,0.0361113333333331,0.917778},
+ {0.0316666666666663,0.907778,0.0338886666666648,0.913333333333333},
+ {0.0288886666666646,0.901666666666667,0.0316666666666663,0.907778},
+ {0.0266666666666661,0.893888666666667,0.0288886666666646,0.901666666666667},
+ {0.0233333333333311,0.885,0.0266666666666661,0.893888666666667},
+ {0.0205553333333318,0.874444666666667,0.0233333333333311,0.885},
+ {0.0172219999999991,0.862778,0.0205553333333318,0.874444666666667},
+ {0.0144446666666648,0.848888666666667,0.0172219999999991,0.862778},
+ {0.0116666666666655,0.833333333333333,0.0144446666666648,0.848888666666667},
+ {0.00999999999999801,0.821111333333333,0.0116666666666655,0.833333333333333},
+ {0.00833333333333286,0.808333333333334,0.00999999999999801,0.821111333333333},
+ {0.00722199999999873,0.793888666666666,0.00833333333333286,0.808333333333334},
+ {0.00611133333333195,0.778888666666666,0.00722199999999873,0.793888666666666},
+ {0.00499999999999782,0.762222,0.00611133333333195,0.778888666666666},
+ {0.00388866666666606,0.745,0.00499999999999782,0.762222},
+ {0.00333333333333267,0.726111333333333,0.00388866666666606,0.745},
+ {0.00222199999999854,0.706666666666666,0.00333333333333267,0.726111333333333},
+ {0.00166666666666515,0.686666666666667,0.00222199999999854,0.706666666666666},
+ {0.00111133333333176,0.665,0.00166666666666515,0.686666666666667},
+ {0.00111133333333176,0.643333333333333,0.00111133333333176,0.665},
+ {0.000555333333331021,0.620555333333333,0.00111133333333176,0.643333333333333},
+ {0.000555333333331021,0.597222,0.000555333333331021,0.620555333333333},
+ {0,0.573333333333334,0.000555333333331021,0.597222},
+ {0,0.548888666666667,0,0.573333333333334},
+ {0,0.524444666666666,0,0.548888666666667},
+ {0,0.5,0,0.524444666666666},
+ {0,0.475555333333334,0,0.5},
+ {0,0.451111333333333,0,0.475555333333334},
+ {0,0.426666666666667,0,0.451111333333333},
+ {0.000555333333331021,0.402778,0,0.426666666666667},
+ {0.000555333333331021,0.379444666666667,0.000555333333331021,0.402778},
+ {0.00111133333333176,0.356666666666667,0.000555333333331021,0.379444666666667},
+ {0.00111133333333176,0.335,0.00111133333333176,0.356666666666667},
+ {0.00166666666666515,0.313333333333333,0.00111133333333176,0.335},
+ {0.00222199999999854,0.293333333333334,0.00166666666666515,0.313333333333333},
+ {0.00333333333333267,0.273888666666667,0.00222199999999854,0.293333333333334},
+ {0.00388866666666606,0.255,0.00333333333333267,0.273888666666667},
+ {0.00499999999999782,0.237778,0.00388866666666606,0.255},
+ {0.00611133333333195,0.221111333333334,0.00499999999999782,0.237778},
+ {0.00722199999999873,0.206111333333334,0.00611133333333195,0.221111333333334},
+ {0.00833333333333286,0.191666666666666,0.00722199999999873,0.206111333333334},
+ {0.00999999999999801,0.178888666666667,0.00833333333333286,0.191666666666666},
+ {0.0116666666666655,0.166666666666667,0.00999999999999801,0.178888666666667},
+ {0.0144446666666648,0.151111333333333,0.0116666666666655,0.166666666666667},
+ {0.0172219999999991,0.137222,0.0144446666666648,0.151111333333333},
+ {0.0205553333333318,0.125555333333333,0.0172219999999991,0.137222},
+ {0.0233333333333311,0.115,0.0205553333333318,0.125555333333333},
+ {0.0266666666666661,0.106111333333333,0.0233333333333311,0.115},
+ {0.0288886666666646,0.0983333333333334,0.0266666666666661,0.106111333333333},
+ {0.0316666666666663,0.0922220000000002,0.0288886666666646,0.0983333333333334},
+ {0.0338886666666648,0.0866666666666667,0.0316666666666663,0.0922220000000002},
+ {0.0361113333333331,0.0822219999999998,0.0338886666666648,0.0866666666666667},
+ {0.0383333333333316,0.0788886666666666,0.0361113333333331,0.0822219999999998},
+ {0.0405553333333325,0.0755553333333333,0.0383333333333316,0.0788886666666666},
+ {0.0427779999999984,0.0727780000000002,0.0405553333333325,0.0755553333333333},
+ {0.0455553333333327,0.0705553333333331,0.0427779999999984,0.0727780000000002},
+ {0.0488886666666654,0.0683333333333334,0.0455553333333327,0.0705553333333331},
+ {0.0522219999999981,0.0661113333333331,0.0488886666666654,0.0683333333333334},
+ {0.0566666666666649,0.0638886666666666,0.0522219999999981,0.0661113333333331},
+ {0.0622219999999984,0.0616666666666669,0.0566666666666649,0.0638886666666666},
+ {0.0683333333333328,0.058888666666667,0.0622219999999984,0.0616666666666669},
+ {0.0761113333333322,0.0566666666666666,0.0683333333333328,0.058888666666667},
+ {0.0849999999999985,0.0533333333333335,0.0761113333333322,0.0566666666666666},
+ {0.0955553333333322,0.0505553333333335,0.0849999999999985,0.0533333333333335},
+ {0.107221999999998,0.0472220000000003,0.0955553333333322,0.0505553333333335},
+ {0.121111333333332,0.0444446666666666,0.107221999999998,0.0472220000000003},
+ {0.136666666666666,0.0416666666666667,0.121111333333332,0.0444446666666666},
+ {0,0,0,0}
+};
+
+double Icon27[][4] = {
+ {0,0.458333333333333,0,0.541666666666667},
+ {1,0.541666666666667,1,0.458333333333333},
+ {0,0,0,0}
+};
+
+double Icon28[][4] = {
+ {0.0838893333333317,0.25,0.0822226666666666,0.251111333333334},
+ {0.0822226666666666,0.251111333333334,0.0794446666666649,0.253333333333333},
+ {0.0794446666666649,0.253333333333333,0.0738893333333337,0.256666666666667},
+ {0.0738893333333337,0.256666666666667,0.0661113333333319,0.262222},
+ {0.0661113333333319,0.262222,0.0572226666666656,0.268888666666667},
+ {0.0572226666666656,0.268888666666667,0.0472226666666652,0.276666666666667},
+ {0.0472226666666652,0.276666666666667,0.0366666666666665,0.284444666666667},
+ {0.0366666666666665,0.284444666666667,0.0272226666666668,0.292778},
+ {0.0272226666666668,0.292778,0.0188893333333316,0.300555333333334},
+ {0.0188893333333316,0.300555333333334,0.0116666666666655,0.308888666666667},
+ {0.0116666666666655,0.308888666666667,0.00666666666666534,0.316666666666666},
+ {0.00666666666666534,0.316666666666666,0.00277799999999928,0.325},
+ {0.00277799999999928,0.325,0.000555999999998373,0.333333333333333},
+ {0.000555999999998373,0.333333333333333,0,0.341666666666667},
+ {0,0.341666666666667,0,0.350555333333334},
+ {0,0.350555333333334,0.00111133333333176,0.360555333333333},
+ {0.00111133333333176,0.360555333333333,0.00277799999999928,0.371111333333333},
+ {0.00277799999999928,0.371111333333333,0.00500000000000019,0.382778},
+ {0.00500000000000019,0.382778,0.00833333333333286,0.395},
+ {0.00833333333333286,0.395,0.0116666666666655,0.407778},
+ {0.0116666666666655,0.407778,0.0155559999999989,0.420555333333333},
+ {0.0155559999999989,0.420555333333333,0.019444666666665,0.433333333333334},
+ {0.019444666666665,0.433333333333334,0.0233333333333334,0.445555333333333},
+ {0.0233333333333334,0.445555333333333,0.0272226666666668,0.457778},
+ {0.0272226666666668,0.457778,0.0305559999999995,0.468333333333333},
+ {0.0305559999999995,0.468333333333333,0.0338893333333322,0.478333333333333},
+ {0.0338893333333322,0.478333333333333,0.0366666666666665,0.486666666666667},
+ {0.0366666666666665,0.486666666666667,0.0394446666666658,0.493888666666667},
+ {0.0394446666666658,0.493888666666667,0.042222666666665,0.5},
+ {0.042222666666665,0.5,0.0449999999999993,0.505},
+ {0.0449999999999993,0.505,0.048333333333332,0.508333333333334},
+ {0.048333333333332,0.508333333333334,0.0516666666666647,0.510555333333333},
+ {0.0516666666666647,0.510555333333333,0.0555559999999981,0.511666666666667},
+ {0.0555559999999981,0.511666666666667,0.0599999999999999,0.511111333333333},
+ {0.0599999999999999,0.511111333333333,0.0638893333333333,0.51},
+ {0.0638893333333333,0.51,0.0688893333333335,0.508333333333334},
+ {0.0688893333333335,0.508333333333334,0.0727779999999996,0.506111333333333},
+ {0.0727779999999996,0.506111333333333,0.0766666666666656,0.504444666666667},
+ {0.0766666666666656,0.504444666666667,0.0799999999999983,0.502778},
+ {0.0799999999999983,0.502778,0.0822226666666666,0.501111333333334},
+ {0.0822226666666666,0.501111333333334,0.0833333333333333,0.500555333333333},
+ {0.0833333333333333,0.500555333333333,0.0838893333333317,0.5},
+ {0.187777999999999,0.333333333333333,0.187777999999999,0.335},
+ {0.187777999999999,0.335,0.188889333333333,0.338333333333334},
+ {0.188889333333333,0.338333333333334,0.189444666666667,0.345},
+ {0.189444666666667,0.345,0.191111333333332,0.353888666666667},
+ {0.191111333333332,0.353888666666667,0.192777999999999,0.365555333333334},
+ {0.192777999999999,0.365555333333334,0.194444666666667,0.379444666666667},
+ {0.194444666666667,0.379444666666667,0.196111333333332,0.394444666666667},
+ {0.196111333333332,0.394444666666667,0.197778,0.41},
+ {0.197778,0.41,0.198889333333334,0.425555333333334},
+ {0.198889333333334,0.425555333333334,0.199444666666665,0.440555333333334},
+ {0.199444666666665,0.440555333333334,0.198889333333334,0.453888666666667},
+ {0.198889333333334,0.453888666666667,0.197778,0.466666666666667},
+ {0.197778,0.466666666666667,0.195555999999999,0.478333333333333},
+ {0.195555999999999,0.478333333333333,0.192222666666666,0.489444666666667},
+ {0.192222666666666,0.489444666666667,0.187777999999999,0.5},
+ {0.187777999999999,0.5,0.183333333333332,0.508333333333334},
+ {0.183333333333332,0.508333333333334,0.177777999999999,0.516666666666667},
+ {0.177777999999999,0.516666666666667,0.170556,0.525},
+ {0.170556,0.525,0.162777999999998,0.533333333333333},
+ {0.162777999999998,0.533333333333333,0.153889333333332,0.541666666666667},
+ {0.153889333333332,0.541666666666667,0.144444666666665,0.55},
+ {0.144444666666665,0.55,0.133333333333333,0.558333333333334},
+ {0.133333333333333,0.558333333333334,0.122222666666666,0.566666666666666},
+ {0.122222666666666,0.566666666666666,0.110556,0.575},
+ {0.110556,0.575,0.0983333333333315,0.583333333333333},
+ {0.0983333333333315,0.583333333333333,0.086666666666666,0.591666666666667},
+ {0.086666666666666,0.591666666666667,0.0749999999999981,0.6},
+ {0.0749999999999981,0.6,0.0644446666666667,0.608333333333333},
+ {0.0644446666666667,0.608333333333333,0.0544446666666663,0.616666666666667},
+ {0.0544446666666663,0.616666666666667,0.0449999999999993,0.625},
+ {0.0449999999999993,0.625,0.0372226666666648,0.633333333333334},
+ {0.0372226666666648,0.633333333333334,0.0311113333333329,0.641666666666667},
+ {0.0311113333333329,0.641666666666667,0.0261113333333327,0.65},
+ {0.0261113333333327,0.65,0.022778,0.658333333333333},
+ {0.022778,0.658333333333333,0.0211113333333325,0.666666666666667},
+ {0.0211113333333325,0.666666666666667,0.0211113333333325,0.676111333333333},
+ {0.0211113333333325,0.676111333333333,0.0222226666666666,0.685555333333333},
+ {0.0222226666666666,0.685555333333333,0.0255559999999993,0.695},
+ {0.0255559999999993,0.695,0.0311113333333329,0.705},
+ {0.0311113333333329,0.705,0.0372226666666648,0.715},
+ {0.0372226666666648,0.715,0.0455560000000001,0.725555333333334},
+ {0.0455560000000001,0.725555333333334,0.0538893333333329,0.736111333333334},
+ {0.0538893333333329,0.736111333333334,0.0638893333333333,0.747222},
+ {0.0638893333333333,0.747222,0.0738893333333337,0.757778},
+ {0.0738893333333337,0.757778,0.0838893333333317,0.768333333333333},
+ {0.0838893333333317,0.768333333333333,0.0944446666666655,0.778888666666666},
+ {0.0944446666666655,0.778888666666666,0.103889333333332,0.788888666666667},
+ {0.103889333333332,0.788888666666667,0.113333333333332,0.798333333333333},
+ {0.113333333333332,0.798333333333333,0.121666666666665,0.807222},
+ {0.121666666666665,0.807222,0.128889333333333,0.815},
+ {0.128889333333333,0.815,0.135555999999999,0.822222},
+ {0.135555999999999,0.822222,0.141111333333332,0.828333333333333},
+ {0.141111333333332,0.828333333333333,0.146111333333333,0.833333333333333},
+ {0.146111333333333,0.833333333333333,0.151666666666666,0.838333333333334},
+ {0.151666666666666,0.838333333333334,0.156666666666666,0.841666666666667},
+ {0.156666666666666,0.841666666666667,0.161111333333333,0.843888666666667},
+ {0.161111333333333,0.843888666666667,0.164999999999999,0.845},
+ {0.164999999999999,0.845,0.169444666666666,0.844444666666667},
+ {0.169444666666666,0.844444666666667,0.173333333333332,0.843333333333333},
+ {0.173333333333332,0.843333333333333,0.176666666666665,0.841666666666667},
+ {0.176666666666665,0.841666666666667,0.18,0.839444666666667},
+ {0.18,0.839444666666667,0.182777999999999,0.837778},
+ {0.182777999999999,0.837778,0.185,0.836111333333333},
+ {0.185,0.836111333333333,0.186666666666665,0.834444666666667},
+ {0.186666666666665,0.834444666666667,0.187222666666666,0.833888666666667},
+ {0.187222666666666,0.833888666666667,0.187777999999999,0.833333333333333},
+ {0.354444666666666,1,0.354444666666666,0.916666666666667},
+ {0.0211113333333325,0.916666666666667,0.0211113333333325,1},
+ {0.0833333333333333,0.251666666666667,0.0838893333333317,0.25},
+ {0.0827779999999999,0.255555333333334,0.0833333333333333,0.251666666666667},
+ {0.0822226666666666,0.262222,0.0827779999999999,0.255555333333334},
+ {0.0811113333333324,0.270555333333334,0.0822226666666666,0.262222},
+ {0.0794446666666649,0.280555333333333,0.0811113333333324,0.270555333333334},
+ {0.0788893333333315,0.291111333333333,0.0794446666666649,0.280555333333333},
+ {0.0783333333333331,0.301111333333333,0.0788893333333315,0.291111333333333},
+ {0.0783333333333331,0.310555333333333,0.0783333333333331,0.301111333333333},
+ {0.0794446666666649,0.318888666666667,0.0783333333333331,0.310555333333333},
+ {0.0811113333333324,0.326111333333333,0.0794446666666649,0.318888666666667},
+ {0.0838893333333317,0.333333333333333,0.0811113333333324,0.326111333333333},
+ {0.0872226666666667,0.339444666666667,0.0838893333333317,0.333333333333333},
+ {0.0916666666666662,0.345,0.0872226666666667,0.339444666666667},
+ {0.0972226666666648,0.351111333333333,0.0916666666666662,0.345},
+ {0.104444666666666,0.357222,0.0972226666666648,0.351111333333333},
+ {0.111666666666667,0.363333333333333,0.104444666666666,0.357222},
+ {0.12,0.368888666666667,0.111666666666667,0.363333333333333},
+ {0.128333333333333,0.375,0.12,0.368888666666667},
+ {0.136666666666666,0.381111333333333,0.128333333333333,0.375},
+ {0.144999999999998,0.386666666666667,0.136666666666666,0.381111333333333},
+ {0.152222666666667,0.392778,0.144999999999998,0.386666666666667},
+ {0.157777999999998,0.398888666666667,0.152222666666667,0.392778},
+ {0.162777999999998,0.405,0.157777999999998,0.398888666666667},
+ {0.165556,0.410555333333334,0.162777999999998,0.405},
+ {0.167222666666665,0.416666666666667,0.165556,0.410555333333334},
+ {0.167222666666665,0.423888666666667,0.167222666666665,0.416666666666667},
+ {0.164999999999999,0.431111333333333,0.167222666666665,0.423888666666667},
+ {0.160556,0.438333333333333,0.164999999999999,0.431111333333333},
+ {0.154999999999999,0.446111333333333,0.160556,0.438333333333333},
+ {0.148333333333333,0.454444666666667,0.154999999999999,0.446111333333333},
+ {0.140555999999999,0.462222,0.148333333333333,0.454444666666667},
+ {0.132777999999999,0.47,0.140555999999999,0.462222},
+ {0.125555999999998,0.477778,0.132777999999999,0.47},
+ {0.118889333333333,0.484444666666667,0.125555999999998,0.477778},
+ {0.112777999999999,0.490555333333334,0.118889333333333,0.484444666666667},
+ {0.108333333333332,0.496111333333333,0.112777999999999,0.490555333333334},
+ {0.104444666666666,0.5,0.108333333333332,0.496111333333333},
+ {0.101666666666667,0.502778,0.104444666666666,0.5},
+ {0.0994446666666657,0.504444666666667,0.101666666666667,0.502778},
+ {0.0972226666666648,0.505555333333334,0.0994446666666657,0.504444666666667},
+ {0.0911113333333328,0.505,0.0927780000000003,0.505555333333334},
+ {0.0894446666666653,0.503888666666667,0.0911113333333328,0.505},
+ {0.0877780000000001,0.503333333333333,0.0894446666666653,0.503888666666667},
+ {0.0861113333333326,0.502222,0.0877780000000001,0.503333333333333},
+ {0.0849999999999985,0.501111333333334,0.0861113333333326,0.502222},
+ {0.0844446666666651,0.500555333333333,0.0849999999999985,0.501111333333334},
+ {0.0838893333333317,0.5,0.0844446666666651,0.500555333333333},
+ {0.208333333333333,0.0416666666666667,0.208889333333332,0.0433333333333337},
+ {0.208889333333332,0.0433333333333337,0.209444666666665,0.0472220000000003},
+ {0.209444666666665,0.0472220000000003,0.209999999999998,0.0538886666666668},
+ {0.209999999999998,0.0538886666666668,0.211111333333333,0.0622220000000002},
+ {0.211111333333333,0.0622220000000002,0.212778,0.072222},
+ {0.212778,0.072222,0.213333333333334,0.082778},
+ {0.213333333333334,0.082778,0.213889333333332,0.0927779999999998},
+ {0.213889333333332,0.0927779999999998,0.213889333333332,0.102222},
+ {0.213889333333332,0.102222,0.212778,0.110555333333333},
+ {0.212778,0.110555333333333,0.211111333333333,0.117778},
+ {0.211111333333333,0.117778,0.208333333333333,0.125},
+ {0.208333333333333,0.125,0.204999999999998,0.131111333333333},
+ {0.204999999999998,0.131111333333333,0.200555999999999,0.136666666666667},
+ {0.200555999999999,0.136666666666667,0.195,0.142778},
+ {0.195,0.142778,0.187777999999999,0.148888666666667},
+ {0.187777999999999,0.148888666666667,0.180555999999998,0.155},
+ {0.180555999999998,0.155,0.172222666666665,0.160555333333334},
+ {0.172222666666665,0.160555333333334,0.163889333333332,0.166666666666667},
+ {0.163889333333332,0.166666666666667,0.155556,0.172778},
+ {0.155556,0.172778,0.147222666666667,0.178333333333333},
+ {0.147222666666667,0.178333333333333,0.139999999999998,0.184444666666667},
+ {0.139999999999998,0.184444666666667,0.134444666666667,0.190555333333334},
+ {0.134444666666667,0.190555333333334,0.129444666666667,0.196666666666667},
+ {0.129444666666667,0.196666666666667,0.126666666666665,0.202222},
+ {0.126666666666665,0.202222,0.125,0.208333333333333},
+ {0.125,0.208333333333333,0.125,0.215555333333333},
+ {0.125,0.215555333333333,0.127222666666666,0.222778},
+ {0.127222666666666,0.222778,0.131666666666665,0.23},
+ {0.131666666666665,0.23,0.137222666666666,0.237778},
+ {0.137222666666666,0.237778,0.143889333333332,0.246111333333333},
+ {0.143889333333332,0.246111333333333,0.151666666666666,0.253888666666667},
+ {0.151666666666666,0.253888666666667,0.159444666666666,0.261666666666667},
+ {0.159444666666666,0.261666666666667,0.166666666666667,0.269444666666667},
+ {0.166666666666667,0.269444666666667,0.173333333333332,0.276111333333333},
+ {0.173333333333332,0.276111333333333,0.179444666666666,0.282222},
+ {0.179444666666666,0.282222,0.183889333333333,0.287778},
+ {0.183889333333333,0.287778,0.187777999999999,0.291666666666667},
+ {0.187777999999999,0.291666666666667,0.190555999999998,0.294444666666667},
+ {0.190555999999998,0.294444666666667,0.192777999999999,0.296111333333334},
+ {0.192777999999999,0.296111333333334,0.195,0.297222},
+ {0.199444666666665,0.297222,0.201111333333332,0.296666666666667},
+ {0.201111333333332,0.296666666666667,0.202778,0.295555333333333},
+ {0.202778,0.295555333333333,0.204444666666665,0.295},
+ {0.204444666666665,0.295,0.206111333333332,0.293888666666666},
+ {0.206111333333332,0.293888666666666,0.207222666666667,0.292778},
+ {0.207222666666667,0.292778,0.207778,0.292222},
+ {0.207778,0.292222,0.208333333333333,0.291666666666667},
+ {0.188889333333333,0.333888666666667,0.187777999999999,0.333333333333333},
+ {0.191111333333332,0.335555333333333,0.188889333333333,0.333888666666667},
+ {0.195555999999999,0.338888666666667,0.191111333333332,0.335555333333333},
+ {0.202222666666666,0.342778,0.195555999999999,0.338888666666667},
+ {0.210555999999999,0.348888666666667,0.202222666666666,0.342778},
+ {0.221111333333333,0.356666666666667,0.210555999999999,0.348888666666667},
+ {0.233889333333333,0.365555333333334,0.221111333333333,0.356666666666667},
+ {0.247222666666666,0.375555333333333,0.233889333333333,0.365555333333334},
+ {0.261666666666665,0.386111333333333,0.247222666666666,0.375555333333333},
+ {0.275555999999999,0.397222,0.261666666666665,0.386111333333333},
+ {0.289444666666666,0.408888666666667,0.275555999999999,0.397222},
+ {0.302777999999999,0.420555333333333,0.289444666666666,0.408888666666667},
+ {0.315,0.431666666666667,0.302777999999999,0.420555333333333},
+ {0.325555999999999,0.442778,0.315,0.431666666666667},
+ {0.334444666666665,0.453888666666667,0.325555999999999,0.442778},
+ {0.341666666666666,0.465,0.334444666666665,0.453888666666667},
+ {0.347777999999998,0.476111333333333,0.341666666666666,0.465},
+ {0.351666666666667,0.487778,0.347777999999998,0.476111333333333},
+ {0.354444666666666,0.5,0.351666666666667,0.487778},
+ {0.355556,0.510555333333333,0.354444666666666,0.5},
+ {0.356111333333333,0.522222,0.355556,0.510555333333333},
+ {0.355556,0.534444666666667,0.356111333333333,0.522222},
+ {0.354444666666666,0.547222,0.355556,0.534444666666667},
+ {0.352777999999998,0.561111333333334,0.354444666666666,0.547222},
+ {0.349999999999999,0.575555333333333,0.352777999999998,0.561111333333334},
+ {0.346666666666666,0.591111333333333,0.349999999999999,0.575555333333333},
+ {0.343333333333331,0.607222,0.346666666666666,0.591111333333333},
+ {0.338889333333332,0.623333333333333,0.343333333333331,0.607222},
+ {0.334444666666665,0.64,0.338889333333332,0.623333333333333},
+ {0.329444666666665,0.657222,0.334444666666665,0.64},
+ {0.324444666666665,0.674444666666667,0.329444666666665,0.657222},
+ {0.319444666666667,0.691666666666666,0.324444666666665,0.674444666666667},
+ {0.314444666666667,0.708333333333333,0.319444666666667,0.691666666666666},
+ {0.308889333333333,0.725,0.314444666666667,0.708333333333333},
+ {0.303889333333333,0.740555333333334,0.308889333333333,0.725},
+ {0.299444666666666,0.756111333333333,0.303889333333333,0.740555333333334},
+ {0.294444666666666,0.77,0.299444666666666,0.756111333333333},
+ {0.289999999999999,0.783888666666667,0.294444666666666,0.77},
+ {0.286111333333333,0.796111333333334,0.289999999999999,0.783888666666667},
+ {0.281666666666666,0.807222,0.286111333333333,0.796111333333334},
+ {0.278333333333334,0.817222,0.281666666666666,0.807222},
+ {0.274444666666665,0.825555333333333,0.278333333333334,0.817222},
+ {0.271111333333332,0.833333333333333,0.274444666666665,0.825555333333333},
+ {0.266666666666666,0.841666666666667,0.271111333333332,0.833333333333333},
+ {0.261666666666665,0.847778,0.266666666666666,0.841666666666667},
+ {0.256666666666665,0.852222,0.261666666666665,0.847778},
+ {0.251111333333332,0.855,0.256666666666665,0.852222},
+ {0.245,0.856111333333333,0.251111333333332,0.855},
+ {0.232222666666665,0.855,0.238889333333333,0.856111333333333},
+ {0.224999999999999,0.852778,0.232222666666665,0.855},
+ {0.218333333333331,0.85,0.224999999999999,0.852778},
+ {0.211666666666666,0.846666666666666,0.218333333333331,0.85},
+ {0.205555999999999,0.843888666666667,0.211666666666666,0.846666666666666},
+ {0.199999999999998,0.840555333333333,0.205555999999999,0.843888666666667},
+ {0.195555999999999,0.837778,0.199999999999998,0.840555333333333},
+ {0.192222666666666,0.836111333333333,0.195555999999999,0.837778},
+ {0.189444666666667,0.834444666666667,0.192222666666666,0.836111333333333},
+ {0.188333333333333,0.833888666666667,0.189444666666667,0.834444666666667},
+ {0.187777999999999,0.833333333333333,0.188333333333333,0.833888666666667},
+ {0.209999999999998,0.0427780000000002,0.208333333333333,0.0416666666666667},
+ {0.212778,0.0449999999999999,0.209999999999998,0.0427780000000002},
+ {0.218333333333331,0.0483333333333332,0.212778,0.0449999999999999},
+ {0.226111333333333,0.0538886666666668,0.218333333333331,0.0483333333333332},
+ {0.234999999999999,0.0605553333333333,0.226111333333333,0.0538886666666668},
+ {0.245,0.0683333333333334,0.234999999999999,0.0605553333333333},
+ {0.255555999999999,0.0761113333333334,0.245,0.0683333333333334},
+ {0.264999999999998,0.0844446666666669,0.255555999999999,0.0761113333333334},
+ {0.273333333333333,0.0922220000000002,0.264999999999998,0.0844446666666669},
+ {0.280555999999999,0.100555333333334,0.273333333333333,0.0922220000000002},
+ {0.285556,0.108333333333333,0.280555999999999,0.100555333333334},
+ {0.289444666666666,0.116666666666667,0.285556,0.108333333333333},
+ {0.291666666666667,0.125,0.289444666666666,0.116666666666667},
+ {0.292222666666665,0.133333333333334,0.291666666666667,0.125},
+ {0.292222666666665,0.142222,0.292222666666665,0.133333333333334},
+ {0.291111333333333,0.152222,0.292222666666665,0.142222},
+ {0.289444666666666,0.162778,0.291111333333333,0.152222},
+ {0.287222666666665,0.174444666666667,0.289444666666666,0.162778},
+ {0.283889333333332,0.186666666666667,0.287222666666665,0.174444666666667},
+ {0.280555999999999,0.199444666666666,0.283889333333332,0.186666666666667},
+ {0.276666666666666,0.212222,0.280555999999999,0.199444666666666},
+ {0.272778,0.225,0.276666666666666,0.212222},
+ {0.268889333333332,0.237222,0.272778,0.225},
+ {0.264999999999998,0.249444666666667,0.268889333333332,0.237222},
+ {0.261666666666665,0.26,0.264999999999998,0.249444666666667},
+ {0.258333333333333,0.27,0.261666666666665,0.26},
+ {0.255555999999999,0.278333333333334,0.258333333333333,0.27},
+ {0.252777999999999,0.285555333333334,0.255555999999999,0.278333333333334},
+ {0.25,0.291666666666667,0.252777999999999,0.285555333333334},
+ {0.247222666666666,0.296666666666667,0.25,0.291666666666667},
+ {0.243889333333333,0.3,0.247222666666666,0.296666666666667},
+ {0.240556,0.302222,0.243889333333333,0.3},
+ {0.236666666666667,0.303333333333333,0.240556,0.302222},
+ {0.232222666666665,0.302778,0.236666666666667,0.303333333333333},
+ {0.228333333333332,0.301666666666667,0.232222666666665,0.302778},
+ {0.223333333333332,0.3,0.228333333333332,0.301666666666667},
+ {0.219444666666665,0.297778,0.223333333333332,0.3},
+ {0.215555999999999,0.296111333333334,0.219444666666665,0.297778},
+ {0.212222666666667,0.294444666666667,0.215555999999999,0.296111333333334},
+ {0.209999999999998,0.292778,0.212222666666667,0.294444666666667},
+ {0.208889333333332,0.292222,0.209999999999998,0.292778},
+ {0.208333333333333,0.291666666666667,0.208889333333332,0.292222},
+ {0,0,0,0}
+};
+
+double Icon29[][4] = {
+ {0,0.75,0,1},
+ {1,1,1,0.75},
+ {0.00333333333333267,0.750555333333333,0.00111133333333413,0.75},
+ {0.0072220000000011,0.751111333333334,0.00333333333333267,0.750555333333333},
+ {0.0127779999999997,0.751666666666667,0.0072220000000011,0.751111333333334},
+ {0.0194446666666674,0.752778,0.0127779999999997,0.751666666666667},
+ {0.0438886666666676,0.752222,0.0355553333333323,0.752778},
+ {0.0522220000000004,0.750555333333333,0.0438886666666676,0.752222},
+ {0.0599999999999999,0.747778,0.0522220000000004,0.750555333333333},
+ {0.0677779999999994,0.743333333333334,0.0599999999999999,0.747778},
+ {0.0755553333333339,0.737222,0.0677779999999994,0.743333333333334},
+ {0.0833333333333333,0.729444666666667,0.0755553333333339,0.737222},
+ {0.0888886666666669,0.723333333333333,0.0833333333333333,0.729444666666667},
+ {0.0944446666666678,0.716111333333333,0.0888886666666669,0.723333333333333},
+ {0.099999999999999,0.708333333333333,0.0944446666666678,0.716111333333333},
+ {0.106666666666667,0.698888666666667,0.099999999999999,0.708333333333333},
+ {0.112778000000001,0.688888666666667,0.106666666666667,0.698888666666667},
+ {0.119444666666666,0.678333333333333,0.112778000000001,0.688888666666667},
+ {0.126666666666668,0.666666666666667,0.119444666666666,0.678333333333333},
+ {0.133333333333333,0.653888666666666,0.126666666666668,0.666666666666667},
+ {0.140555333333334,0.641111333333334,0.133333333333333,0.653888666666666},
+ {0.147778,0.628333333333333,0.140555333333334,0.641111333333334},
+ {0.155555333333332,0.614444666666667,0.147778,0.628333333333333},
+ {0.162778000000001,0.601111333333333,0.155555333333332,0.614444666666667},
+ {0.169999999999999,0.588333333333334,0.162778000000001,0.601111333333333},
+ {0.177222,0.575555333333333,0.169999999999999,0.588333333333334},
+ {0.184444666666667,0.562778,0.177222,0.575555333333333},
+ {0.191666666666668,0.551111333333333,0.184444666666667,0.562778},
+ {0.198333333333333,0.540555333333333,0.191666666666668,0.551111333333333},
+ {0.205000000000001,0.530555333333333,0.198333333333333,0.540555333333333},
+ {0.211666666666666,0.521111333333333,0.205000000000001,0.530555333333333},
+ {0.217778,0.513333333333333,0.211666666666666,0.521111333333333},
+ {0.223888666666667,0.506111333333333,0.217778,0.513333333333333},
+ {0.229444666666666,0.5,0.223888666666667,0.506111333333333},
+ {0.239444666666666,0.491111333333333,0.229444666666666,0.5},
+ {0.249444666666667,0.484444666666667,0.239444666666666,0.491111333333333},
+ {0.258888666666666,0.480555333333333,0.249444666666667,0.484444666666667},
+ {0.267778,0.478333333333333,0.258888666666666,0.480555333333333},
+ {0.276666666666666,0.477222,0.267778,0.478333333333333},
+ {0.302222,0.477778,0.293888666666668,0.477222},
+ {0.310555333333333,0.478333333333333,0.302222,0.477778},
+ {0.318333333333333,0.478888666666667,0.310555333333333,0.478333333333333},
+ {0.333333333333333,0.479444666666667,0.326111333333332,0.478888666666667},
+ {0.341111333333333,0.481111333333333,0.333333333333333,0.479444666666667},
+ {0.349444666666666,0.484444666666667,0.341111333333333,0.481111333333333},
+ {0.357778000000001,0.489444666666667,0.349444666666666,0.484444666666667},
+ {0.366111333333334,0.495555333333333,0.357778000000001,0.489444666666667},
+ {0.375,0.502778,0.366111333333334,0.495555333333333},
+ {0.383333333333333,0.509444666666666,0.375,0.502778},
+ {0.390000000000001,0.515555333333333,0.383333333333333,0.509444666666666},
+ {0.393888666666667,0.518888666666667,0.390000000000001,0.515555333333333},
+ {0.395555333333334,0.521111333333333,0.393888666666667,0.518888666666667},
+ {0.393888666666667,0.520555333333334,0.395555333333334,0.521111333333333},
+ {0.388888666666666,0.519444666666667,0.393888666666667,0.520555333333334},
+ {0.381666666666668,0.518333333333333,0.388888666666666,0.519444666666667},
+ {0.373333333333332,0.516666666666667,0.381666666666668,0.518333333333333},
+ {0.363888666666665,0.515555333333333,0.373333333333332,0.516666666666667},
+ {0.346666666666666,0.516111333333334,0.354444666666666,0.515555333333333},
+ {0.339444666666668,0.517778,0.346666666666666,0.516111333333334},
+ {0.333333333333333,0.521111333333333,0.339444666666668,0.517778},
+ {0.328333333333333,0.525,0.333333333333333,0.521111333333333},
+ {0.322221999999999,0.53,0.328333333333333,0.525},
+ {0.316666666666668,0.536111333333333,0.322221999999999,0.53},
+ {0.31,0.542778,0.316666666666668,0.536111333333333},
+ {0.303333333333332,0.549444666666667,0.31,0.542778},
+ {0.296111333333333,0.556666666666667,0.303333333333332,0.549444666666667},
+ {0.289999999999999,0.564444666666667,0.296111333333333,0.556666666666667},
+ {0.283888666666667,0.572222,0.289999999999999,0.564444666666667},
+ {0.278333333333334,0.58,0.283888666666667,0.572222},
+ {0.274444666666668,0.587778,0.278333333333334,0.58},
+ {0.272221999999999,0.596111333333334,0.274444666666668,0.587778},
+ {0.271111333333332,0.604444666666667,0.272221999999999,0.596111333333334},
+ {0.271666666666666,0.612222,0.271111333333332,0.604444666666667},
+ {0.273333333333333,0.620555333333333,0.271666666666666,0.612222},
+ {0.276111333333333,0.629444666666667,0.273333333333333,0.620555333333333},
+ {0.278888666666667,0.638888666666666,0.276111333333333,0.629444666666667},
+ {0.282778,0.648888666666667,0.278888666666667,0.638888666666666},
+ {0.287222,0.659444666666667,0.282778,0.648888666666667},
+ {0.291666666666667,0.67,0.287222,0.659444666666667},
+ {0.296111333333333,0.680555333333333,0.291666666666667,0.67},
+ {0.301666666666667,0.690555333333334,0.296111333333333,0.680555333333333},
+ {0.306666666666667,0.7,0.301666666666667,0.690555333333334},
+ {0.312777999999999,0.708888666666667,0.306666666666667,0.7},
+ {0.318888666666666,0.716666666666667,0.312777999999999,0.708888666666667},
+ {0.325555333333334,0.723888666666667,0.318888666666666,0.716666666666667},
+ {0.333333333333333,0.729444666666667,0.325555333333334,0.723888666666667},
+ {0.341111333333333,0.733333333333333,0.333333333333333,0.729444666666667},
+ {0.349999999999999,0.737222,0.341111333333333,0.733333333333333},
+ {0.359999999999999,0.74,0.349999999999999,0.737222},
+ {0.372222000000001,0.742222,0.359999999999999,0.74},
+ {0.386111333333334,0.743888666666667,0.372222000000001,0.742222},
+ {0.401111333333333,0.745555333333333,0.386111333333334,0.743888666666667},
+ {0.417222,0.746666666666667,0.401111333333333,0.745555333333333},
+ {0.433888666666666,0.747778,0.417222,0.746666666666667},
+ {0.45,0.748333333333333,0.433888666666666,0.747778},
+ {0.464444666666668,0.748888666666667,0.45,0.748333333333333},
+ {0.477222,0.749444666666667,0.464444666666668,0.748888666666667},
+ {0.494444666666666,0.75,0.487222,0.749444666666667},
+ {0.503333333333333,0.750555333333333,0.501111333333334,0.75},
+ {0.507222000000001,0.751111333333334,0.503333333333333,0.750555333333333},
+ {0.512778,0.751666666666667,0.507222000000001,0.751111333333334},
+ {0.519444666666667,0.752778,0.512778,0.751666666666667},
+ {0.543888666666668,0.752222,0.535555333333332,0.752778},
+ {0.552222,0.750555333333333,0.543888666666668,0.752222},
+ {0.56,0.747778,0.552222,0.750555333333333},
+ {0.567777999999999,0.743333333333334,0.56,0.747778},
+ {0.575555333333334,0.737222,0.567777999999999,0.743333333333334},
+ {0.583333333333333,0.729444666666667,0.575555333333334,0.737222},
+ {0.588888666666667,0.723333333333333,0.583333333333333,0.729444666666667},
+ {0.594444666666668,0.716111333333333,0.588888666666667,0.723333333333333},
+ {0.599999999999999,0.708333333333333,0.594444666666668,0.716111333333333},
+ {0.606666666666667,0.698888666666667,0.599999999999999,0.708333333333333},
+ {0.612778000000001,0.688888666666667,0.606666666666667,0.698888666666667},
+ {0.619444666666666,0.678333333333333,0.612778000000001,0.688888666666667},
+ {0.626666666666667,0.666666666666667,0.619444666666666,0.678333333333333},
+ {0.633333333333333,0.653888666666666,0.626666666666667,0.666666666666667},
+ {0.640555333333334,0.641111333333334,0.633333333333333,0.653888666666666},
+ {0.647778,0.628333333333333,0.640555333333334,0.641111333333334},
+ {0.655555333333332,0.614444666666667,0.647778,0.628333333333333},
+ {0.662778000000001,0.601111333333333,0.655555333333332,0.614444666666667},
+ {0.669999999999999,0.588333333333334,0.662778000000001,0.601111333333333},
+ {0.677222,0.575555333333333,0.669999999999999,0.588333333333334},
+ {0.684444666666666,0.562778,0.677222,0.575555333333333},
+ {0.691666666666668,0.551111333333333,0.684444666666666,0.562778},
+ {0.698333333333333,0.540555333333333,0.691666666666668,0.551111333333333},
+ {0.705000000000001,0.530555333333333,0.698333333333333,0.540555333333333},
+ {0.711666666666666,0.521111333333333,0.705000000000001,0.530555333333333},
+ {0.717778,0.513333333333333,0.711666666666666,0.521111333333333},
+ {0.723888666666667,0.506111333333333,0.717778,0.513333333333333},
+ {0.729444666666666,0.5,0.723888666666667,0.506111333333333},
+ {0.739444666666666,0.491111333333333,0.729444666666666,0.5},
+ {0.749444666666667,0.484444666666667,0.739444666666666,0.491111333333333},
+ {0.758888666666666,0.480555333333333,0.749444666666667,0.484444666666667},
+ {0.767778,0.478333333333333,0.758888666666666,0.480555333333333},
+ {0.776666666666666,0.477222,0.767778,0.478333333333333},
+ {0.802222,0.477778,0.793888666666668,0.477222},
+ {0.810555333333333,0.478333333333333,0.802222,0.477778},
+ {0.818333333333333,0.478888666666667,0.810555333333333,0.478333333333333},
+ {0.833333333333333,0.479444666666667,0.826111333333332,0.478888666666667},
+ {0.841111333333333,0.481111333333333,0.833333333333333,0.479444666666667},
+ {0.849444666666666,0.484444666666667,0.841111333333333,0.481111333333333},
+ {0.857778000000001,0.489444666666667,0.849444666666666,0.484444666666667},
+ {0.866111333333334,0.495555333333333,0.857778000000001,0.489444666666667},
+ {0.875,0.502778,0.866111333333334,0.495555333333333},
+ {0.883333333333333,0.509444666666666,0.875,0.502778},
+ {0.890000000000001,0.515555333333333,0.883333333333333,0.509444666666666},
+ {0.893888666666667,0.518888666666667,0.890000000000001,0.515555333333333},
+ {0.895555333333334,0.521111333333333,0.893888666666667,0.518888666666667},
+ {0.893888666666667,0.520555333333334,0.895555333333334,0.521111333333333},
+ {0.888888666666666,0.519444666666667,0.893888666666667,0.520555333333334},
+ {0.881666666666668,0.518333333333333,0.888888666666666,0.519444666666667},
+ {0.873333333333332,0.516666666666667,0.881666666666668,0.518333333333333},
+ {0.863888666666665,0.515555333333333,0.873333333333332,0.516666666666667},
+ {0.846666666666666,0.516111333333334,0.854444666666666,0.515555333333333},
+ {0.839444666666668,0.517778,0.846666666666666,0.516111333333334},
+ {0.833333333333333,0.521111333333333,0.839444666666668,0.517778},
+ {0.828333333333333,0.525,0.833333333333333,0.521111333333333},
+ {0.822221999999999,0.53,0.828333333333333,0.525},
+ {0.816666666666668,0.536111333333333,0.822221999999999,0.53},
+ {0.81,0.542778,0.816666666666668,0.536111333333333},
+ {0.803333333333332,0.549444666666667,0.81,0.542778},
+ {0.796111333333333,0.556666666666667,0.803333333333332,0.549444666666667},
+ {0.789999999999999,0.564444666666667,0.796111333333333,0.556666666666667},
+ {0.783888666666667,0.572222,0.789999999999999,0.564444666666667},
+ {0.778333333333334,0.58,0.783888666666667,0.572222},
+ {0.774444666666668,0.587778,0.778333333333334,0.58},
+ {0.772221999999999,0.596111333333334,0.774444666666668,0.587778},
+ {0.771111333333332,0.604444666666667,0.772221999999999,0.596111333333334},
+ {0.771666666666666,0.612222,0.771111333333332,0.604444666666667},
+ {0.773333333333333,0.620555333333333,0.771666666666666,0.612222},
+ {0.776111333333333,0.629444666666667,0.773333333333333,0.620555333333333},
+ {0.778888666666667,0.638888666666666,0.776111333333333,0.629444666666667},
+ {0.782778,0.648888666666667,0.778888666666667,0.638888666666666},
+ {0.787222,0.659444666666667,0.782778,0.648888666666667},
+ {0.791666666666667,0.67,0.787222,0.659444666666667},
+ {0.796111333333333,0.680555333333333,0.791666666666667,0.67},
+ {0.801666666666667,0.690555333333334,0.796111333333333,0.680555333333333},
+ {0.806666666666667,0.7,0.801666666666667,0.690555333333334},
+ {0.812777999999999,0.708888666666667,0.806666666666667,0.7},
+ {0.818888666666666,0.716666666666667,0.812777999999999,0.708888666666667},
+ {0.825555333333334,0.723888666666667,0.818888666666666,0.716666666666667},
+ {0.833333333333333,0.729444666666667,0.825555333333334,0.723888666666667},
+ {0.841111333333333,0.733333333333333,0.833333333333333,0.729444666666667},
+ {0.849999999999999,0.737222,0.841111333333333,0.733333333333333},
+ {0.859999999999999,0.74,0.849999999999999,0.737222},
+ {0.872222000000001,0.742222,0.859999999999999,0.74},
+ {0.886111333333334,0.743888666666667,0.872222000000001,0.742222},
+ {0.901111333333333,0.745555333333333,0.886111333333334,0.743888666666667},
+ {0.917222,0.746666666666667,0.901111333333333,0.745555333333333},
+ {0.933888666666666,0.747778,0.917222,0.746666666666667},
+ {0.95,0.748333333333333,0.933888666666666,0.747778},
+ {0.964444666666668,0.748888666666667,0.95,0.748333333333333},
+ {0.977222,0.749444666666667,0.964444666666668,0.748888666666667},
+ {0.994444666666666,0.75,0.987222,0.749444666666667},
+ {0,0,0,0}
+};
+
+double Icon30[][4] = {
+ {0.103888666666667,0.687222,0,0.708333333333333},
+ {0.125,0.583333333333333,0.103888666666667,0.687222},
+ {0.145555333333334,0.687222,0.125,0.583333333333333},
+ {0.25,0.708333333333333,0.145555333333334,0.687222},
+ {0.145555333333334,0.728888666666667,0.25,0.708333333333333},
+ {0.125,0.833333333333333,0.145555333333334,0.728888666666667},
+ {0.103888666666667,0.728888666666667,0.125,0.833333333333333},
+ {0,0.708333333333333,0.103888666666667,0.728888666666667},
+ {0.291666666666667,0.458333333333333,0.0833333333333333,0.5},
+ {0.333333333333333,0.25,0.291666666666667,0.458333333333333},
+ {0.375,0.458333333333333,0.333333333333333,0.25},
+ {0.583333333333333,0.5,0.375,0.458333333333333},
+ {0.375,0.541666666666667,0.583333333333333,0.5},
+ {0.333333333333333,0.75,0.375,0.541666666666667},
+ {0.291666666666667,0.541666666666667,0.333333333333333,0.75},
+ {0.0833333333333333,0.5,0.291666666666667,0.541666666666667},
+ {0.520555333333334,0.270555333333334,0.416666666666667,0.291666666666667},
+ {0.541666666666667,0.166666666666667,0.520555333333334,0.270555333333334},
+ {0.562222000000001,0.270555333333334,0.541666666666667,0.166666666666667},
+ {0.666666666666667,0.291666666666667,0.562222000000001,0.270555333333334},
+ {0.562222000000001,0.312222,0.666666666666667,0.291666666666667},
+ {0.541666666666667,0.416666666666667,0.562222000000001,0.312222},
+ {0.520555333333334,0.312222,0.541666666666667,0.416666666666667},
+ {0.416666666666667,0.291666666666667,0.520555333333334,0.312222},
+ {0,0,0,0}
+};
+
+double Icon31[][4] = {
+ {0.208333333333333,0.458333333333333,0,0.5},
+ {0.25,0.25,0.208333333333333,0.458333333333333},
+ {0.291666666666667,0.458333333333333,0.25,0.25},
+ {0.5,0.5,0.291666666666667,0.458333333333333},
+ {0.291666666666667,0.541666666666667,0.5,0.5},
+ {0.25,0.75,0.291666666666667,0.541666666666667},
+ {0.208333333333333,0.541666666666667,0.25,0.75},
+ {0,0.5,0.208333333333333,0.541666666666667},
+ {0,0,0,0}
+};
+
+double Icon32[][4] = {
+ {0.25,0.25,0,0.5},
+ {0.5,0.5,0.25,0.25},
+ {0.25,0.75,0.5,0.5},
+ {0,0.5,0.25,0.75},
+ {0,0,0,0}
+};
+
+double Icon33[][4] = {
+ {0.166666666666667,0.25,0,0.333333333333333},
+ {0.166666666666667,0.291666666666667,0.166666666666667,0.25},
+ {0,0.333333333333333,0.166666666666667,0.416666666666667},
+ {0.166666666666667,0.416666666666667,0.166666666666667,0.375},
+ {0.208333333333333,0.458333333333333,0.291666666666667,0.625},
+ {0.25,0.375,0.25,0.458333333333333},
+ {0.291666666666667,0.0416666666666667,0.208333333333333,0.208333333333333},
+ {0.25,0.208333333333333,0.25,0.291666666666667},
+ {0.291666666666667,0.625,0.375,0.458333333333333},
+ {0.333333333333333,0.458333333333333,0.333333333333333,0.375},
+ {0.375,0.208333333333333,0.291666666666667,0.0416666666666667},
+ {0.333333333333333,0.291666666666667,0.333333333333333,0.208333333333333},
+ {0.416666666666667,0.416666666666667,0.583333333333333,0.333333333333333},
+ {0.416666666666667,0.375,0.416666666666667,0.416666666666667},
+ {0.583333333333333,0.333333333333333,0.416666666666667,0.25},
+ {0.416666666666667,0.25,0.416666666666667,0.291666666666667},
+ {0,0,0,0}
+};
+
+double Icon34[][4] = {
+ {0.125,0.497778,0.125,0.5},
+ {0.124444666666667,0.493888666666667,0.125,0.497778},
+ {0.123888666666668,0.486666666666667,0.124444666666667,0.493888666666667},
+ {0.122778000000001,0.476111333333333,0.123888666666668,0.486666666666667},
+ {0.121666666666665,0.462778,0.122778000000001,0.476111333333333},
+ {0.12,0.447222,0.121666666666665,0.462778},
+ {0.118888666666668,0.430555333333333,0.12,0.447222},
+ {0.117778000000001,0.413333333333333,0.118888666666668,0.430555333333333},
+ {0.116666666666665,0.396666666666667,0.117778000000001,0.413333333333333},
+ {0.116666666666665,0.381666666666667,0.116666666666665,0.396666666666667},
+ {0.116666666666665,0.367778,0.116666666666665,0.381666666666667},
+ {0.117221999999998,0.356666666666667,0.116666666666665,0.367778},
+ {0.118888666666668,0.346666666666666,0.117221999999998,0.356666666666667},
+ {0.121666666666665,0.339444666666667,0.118888666666668,0.346666666666666},
+ {0.125,0.333333333333333,0.121666666666665,0.339444666666667},
+ {0.13,0.328333333333333,0.125,0.333333333333333},
+ {0.136666666666666,0.325,0.13,0.328333333333333},
+ {0.145000000000001,0.324444666666666,0.136666666666666,0.325},
+ {0.153888666666665,0.325,0.145000000000001,0.324444666666666},
+ {0.164444666666668,0.327778,0.153888666666665,0.325},
+ {0.176111333333334,0.331111333333334,0.164444666666668,0.327778},
+ {0.187777999999999,0.335555333333333,0.176111333333334,0.331111333333334},
+ {0.198888666666666,0.339444666666667,0.187777999999999,0.335555333333333},
+ {0.210555333333332,0.342778,0.198888666666666,0.339444666666667},
+ {0.221111333333335,0.345,0.210555333333332,0.342778},
+ {0.229999999999999,0.345555333333333,0.221111333333335,0.345},
+ {0.238333333333334,0.343888666666667,0.229999999999999,0.345555333333333},
+ {0.245,0.339444666666667,0.238333333333334,0.343888666666667},
+ {0.25,0.333333333333333,0.245,0.339444666666667},
+ {0.253333333333335,0.326666666666667,0.25,0.333333333333333},
+ {0.255555333333334,0.318888666666667,0.253333333333335,0.326666666666667},
+ {0.256666666666665,0.309444666666667,0.255555333333334,0.318888666666667},
+ {0.257221999999999,0.298888666666667,0.256666666666665,0.309444666666667},
+ {0.257221999999999,0.286666666666667,0.257221999999999,0.298888666666667},
+ {0.256666666666665,0.273333333333333,0.257221999999999,0.286666666666667},
+ {0.255555333333334,0.258888666666667,0.256666666666665,0.273333333333333},
+ {0.253888666666668,0.244444666666666,0.255555333333334,0.258888666666667},
+ {0.252221999999999,0.228888666666667,0.253888666666668,0.244444666666666},
+ {0.25,0.213888666666667,0.252221999999999,0.228888666666667},
+ {0.248333333333335,0.199444666666666,0.25,0.213888666666667},
+ {0.247221999999998,0.185,0.248333333333335,0.199444666666666},
+ {0.246111333333332,0.171666666666667,0.247221999999998,0.185},
+ {0.245555333333333,0.159444666666667,0.246111333333332,0.171666666666667},
+ {0.245555333333333,0.148888666666667,0.245555333333333,0.159444666666667},
+ {0.246666666666665,0.139444666666667,0.245555333333333,0.148888666666667},
+ {0.247778000000001,0.131666666666667,0.246666666666665,0.139444666666667},
+ {0.25,0.125,0.247778000000001,0.131666666666667},
+ {0.252778000000002,0.12,0.25,0.125},
+ {0.255555333333334,0.115555333333334,0.252778000000002,0.12},
+ {0.259444666666667,0.112778,0.255555333333334,0.115555333333334},
+ {0.263888666666669,0.11,0.259444666666667,0.112778},
+ {0.268888666666669,0.108333333333333,0.263888666666669,0.11},
+ {0.273888666666664,0.107222,0.268888666666669,0.108333333333333},
+ {0.279444666666668,0.106111333333333,0.273888666666664,0.107222},
+ {0.285555333333335,0.105555333333333,0.279444666666668,0.106111333333333},
+ {0.303888666666666,0.106111333333333,0.297777999999999,0.105555333333333},
+ {0.309444666666669,0.107222,0.303888666666666,0.106111333333333},
+ {0.314444666666664,0.108333333333333,0.309444666666669,0.107222},
+ {0.319444666666664,0.11,0.314444666666664,0.108333333333333},
+ {0.323888666666666,0.112778,0.319444666666664,0.11},
+ {0.327778,0.115555333333334,0.323888666666666,0.112778},
+ {0.330555333333332,0.12,0.327778,0.115555333333334},
+ {0.333333333333333,0.125,0.330555333333332,0.12},
+ {0.335555333333332,0.131666666666667,0.333333333333333,0.125},
+ {0.336666666666668,0.139444666666667,0.335555333333332,0.131666666666667},
+ {0.337778,0.148888666666667,0.336666666666668,0.139444666666667},
+ {0.337778,0.159444666666667,0.337778,0.148888666666667},
+ {0.337222000000002,0.171666666666667,0.337778,0.159444666666667},
+ {0.336111333333335,0.185,0.337222000000002,0.171666666666667},
+ {0.334999999999998,0.199444666666666,0.336111333333335,0.185},
+ {0.333333333333333,0.213888666666667,0.334999999999998,0.199444666666666},
+ {0.331111333333335,0.229444666666667,0.333333333333333,0.213888666666667},
+ {0.329444666666665,0.244444666666666,0.331111333333335,0.229444666666667},
+ {0.327778,0.258888666666667,0.329444666666665,0.244444666666666},
+ {0.326666666666668,0.273333333333333,0.327778,0.258888666666667},
+ {0.326111333333335,0.286666666666667,0.326666666666668,0.273333333333333},
+ {0.326111333333335,0.298888666666667,0.326111333333335,0.286666666666667},
+ {0.326666666666668,0.309444666666667,0.326111333333335,0.298888666666667},
+ {0.327778,0.318888666666667,0.326666666666668,0.309444666666667},
+ {0.329999999999998,0.326666666666667,0.327778,0.318888666666667},
+ {0.333333333333333,0.333333333333333,0.329999999999998,0.326666666666667},
+ {0.338333333333333,0.339444666666667,0.333333333333333,0.333333333333333},
+ {0.344999999999999,0.343888666666667,0.338333333333333,0.339444666666667},
+ {0.353333333333334,0.345555333333333,0.344999999999999,0.343888666666667},
+ {0.362221999999998,0.345,0.353333333333334,0.345555333333333},
+ {0.372778000000001,0.342778,0.362221999999998,0.345},
+ {0.384444666666667,0.339444666666667,0.372778000000001,0.342778},
+ {0.396111333333332,0.335555333333333,0.384444666666667,0.339444666666667},
+ {0.407222,0.331111333333334,0.396111333333332,0.335555333333333},
+ {0.418888666666665,0.327778,0.407222,0.331111333333334},
+ {0.429444666666669,0.325,0.418888666666665,0.327778},
+ {0.438333333333333,0.324444666666666,0.429444666666669,0.325},
+ {0.446666666666668,0.325,0.438333333333333,0.324444666666666},
+ {0.453333333333333,0.328333333333333,0.446666666666668,0.325},
+ {0.458333333333333,0.333333333333333,0.453333333333333,0.328333333333333},
+ {0.461666666666668,0.339444666666667,0.458333333333333,0.333333333333333},
+ {0.464444666666665,0.346666666666666,0.461666666666668,0.339444666666667},
+ {0.466111333333335,0.356666666666667,0.464444666666665,0.346666666666666},
+ {0.466666666666669,0.367778,0.466111333333335,0.356666666666667},
+ {0.466666666666669,0.381666666666667,0.466666666666669,0.367778},
+ {0.466666666666669,0.396666666666667,0.466666666666669,0.381666666666667},
+ {0.465555333333332,0.413333333333333,0.466666666666669,0.396666666666667},
+ {0.464444666666665,0.430555333333333,0.465555333333332,0.413333333333333},
+ {0.463333333333333,0.447222,0.464444666666665,0.430555333333333},
+ {0.461666666666668,0.462778,0.463333333333333,0.447222},
+ {0.460555333333332,0.476111333333333,0.461666666666668,0.462778},
+ {0.459444666666665,0.486666666666667,0.460555333333332,0.476111333333333},
+ {0.458888666666667,0.493888666666667,0.459444666666665,0.486666666666667},
+ {0.458333333333333,0.497778,0.458888666666667,0.493888666666667},
+ {0.458333333333333,0.5,0.458333333333333,0.497778},
+ {0.125,0.541666666666667,0.125,0.542222},
+ {0.125,0.542222,0.125,0.543888666666666},
+ {0.125,0.543888666666666,0.124444666666667,0.547778},
+ {0.124444666666667,0.547778,0.123888666666668,0.554444666666667},
+ {0.123888666666668,0.554444666666667,0.123333333333335,0.563888666666667},
+ {0.123333333333335,0.563888666666667,0.122778000000001,0.574444666666666},
+ {0.122778000000001,0.574444666666666,0.122221999999998,0.585},
+ {0.122221999999998,0.585,0.122221999999998,0.595555333333333},
+ {0.122221999999998,0.595555333333333,0.122221999999998,0.605},
+ {0.122221999999998,0.605,0.122778000000001,0.612778},
+ {0.122778000000001,0.612778,0.123333333333335,0.619444666666666},
+ {0.123333333333335,0.619444666666666,0.125,0.625},
+ {0.125,0.625,0.127778000000002,0.631111333333333},
+ {0.127778000000002,0.631111333333333,0.131111333333332,0.636666666666667},
+ {0.131111333333332,0.636666666666667,0.136111333333332,0.642222},
+ {0.136111333333332,0.642222,0.142778000000002,0.647778},
+ {0.142778000000002,0.647778,0.149444666666668,0.653333333333334},
+ {0.149444666666668,0.653333333333334,0.156111333333333,0.658888666666667},
+ {0.156111333333333,0.658888666666667,0.161111333333333,0.662778},
+ {0.161111333333333,0.662778,0.165000000000002,0.665555333333333},
+ {0.165000000000002,0.665555333333333,0.166666666666667,0.666666666666667},
+ {0.458333333333333,0.542222,0.458333333333333,0.541666666666667},
+ {0.458333333333333,0.543888666666666,0.458333333333333,0.542222},
+ {0.457778,0.547778,0.458333333333333,0.543888666666666},
+ {0.457222000000002,0.554444666666667,0.457778,0.547778},
+ {0.456666666666668,0.563888666666667,0.457222000000002,0.554444666666667},
+ {0.456111333333335,0.574444666666666,0.456666666666668,0.563888666666667},
+ {0.455555333333332,0.585,0.456111333333335,0.574444666666666},
+ {0.455555333333332,0.595555333333333,0.455555333333332,0.585},
+ {0.455555333333332,0.605,0.455555333333332,0.595555333333333},
+ {0.456111333333335,0.612778,0.455555333333332,0.605},
+ {0.456666666666668,0.619444666666666,0.456111333333335,0.612778},
+ {0.458333333333333,0.625,0.456666666666668,0.619444666666666},
+ {0.461111333333335,0.631111333333333,0.458333333333333,0.625},
+ {0.464444666666665,0.636666666666667,0.461111333333335,0.631111333333333},
+ {0.469444666666665,0.642222,0.464444666666665,0.636666666666667},
+ {0.476111333333336,0.647778,0.469444666666665,0.642222},
+ {0.482778000000001,0.653333333333334,0.476111333333336,0.647778},
+ {0.489444666666666,0.658888666666667,0.482778000000001,0.653333333333334},
+ {0.494444666666666,0.662778,0.489444666666666,0.658888666666667},
+ {0.498333333333335,0.665555333333333,0.494444666666666,0.662778},
+ {0.5,0.666666666666667,0.498333333333335,0.665555333333333},
+ {0,0,0,0}
+};
+
+double Icon35[][4] = {
+ {0.583333333333333,0.75,0.583333333333333,0},
+ {0,0,0,0.75},
+ {0.125,0.5,0.125,0.497778},
+ {0.125,0.497778,0.124444666666667,0.493888666666667},
+ {0.124444666666667,0.493888666666667,0.123888666666668,0.486666666666667},
+ {0.123888666666668,0.486666666666667,0.122778000000001,0.476111333333333},
+ {0.122778000000001,0.476111333333333,0.121666666666665,0.462778},
+ {0.121666666666665,0.462778,0.12,0.447222},
+ {0.12,0.447222,0.118888666666668,0.430555333333333},
+ {0.118888666666668,0.430555333333333,0.117778000000001,0.413333333333333},
+ {0.117778000000001,0.413333333333333,0.116666666666665,0.396666666666667},
+ {0.116666666666665,0.396666666666667,0.116666666666665,0.381666666666667},
+ {0.116666666666665,0.381666666666667,0.116666666666665,0.367778},
+ {0.116666666666665,0.367778,0.117221999999998,0.356666666666667},
+ {0.117221999999998,0.356666666666667,0.118888666666668,0.346666666666666},
+ {0.118888666666668,0.346666666666666,0.121666666666665,0.339444666666667},
+ {0.121666666666665,0.339444666666667,0.125,0.333333333333333},
+ {0.125,0.333333333333333,0.13,0.328333333333333},
+ {0.13,0.328333333333333,0.136666666666666,0.325},
+ {0.136666666666666,0.325,0.145000000000001,0.324444666666666},
+ {0.145000000000001,0.324444666666666,0.153888666666665,0.325},
+ {0.153888666666665,0.325,0.164444666666668,0.327778},
+ {0.164444666666668,0.327778,0.176111333333334,0.331111333333334},
+ {0.176111333333334,0.331111333333334,0.187777999999999,0.335555333333333},
+ {0.187777999999999,0.335555333333333,0.198888666666666,0.339444666666667},
+ {0.198888666666666,0.339444666666667,0.210555333333332,0.342778},
+ {0.210555333333332,0.342778,0.221111333333335,0.345},
+ {0.221111333333335,0.345,0.229999999999999,0.345555333333333},
+ {0.229999999999999,0.345555333333333,0.238333333333334,0.343888666666667},
+ {0.238333333333334,0.343888666666667,0.245,0.339444666666667},
+ {0.245,0.339444666666667,0.25,0.333333333333333},
+ {0.25,0.333333333333333,0.253333333333335,0.326666666666667},
+ {0.253333333333335,0.326666666666667,0.255555333333334,0.318888666666667},
+ {0.255555333333334,0.318888666666667,0.256666666666665,0.309444666666667},
+ {0.256666666666665,0.309444666666667,0.257221999999999,0.298888666666667},
+ {0.257221999999999,0.298888666666667,0.257221999999999,0.286666666666667},
+ {0.257221999999999,0.286666666666667,0.256666666666665,0.273333333333333},
+ {0.256666666666665,0.273333333333333,0.255555333333334,0.258888666666667},
+ {0.255555333333334,0.258888666666667,0.253888666666668,0.244444666666666},
+ {0.253888666666668,0.244444666666666,0.252221999999999,0.228888666666667},
+ {0.252221999999999,0.228888666666667,0.25,0.213888666666667},
+ {0.25,0.213888666666667,0.248333333333335,0.199444666666666},
+ {0.248333333333335,0.199444666666666,0.247221999999998,0.185},
+ {0.247221999999998,0.185,0.246111333333332,0.171666666666667},
+ {0.246111333333332,0.171666666666667,0.245555333333333,0.159444666666667},
+ {0.245555333333333,0.159444666666667,0.245555333333333,0.148888666666667},
+ {0.245555333333333,0.148888666666667,0.246666666666665,0.139444666666667},
+ {0.246666666666665,0.139444666666667,0.247778000000001,0.131666666666667},
+ {0.247778000000001,0.131666666666667,0.25,0.125},
+ {0.25,0.125,0.252778000000002,0.12},
+ {0.252778000000002,0.12,0.255555333333334,0.115555333333334},
+ {0.255555333333334,0.115555333333334,0.259444666666667,0.112778},
+ {0.259444666666667,0.112778,0.263888666666669,0.11},
+ {0.263888666666669,0.11,0.268888666666669,0.108333333333333},
+ {0.268888666666669,0.108333333333333,0.273888666666664,0.107222},
+ {0.273888666666664,0.107222,0.279444666666668,0.106111333333333},
+ {0.279444666666668,0.106111333333333,0.285555333333335,0.105555333333333},
+ {0.297777999999999,0.105555333333333,0.303888666666666,0.106111333333333},
+ {0.303888666666666,0.106111333333333,0.309444666666669,0.107222},
+ {0.309444666666669,0.107222,0.314444666666664,0.108333333333333},
+ {0.314444666666664,0.108333333333333,0.319444666666664,0.11},
+ {0.319444666666664,0.11,0.323888666666666,0.112778},
+ {0.323888666666666,0.112778,0.327778,0.115555333333334},
+ {0.327778,0.115555333333334,0.330555333333332,0.12},
+ {0.330555333333332,0.12,0.333333333333333,0.125},
+ {0.333333333333333,0.125,0.335555333333332,0.131666666666667},
+ {0.335555333333332,0.131666666666667,0.336666666666668,0.139444666666667},
+ {0.336666666666668,0.139444666666667,0.337778,0.148888666666667},
+ {0.337778,0.148888666666667,0.337778,0.159444666666667},
+ {0.337778,0.159444666666667,0.337222000000002,0.171666666666667},
+ {0.337222000000002,0.171666666666667,0.336111333333335,0.185},
+ {0.336111333333335,0.185,0.334999999999998,0.199444666666666},
+ {0.334999999999998,0.199444666666666,0.333333333333333,0.213888666666667},
+ {0.333333333333333,0.213888666666667,0.331111333333335,0.229444666666667},
+ {0.331111333333335,0.229444666666667,0.329444666666665,0.244444666666666},
+ {0.329444666666665,0.244444666666666,0.327778,0.258888666666667},
+ {0.327778,0.258888666666667,0.326666666666668,0.273333333333333},
+ {0.326666666666668,0.273333333333333,0.326111333333335,0.286666666666667},
+ {0.326111333333335,0.286666666666667,0.326111333333335,0.298888666666667},
+ {0.326111333333335,0.298888666666667,0.326666666666668,0.309444666666667},
+ {0.326666666666668,0.309444666666667,0.327778,0.318888666666667},
+ {0.327778,0.318888666666667,0.329999999999998,0.326666666666667},
+ {0.329999999999998,0.326666666666667,0.333333333333333,0.333333333333333},
+ {0.333333333333333,0.333333333333333,0.338333333333333,0.339444666666667},
+ {0.338333333333333,0.339444666666667,0.344999999999999,0.343888666666667},
+ {0.344999999999999,0.343888666666667,0.353333333333334,0.345555333333333},
+ {0.353333333333334,0.345555333333333,0.362221999999998,0.345},
+ {0.362221999999998,0.345,0.372778000000001,0.342778},
+ {0.372778000000001,0.342778,0.384444666666667,0.339444666666667},
+ {0.384444666666667,0.339444666666667,0.396111333333332,0.335555333333333},
+ {0.396111333333332,0.335555333333333,0.407222,0.331111333333334},
+ {0.407222,0.331111333333334,0.418888666666665,0.327778},
+ {0.418888666666665,0.327778,0.429444666666669,0.325},
+ {0.429444666666669,0.325,0.438333333333333,0.324444666666666},
+ {0.438333333333333,0.324444666666666,0.446666666666668,0.325},
+ {0.446666666666668,0.325,0.453333333333333,0.328333333333333},
+ {0.453333333333333,0.328333333333333,0.458333333333333,0.333333333333333},
+ {0.458333333333333,0.333333333333333,0.461666666666668,0.339444666666667},
+ {0.461666666666668,0.339444666666667,0.464444666666665,0.346666666666666},
+ {0.464444666666665,0.346666666666666,0.466111333333335,0.356666666666667},
+ {0.466111333333335,0.356666666666667,0.466666666666669,0.367778},
+ {0.466666666666669,0.367778,0.466666666666669,0.381666666666667},
+ {0.466666666666669,0.381666666666667,0.466666666666669,0.396666666666667},
+ {0.466666666666669,0.396666666666667,0.465555333333332,0.413333333333333},
+ {0.465555333333332,0.413333333333333,0.464444666666665,0.430555333333333},
+ {0.464444666666665,0.430555333333333,0.463333333333333,0.447222},
+ {0.463333333333333,0.447222,0.461666666666668,0.462778},
+ {0.461666666666668,0.462778,0.460555333333332,0.476111333333333},
+ {0.460555333333332,0.476111333333333,0.459444666666665,0.486666666666667},
+ {0.459444666666665,0.486666666666667,0.458888666666667,0.493888666666667},
+ {0.458888666666667,0.493888666666667,0.458333333333333,0.497778},
+ {0.458333333333333,0.497778,0.458333333333333,0.5},
+ {0.125,0.542222,0.125,0.541666666666667},
+ {0.125,0.543888666666666,0.125,0.542222},
+ {0.124444666666667,0.547778,0.125,0.543888666666666},
+ {0.123888666666668,0.554444666666667,0.124444666666667,0.547778},
+ {0.123333333333335,0.563888666666667,0.123888666666668,0.554444666666667},
+ {0.122778000000001,0.574444666666666,0.123333333333335,0.563888666666667},
+ {0.122221999999998,0.585,0.122778000000001,0.574444666666666},
+ {0.122221999999998,0.595555333333333,0.122221999999998,0.585},
+ {0.122221999999998,0.605,0.122221999999998,0.595555333333333},
+ {0.122778000000001,0.612778,0.122221999999998,0.605},
+ {0.123333333333335,0.619444666666666,0.122778000000001,0.612778},
+ {0.125,0.625,0.123333333333335,0.619444666666666},
+ {0.127778000000002,0.631111333333333,0.125,0.625},
+ {0.131111333333332,0.636666666666667,0.127778000000002,0.631111333333333},
+ {0.136111333333332,0.642222,0.131111333333332,0.636666666666667},
+ {0.142778000000002,0.647778,0.136111333333332,0.642222},
+ {0.149444666666668,0.653333333333334,0.142778000000002,0.647778},
+ {0.156111333333333,0.658888666666667,0.149444666666668,0.653333333333334},
+ {0.161111333333333,0.662778,0.156111333333333,0.658888666666667},
+ {0.165000000000002,0.665555333333333,0.161111333333333,0.662778},
+ {0.166666666666667,0.666666666666667,0.165000000000002,0.665555333333333},
+ {0.458333333333333,0.541666666666667,0.458333333333333,0.542222},
+ {0.458333333333333,0.542222,0.458333333333333,0.543888666666666},
+ {0.458333333333333,0.543888666666666,0.457778,0.547778},
+ {0.457778,0.547778,0.457222000000002,0.554444666666667},
+ {0.457222000000002,0.554444666666667,0.456666666666668,0.563888666666667},
+ {0.456666666666668,0.563888666666667,0.456111333333335,0.574444666666666},
+ {0.456111333333335,0.574444666666666,0.455555333333332,0.585},
+ {0.455555333333332,0.585,0.455555333333332,0.595555333333333},
+ {0.455555333333332,0.595555333333333,0.455555333333332,0.605},
+ {0.455555333333332,0.605,0.456111333333335,0.612778},
+ {0.456111333333335,0.612778,0.456666666666668,0.619444666666666},
+ {0.456666666666668,0.619444666666666,0.458333333333333,0.625},
+ {0.458333333333333,0.625,0.461111333333335,0.631111333333333},
+ {0.461111333333335,0.631111333333333,0.464444666666665,0.636666666666667},
+ {0.464444666666665,0.636666666666667,0.469444666666665,0.642222},
+ {0.469444666666665,0.642222,0.476111333333336,0.647778},
+ {0.476111333333336,0.647778,0.482778000000001,0.653333333333334},
+ {0.482778000000001,0.653333333333334,0.489444666666666,0.658888666666667},
+ {0.489444666666666,0.658888666666667,0.494444666666666,0.662778},
+ {0.494444666666666,0.662778,0.498333333333335,0.665555333333333},
+ {0.498333333333335,0.665555333333333,0.5,0.666666666666667},
+ {0,0,0,0}
+};
+
+double Icon36[][4] = {
+ {0.0694446666666645,0.397778,0.0733333333333329,0.395555333333334},
+ {0.067222666666666,0.401111333333333,0.0694446666666645,0.397778},
+ {0.0649999999999977,0.405,0.067222666666666,0.401111333333333},
+ {0.0638893333333309,0.409444666666667,0.0649999999999977,0.405},
+ {0.0627779999999992,0.414444666666667,0.0638893333333309,0.409444666666667},
+ {0.0622226666666658,0.42,0.0627779999999992,0.414444666666667},
+ {0.0622226666666658,0.425555333333334,0.0622226666666658,0.42},
+ {0.0622226666666658,0.431111333333333,0.0622226666666658,0.425555333333334},
+ {0.0627779999999992,0.436666666666667,0.0622226666666658,0.431111333333333},
+ {0.0638893333333309,0.441666666666666,0.0627779999999992,0.436666666666667},
+ {0.0649999999999977,0.446111333333333,0.0638893333333309,0.441666666666666},
+ {0.067222666666666,0.45,0.0649999999999977,0.446111333333333},
+ {0.0694446666666645,0.453333333333333,0.067222666666666,0.45},
+ {0.0733333333333329,0.455555333333334,0.0694446666666645,0.453333333333333},
+ {0.0783333333333331,0.457222,0.0733333333333329,0.455555333333334},
+ {0.0844446666666651,0.458333333333333,0.0783333333333331,0.457222},
+ {0.101111333333331,0.457222,0.0922226666666669,0.458333333333333},
+ {0.111111333333331,0.455,0.101111333333331,0.457222},
+ {0.121666666666665,0.452778,0.111111333333331,0.455},
+ {0.132777999999997,0.45,0.121666666666665,0.452778},
+ {0.143889333333334,0.447222,0.132777999999997,0.45},
+ {0.154444666666668,0.445555333333333,0.143889333333334,0.447222},
+ {0.164444666666663,0.444444666666667,0.154444666666668,0.445555333333333},
+ {0.181111333333334,0.446666666666667,0.173333333333332,0.444444666666667},
+ {0.187222666666666,0.45,0.181111333333334,0.446666666666667},
+ {0.192222666666666,0.455555333333334,0.187222666666666,0.45},
+ {0.195556000000001,0.461666666666667,0.192222666666666,0.455555333333334},
+ {0.198333333333333,0.47,0.195556000000001,0.461666666666667},
+ {0.199999999999998,0.479444666666667,0.198333333333333,0.47},
+ {0.201666666666663,0.49,0.199999999999998,0.479444666666667},
+ {0.203333333333333,0.502778,0.201666666666663,0.49},
+ {0.204444666666665,0.516111333333334,0.203333333333333,0.502778},
+ {0.205555999999997,0.53,0.204444666666665,0.516111333333334},
+ {0.20611133333333,0.545,0.205555999999997,0.53},
+ {0.206666666666663,0.559444666666667,0.20611133333333,0.545},
+ {0.206666666666663,0.573333333333334,0.206666666666663,0.559444666666667},
+ {0.20611133333333,0.586666666666667,0.206666666666663,0.573333333333334},
+ {0.204999999999998,0.599444666666667,0.20611133333333,0.586666666666667},
+ {0.203333333333333,0.61,0.204999999999998,0.599444666666667},
+ {0.200555999999996,0.619444666666666,0.203333333333333,0.61},
+ {0.197222666666666,0.627778,0.200555999999996,0.619444666666666},
+ {0.192222666666666,0.633888666666667,0.197222666666666,0.627778},
+ {0.186111333333334,0.638888666666666,0.192222666666666,0.633888666666667},
+ {0.178333333333332,0.642222,0.186111333333334,0.638888666666666},
+ {0.16888933333333,0.645,0.178333333333332,0.642222},
+ {0.157777999999998,0.646111333333333,0.16888933333333,0.645},
+ {0.145555999999999,0.646666666666667,0.157777999999998,0.646111333333333},
+ {0.117777999999997,0.646111333333333,0.132222666666664,0.646666666666667},
+ {0.103333333333334,0.645,0.117777999999997,0.646111333333333},
+ {0.0888893333333319,0.643888666666667,0.103333333333334,0.645},
+ {0.0744446666666647,0.642222,0.0888893333333319,0.643888666666667},
+ {0.061111333333334,0.641111333333334,0.0744446666666647,0.642222},
+ {0.0488893333333304,0.639444666666667,0.061111333333334,0.641111333333334},
+ {0.0377779999999982,0.638333333333333,0.0488893333333304,0.639444666666667},
+ {0.0283333333333312,0.637222,0.0377779999999982,0.638333333333333},
+ {0.0205559999999991,0.635555333333333,0.0283333333333312,0.637222},
+ {0.0144446666666672,0.633888666666667,0.0205559999999991,0.635555333333333},
+ {0.00944466666666699,0.631666666666667,0.0144446666666672,0.633888666666667},
+ {0.00611133333333195,0.628888666666667,0.00944466666666699,0.631666666666667},
+ {0.0033333333333303,0.626111333333334,0.00611133333333195,0.628888666666667},
+ {0.00166666666666515,0.622222,0.0033333333333303,0.626111333333334},
+ {0.000555999999998373,0.618333333333334,0.00166666666666515,0.622222},
+ {0,0.613888666666667,0.000555999999998373,0.618333333333334},
+ {0,0.608888666666667,0,0.613888666666667},
+ {0.000555999999998373,0.604444666666667,0,0.608888666666667},
+ {0.00111133333333176,0.599444666666667,0.000555999999998373,0.604444666666667},
+ {0.00222266666666352,0.594444666666667,0.00111133333333176,0.599444666666667},
+ {0.0033333333333303,0.59,0.00222266666666352,0.594444666666667},
+ {0.00500000000000019,0.586111333333333,0.0033333333333303,0.59},
+ {0.00666666666666534,0.582222,0.00500000000000019,0.586111333333333},
+ {0.00833333333333049,0.579444666666667,0.00666666666666534,0.582222},
+ {0.0111113333333321,0.576666666666667,0.00833333333333049,0.579444666666667},
+ {0.0144446666666672,0.574444666666666,0.0111113333333321,0.576666666666667},
+ {0.0194446666666674,0.572778,0.0144446666666672,0.574444666666666},
+ {0.0255559999999993,0.571666666666667,0.0194446666666674,0.572778},
+ {0.0333333333333314,0.571111333333333,0.0255559999999993,0.571666666666667},
+ {0.0522226666666654,0.572222,0.042222666666665,0.571111333333333},
+ {0.0627779999999992,0.573333333333334,0.0522226666666654,0.572222},
+ {0.0738893333333313,0.574444666666666,0.0627779999999992,0.573333333333334},
+ {0.0849999999999985,0.575555333333333,0.0738893333333313,0.574444666666666},
+ {0.0955559999999972,0.576666666666667,0.0849999999999985,0.575555333333333},
+ {0.105555999999998,0.577778,0.0955559999999972,0.576666666666667},
+ {0.122222666666663,0.577222,0.114444666666666,0.577778},
+ {0.12833333333333,0.576111333333333,0.122222666666663,0.577222},
+ {0.13333333333333,0.574444666666666,0.12833333333333,0.576111333333333},
+ {0.137222666666664,0.572222,0.13333333333333,0.574444666666666},
+ {0.139444666666667,0.568888666666667,0.137222666666664,0.572222},
+ {0.141666666666666,0.565,0.139444666666667,0.568888666666667},
+ {0.142777999999997,0.560555333333333,0.141666666666666,0.565},
+ {0.143889333333334,0.555555333333333,0.142777999999997,0.560555333333333},
+ {0.144444666666667,0.55,0.143889333333334,0.555555333333333},
+ {0.144444666666667,0.544444666666667,0.144444666666667,0.55},
+ {0.144444666666667,0.539444666666667,0.144444666666667,0.544444666666667},
+ {0.143889333333334,0.533888666666667,0.144444666666667,0.539444666666667},
+ {0.142777999999997,0.528888666666666,0.143889333333334,0.533888666666667},
+ {0.141666666666666,0.524444666666666,0.142777999999997,0.528888666666666},
+ {0.139444666666667,0.520555333333334,0.141666666666666,0.524444666666666},
+ {0.137222666666664,0.517222,0.139444666666667,0.520555333333334},
+ {0.13333333333333,0.515,0.137222666666664,0.517222},
+ {0.12833333333333,0.513333333333333,0.13333333333333,0.515},
+ {0.122222666666663,0.512222,0.12833333333333,0.513333333333333},
+ {0.105555999999998,0.513333333333333,0.114444666666666,0.512222},
+ {0.0955559999999972,0.515555333333333,0.105555999999998,0.513333333333333},
+ {0.0849999999999985,0.517778,0.0955559999999972,0.515555333333333},
+ {0.0738893333333313,0.520555333333334,0.0849999999999985,0.517778},
+ {0.0627779999999992,0.523333333333333,0.0738893333333313,0.520555333333334},
+ {0.0522226666666654,0.525,0.0627779999999992,0.523333333333333},
+ {0.042222666666665,0.526111333333333,0.0522226666666654,0.525},
+ {0.0255559999999993,0.523888666666667,0.0333333333333314,0.526111333333333},
+ {0.0194446666666674,0.520555333333334,0.0255559999999993,0.523888666666667},
+ {0.0144446666666672,0.515,0.0194446666666674,0.520555333333334},
+ {0.0111113333333321,0.508888666666667,0.0144446666666672,0.515},
+ {0.00833333333333049,0.500555333333333,0.0111113333333321,0.508888666666667},
+ {0.00666666666666534,0.491111333333333,0.00833333333333049,0.500555333333333},
+ {0.00500000000000019,0.480555333333333,0.00666666666666534,0.491111333333333},
+ {0.0033333333333303,0.467778,0.00500000000000019,0.480555333333333},
+ {0.00222266666666352,0.454444666666667,0.0033333333333303,0.467778},
+ {0.00111133333333176,0.440555333333334,0.00222266666666352,0.454444666666667},
+ {0.000555999999998373,0.426111333333333,0.00111133333333176,0.440555333333334},
+ {0,0.411111333333333,0.000555999999998373,0.426111333333333},
+ {0,0.397222,0,0.411111333333333},
+ {0.000555999999998373,0.383888666666667,0,0.397222},
+ {0.00166666666666515,0.371111333333333,0.000555999999998373,0.383888666666667},
+ {0.0033333333333303,0.360555333333333,0.00166666666666515,0.371111333333333},
+ {0.00611133333333195,0.351111333333333,0.0033333333333303,0.360555333333333},
+ {0.00944466666666699,0.342778,0.00611133333333195,0.351111333333333},
+ {0.0144446666666672,0.336666666666667,0.00944466666666699,0.342778},
+ {0.0205559999999991,0.331666666666666,0.0144446666666672,0.336666666666667},
+ {0.0283333333333312,0.328333333333333,0.0205559999999991,0.331666666666666},
+ {0.0377779999999982,0.325555333333333,0.0283333333333312,0.328333333333333},
+ {0.0488893333333304,0.324444666666666,0.0377779999999982,0.325555333333333},
+ {0.061111333333334,0.323888666666667,0.0488893333333304,0.324444666666666},
+ {0.0888893333333319,0.324444666666666,0.0744446666666647,0.323888666666667},
+ {0.103333333333334,0.325555333333333,0.0888893333333319,0.324444666666666},
+ {0.117777999999997,0.326666666666667,0.103333333333334,0.325555333333333},
+ {0.132222666666664,0.328333333333333,0.117777999999997,0.326666666666667},
+ {0.145555999999999,0.329444666666667,0.132222666666664,0.328333333333333},
+ {0.157777999999998,0.331111333333334,0.145555999999999,0.329444666666667},
+ {0.16888933333333,0.332222,0.157777999999998,0.331111333333334},
+ {0.178333333333332,0.333333333333333,0.16888933333333,0.332222},
+ {0.186111333333334,0.335,0.178333333333332,0.333333333333333},
+ {0.192222666666666,0.336666666666667,0.186111333333334,0.335},
+ {0.197222666666666,0.338888666666667,0.192222666666666,0.336666666666667},
+ {0.200555999999996,0.341111333333333,0.197222666666666,0.338888666666667},
+ {0.203333333333333,0.344444666666667,0.200555999999996,0.341111333333333},
+ {0.204999999999998,0.348333333333333,0.203333333333333,0.344444666666667},
+ {0.20611133333333,0.352222,0.204999999999998,0.348333333333333},
+ {0.206666666666663,0.356666666666667,0.20611133333333,0.352222},
+ {0.206666666666663,0.361111333333334,0.206666666666663,0.356666666666667},
+ {0.20611133333333,0.366111333333333,0.206666666666663,0.361111333333334},
+ {0.205555999999997,0.371111333333333,0.20611133333333,0.366111333333333},
+ {0.204444666666665,0.375555333333333,0.205555999999997,0.371111333333333},
+ {0.203333333333333,0.38,0.204444666666665,0.375555333333333},
+ {0.201666666666663,0.383888666666667,0.203333333333333,0.38},
+ {0.199999999999998,0.387778,0.201666666666663,0.383888666666667},
+ {0.198333333333333,0.391111333333334,0.199999999999998,0.387778},
+ {0.195556000000001,0.393333333333333,0.198333333333333,0.391111333333334},
+ {0.192222666666666,0.395555333333334,0.195556000000001,0.393333333333333},
+ {0.187222666666666,0.397222,0.192222666666666,0.395555333333334},
+ {0.181111333333334,0.398333333333333,0.187222666666666,0.397222},
+ {0.173333333333332,0.398888666666667,0.181111333333334,0.398333333333333},
+ {0.154444666666668,0.397778,0.164444666666663,0.398888666666667},
+ {0.143889333333334,0.396666666666667,0.154444666666668,0.397778},
+ {0.132777999999997,0.395555333333334,0.143889333333334,0.396666666666667},
+ {0.121666666666665,0.394444666666667,0.132777999999997,0.395555333333334},
+ {0.111111333333331,0.393333333333333,0.121666666666665,0.394444666666667},
+ {0.101111333333331,0.392222,0.111111333333331,0.393333333333333},
+ {0.0844446666666651,0.392778,0.0922226666666669,0.392222},
+ {0.0783333333333331,0.393888666666667,0.0844446666666651,0.392778},
+ {0.0733333333333329,0.395555333333334,0.0783333333333331,0.393888666666667},
+ {0.317777999999999,0.334444666666667,0.311666666666667,0.336666666666667},
+ {0.323333333333333,0.332778,0.317777999999999,0.334444666666667},
+ {0.329444666666665,0.331666666666666,0.323333333333333,0.332778},
+ {0.335555999999997,0.331111333333334,0.329444666666665,0.331666666666666},
+ {0.353333333333334,0.331666666666666,0.347222666666667,0.331111333333334},
+ {0.359444666666666,0.332778,0.353333333333334,0.331666666666666},
+ {0.365,0.334444666666667,0.359444666666666,0.332778},
+ {0.371111333333332,0.336666666666667,0.365,0.334444666666667},
+ {0.375555999999998,0.338888666666667,0.371111333333332,0.336666666666667},
+ {0.38,0.341666666666667,0.375555999999998,0.338888666666667},
+ {0.384444666666667,0.344444666666667,0.38,0.341666666666667},
+ {0.388889333333334,0.347222,0.384444666666667,0.344444666666667},
+ {0.393889333333334,0.349444666666667,0.388889333333334,0.347222},
+ {0.398889333333334,0.352222,0.393889333333334,0.349444666666667},
+ {0.403889333333334,0.355,0.398889333333334,0.352222},
+ {0.408333333333331,0.357778,0.403889333333334,0.355},
+ {0.413333333333332,0.361666666666667,0.408333333333331,0.357778},
+ {0.417777999999998,0.366111333333333,0.413333333333332,0.361666666666667},
+ {0.421666666666667,0.371111333333333,0.417777999999998,0.366111333333333},
+ {0.424999999999997,0.377778,0.421666666666667,0.371111333333333},
+ {0.428333333333332,0.385555333333333,0.424999999999997,0.377778},
+ {0.430556,0.395555333333334,0.428333333333332,0.385555333333333},
+ {0.431666666666667,0.403333333333334,0.430556,0.395555333333334},
+ {0.432777999999999,0.412222,0.431666666666667,0.403333333333334},
+ {0.433889333333331,0.422222,0.432777999999999,0.412222},
+ {0.434444666666664,0.433333333333334,0.433889333333331,0.422222},
+ {0.434999999999997,0.445555333333333,0.434444666666664,0.433333333333334},
+ {0.435556000000001,0.458888666666667,0.434999999999997,0.445555333333333},
+ {0.435556000000001,0.472778,0.435556000000001,0.458888666666667},
+ {0.436111333333334,0.487222,0.435556000000001,0.472778},
+ {0.436111333333334,0.502222,0.436111333333334,0.487222},
+ {0.436111333333334,0.517222,0.436111333333334,0.502222},
+ {0.436111333333334,0.532778,0.436111333333334,0.517222},
+ {0.436111333333334,0.547222,0.436111333333334,0.532778},
+ {0.435556000000001,0.561666666666667,0.436111333333334,0.547222},
+ {0.435556000000001,0.575555333333333,0.435556000000001,0.561666666666667},
+ {0.434999999999997,0.588333333333334,0.435556000000001,0.575555333333333},
+ {0.434444666666664,0.6,0.434999999999997,0.588333333333334},
+ {0.433889333333331,0.610555333333333,0.434444666666664,0.6},
+ {0.432777999999999,0.619444666666666,0.433889333333331,0.610555333333333},
+ {0.431666666666667,0.627222,0.432777999999999,0.619444666666666},
+ {0.430556,0.633888666666667,0.431666666666667,0.627222},
+ {0.428889333333331,0.64,0.430556,0.633888666666667},
+ {0.426666666666667,0.644444666666667,0.428889333333331,0.64},
+ {0.42388933333333,0.647778,0.426666666666667,0.644444666666667},
+ {0.420556,0.65,0.42388933333333,0.647778},
+ {0.417222666666665,0.651666666666667,0.420556,0.65},
+ {0.413333333333332,0.652222,0.417222666666665,0.651666666666667},
+ {0.405000000000001,0.651666666666667,0.409444666666663,0.652222},
+ {0.400555999999999,0.650555333333333,0.405000000000001,0.651666666666667},
+ {0.396666666666666,0.649444666666666,0.400555999999999,0.650555333333333},
+ {0.392222666666664,0.648333333333333,0.396666666666666,0.649444666666666},
+ {0.388333333333331,0.646666666666667,0.392222666666664,0.648333333333333},
+ {0.384444666666667,0.645,0.388333333333331,0.646666666666667},
+ {0.381111333333332,0.643333333333333,0.384444666666667,0.645},
+ {0.377777999999997,0.641666666666667,0.381111333333332,0.643333333333333},
+ {0.375,0.639444666666667,0.377777999999997,0.641666666666667},
+ {0.372777999999997,0.636666666666667,0.375,0.639444666666667},
+ {0.371111333333332,0.633888666666667,0.372777999999997,0.636666666666667},
+ {0.369444666666666,0.628888666666667,0.371111333333332,0.633888666666667},
+ {0.36833333333333,0.622778,0.369444666666666,0.628888666666667},
+ {0.367777999999996,0.615,0.36833333333333,0.622778},
+ {0.367777999999996,0.606111333333333,0.367777999999996,0.615},
+ {0.368889333333333,0.596111333333334,0.367777999999996,0.606111333333333},
+ {0.37,0.585555333333333,0.368889333333333,0.596111333333334},
+ {0.371111333333332,0.574444666666666,0.37,0.585555333333333},
+ {0.372222666666663,0.563333333333333,0.371111333333332,0.574444666666666},
+ {0.37333333333333,0.552778,0.372222666666663,0.563333333333333},
+ {0.374444666666667,0.542778,0.37333333333333,0.552778},
+ {0.374444666666667,0.533888666666667,0.374444666666667,0.542778},
+ {0.373889333333333,0.526111333333333,0.374444666666667,0.533888666666667},
+ {0.372777999999997,0.52,0.373889333333333,0.526111333333333},
+ {0.371111333333332,0.515,0.372777999999997,0.52},
+ {0.368889333333333,0.511111333333333,0.371111333333332,0.515},
+ {0.365555999999998,0.508888666666667,0.368889333333333,0.511111333333333},
+ {0.361666666666665,0.506666666666667,0.365555999999998,0.508888666666667},
+ {0.357222666666667,0.505555333333334,0.361666666666665,0.506666666666667},
+ {0.352222666666667,0.504444666666667,0.357222666666667,0.505555333333334},
+ {0.346666666666664,0.503888666666667,0.352222666666667,0.504444666666667},
+ {0.330555999999997,0.504444666666667,0.33611133333333,0.503888666666667},
+ {0.325555999999996,0.505555333333334,0.330555999999997,0.504444666666667},
+ {0.321111333333334,0.506666666666667,0.325555999999996,0.505555333333334},
+ {0.317222666666666,0.508888666666667,0.321111333333334,0.506666666666667},
+ {0.313889333333331,0.511111333333333,0.317222666666666,0.508888666666667},
+ {0.311666666666667,0.515,0.313889333333331,0.511111333333333},
+ {0.309999999999997,0.52,0.311666666666667,0.515},
+ {0.308889333333331,0.526111333333333,0.309999999999997,0.52},
+ {0.308333333333332,0.533888666666667,0.308889333333331,0.526111333333333},
+ {0.308333333333332,0.542778,0.308333333333332,0.533888666666667},
+ {0.309444666666664,0.552778,0.308333333333332,0.542778},
+ {0.310556000000001,0.563333333333333,0.309444666666664,0.552778},
+ {0.311666666666667,0.574444666666666,0.310556000000001,0.563333333333333},
+ {0.312777999999999,0.585555333333333,0.311666666666667,0.574444666666666},
+ {0.313889333333331,0.596111333333334,0.312777999999999,0.585555333333333},
+ {0.314999999999998,0.606111333333333,0.313889333333331,0.596111333333334},
+ {0.314999999999998,0.615,0.314999999999998,0.606111333333333},
+ {0.314444666666664,0.622778,0.314999999999998,0.615},
+ {0.313333333333333,0.628888666666667,0.314444666666664,0.622778},
+ {0.311666666666667,0.633888666666667,0.313333333333333,0.628888666666667},
+ {0.309999999999997,0.636666666666667,0.311666666666667,0.633888666666667},
+ {0.307777999999999,0.639444666666667,0.309999999999997,0.636666666666667},
+ {0.304999999999997,0.641666666666667,0.307777999999999,0.639444666666667},
+ {0.301666666666667,0.643333333333333,0.304999999999997,0.641666666666667},
+ {0.298333333333332,0.645,0.301666666666667,0.643333333333333},
+ {0.294444666666664,0.646666666666667,0.298333333333332,0.645},
+ {0.290556,0.648333333333333,0.294444666666664,0.646666666666667},
+ {0.286111333333333,0.649444666666666,0.290556,0.648333333333333},
+ {0.281666666666666,0.650555333333333,0.286111333333333,0.649444666666666},
+ {0.277777999999998,0.651666666666667,0.281666666666666,0.650555333333333},
+ {0.273333333333331,0.652222,0.277777999999998,0.651666666666667},
+ {0.265555999999999,0.651666666666667,0.269444666666667,0.652222},
+ {0.262222666666664,0.65,0.265555999999999,0.651666666666667},
+ {0.258889333333334,0.647778,0.262222666666664,0.65},
+ {0.256111333333332,0.644444666666667,0.258889333333334,0.647778},
+ {0.253889333333333,0.64,0.256111333333332,0.644444666666667},
+ {0.252222666666663,0.633888666666667,0.253889333333333,0.64},
+ {0.251111333333332,0.627222,0.252222666666663,0.633888666666667},
+ {0.25,0.619444666666666,0.251111333333332,0.627222},
+ {0.248889333333333,0.610555333333333,0.25,0.619444666666666},
+ {0.24833333333333,0.6,0.248889333333333,0.610555333333333},
+ {0.247777999999997,0.588333333333334,0.24833333333333,0.6},
+ {0.247222666666663,0.575555333333333,0.247777999999997,0.588333333333334},
+ {0.247222666666663,0.561666666666667,0.247222666666663,0.575555333333333},
+ {0.246666666666665,0.547222,0.247222666666663,0.561666666666667},
+ {0.246666666666665,0.532778,0.246666666666665,0.547222},
+ {0.246666666666665,0.517222,0.246666666666665,0.532778},
+ {0.246666666666665,0.502222,0.246666666666665,0.517222},
+ {0.246666666666665,0.487222,0.246666666666665,0.502222},
+ {0.247222666666663,0.472778,0.246666666666665,0.487222},
+ {0.247222666666663,0.458888666666667,0.247222666666663,0.472778},
+ {0.247777999999997,0.445555333333333,0.247222666666663,0.458888666666667},
+ {0.24833333333333,0.433333333333334,0.247777999999997,0.445555333333333},
+ {0.248889333333333,0.422222,0.24833333333333,0.433333333333334},
+ {0.25,0.412222,0.248889333333333,0.422222},
+ {0.251111333333332,0.403333333333334,0.25,0.412222},
+ {0.252222666666663,0.395555333333334,0.251111333333332,0.403333333333334},
+ {0.254444666666667,0.385555333333333,0.252222666666663,0.395555333333334},
+ {0.257777999999997,0.377778,0.254444666666667,0.385555333333333},
+ {0.261111333333332,0.371111333333333,0.257777999999997,0.377778},
+ {0.265000000000001,0.366111333333333,0.261111333333332,0.371111333333333},
+ {0.269444666666667,0.361666666666667,0.265000000000001,0.366111333333333},
+ {0.274444666666668,0.357778,0.269444666666667,0.361666666666667},
+ {0.278889333333334,0.355,0.274444666666668,0.357778},
+ {0.28388933333333,0.352222,0.278889333333334,0.355},
+ {0.28888933333333,0.349444666666667,0.28388933333333,0.352222},
+ {0.29388933333333,0.347222,0.28888933333333,0.349444666666667},
+ {0.298333333333332,0.344444666666667,0.29388933333333,0.347222},
+ {0.302777999999999,0.341666666666667,0.298333333333332,0.344444666666667},
+ {0.307222666666666,0.338888666666667,0.302777999999999,0.341666666666667},
+ {0.311666666666667,0.336666666666667,0.307222666666666,0.338888666666667},
+ {0.371111333333332,0.455555333333334,0.367222666666663,0.457778},
+ {0.367222666666663,0.457778,0.362778000000001,0.459444666666667},
+ {0.362778000000001,0.459444666666667,0.356111333333331,0.460555333333333},
+ {0.356111333333331,0.460555333333333,0.348889333333332,0.461111333333333},
+ {0.333889333333332,0.461111333333333,0.326666666666663,0.460555333333333},
+ {0.326666666666663,0.460555333333333,0.319999999999998,0.459444666666667},
+ {0.319999999999998,0.459444666666667,0.315556000000001,0.457778},
+ {0.315556000000001,0.457778,0.311666666666667,0.455555333333334},
+ {0.311666666666667,0.455555333333334,0.309444666666664,0.451666666666667},
+ {0.309444666666664,0.451666666666667,0.307777999999999,0.446666666666667},
+ {0.307777999999999,0.446666666666667,0.306666666666667,0.440555333333334},
+ {0.306666666666667,0.440555333333334,0.306111333333334,0.433333333333334},
+ {0.306111333333334,0.433333333333334,0.306111333333334,0.425555333333334},
+ {0.306111333333334,0.425555333333334,0.306111333333334,0.417778},
+ {0.306111333333334,0.417778,0.306666666666667,0.410555333333334},
+ {0.306666666666667,0.410555333333334,0.307777999999999,0.404444666666667},
+ {0.307777999999999,0.404444666666667,0.309444666666664,0.399444666666666},
+ {0.309444666666664,0.399444666666666,0.311666666666667,0.395555333333334},
+ {0.311666666666667,0.395555333333334,0.315556000000001,0.393333333333333},
+ {0.315556000000001,0.393333333333333,0.319999999999998,0.391666666666667},
+ {0.319999999999998,0.391666666666667,0.326666666666663,0.390555333333333},
+ {0.326666666666663,0.390555333333333,0.333889333333332,0.39},
+ {0.348889333333332,0.39,0.356111333333331,0.390555333333333},
+ {0.356111333333331,0.390555333333333,0.362778000000001,0.391666666666667},
+ {0.362778000000001,0.391666666666667,0.367222666666663,0.393333333333333},
+ {0.367222666666663,0.393333333333333,0.371111333333332,0.395555333333334},
+ {0.371111333333332,0.395555333333334,0.37333333333333,0.399444666666666},
+ {0.37333333333333,0.399444666666666,0.375,0.404444666666667},
+ {0.375,0.404444666666667,0.376111333333332,0.410555333333334},
+ {0.376111333333332,0.410555333333334,0.376666666666665,0.417778},
+ {0.376666666666665,0.417778,0.376666666666665,0.425555333333334},
+ {0.376666666666665,0.425555333333334,0.376666666666665,0.433333333333334},
+ {0.376666666666665,0.433333333333334,0.376111333333332,0.440555333333334},
+ {0.376111333333332,0.440555333333334,0.375,0.446666666666667},
+ {0.375,0.446666666666667,0.37333333333333,0.451666666666667},
+ {0.37333333333333,0.451666666666667,0.371111333333332,0.455555333333334},
+ {0.549444666666664,0.633888666666667,0.553889333333331,0.637778},
+ {0.553889333333331,0.637778,0.557777999999999,0.64},
+ {0.557777999999999,0.64,0.562222666666666,0.642222},
+ {0.562222666666666,0.642222,0.566666666666668,0.643333333333333},
+ {0.566666666666668,0.643333333333333,0.570556000000001,0.644444666666667},
+ {0.570556000000001,0.644444666666667,0.574999999999998,0.645},
+ {0.583333333333333,0.645,0.587778,0.644444666666667},
+ {0.587778,0.644444666666667,0.591666666666664,0.643333333333333},
+ {0.591666666666664,0.643333333333333,0.596111333333331,0.642222},
+ {0.596111333333331,0.642222,0.600555999999997,0.64},
+ {0.600555999999997,0.64,0.604444666666666,0.637778},
+ {0.604444666666666,0.637778,0.608889333333333,0.633888666666667},
+ {0.608889333333333,0.633888666666667,0.613333333333334,0.628888666666667},
+ {0.613333333333334,0.628888666666667,0.617777999999996,0.623333333333333},
+ {0.617777999999996,0.623333333333333,0.622222666666663,0.616111333333333},
+ {0.622222666666663,0.616111333333333,0.626666666666665,0.608888666666667},
+ {0.626666666666665,0.608888666666667,0.631666666666665,0.600555333333334},
+ {0.631666666666665,0.600555333333334,0.636666666666665,0.591666666666667},
+ {0.636666666666665,0.591666666666667,0.641666666666666,0.582778},
+ {0.641666666666666,0.582778,0.646111333333332,0.573333333333334},
+ {0.646111333333332,0.573333333333334,0.651111333333333,0.563888666666667},
+ {0.651111333333333,0.563888666666667,0.655555999999999,0.554444666666667},
+ {0.655555999999999,0.554444666666667,0.659444666666663,0.545},
+ {0.659444666666663,0.545,0.662777999999998,0.535555333333334},
+ {0.662777999999998,0.535555333333334,0.666111333333333,0.525555333333333},
+ {0.666111333333333,0.525555333333333,0.668333333333332,0.515},
+ {0.668333333333332,0.515,0.669999999999997,0.505555333333334},
+ {0.669999999999997,0.505555333333334,0.671111333333333,0.495},
+ {0.671111333333333,0.495,0.672222666666665,0.484444666666667},
+ {0.672222666666665,0.484444666666667,0.672777999999999,0.472778},
+ {0.672777999999999,0.472778,0.673333333333332,0.46},
+ {0.673333333333332,0.46,0.67388933333333,0.447222},
+ {0.67388933333333,0.447222,0.67388933333333,0.433888666666667},
+ {0.67388933333333,0.433888666666667,0.67388933333333,0.42},
+ {0.67388933333333,0.42,0.67388933333333,0.406666666666667},
+ {0.67388933333333,0.406666666666667,0.67388933333333,0.393888666666667},
+ {0.67388933333333,0.393888666666667,0.673333333333332,0.381666666666667},
+ {0.673333333333332,0.381666666666667,0.672777999999999,0.37},
+ {0.672777999999999,0.37,0.672222666666665,0.36},
+ {0.672222666666665,0.36,0.671111333333333,0.350555333333334},
+ {0.671111333333333,0.350555333333334,0.669999999999997,0.342778},
+ {0.669999999999997,0.342778,0.668333333333332,0.336666666666667},
+ {0.668333333333332,0.336666666666667,0.666666666666667,0.332222},
+ {0.666666666666667,0.332222,0.664444666666663,0.328888666666667},
+ {0.664444666666663,0.328888666666667,0.661666666666666,0.326111333333333},
+ {0.661666666666666,0.326111333333333,0.658333333333331,0.323888666666667},
+ {0.658333333333331,0.323888666666667,0.655000000000001,0.322222},
+ {0.655000000000001,0.322222,0.651111333333333,0.321111333333333},
+ {0.651111333333333,0.321111333333333,0.647222666666664,0.320555333333333},
+ {0.647222666666664,0.320555333333333,0.642777999999997,0.32},
+ {0.634444666666667,0.32,0.63,0.320555333333333},
+ {0.63,0.320555333333333,0.626111333333332,0.321111333333333},
+ {0.626111333333332,0.321111333333333,0.622222666666663,0.322222},
+ {0.622222666666663,0.322222,0.618889333333333,0.323888666666667},
+ {0.618889333333333,0.323888666666667,0.615555999999998,0.326111333333333},
+ {0.615555999999998,0.326111333333333,0.612778000000001,0.328888666666667},
+ {0.612778000000001,0.328888666666667,0.610555999999998,0.332222},
+ {0.610555999999998,0.332222,0.608889333333333,0.336666666666667},
+ {0.608889333333333,0.336666666666667,0.607222666666667,0.342778},
+ {0.607222666666667,0.342778,0.606111333333331,0.351111333333333},
+ {0.606111333333331,0.351111333333333,0.605555999999998,0.360555333333333},
+ {0.605555999999998,0.360555333333333,0.605555999999998,0.371111333333333},
+ {0.605555999999998,0.371111333333333,0.606111333333331,0.383888666666667},
+ {0.606111333333331,0.383888666666667,0.606666666666664,0.397222},
+ {0.606666666666664,0.397222,0.607778000000001,0.411111333333333},
+ {0.607778000000001,0.411111333333333,0.608889333333333,0.426111333333333},
+ {0.608889333333333,0.426111333333333,0.609999999999999,0.440555333333334},
+ {0.609999999999999,0.440555333333334,0.611111333333331,0.454444666666667},
+ {0.611111333333331,0.454444666666667,0.611666666666665,0.467778},
+ {0.611666666666665,0.467778,0.612222666666668,0.480555333333333},
+ {0.612222666666668,0.480555333333333,0.612222666666668,0.491111333333333},
+ {0.612222666666668,0.491111333333333,0.611666666666665,0.500555333333333},
+ {0.611666666666665,0.500555333333333,0.610555999999998,0.508888666666667},
+ {0.610555999999998,0.508888666666667,0.608889333333333,0.515},
+ {0.608889333333333,0.515,0.607222666666667,0.519444666666667},
+ {0.607222666666667,0.519444666666667,0.604999999999999,0.522778},
+ {0.604999999999999,0.522778,0.602222666666667,0.525555333333333},
+ {0.602222666666667,0.525555333333333,0.598889333333332,0.527778},
+ {0.598889333333332,0.527778,0.595555999999997,0.529444666666667},
+ {0.595555999999997,0.529444666666667,0.591666666666664,0.530555333333333},
+ {0.591666666666664,0.530555333333333,0.587778,0.531111333333333},
+ {0.587778,0.531111333333333,0.583333333333333,0.531666666666667},
+ {0.574999999999998,0.531666666666667,0.570556000000001,0.531111333333333},
+ {0.570556000000001,0.531111333333333,0.566666666666668,0.530555333333333},
+ {0.566666666666668,0.530555333333333,0.562777999999999,0.529444666666667},
+ {0.562777999999999,0.529444666666667,0.559444666666664,0.527778},
+ {0.559444666666664,0.527778,0.556111333333334,0.525555333333333},
+ {0.556111333333334,0.525555333333333,0.553333333333332,0.522778},
+ {0.553333333333332,0.522778,0.551111333333334,0.519444666666667},
+ {0.551111333333334,0.519444666666667,0.549444666666664,0.515},
+ {0.549444666666664,0.515,0.547777999999999,0.508888666666667},
+ {0.547777999999999,0.508888666666667,0.546666666666667,0.500555333333333},
+ {0.546666666666667,0.500555333333333,0.546111333333333,0.491111333333333},
+ {0.546111333333333,0.491111333333333,0.546111333333333,0.480555333333333},
+ {0.546111333333333,0.480555333333333,0.546666666666667,0.467778},
+ {0.546666666666667,0.467778,0.547222666666665,0.454444666666667},
+ {0.547222666666665,0.454444666666667,0.548333333333332,0.440555333333334},
+ {0.548333333333332,0.440555333333334,0.549444666666664,0.426111333333333},
+ {0.549444666666664,0.426111333333333,0.550556,0.411111333333333},
+ {0.550556,0.411111333333333,0.551666666666667,0.397222},
+ {0.551666666666667,0.397222,0.552222666666665,0.383888666666667},
+ {0.552222666666665,0.383888666666667,0.552777999999999,0.371111333333333},
+ {0.552777999999999,0.371111333333333,0.552777999999999,0.360555333333333},
+ {0.552777999999999,0.360555333333333,0.552222666666665,0.351111333333333},
+ {0.552222666666665,0.351111333333333,0.551111333333334,0.342778},
+ {0.551111333333334,0.342778,0.549444666666664,0.336666666666667},
+ {0.549444666666664,0.336666666666667,0.547777999999999,0.332222},
+ {0.547777999999999,0.332222,0.545556,0.328888666666667},
+ {0.545556,0.328888666666667,0.542777999999998,0.326111333333333},
+ {0.542777999999998,0.326111333333333,0.539444666666663,0.323888666666667},
+ {0.539444666666663,0.323888666666667,0.536111333333333,0.322222},
+ {0.536111333333333,0.322222,0.532222666666665,0.321111333333333},
+ {0.532222666666665,0.321111333333333,0.528333333333331,0.320555333333333},
+ {0.528333333333331,0.320555333333333,0.523889333333334,0.32},
+ {0.515555999999999,0.32,0.511111333333332,0.320555333333333},
+ {0.511111333333332,0.320555333333333,0.507222666666664,0.321111333333333},
+ {0.507222666666664,0.321111333333333,0.50333333333333,0.322222},
+ {0.50333333333333,0.322222,0.5,0.323888666666667},
+ {0.5,0.323888666666667,0.496666666666665,0.326111333333333},
+ {0.496666666666665,0.326111333333333,0.493889333333333,0.328888666666667},
+ {0.493889333333333,0.328888666666667,0.491666666666665,0.332222},
+ {0.491666666666665,0.332222,0.49,0.336666666666667},
+ {0.49,0.336666666666667,0.488333333333334,0.342778},
+ {0.488333333333334,0.342778,0.487222666666668,0.350555333333334},
+ {0.487222666666668,0.350555333333334,0.486111333333331,0.36},
+ {0.486111333333331,0.36,0.485555999999998,0.37},
+ {0.485555999999998,0.37,0.484999999999999,0.381666666666667},
+ {0.484999999999999,0.381666666666667,0.484444666666666,0.393888666666667},
+ {0.484444666666666,0.393888666666667,0.484444666666666,0.406666666666667},
+ {0.484444666666666,0.406666666666667,0.484444666666666,0.42},
+ {0.484444666666666,0.42,0.484444666666666,0.433888666666667},
+ {0.484444666666666,0.433888666666667,0.484444666666666,0.447222},
+ {0.484444666666666,0.447222,0.484999999999999,0.46},
+ {0.484999999999999,0.46,0.485555999999998,0.472778},
+ {0.485555999999998,0.472778,0.486111333333331,0.484444666666667},
+ {0.486111333333331,0.484444666666667,0.487222666666668,0.495},
+ {0.487222666666668,0.495,0.488333333333334,0.505555333333334},
+ {0.488333333333334,0.505555333333334,0.49,0.515},
+ {0.49,0.515,0.492222666666663,0.525555333333333},
+ {0.492222666666663,0.525555333333333,0.495555999999998,0.535555333333334},
+ {0.495555999999998,0.535555333333334,0.498889333333333,0.545},
+ {0.498889333333333,0.545,0.502777999999997,0.554444666666667},
+ {0.502777999999997,0.554444666666667,0.507222666666664,0.563888666666667},
+ {0.507222666666664,0.563888666666667,0.512222666666664,0.573333333333334},
+ {0.512222666666664,0.573333333333334,0.516666666666666,0.582778},
+ {0.516666666666666,0.582778,0.521666666666666,0.591666666666667},
+ {0.521666666666666,0.591666666666667,0.526666666666666,0.600555333333334},
+ {0.526666666666666,0.600555333333334,0.531666666666666,0.608888666666667},
+ {0.531666666666666,0.608888666666667,0.536111333333333,0.616111333333333},
+ {0.536111333333333,0.616111333333333,0.540556,0.623333333333333},
+ {0.540556,0.623333333333333,0.544999999999997,0.628888666666667},
+ {0.544999999999997,0.628888666666667,0.549444666666664,0.633888666666667},
+ {0.728333333333334,0.633888666666667,0.734444666666666,0.642222},
+ {0.734444666666666,0.642222,0.742222666666663,0.647778},
+ {0.742222666666663,0.647778,0.751666666666665,0.651666666666667},
+ {0.751666666666665,0.651666666666667,0.762777999999997,0.653888666666666},
+ {0.762777999999997,0.653888666666666,0.775000000000001,0.655},
+ {0.775000000000001,0.655,0.788333333333332,0.654444666666667},
+ {0.788333333333332,0.654444666666667,0.802777999999999,0.652778},
+ {0.802777999999999,0.652778,0.817222666666666,0.650555333333333},
+ {0.817222666666666,0.650555333333333,0.831666666666663,0.648333333333333},
+ {0.831666666666663,0.648333333333333,0.846111333333331,0.645555333333334},
+ {0.846111333333331,0.645555333333334,0.859444666666666,0.643333333333333},
+ {0.859444666666666,0.643333333333333,0.871666666666665,0.641111333333334},
+ {0.871666666666665,0.641111333333334,0.882777999999997,0.638888666666666},
+ {0.882777999999997,0.638888666666666,0.892222666666664,0.637222},
+ {0.892222666666664,0.637222,0.900000000000001,0.635555333333333},
+ {0.900000000000001,0.635555333333333,0.906111333333333,0.633888666666667},
+ {0.906111333333333,0.633888666666667,0.911111333333333,0.631666666666667},
+ {0.911111333333333,0.631666666666667,0.914444666666663,0.628888666666667},
+ {0.914444666666663,0.628888666666667,0.917222666666665,0.626111333333334},
+ {0.917222666666665,0.626111333333334,0.91888933333333,0.622222},
+ {0.91888933333333,0.622222,0.919999999999997,0.618333333333334},
+ {0.919999999999997,0.618333333333334,0.920556,0.613888666666667},
+ {0.920556,0.613888666666667,0.920556,0.608888666666667},
+ {0.920556,0.608888666666667,0.919999999999997,0.604444666666667},
+ {0.919999999999997,0.604444666666667,0.919444666666664,0.599444666666667},
+ {0.919444666666664,0.599444666666667,0.918333333333332,0.594444666666667},
+ {0.918333333333332,0.594444666666667,0.917222666666665,0.59},
+ {0.917222666666665,0.59,0.915556,0.586111333333333},
+ {0.915556,0.586111333333333,0.91388933333333,0.582222},
+ {0.91388933333333,0.582222,0.912222666666665,0.579444666666667},
+ {0.912222666666665,0.579444666666667,0.909444666666663,0.576666666666667},
+ {0.909444666666663,0.576666666666667,0.906111333333333,0.574444666666666},
+ {0.906111333333333,0.574444666666666,0.901111333333333,0.572778},
+ {0.901111333333333,0.572778,0.895000000000001,0.571666666666667},
+ {0.895000000000001,0.571666666666667,0.887222666666664,0.571111333333333},
+ {0.87833333333333,0.571111333333333,0.86833333333333,0.572222},
+ {0.86833333333333,0.572222,0.857778000000001,0.573333333333334},
+ {0.857778000000001,0.573333333333334,0.846666666666664,0.574444666666666},
+ {0.846666666666664,0.574444666666666,0.835555999999997,0.575555333333333},
+ {0.835555999999997,0.575555333333333,0.824999999999998,0.576666666666667},
+ {0.824999999999998,0.576666666666667,0.814999999999998,0.577778},
+ {0.806111333333334,0.577778,0.798333333333332,0.577222},
+ {0.798333333333332,0.577222,0.792222666666665,0.576111333333333},
+ {0.792222666666665,0.576111333333333,0.787222666666665,0.574444666666666},
+ {0.787222666666665,0.574444666666666,0.783333333333331,0.571666666666667},
+ {0.783333333333331,0.571666666666667,0.780555999999999,0.567778},
+ {0.780555999999999,0.567778,0.778889333333334,0.562778},
+ {0.778889333333334,0.562778,0.778333333333331,0.557222},
+ {0.778333333333331,0.557222,0.778333333333331,0.551111333333333},
+ {0.778333333333331,0.551111333333333,0.778889333333334,0.544444666666667},
+ {0.778889333333334,0.544444666666667,0.780000000000001,0.538333333333333},
+ {0.780000000000001,0.538333333333333,0.780555999999999,0.532222},
+ {0.780555999999999,0.532222,0.782222666666665,0.526666666666667},
+ {0.782222666666665,0.526666666666667,0.783333333333331,0.521666666666667},
+ {0.783333333333331,0.521666666666667,0.784999999999997,0.517778},
+ {0.784999999999997,0.517778,0.787222666666665,0.515},
+ {0.787222666666665,0.515,0.791111333333333,0.512778},
+ {0.791111333333333,0.512778,0.796111333333333,0.511666666666667},
+ {0.796111333333333,0.511666666666667,0.802222666666665,0.512222},
+ {0.802222666666665,0.512222,0.809444666666664,0.513333333333333},
+ {0.809444666666664,0.513333333333333,0.817222666666666,0.515},
+ {0.817222666666666,0.515,0.824999999999998,0.516666666666667},
+ {0.824999999999998,0.516666666666667,0.832222666666667,0.517778},
+ {0.832222666666667,0.517778,0.838333333333333,0.518333333333333},
+ {0.838333333333333,0.518333333333333,0.843333333333334,0.517222},
+ {0.843333333333334,0.517222,0.847222666666667,0.515},
+ {0.847222666666667,0.515,0.849444666666666,0.511111333333333},
+ {0.849444666666666,0.511111333333333,0.851111333333331,0.506666666666667},
+ {0.851111333333331,0.506666666666667,0.852222666666667,0.5},
+ {0.852222666666667,0.5,0.852778000000001,0.492778},
+ {0.852778000000001,0.492778,0.852778000000001,0.485},
+ {0.852778000000001,0.485,0.852778000000001,0.477778},
+ {0.852778000000001,0.477778,0.852222666666667,0.470555333333333},
+ {0.852222666666667,0.470555333333333,0.851111333333331,0.463888666666667},
+ {0.851111333333331,0.463888666666667,0.849444666666666,0.459444666666667},
+ {0.849444666666666,0.459444666666667,0.847222666666667,0.455555333333334},
+ {0.847222666666667,0.455555333333334,0.843333333333334,0.453333333333333},
+ {0.843333333333334,0.453333333333333,0.838333333333333,0.452222},
+ {0.838333333333333,0.452222,0.832222666666667,0.452778},
+ {0.832222666666667,0.452778,0.824999999999998,0.453888666666667},
+ {0.824999999999998,0.453888666666667,0.817222666666666,0.455555333333334},
+ {0.817222666666666,0.455555333333334,0.809444666666664,0.457222},
+ {0.809444666666664,0.457222,0.802222666666665,0.458888666666667},
+ {0.796111333333333,0.458888666666667,0.791111333333333,0.457778},
+ {0.791111333333333,0.457778,0.787222666666665,0.455555333333334},
+ {0.787222666666665,0.455555333333334,0.784999999999997,0.452778},
+ {0.784999999999997,0.452778,0.783333333333331,0.448888666666667},
+ {0.783333333333331,0.448888666666667,0.782222666666665,0.443888666666667},
+ {0.782222666666665,0.443888666666667,0.780555999999999,0.438333333333333},
+ {0.780555999999999,0.438333333333333,0.780000000000001,0.432222},
+ {0.780000000000001,0.432222,0.778889333333334,0.425555333333334},
+ {0.778889333333334,0.425555333333334,0.778333333333331,0.418888666666666},
+ {0.778333333333331,0.418888666666666,0.778333333333331,0.412778},
+ {0.778333333333331,0.412778,0.778889333333334,0.407222},
+ {0.778889333333334,0.407222,0.780555999999999,0.402222},
+ {0.780555999999999,0.402222,0.783333333333331,0.398333333333333},
+ {0.783333333333331,0.398333333333333,0.787222666666665,0.395555333333334},
+ {0.787222666666665,0.395555333333334,0.792222666666665,0.393888666666667},
+ {0.792222666666665,0.393888666666667,0.798333333333332,0.392778},
+ {0.798333333333332,0.392778,0.806111333333334,0.392222},
+ {0.814999999999998,0.392222,0.824999999999998,0.393333333333333},
+ {0.824999999999998,0.393333333333333,0.835555999999997,0.394444666666667},
+ {0.835555999999997,0.394444666666667,0.846666666666664,0.395555333333334},
+ {0.846666666666664,0.395555333333334,0.857778000000001,0.396666666666667},
+ {0.857778000000001,0.396666666666667,0.86833333333333,0.397778},
+ {0.86833333333333,0.397778,0.87833333333333,0.398888666666667},
+ {0.887222666666664,0.398888666666667,0.895000000000001,0.398333333333333},
+ {0.895000000000001,0.398333333333333,0.901111333333333,0.397222},
+ {0.901111333333333,0.397222,0.906111333333333,0.395555333333334},
+ {0.906111333333333,0.395555333333334,0.909444666666663,0.393333333333333},
+ {0.909444666666663,0.393333333333333,0.912222666666665,0.391111333333334},
+ {0.912222666666665,0.391111333333334,0.91388933333333,0.387778},
+ {0.91388933333333,0.387778,0.915556,0.383888666666667},
+ {0.915556,0.383888666666667,0.917222666666665,0.38},
+ {0.917222666666665,0.38,0.918333333333332,0.375555333333333},
+ {0.918333333333332,0.375555333333333,0.919444666666664,0.371111333333333},
+ {0.919444666666664,0.371111333333333,0.919999999999997,0.366111333333333},
+ {0.919999999999997,0.366111333333333,0.920556,0.361111333333334},
+ {0.920556,0.361111333333334,0.920556,0.356666666666667},
+ {0.920556,0.356666666666667,0.919999999999997,0.352222},
+ {0.919999999999997,0.352222,0.91888933333333,0.348333333333333},
+ {0.91888933333333,0.348333333333333,0.917222666666665,0.344444666666667},
+ {0.917222666666665,0.344444666666667,0.914444666666663,0.341111333333333},
+ {0.914444666666663,0.341111333333333,0.911111333333333,0.338888666666667},
+ {0.911111333333333,0.338888666666667,0.906111333333333,0.336666666666667},
+ {0.906111333333333,0.336666666666667,0.900000000000001,0.335},
+ {0.900000000000001,0.335,0.892222666666664,0.333333333333333},
+ {0.892222666666664,0.333333333333333,0.882777999999997,0.331666666666666},
+ {0.882777999999997,0.331666666666666,0.871666666666665,0.33},
+ {0.871666666666665,0.33,0.859444666666666,0.327222},
+ {0.859444666666666,0.327222,0.846111333333331,0.325},
+ {0.846111333333331,0.325,0.831666666666663,0.322222},
+ {0.831666666666663,0.322222,0.817222666666666,0.32},
+ {0.817222666666666,0.32,0.802777999999999,0.317778},
+ {0.802777999999999,0.317778,0.788333333333332,0.316111333333333},
+ {0.788333333333332,0.316111333333333,0.775000000000001,0.315555333333334},
+ {0.775000000000001,0.315555333333334,0.762777999999997,0.316666666666666},
+ {0.762777999999997,0.316666666666666,0.751666666666665,0.318888666666667},
+ {0.751666666666665,0.318888666666667,0.742222666666663,0.322778},
+ {0.742222666666663,0.322778,0.734444666666666,0.328333333333333},
+ {0.734444666666666,0.328333333333333,0.728333333333334,0.336666666666667},
+ {0.728333333333334,0.336666666666667,0.724444666666666,0.343888666666667},
+ {0.724444666666666,0.343888666666667,0.721666666666664,0.352778},
+ {0.721666666666664,0.352778,0.718889333333332,0.362778},
+ {0.718889333333332,0.362778,0.717222666666667,0.374444666666667},
+ {0.717222666666667,0.374444666666667,0.715555999999997,0.387222},
+ {0.715555999999997,0.387222,0.714444666666665,0.401666666666667},
+ {0.714444666666665,0.401666666666667,0.713333333333333,0.417222},
+ {0.713333333333333,0.417222,0.712778,0.433333333333334},
+ {0.712778,0.433333333333334,0.712222666666667,0.45},
+ {0.712222666666667,0.45,0.711666666666664,0.467778},
+ {0.711666666666664,0.467778,0.711666666666664,0.485555333333333},
+ {0.711666666666664,0.485555333333333,0.711666666666664,0.502778},
+ {0.711666666666664,0.502778,0.712222666666667,0.520555333333334},
+ {0.712222666666667,0.520555333333334,0.712778,0.537222},
+ {0.712778,0.537222,0.713333333333333,0.553333333333333},
+ {0.713333333333333,0.553333333333333,0.714444666666665,0.568888666666667},
+ {0.714444666666665,0.568888666666667,0.715555999999997,0.583333333333333},
+ {0.715555999999997,0.583333333333333,0.717222666666667,0.596111333333334},
+ {0.717222666666667,0.596111333333334,0.718889333333332,0.607778},
+ {0.718889333333332,0.607778,0.721666666666664,0.617778},
+ {0.721666666666664,0.617778,0.724444666666666,0.626666666666667},
+ {0.724444666666666,0.626666666666667,0.728333333333334,0.633888666666667},
+ {0,0,0,0}
+};
+
+double Icon37[][4] = {
+ {0.140555333333334,0.338888666666667,0.133333333333335,0.336111333333333},
+ {0.147221999999999,0.342778,0.140555333333334,0.338888666666667},
+ {0.153333333333336,0.346666666666666,0.147221999999999,0.342778},
+ {0.159444000000003,0.351666666666667,0.153333333333336,0.346666666666666},
+ {0.165000000000002,0.356666666666667,0.159444000000003,0.351666666666667},
+ {0.170000000000002,0.362222,0.165000000000002,0.356666666666667},
+ {0.175555333333335,0.367778,0.170000000000002,0.362222},
+ {0.180000000000002,0.373333333333333,0.175555333333335,0.367778},
+ {0.185000000000002,0.378888666666667,0.180000000000002,0.373333333333333},
+ {0.188888666666666,0.384444666666666,0.185000000000002,0.378888666666667},
+ {0.192777333333334,0.39,0.188888666666666,0.384444666666666},
+ {0.195555333333336,0.395555333333334,0.192777333333334,0.39},
+ {0.198333333333333,0.402222,0.195555333333336,0.395555333333334},
+ {0.200000000000003,0.409444666666667,0.198333333333333,0.402222},
+ {0.200555333333336,0.417222,0.200000000000003,0.409444666666667},
+ {0.20111066666667,0.425555333333334,0.200555333333336,0.417222},
+ {0.201666666666668,0.433333333333334,0.20111066666667,0.425555333333334},
+ {0.20111066666667,0.441666666666666,0.201666666666668,0.433333333333334},
+ {0.200555333333336,0.449444666666666,0.20111066666667,0.441666666666666},
+ {0.200000000000003,0.456666666666666,0.200555333333336,0.449444666666666},
+ {0.198333333333333,0.463888666666667,0.200000000000003,0.456666666666666},
+ {0.195555333333336,0.47,0.198333333333333,0.463888666666667},
+ {0.191666666666668,0.475555333333334,0.195555333333336,0.47},
+ {0.186110666666669,0.480555333333333,0.191666666666668,0.475555333333334},
+ {0.17888866666667,0.483888666666667,0.186110666666669,0.480555333333333},
+ {0.170555333333335,0.487222,0.17888866666667,0.483888666666667},
+ {0.161666666666666,0.49,0.170555333333335,0.487222},
+ {0.152777333333333,0.492778,0.161666666666666,0.49},
+ {0.144444000000002,0.496666666666667,0.152777333333333,0.492778},
+ {0.138333333333335,0.501111333333334,0.144444000000002,0.496666666666667},
+ {0.134444000000002,0.507222,0.138333333333335,0.501111333333334},
+ {0.133333333333335,0.514444666666667,0.134444000000002,0.507222},
+ {0.133888666666669,0.520555333333334,0.133333333333335,0.514444666666667},
+ {0.136110666666667,0.527778,0.133888666666669,0.520555333333334},
+ {0.139444000000002,0.536111333333333,0.136110666666667,0.527778},
+ {0.144444000000002,0.545,0.139444000000002,0.536111333333333},
+ {0.150555333333334,0.555,0.144444000000002,0.545},
+ {0.157222,0.565555333333334,0.150555333333334,0.555},
+ {0.164444000000003,0.576111333333333,0.157222,0.565555333333334},
+ {0.171666666666667,0.586666666666667,0.164444000000003,0.576111333333333},
+ {0.178333333333337,0.597222,0.171666666666667,0.586666666666667},
+ {0.184443999999999,0.606666666666667,0.178333333333337,0.597222},
+ {0.189443999999999,0.615555333333334,0.184443999999999,0.606666666666667},
+ {0.192777333333334,0.622778,0.189443999999999,0.615555333333334},
+ {0.195000000000003,0.628888666666667,0.192777333333334,0.622778},
+ {0.195555333333336,0.633888666666667,0.195000000000003,0.628888666666667},
+ {0.195000000000003,0.637778,0.195555333333336,0.633888666666667},
+ {0.193333333333333,0.640555333333333,0.195000000000003,0.637778},
+ {0.190000000000002,0.642222,0.193333333333333,0.640555333333333},
+ {0.186110666666669,0.643333333333333,0.190000000000002,0.642222},
+ {0.181110666666669,0.644444666666667,0.186110666666669,0.643333333333333},
+ {0.176110666666669,0.645,0.181110666666669,0.644444666666667},
+ {0.158333333333336,0.644444666666667,0.164444000000003,0.645},
+ {0.152777333333333,0.643333333333333,0.158333333333336,0.644444666666667},
+ {0.147777333333333,0.642222,0.152777333333333,0.643333333333333},
+ {0.142777333333332,0.640555333333333,0.147777333333333,0.642222},
+ {0.137777333333337,0.637778,0.142777333333332,0.640555333333333},
+ {0.133333333333335,0.633888666666667,0.137777333333337,0.637778},
+ {0.128888666666668,0.628888666666667,0.133333333333335,0.633888666666667},
+ {0.124444000000002,0.622222,0.128888666666668,0.628888666666667},
+ {0.119444000000001,0.614444666666667,0.124444000000002,0.622222},
+ {0.114444000000001,0.604444666666667,0.119444000000001,0.614444666666667},
+ {0.109444000000001,0.593333333333333,0.114444000000001,0.604444666666667},
+ {0.104444000000001,0.581111333333334,0.109444000000001,0.593333333333333},
+ {0.0994440000000007,0.568333333333333,0.104444000000001,0.581111333333334},
+ {0.0944440000000005,0.556111333333333,0.0994440000000007,0.568333333333333},
+ {0.0894440000000003,0.544444666666667,0.0944440000000005,0.556111333333333},
+ {0.0850000000000032,0.534444666666667,0.0894440000000003,0.544444666666667},
+ {0.0805553333333364,0.525555333333333,0.0850000000000032,0.534444666666667},
+ {0.076666666666668,0.519444666666667,0.0805553333333364,0.525555333333333},
+ {0.0738886666666663,0.515555333333333,0.076666666666668,0.519444666666667},
+ {0.0711106666666694,0.514444666666667,0.0738886666666663,0.515555333333333},
+ {0.0694439999999995,0.515555333333333,0.0711106666666694,0.514444666666667},
+ {0.0677773333333344,0.519444666666667,0.0694439999999995,0.515555333333333},
+ {0.0677773333333344,0.525555333333333,0.0677773333333344,0.519444666666667},
+ {0.0677773333333344,0.534444666666667,0.0677773333333344,0.525555333333333},
+ {0.0683333333333328,0.544444666666667,0.0677773333333344,0.534444666666667},
+ {0.0700000000000026,0.556111333333333,0.0683333333333328,0.544444666666667},
+ {0.0711106666666694,0.568333333333333,0.0700000000000026,0.556111333333333},
+ {0.0722220000000012,0.581111333333334,0.0711106666666694,0.568333333333333},
+ {0.0733333333333329,0.593333333333333,0.0722220000000012,0.581111333333334},
+ {0.0744439999999997,0.604444666666667,0.0733333333333329,0.593333333333333},
+ {0.0744439999999997,0.614444666666667,0.0744439999999997,0.604444666666667},
+ {0.0738886666666663,0.622222,0.0744439999999997,0.614444666666667},
+ {0.0727773333333346,0.628888666666667,0.0738886666666663,0.622222},
+ {0.0711106666666694,0.633888666666667,0.0727773333333346,0.628888666666667},
+ {0.0694439999999995,0.636666666666667,0.0711106666666694,0.633888666666667},
+ {0.067222000000001,0.638888666666666,0.0694439999999995,0.636666666666667},
+ {0.0650000000000025,0.641111333333334,0.067222000000001,0.638888666666666},
+ {0.0622220000000008,0.642778,0.0650000000000025,0.641111333333334},
+ {0.0588886666666658,0.645,0.0622220000000008,0.642778},
+ {0.0555553333333355,0.646666666666667,0.0588886666666658,0.645},
+ {0.0522220000000004,0.648333333333333,0.0555553333333355,0.646666666666667},
+ {0.0483333333333367,0.65,0.0522220000000004,0.648333333333333},
+ {0.0444440000000033,0.651666666666667,0.0483333333333367,0.65},
+ {0.0400000000000015,0.653333333333334,0.0444440000000033,0.651666666666667},
+ {0.0361106666666681,0.654444666666667,0.0400000000000015,0.653333333333334},
+ {0.0322219999999997,0.655555333333333,0.0361106666666681,0.654444666666667},
+ {0.028333333333336,0.656111333333333,0.0322219999999997,0.655555333333333},
+ {0.0250000000000009,0.655555333333333,0.028333333333336,0.656111333333333},
+ {0.0216666666666659,0.655,0.0250000000000009,0.655555333333333},
+ {0.0183333333333356,0.652778,0.0216666666666659,0.655},
+ {0.015555333333334,0.65,0.0183333333333356,0.652778},
+ {0.0133333333333354,0.646111333333333,0.015555333333334,0.65},
+ {0.0111106666666672,0.640555333333333,0.0133333333333354,0.646111333333333},
+ {0.00944400000000201,0.633888666666667,0.0111106666666672,0.640555333333333},
+ {0.00833333333333523,0.626666666666667,0.00944400000000201,0.633888666666667},
+ {0.00722200000000347,0.617778,0.00833333333333523,0.626666666666667},
+ {0.00611066666666697,0.607778,0.00722200000000347,0.617778},
+ {0.00500000000000019,0.596111333333334,0.00611066666666697,0.607778},
+ {0.00444400000000182,0.582778,0.00500000000000019,0.596111333333334},
+ {0.00388866666666843,0.568888666666667,0.00444400000000182,0.582778},
+ {0.00333333333333504,0.553333333333333,0.00388866666666843,0.568888666666667},
+ {0.00222200000000328,0.537222,0.00333333333333504,0.553333333333333},
+ {0.00166666666666989,0.52,0.00222200000000328,0.537222},
+ {0.00111066666666678,0.502778,0.00166666666666989,0.52},
+ {0.000555333333333389,0.485,0.00111066666666678,0.502778},
+ {0.000555333333333389,0.467222,0.000555333333333389,0.485},
+ {0,0.45,0.000555333333333389,0.467222},
+ {0,0.432778,0,0.45},
+ {0,0.416666666666667,0,0.432778},
+ {0.000555333333333389,0.401111333333333,0,0.416666666666667},
+ {0.00111066666666678,0.387222,0.000555333333333389,0.401111333333333},
+ {0.00166666666666989,0.373888666666667,0.00111066666666678,0.387222},
+ {0.00333333333333504,0.362222,0.00166666666666989,0.373888666666667},
+ {0.00500000000000019,0.352222,0.00333333333333504,0.362222},
+ {0.00666666666667008,0.343333333333333,0.00500000000000019,0.352222},
+ {0.00944400000000201,0.336111333333333,0.00666666666667008,0.343333333333333},
+ {0.0138886666666688,0.327778,0.00944400000000201,0.336111333333333},
+ {0.0194440000000024,0.322222,0.0138886666666688,0.327778},
+ {0.0255553333333343,0.317778,0.0194440000000024,0.322222},
+ {0.0327773333333331,0.316111333333333,0.0255553333333343,0.317778},
+ {0.0411106666666683,0.315,0.0327773333333331,0.316111333333333},
+ {0.0500000000000019,0.315555333333334,0.0411106666666683,0.315},
+ {0.0588886666666658,0.317222,0.0500000000000019,0.315555333333334},
+ {0.0683333333333328,0.319444666666667,0.0588886666666658,0.317222},
+ {0.0777773333333348,0.321666666666667,0.0683333333333328,0.319444666666667},
+ {0.0872220000000018,0.324444666666666,0.0777773333333348,0.321666666666667},
+ {0.0966666666666687,0.326666666666667,0.0872220000000018,0.324444666666666},
+ {0.104999999999999,0.328888666666667,0.0966666666666687,0.326666666666667},
+ {0.113333333333334,0.331111333333334,0.104999999999999,0.328888666666667},
+ {0.120555333333333,0.332778,0.113333333333334,0.331111333333334},
+ {0.127222000000003,0.334444666666667,0.120555333333333,0.332778},
+ {0.133333333333335,0.336111333333333,0.127222000000003,0.334444666666667},
+ {0.136110666666667,0.451666666666667,0.133333333333335,0.455555333333334},
+ {0.137777333333337,0.446666666666667,0.136110666666667,0.451666666666667},
+ {0.138333333333335,0.440555333333334,0.137777333333337,0.446666666666667},
+ {0.138888666666669,0.433333333333334,0.138333333333335,0.440555333333334},
+ {0.139444000000002,0.425555333333334,0.138888666666669,0.433333333333334},
+ {0.138888666666669,0.417778,0.139444000000002,0.425555333333334},
+ {0.138333333333335,0.410555333333334,0.138888666666669,0.417778},
+ {0.137777333333337,0.404444666666667,0.138333333333335,0.410555333333334},
+ {0.136110666666667,0.399444666666666,0.137777333333337,0.404444666666667},
+ {0.133333333333335,0.395555333333334,0.136110666666667,0.399444666666666},
+ {0.129444000000002,0.393333333333333,0.133333333333335,0.395555333333334},
+ {0.124444000000002,0.391666666666667,0.129444000000002,0.393333333333333},
+ {0.117777333333336,0.390555333333333,0.124444000000002,0.391666666666667},
+ {0.110555333333333,0.39,0.117777333333336,0.390555333333333},
+ {0.0866666666666684,0.390555333333333,0.0938886666666671,0.39},
+ {0.080000000000003,0.391666666666667,0.0866666666666684,0.390555333333333},
+ {0.0750000000000028,0.393333333333333,0.080000000000003,0.391666666666667},
+ {0.0711106666666694,0.395555333333334,0.0750000000000028,0.393333333333333},
+ {0.0683333333333328,0.399444666666666,0.0711106666666694,0.395555333333334},
+ {0.0666666666666676,0.404444666666667,0.0683333333333328,0.399444666666666},
+ {0.0661106666666692,0.410555333333334,0.0666666666666676,0.404444666666667},
+ {0.0655553333333359,0.417778,0.0661106666666692,0.410555333333334},
+ {0.0655553333333359,0.425555333333334,0.0655553333333359,0.417778},
+ {0.0655553333333359,0.433333333333334,0.0655553333333359,0.425555333333334},
+ {0.0661106666666692,0.440555333333334,0.0655553333333359,0.433333333333334},
+ {0.0666666666666676,0.446666666666667,0.0661106666666692,0.440555333333334},
+ {0.0683333333333328,0.451666666666667,0.0666666666666676,0.446666666666667},
+ {0.0711106666666694,0.455555333333334,0.0683333333333328,0.451666666666667},
+ {0.0750000000000028,0.457778,0.0711106666666694,0.455555333333334},
+ {0.080000000000003,0.459444666666667,0.0750000000000028,0.457778},
+ {0.0866666666666684,0.460555333333333,0.080000000000003,0.459444666666667},
+ {0.0938886666666671,0.461111333333333,0.0866666666666684,0.460555333333333},
+ {0.117777333333336,0.460555333333333,0.110555333333333,0.461111333333333},
+ {0.124444000000002,0.459444666666667,0.117777333333336,0.460555333333333},
+ {0.129444000000002,0.457778,0.124444000000002,0.459444666666667},
+ {0.133333333333335,0.455555333333334,0.129444000000002,0.457778},
+ {0.257222000000003,0.633888666666667,0.262777333333337,0.641111333333334},
+ {0.262777333333337,0.641111333333334,0.270000000000001,0.646666666666667},
+ {0.270000000000001,0.646666666666667,0.278333333333336,0.651111333333333},
+ {0.278333333333336,0.651111333333333,0.288333333333336,0.653333333333334},
+ {0.288333333333336,0.653333333333334,0.29888866666667,0.654444666666667},
+ {0.29888866666667,0.654444666666667,0.311110666666669,0.655},
+ {0.311110666666669,0.655,0.323333333333333,0.653888666666666},
+ {0.323333333333333,0.653888666666666,0.336666666666668,0.652778},
+ {0.336666666666668,0.652778,0.350555333333332,0.650555333333333},
+ {0.350555333333332,0.650555333333333,0.363888666666668,0.648333333333333},
+ {0.363888666666668,0.648333333333333,0.377222000000003,0.646111333333333},
+ {0.377222000000003,0.646111333333333,0.389444000000002,0.643888666666667},
+ {0.389444000000002,0.643888666666667,0.401666666666666,0.641666666666667},
+ {0.401666666666666,0.641666666666667,0.412222,0.64},
+ {0.412222,0.64,0.422222,0.638333333333333},
+ {0.422222,0.638333333333333,0.430555333333335,0.636666666666667},
+ {0.430555333333335,0.636666666666667,0.437777333333334,0.635555333333333},
+ {0.437777333333334,0.635555333333333,0.443333333333333,0.633888666666667},
+ {0.443333333333333,0.633888666666667,0.448333333333333,0.631666666666667},
+ {0.448333333333333,0.631666666666667,0.452222000000001,0.628888666666667},
+ {0.452222000000001,0.628888666666667,0.455000000000003,0.626111333333334},
+ {0.455000000000003,0.626111333333334,0.456666666666668,0.622222},
+ {0.456666666666668,0.622222,0.457777333333335,0.618333333333334},
+ {0.457777333333335,0.618333333333334,0.458333333333333,0.613333333333333},
+ {0.458333333333333,0.613333333333333,0.458333333333333,0.608888666666667},
+ {0.458333333333333,0.608888666666667,0.457777333333335,0.603888666666667},
+ {0.457777333333335,0.603888666666667,0.457222000000002,0.598888666666667},
+ {0.457222000000002,0.598888666666667,0.45611066666667,0.594444666666667},
+ {0.45611066666667,0.594444666666667,0.455000000000003,0.589444666666667},
+ {0.455000000000003,0.589444666666667,0.453333333333333,0.585555333333333},
+ {0.453333333333333,0.585555333333333,0.451666666666668,0.581666666666666},
+ {0.451666666666668,0.581666666666666,0.449444,0.578888666666667},
+ {0.449444,0.578888666666667,0.446666666666668,0.576111333333333},
+ {0.446666666666668,0.576111333333333,0.443333333333333,0.573888666666667},
+ {0.443333333333333,0.573888666666667,0.438333333333333,0.572222},
+ {0.438333333333333,0.572222,0.431666666666667,0.571111333333333},
+ {0.431666666666667,0.571111333333333,0.42388866666667,0.570555333333333},
+ {0.414444000000003,0.570555333333333,0.403888666666669,0.571666666666667},
+ {0.403888666666669,0.571666666666667,0.392777333333332,0.572778},
+ {0.392777333333332,0.572778,0.381110666666667,0.573888666666667},
+ {0.381110666666667,0.573888666666667,0.37,0.575},
+ {0.37,0.575,0.358888666666668,0.576111333333333},
+ {0.358888666666668,0.576111333333333,0.348333333333334,0.577222},
+ {0.338888666666667,0.577222,0.33111066666667,0.576666666666667},
+ {0.33111066666667,0.576666666666667,0.324444,0.575555333333333},
+ {0.324444,0.575555333333333,0.319444,0.573888666666667},
+ {0.319444,0.573888666666667,0.315000000000002,0.571111333333333},
+ {0.315000000000002,0.571111333333333,0.312222000000001,0.567222},
+ {0.312222000000001,0.567222,0.310555333333336,0.562222},
+ {0.310555333333336,0.562222,0.310000000000002,0.556666666666667},
+ {0.310000000000002,0.556666666666667,0.310000000000002,0.550555333333334},
+ {0.310000000000002,0.550555333333334,0.310555333333336,0.543888666666666},
+ {0.310555333333336,0.543888666666666,0.311666666666667,0.537778},
+ {0.311666666666667,0.537778,0.312777333333334,0.531666666666667},
+ {0.312777333333334,0.531666666666667,0.313888666666666,0.526111333333333},
+ {0.313888666666666,0.526111333333333,0.315555333333336,0.521111333333333},
+ {0.315555333333336,0.521111333333333,0.317222000000001,0.517222},
+ {0.317222000000001,0.517222,0.319444,0.514444666666667},
+ {0.319444,0.514444666666667,0.323333333333333,0.512222},
+ {0.323333333333333,0.512222,0.328333333333333,0.511111333333333},
+ {0.328333333333333,0.511111333333333,0.335000000000003,0.511666666666667},
+ {0.335000000000003,0.511666666666667,0.342222000000002,0.512778},
+ {0.342222000000002,0.512778,0.350555333333332,0.514444666666667},
+ {0.350555333333332,0.514444666666667,0.358333333333334,0.516111333333334},
+ {0.358333333333334,0.516111333333334,0.365555333333333,0.517222},
+ {0.365555333333333,0.517222,0.372222000000003,0.517778},
+ {0.372222000000003,0.517778,0.377222000000003,0.516666666666667},
+ {0.377222000000003,0.516666666666667,0.381110666666667,0.514444666666667},
+ {0.381110666666667,0.514444666666667,0.383888666666669,0.511111333333333},
+ {0.383888666666669,0.511111333333333,0.385,0.506111333333333},
+ {0.385,0.506111333333333,0.386110666666667,0.5},
+ {0.386110666666667,0.5,0.38666666666667,0.492778},
+ {0.38666666666667,0.492778,0.38666666666667,0.485},
+ {0.38666666666667,0.485,0.38666666666667,0.477222},
+ {0.38666666666667,0.477222,0.386110666666667,0.47},
+ {0.386110666666667,0.47,0.385,0.463888666666667},
+ {0.385,0.463888666666667,0.383888666666669,0.458888666666667},
+ {0.383888666666669,0.458888666666667,0.381110666666667,0.455555333333334},
+ {0.381110666666667,0.455555333333334,0.377222000000003,0.453333333333333},
+ {0.377222000000003,0.453333333333333,0.372222000000003,0.452222},
+ {0.372222000000003,0.452222,0.365555333333333,0.452778},
+ {0.365555333333333,0.452778,0.358333333333334,0.453888666666667},
+ {0.358333333333334,0.453888666666667,0.349999999999999,0.455555333333334},
+ {0.349999999999999,0.455555333333334,0.342222000000002,0.457222},
+ {0.342222000000002,0.457222,0.335000000000003,0.458888666666667},
+ {0.328333333333333,0.458888666666667,0.323333333333333,0.457778},
+ {0.323333333333333,0.457778,0.319444,0.455555333333334},
+ {0.319444,0.455555333333334,0.317222000000001,0.452778},
+ {0.317222000000001,0.452778,0.315555333333336,0.448888666666667},
+ {0.315555333333336,0.448888666666667,0.313888666666666,0.443888666666667},
+ {0.313888666666666,0.443888666666667,0.312777333333334,0.438333333333333},
+ {0.312777333333334,0.438333333333333,0.311666666666667,0.432222},
+ {0.311666666666667,0.432222,0.310555333333336,0.425555333333334},
+ {0.310555333333336,0.425555333333334,0.310000000000002,0.418888666666666},
+ {0.310000000000002,0.418888666666666,0.310000000000002,0.412778},
+ {0.310000000000002,0.412778,0.310555333333336,0.407222},
+ {0.310555333333336,0.407222,0.312222000000001,0.402222},
+ {0.312222000000001,0.402222,0.315000000000002,0.398333333333333},
+ {0.315000000000002,0.398333333333333,0.319444,0.395555333333334},
+ {0.319444,0.395555333333334,0.324444,0.393888666666667},
+ {0.324444,0.393888666666667,0.33111066666667,0.392778},
+ {0.33111066666667,0.392778,0.338888666666667,0.392222},
+ {0.348333333333334,0.392222,0.358888666666668,0.393333333333333},
+ {0.358888666666668,0.393333333333333,0.37,0.394444666666667},
+ {0.37,0.394444666666667,0.38166666666667,0.395555333333334},
+ {0.38166666666667,0.395555333333334,0.392777333333332,0.396666666666667},
+ {0.392777333333332,0.396666666666667,0.403888666666669,0.397778},
+ {0.403888666666669,0.397778,0.414444000000003,0.398888666666667},
+ {0.42388866666667,0.398888666666667,0.431666666666667,0.398333333333333},
+ {0.431666666666667,0.398333333333333,0.438333333333333,0.397222},
+ {0.438333333333333,0.397222,0.443333333333333,0.395555333333334},
+ {0.443333333333333,0.395555333333334,0.446666666666668,0.393333333333333},
+ {0.446666666666668,0.393333333333333,0.449444,0.390555333333333},
+ {0.449444,0.390555333333333,0.451666666666668,0.387778},
+ {0.451666666666668,0.387778,0.453333333333333,0.383888666666667},
+ {0.453333333333333,0.383888666666667,0.455000000000003,0.38},
+ {0.455000000000003,0.38,0.45611066666667,0.375555333333333},
+ {0.45611066666667,0.375555333333333,0.457222000000002,0.370555333333333},
+ {0.457222000000002,0.370555333333333,0.457777333333335,0.366111333333333},
+ {0.457777333333335,0.366111333333333,0.458333333333333,0.361111333333334},
+ {0.458333333333333,0.361111333333334,0.458333333333333,0.356111333333333},
+ {0.458333333333333,0.356111333333333,0.457777333333335,0.351666666666667},
+ {0.457777333333335,0.351666666666667,0.456666666666668,0.347778},
+ {0.456666666666668,0.347778,0.455000000000003,0.343888666666667},
+ {0.455000000000003,0.343888666666667,0.452222000000001,0.341111333333333},
+ {0.452222000000001,0.341111333333333,0.448333333333333,0.338333333333334},
+ {0.448333333333333,0.338333333333334,0.443333333333333,0.336111333333333},
+ {0.443333333333333,0.336111333333333,0.437777333333334,0.334444666666667},
+ {0.437777333333334,0.334444666666667,0.430555333333335,0.333333333333333},
+ {0.430555333333335,0.333333333333333,0.422222,0.331666666666666},
+ {0.422222,0.331666666666666,0.412222,0.33},
+ {0.412222,0.33,0.401666666666666,0.328333333333333},
+ {0.401666666666666,0.328333333333333,0.389444000000002,0.326111333333333},
+ {0.389444000000002,0.326111333333333,0.377222000000003,0.323888666666667},
+ {0.377222000000003,0.323888666666667,0.363888666666668,0.321666666666667},
+ {0.363888666666668,0.321666666666667,0.349999999999999,0.319444666666667},
+ {0.349999999999999,0.319444666666667,0.336666666666668,0.317222},
+ {0.336666666666668,0.317222,0.323333333333333,0.316111333333333},
+ {0.323333333333333,0.316111333333333,0.311110666666669,0.315555333333334},
+ {0.29888866666667,0.315555333333334,0.288333333333336,0.316666666666666},
+ {0.288333333333336,0.316666666666666,0.278333333333336,0.318888666666667},
+ {0.278333333333336,0.318888666666667,0.270000000000001,0.323333333333334},
+ {0.270000000000001,0.323333333333334,0.262777333333337,0.328888666666667},
+ {0.262777333333337,0.328888666666667,0.257222000000003,0.336111333333333},
+ {0.257222000000003,0.336111333333333,0.253333333333335,0.343333333333333},
+ {0.253333333333335,0.343333333333333,0.25,0.352222},
+ {0.25,0.352222,0.247777333333336,0.362222},
+ {0.247777333333336,0.362222,0.245555333333333,0.373888666666667},
+ {0.245555333333333,0.373888666666667,0.243888666666668,0.387222},
+ {0.243888666666668,0.387222,0.242222000000003,0.401111333333333},
+ {0.242222000000003,0.401111333333333,0.241666666666669,0.416666666666667},
+ {0.241666666666669,0.416666666666667,0.240555333333333,0.432778},
+ {0.240555333333333,0.432778,0.24,0.45},
+ {0.24,0.45,0.24,0.467222},
+ {0.24,0.467222,0.24,0.485},
+ {0.24,0.485,0.24,0.502778},
+ {0.24,0.502778,0.24,0.52},
+ {0.24,0.52,0.240555333333333,0.537222},
+ {0.240555333333333,0.537222,0.241666666666669,0.553333333333333},
+ {0.241666666666669,0.553333333333333,0.242222000000003,0.568888666666667},
+ {0.242222000000003,0.568888666666667,0.243888666666668,0.582778},
+ {0.243888666666668,0.582778,0.245555333333333,0.596111333333334},
+ {0.245555333333333,0.596111333333334,0.247777333333336,0.607778},
+ {0.247777333333336,0.607778,0.25,0.617778},
+ {0.25,0.617778,0.253333333333335,0.626666666666667},
+ {0.253333333333335,0.626666666666667,0.257222000000003,0.633888666666667},
+ {0.505,0.514444666666667,0.51,0.52},
+ {0.51,0.52,0.516666666666666,0.523333333333333},
+ {0.516666666666666,0.523333333333333,0.524444000000003,0.525555333333333},
+ {0.53388866666667,0.525555333333333,0.544444000000003,0.524444666666666},
+ {0.544444000000003,0.524444666666666,0.555555333333335,0.522778},
+ {0.555555333333335,0.522778,0.567222000000001,0.52},
+ {0.567222000000001,0.52,0.578333333333333,0.517222},
+ {0.578333333333333,0.517222,0.589444,0.515},
+ {0.589444,0.515,0.599999999999999,0.512778},
+ {0.599999999999999,0.512778,0.609444000000001,0.511666666666667},
+ {0.617222000000003,0.511666666666667,0.623888666666668,0.512778},
+ {0.623888666666668,0.512778,0.628888666666668,0.514444666666667},
+ {0.628888666666668,0.514444666666667,0.632777333333337,0.516666666666667},
+ {0.632777333333337,0.516666666666667,0.635555333333334,0.52},
+ {0.635555333333334,0.52,0.637777333333337,0.523888666666667},
+ {0.637777333333337,0.523888666666667,0.638888666666669,0.528333333333334},
+ {0.638888666666669,0.528333333333334,0.640000000000001,0.533333333333333},
+ {0.640000000000001,0.533333333333333,0.640555333333334,0.538888666666667},
+ {0.640555333333334,0.538888666666667,0.640555333333334,0.544444666666667},
+ {0.640555333333334,0.544444666666667,0.640555333333334,0.549444666666667},
+ {0.640555333333334,0.549444666666667,0.640000000000001,0.555},
+ {0.640000000000001,0.555,0.638888666666669,0.56},
+ {0.638888666666669,0.56,0.637777333333337,0.564444666666667},
+ {0.637777333333337,0.564444666666667,0.635555333333334,0.568333333333333},
+ {0.635555333333334,0.568333333333333,0.632777333333337,0.571666666666667},
+ {0.632777333333337,0.571666666666667,0.628888666666668,0.573888666666667},
+ {0.628888666666668,0.573888666666667,0.623888666666668,0.575555333333333},
+ {0.623888666666668,0.575555333333333,0.617222000000003,0.576666666666667},
+ {0.617222000000003,0.576666666666667,0.609444000000001,0.577222},
+ {0.599999999999999,0.577222,0.589444,0.576111333333333},
+ {0.589444,0.576111333333333,0.578333333333333,0.575},
+ {0.578333333333333,0.575,0.566666666666668,0.573888666666667},
+ {0.566666666666668,0.573888666666667,0.555555333333335,0.572778},
+ {0.555555333333335,0.572778,0.544444000000003,0.571666666666667},
+ {0.544444000000003,0.571666666666667,0.53388866666667,0.570555333333333},
+ {0.524444000000003,0.570555333333333,0.516666666666666,0.571111333333333},
+ {0.516666666666666,0.571111333333333,0.51,0.572222},
+ {0.51,0.572222,0.505,0.573888666666667},
+ {0.505,0.573888666666667,0.50166666666667,0.576111333333333},
+ {0.50166666666667,0.576111333333333,0.498888666666668,0.578888666666667},
+ {0.498888666666668,0.578888666666667,0.49666666666667,0.581666666666666},
+ {0.49666666666667,0.581666666666666,0.495,0.585555333333333},
+ {0.495,0.585555333333333,0.493333333333335,0.589444666666667},
+ {0.493333333333335,0.589444666666667,0.492222000000003,0.594444666666667},
+ {0.492222000000003,0.594444666666667,0.491110666666666,0.598888666666667},
+ {0.491110666666666,0.598888666666667,0.490555333333333,0.603888666666667},
+ {0.490555333333333,0.603888666666667,0.49,0.608888666666667},
+ {0.49,0.608888666666667,0.49,0.613333333333333},
+ {0.49,0.613333333333333,0.490555333333333,0.618333333333334},
+ {0.490555333333333,0.618333333333334,0.491666666666669,0.622222},
+ {0.491666666666669,0.622222,0.493333333333335,0.626111333333334},
+ {0.493333333333335,0.626111333333334,0.496110666666667,0.628888666666667},
+ {0.496110666666667,0.628888666666667,0.5,0.631666666666667},
+ {0.5,0.631666666666667,0.505,0.633888666666667},
+ {0.505,0.633888666666667,0.510555333333334,0.635555333333333},
+ {0.510555333333334,0.635555333333333,0.517777333333332,0.636666666666667},
+ {0.517777333333332,0.636666666666667,0.526110666666668,0.637778},
+ {0.526110666666668,0.637778,0.536110666666668,0.638888666666666},
+ {0.536110666666668,0.638888666666666,0.546666666666667,0.64},
+ {0.546666666666667,0.64,0.558888666666666,0.641666666666667},
+ {0.558888666666666,0.641666666666667,0.571110666666669,0.642778},
+ {0.571110666666669,0.642778,0.584444,0.643888666666667},
+ {0.584444,0.643888666666667,0.598333333333334,0.645},
+ {0.598333333333334,0.645,0.611666666666669,0.646111333333333},
+ {0.611666666666669,0.646111333333333,0.625,0.646666666666667},
+ {0.649444000000003,0.646666666666667,0.660000000000001,0.645555333333334},
+ {0.660000000000001,0.645555333333334,0.670000000000002,0.643888666666667},
+ {0.670000000000002,0.643888666666667,0.678333333333337,0.641666666666667},
+ {0.678333333333337,0.641666666666667,0.685555333333336,0.638333333333333},
+ {0.685555333333336,0.638333333333333,0.691110666666669,0.633888666666667},
+ {0.691110666666669,0.633888666666667,0.696110666666669,0.627778},
+ {0.696110666666669,0.627778,0.700000000000003,0.619444666666666},
+ {0.700000000000003,0.619444666666666,0.702777333333335,0.61},
+ {0.702777333333335,0.61,0.704444,0.599444666666667},
+ {0.704444,0.599444666666667,0.705555333333336,0.586666666666667},
+ {0.705555333333336,0.586666666666667,0.70611066666667,0.573333333333334},
+ {0.70611066666667,0.573333333333334,0.70611066666667,0.559444666666667},
+ {0.70611066666667,0.559444666666667,0.705555333333336,0.545},
+ {0.705555333333336,0.545,0.705000000000003,0.53},
+ {0.705000000000003,0.53,0.703888666666666,0.516111333333334},
+ {0.703888666666666,0.516111333333334,0.702777333333335,0.502778},
+ {0.702777333333335,0.502778,0.70111066666667,0.49},
+ {0.70111066666667,0.49,0.699444,0.479444666666667},
+ {0.699444,0.479444666666667,0.697222000000001,0.47},
+ {0.697222000000001,0.47,0.694444,0.461666666666667},
+ {0.694444,0.461666666666667,0.691110666666669,0.455555333333334},
+ {0.691110666666669,0.455555333333334,0.686110666666669,0.45},
+ {0.686110666666669,0.45,0.679444000000004,0.446666666666667},
+ {0.679444000000004,0.446666666666667,0.671666666666667,0.444444666666667},
+ {0.662222,0.444444666666667,0.651666666666666,0.445555333333333},
+ {0.651666666666666,0.445555333333333,0.640555333333334,0.447222},
+ {0.640555333333334,0.447222,0.628888666666668,0.45},
+ {0.628888666666668,0.45,0.617777333333336,0.452778},
+ {0.617777333333336,0.452778,0.606666666666669,0.455},
+ {0.606666666666669,0.455,0.59611066666667,0.457222},
+ {0.59611066666667,0.457222,0.586666666666668,0.458333333333333},
+ {0.578888666666666,0.458333333333333,0.572222000000001,0.457222},
+ {0.572222000000001,0.457222,0.567222000000001,0.455555333333334},
+ {0.567222000000001,0.455555333333334,0.563333333333333,0.453333333333333},
+ {0.563333333333333,0.453333333333333,0.560555333333336,0.45},
+ {0.560555333333336,0.45,0.558333333333332,0.446111333333333},
+ {0.558333333333332,0.446111333333333,0.557222000000001,0.441666666666666},
+ {0.557222000000001,0.441666666666666,0.556110666666669,0.436666666666667},
+ {0.556110666666669,0.436666666666667,0.555555333333335,0.431111333333333},
+ {0.555555333333335,0.431111333333333,0.555555333333335,0.425555333333334},
+ {0.555555333333335,0.425555333333334,0.555555333333335,0.42},
+ {0.555555333333335,0.42,0.556110666666669,0.414444666666667},
+ {0.556110666666669,0.414444666666667,0.557222000000001,0.409444666666667},
+ {0.557222000000001,0.409444666666667,0.558333333333332,0.405},
+ {0.558333333333332,0.405,0.560555333333336,0.401111333333333},
+ {0.560555333333336,0.401111333333333,0.563333333333333,0.397778},
+ {0.563333333333333,0.397778,0.567222000000001,0.395555333333334},
+ {0.567222000000001,0.395555333333334,0.572222000000001,0.393888666666667},
+ {0.572222000000001,0.393888666666667,0.578888666666666,0.392778},
+ {0.578888666666666,0.392778,0.586666666666668,0.392222},
+ {0.59611066666667,0.392222,0.606666666666669,0.393333333333333},
+ {0.606666666666669,0.393333333333333,0.617777333333336,0.394444666666667},
+ {0.617777333333336,0.394444666666667,0.629444000000002,0.395555333333334},
+ {0.629444000000002,0.395555333333334,0.640555333333334,0.396666666666667},
+ {0.640555333333334,0.396666666666667,0.651666666666666,0.397778},
+ {0.651666666666666,0.397778,0.662222,0.398888666666667},
+ {0.671666666666667,0.398888666666667,0.679444000000004,0.398333333333333},
+ {0.679444000000004,0.398333333333333,0.686110666666669,0.397222},
+ {0.686110666666669,0.397222,0.691110666666669,0.395555333333334},
+ {0.691110666666669,0.395555333333334,0.694444,0.393333333333333},
+ {0.694444,0.393333333333333,0.697222000000001,0.390555333333333},
+ {0.697222000000001,0.390555333333333,0.699444,0.387778},
+ {0.699444,0.387778,0.70111066666667,0.383888666666667},
+ {0.70111066666667,0.383888666666667,0.702777333333335,0.38},
+ {0.702777333333335,0.38,0.703888666666666,0.375555333333333},
+ {0.703888666666666,0.375555333333333,0.705000000000003,0.370555333333333},
+ {0.705000000000003,0.370555333333333,0.705555333333336,0.366111333333333},
+ {0.705555333333336,0.366111333333333,0.70611066666667,0.361111333333334},
+ {0.70611066666667,0.361111333333334,0.70611066666667,0.356111333333333},
+ {0.70611066666667,0.356111333333333,0.705555333333336,0.351666666666667},
+ {0.705555333333336,0.351666666666667,0.704444,0.347778},
+ {0.704444,0.347778,0.702777333333335,0.343888666666667},
+ {0.702777333333335,0.343888666666667,0.700000000000003,0.341111333333333},
+ {0.700000000000003,0.341111333333333,0.696110666666669,0.338333333333334},
+ {0.696110666666669,0.338333333333334,0.691110666666669,0.336111333333333},
+ {0.691110666666669,0.336111333333333,0.685555333333336,0.334444666666667},
+ {0.685555333333336,0.334444666666667,0.678333333333337,0.333333333333333},
+ {0.678333333333337,0.333333333333333,0.670000000000002,0.332222},
+ {0.670000000000002,0.332222,0.660000000000001,0.331111333333334},
+ {0.660000000000001,0.331111333333334,0.649444000000003,0.33},
+ {0.649444000000003,0.33,0.637222000000004,0.328333333333333},
+ {0.637222000000004,0.328333333333333,0.625,0.327222},
+ {0.625,0.327222,0.611666666666669,0.326111333333333},
+ {0.611666666666669,0.326111333333333,0.597777333333335,0.325},
+ {0.597777333333335,0.325,0.584444,0.323888666666667},
+ {0.584444,0.323888666666667,0.571110666666669,0.323333333333334},
+ {0.546666666666667,0.323333333333334,0.536110666666668,0.324444666666666},
+ {0.536110666666668,0.324444666666666,0.526110666666668,0.326111333333333},
+ {0.526110666666668,0.326111333333333,0.517777333333332,0.328333333333333},
+ {0.517777333333332,0.328333333333333,0.510555333333334,0.331666666666666},
+ {0.510555333333334,0.331666666666666,0.505,0.336111333333333},
+ {0.505,0.336111333333333,0.5,0.342222},
+ {0.5,0.342222,0.496110666666667,0.350555333333334},
+ {0.496110666666667,0.350555333333334,0.493333333333335,0.36},
+ {0.493333333333335,0.36,0.491666666666669,0.370555333333333},
+ {0.491666666666669,0.370555333333333,0.490555333333333,0.383333333333334},
+ {0.490555333333333,0.383333333333334,0.49,0.396666666666667},
+ {0.49,0.396666666666667,0.49,0.410555333333334},
+ {0.49,0.410555333333334,0.490555333333333,0.425555333333334},
+ {0.490555333333333,0.425555333333334,0.491110666666666,0.44},
+ {0.491110666666666,0.44,0.492222000000003,0.453888666666667},
+ {0.492222000000003,0.453888666666667,0.493333333333335,0.467222},
+ {0.493333333333335,0.467222,0.495,0.48},
+ {0.495,0.48,0.49666666666667,0.490555333333334},
+ {0.49666666666667,0.490555333333334,0.498888666666668,0.5},
+ {0.498888666666668,0.5,0.50166666666667,0.508333333333334},
+ {0.50166666666667,0.508333333333334,0.505,0.514444666666667},
+ {0.752777333333337,0.633888666666667,0.758333333333335,0.641111333333334},
+ {0.758333333333335,0.641111333333334,0.765555333333334,0.646666666666667},
+ {0.765555333333334,0.646666666666667,0.773888666666669,0.651111333333333},
+ {0.773888666666669,0.651111333333333,0.78388866666667,0.653333333333334},
+ {0.78388866666667,0.653333333333334,0.794444000000003,0.654444666666667},
+ {0.794444000000003,0.654444666666667,0.806666666666667,0.655},
+ {0.806666666666667,0.655,0.818888666666666,0.653888666666666},
+ {0.818888666666666,0.653888666666666,0.832222000000002,0.652778},
+ {0.832222000000002,0.652778,0.84611066666667,0.650555333333333},
+ {0.84611066666667,0.650555333333333,0.859444000000001,0.648333333333333},
+ {0.859444000000001,0.648333333333333,0.872777333333336,0.646111333333333},
+ {0.872777333333336,0.646111333333333,0.885,0.643888666666667},
+ {0.885,0.643888666666667,0.897221999999999,0.641666666666667},
+ {0.897221999999999,0.641666666666667,0.907777333333333,0.64},
+ {0.907777333333333,0.64,0.917777333333333,0.638333333333333},
+ {0.917777333333333,0.638333333333333,0.926110666666669,0.636666666666667},
+ {0.926110666666669,0.636666666666667,0.933333333333332,0.635555333333333},
+ {0.933333333333332,0.635555333333333,0.938888666666666,0.633888666666667},
+ {0.938888666666666,0.633888666666667,0.943888666666666,0.631666666666667},
+ {0.943888666666666,0.631666666666667,0.947777333333335,0.628888666666667},
+ {0.947777333333335,0.628888666666667,0.950555333333336,0.626111333333334},
+ {0.950555333333336,0.626111333333334,0.952222000000001,0.622222},
+ {0.952222000000001,0.622222,0.953333333333333,0.618333333333334},
+ {0.953333333333333,0.618333333333334,0.953888666666666,0.613333333333333},
+ {0.953888666666666,0.613333333333333,0.953888666666666,0.608888666666667},
+ {0.953888666666666,0.608888666666667,0.953333333333333,0.603888666666667},
+ {0.953333333333333,0.603888666666667,0.952777333333335,0.598888666666667},
+ {0.952777333333335,0.598888666666667,0.951666666666668,0.594444666666667},
+ {0.951666666666668,0.594444666666667,0.950555333333336,0.589444666666667},
+ {0.950555333333336,0.589444666666667,0.948888666666666,0.585555333333333},
+ {0.948888666666666,0.585555333333333,0.947222000000001,0.581666666666666},
+ {0.947222000000001,0.581666666666666,0.945000000000003,0.578888666666667},
+ {0.945000000000003,0.578888666666667,0.942222000000001,0.576111333333333},
+ {0.942222000000001,0.576111333333333,0.938888666666666,0.573888666666667},
+ {0.938888666666666,0.573888666666667,0.933888666666666,0.572222},
+ {0.933888666666666,0.572222,0.927222,0.571111333333333},
+ {0.927222,0.571111333333333,0.919444000000003,0.570555333333333},
+ {0.910000000000001,0.570555333333333,0.899444000000003,0.571666666666667},
+ {0.899444000000003,0.571666666666667,0.888333333333335,0.572778},
+ {0.888333333333335,0.572778,0.87666666666667,0.573888666666667},
+ {0.87666666666667,0.573888666666667,0.865555333333333,0.575},
+ {0.865555333333333,0.575,0.854444000000001,0.576111333333333},
+ {0.854444000000001,0.576111333333333,0.843888666666667,0.577222},
+ {0.834444,0.577222,0.826666666666668,0.576666666666667},
+ {0.826666666666668,0.576666666666667,0.820000000000003,0.575555333333333},
+ {0.820000000000003,0.575555333333333,0.815000000000002,0.573888666666667},
+ {0.815000000000002,0.573888666666667,0.810555333333336,0.571111333333333},
+ {0.810555333333336,0.571111333333333,0.807777333333334,0.567222},
+ {0.807777333333334,0.567222,0.806110666666669,0.562222},
+ {0.806110666666669,0.562222,0.805555333333335,0.556666666666667},
+ {0.805555333333335,0.556666666666667,0.805555333333335,0.550555333333334},
+ {0.805555333333335,0.550555333333334,0.806110666666669,0.543888666666666},
+ {0.806110666666669,0.543888666666666,0.807222000000001,0.537778},
+ {0.807222000000001,0.537778,0.808333333333332,0.531666666666667},
+ {0.808333333333332,0.531666666666667,0.809443999999999,0.526111333333333},
+ {0.809443999999999,0.526111333333333,0.811110666666669,0.521111333333333},
+ {0.811110666666669,0.521111333333333,0.812777333333334,0.517222},
+ {0.812777333333334,0.517222,0.815000000000002,0.514444666666667},
+ {0.815000000000002,0.514444666666667,0.818888666666666,0.512222},
+ {0.818888666666666,0.512222,0.823888666666666,0.511111333333333},
+ {0.823888666666666,0.511111333333333,0.830555333333336,0.511666666666667},
+ {0.830555333333336,0.511666666666667,0.837777333333335,0.512778},
+ {0.837777333333335,0.512778,0.84611066666667,0.514444666666667},
+ {0.84611066666667,0.514444666666667,0.853888666666667,0.516111333333334},
+ {0.853888666666667,0.516111333333334,0.861110666666666,0.517222},
+ {0.861110666666666,0.517222,0.867777333333336,0.517778},
+ {0.867777333333336,0.517778,0.872777333333336,0.516666666666667},
+ {0.872777333333336,0.516666666666667,0.87666666666667,0.514444666666667},
+ {0.87666666666667,0.514444666666667,0.879444000000002,0.511111333333333},
+ {0.879444000000002,0.511111333333333,0.880555333333334,0.506111333333333},
+ {0.880555333333334,0.506111333333333,0.88166666666667,0.5},
+ {0.88166666666667,0.5,0.882222000000003,0.492778},
+ {0.882222000000003,0.492778,0.882222000000003,0.485},
+ {0.882222000000003,0.485,0.882222000000003,0.477222},
+ {0.882222000000003,0.477222,0.88166666666667,0.47},
+ {0.88166666666667,0.47,0.880555333333334,0.463888666666667},
+ {0.880555333333334,0.463888666666667,0.879444000000002,0.458888666666667},
+ {0.879444000000002,0.458888666666667,0.87666666666667,0.455555333333334},
+ {0.87666666666667,0.455555333333334,0.872777333333336,0.453333333333333},
+ {0.872777333333336,0.453333333333333,0.867777333333336,0.452222},
+ {0.867777333333336,0.452222,0.861110666666666,0.452778},
+ {0.861110666666666,0.452778,0.853888666666667,0.453888666666667},
+ {0.853888666666667,0.453888666666667,0.845555333333337,0.455555333333334},
+ {0.845555333333337,0.455555333333334,0.837777333333335,0.457222},
+ {0.837777333333335,0.457222,0.830555333333336,0.458888666666667},
+ {0.823888666666666,0.458888666666667,0.818888666666666,0.457778},
+ {0.818888666666666,0.457778,0.815000000000002,0.455555333333334},
+ {0.815000000000002,0.455555333333334,0.812777333333334,0.452778},
+ {0.812777333333334,0.452778,0.811110666666669,0.448888666666667},
+ {0.811110666666669,0.448888666666667,0.809443999999999,0.443888666666667},
+ {0.809443999999999,0.443888666666667,0.808333333333332,0.438333333333333},
+ {0.808333333333332,0.438333333333333,0.807222000000001,0.432222},
+ {0.807222000000001,0.432222,0.806110666666669,0.425555333333334},
+ {0.806110666666669,0.425555333333334,0.805555333333335,0.418888666666666},
+ {0.805555333333335,0.418888666666666,0.805555333333335,0.412778},
+ {0.805555333333335,0.412778,0.806110666666669,0.407222},
+ {0.806110666666669,0.407222,0.807777333333334,0.402222},
+ {0.807777333333334,0.402222,0.810555333333336,0.398333333333333},
+ {0.810555333333336,0.398333333333333,0.815000000000002,0.395555333333334},
+ {0.815000000000002,0.395555333333334,0.820000000000003,0.393888666666667},
+ {0.820000000000003,0.393888666666667,0.826666666666668,0.392778},
+ {0.826666666666668,0.392778,0.834444,0.392222},
+ {0.843888666666667,0.392222,0.854444000000001,0.393333333333333},
+ {0.854444000000001,0.393333333333333,0.865555333333333,0.394444666666667},
+ {0.865555333333333,0.394444666666667,0.877222000000003,0.395555333333334},
+ {0.877222000000003,0.395555333333334,0.888333333333335,0.396666666666667},
+ {0.888333333333335,0.396666666666667,0.899444000000003,0.397778},
+ {0.899444000000003,0.397778,0.910000000000001,0.398888666666667},
+ {0.919444000000003,0.398888666666667,0.927222,0.398333333333333},
+ {0.927222,0.398333333333333,0.933888666666666,0.397222},
+ {0.933888666666666,0.397222,0.938888666666666,0.395555333333334},
+ {0.938888666666666,0.395555333333334,0.942222000000001,0.393333333333333},
+ {0.942222000000001,0.393333333333333,0.945000000000003,0.390555333333333},
+ {0.945000000000003,0.390555333333333,0.947222000000001,0.387778},
+ {0.947222000000001,0.387778,0.948888666666666,0.383888666666667},
+ {0.948888666666666,0.383888666666667,0.950555333333336,0.38},
+ {0.950555333333336,0.38,0.951666666666668,0.375555333333333},
+ {0.951666666666668,0.375555333333333,0.952777333333335,0.370555333333333},
+ {0.952777333333335,0.370555333333333,0.953333333333333,0.366111333333333},
+ {0.953333333333333,0.366111333333333,0.953888666666666,0.361111333333334},
+ {0.953888666666666,0.361111333333334,0.953888666666666,0.356111333333333},
+ {0.953888666666666,0.356111333333333,0.953333333333333,0.351666666666667},
+ {0.953333333333333,0.351666666666667,0.952222000000001,0.347778},
+ {0.952222000000001,0.347778,0.950555333333336,0.343888666666667},
+ {0.950555333333336,0.343888666666667,0.947777333333335,0.341111333333333},
+ {0.947777333333335,0.341111333333333,0.943888666666666,0.338333333333334},
+ {0.943888666666666,0.338333333333334,0.938888666666666,0.336111333333333},
+ {0.938888666666666,0.336111333333333,0.933333333333332,0.334444666666667},
+ {0.933333333333332,0.334444666666667,0.926110666666669,0.333333333333333},
+ {0.926110666666669,0.333333333333333,0.917777333333333,0.331666666666666},
+ {0.917777333333333,0.331666666666666,0.907777333333333,0.33},
+ {0.907777333333333,0.33,0.897221999999999,0.328333333333333},
+ {0.897221999999999,0.328333333333333,0.885,0.326111333333333},
+ {0.885,0.326111333333333,0.872777333333336,0.323888666666667},
+ {0.872777333333336,0.323888666666667,0.859444000000001,0.321666666666667},
+ {0.859444000000001,0.321666666666667,0.845555333333337,0.319444666666667},
+ {0.845555333333337,0.319444666666667,0.832222000000002,0.317222},
+ {0.832222000000002,0.317222,0.818888666666666,0.316111333333333},
+ {0.818888666666666,0.316111333333333,0.806666666666667,0.315555333333334},
+ {0.794444000000003,0.315555333333334,0.78388866666667,0.316666666666666},
+ {0.78388866666667,0.316666666666666,0.773888666666669,0.318888666666667},
+ {0.773888666666669,0.318888666666667,0.765555333333334,0.323333333333334},
+ {0.765555333333334,0.323333333333334,0.758333333333335,0.328888666666667},
+ {0.758333333333335,0.328888666666667,0.752777333333337,0.336111333333333},
+ {0.752777333333337,0.336111333333333,0.748888666666668,0.343333333333333},
+ {0.748888666666668,0.343333333333333,0.745555333333333,0.352222},
+ {0.745555333333333,0.352222,0.743333333333335,0.362222},
+ {0.743333333333335,0.362222,0.741110666666666,0.373888666666667},
+ {0.741110666666666,0.373888666666667,0.739444000000001,0.387222},
+ {0.739444000000001,0.387222,0.737777333333336,0.401111333333333},
+ {0.737777333333336,0.401111333333333,0.737222000000003,0.416666666666667},
+ {0.737222000000003,0.416666666666667,0.736110666666666,0.432778},
+ {0.736110666666666,0.432778,0.735555333333333,0.45},
+ {0.735555333333333,0.45,0.735555333333333,0.467222},
+ {0.735555333333333,0.467222,0.735555333333333,0.485},
+ {0.735555333333333,0.485,0.735555333333333,0.502778},
+ {0.735555333333333,0.502778,0.735555333333333,0.52},
+ {0.735555333333333,0.52,0.736110666666666,0.537222},
+ {0.736110666666666,0.537222,0.737222000000003,0.553333333333333},
+ {0.737222000000003,0.553333333333333,0.737777333333336,0.568888666666667},
+ {0.737777333333336,0.568888666666667,0.739444000000001,0.582778},
+ {0.739444000000001,0.582778,0.741110666666666,0.596111333333334},
+ {0.741110666666666,0.596111333333334,0.743333333333335,0.607778},
+ {0.743333333333335,0.607778,0.745555333333333,0.617778},
+ {0.745555333333333,0.617778,0.748888666666668,0.626666666666667},
+ {0.748888666666668,0.626666666666667,0.752777333333337,0.633888666666667},
+ {1.18388866666667,0.397778,1.18666666666667,0.395555333333334},
+ {1.179444,0.398333333333333,1.18388866666667,0.397778},
+ {1.174444,0.397222,1.179444,0.398333333333333},
+ {1.16888866666667,0.394444666666667,1.174444,0.397222},
+ {1.16277733333333,0.391111333333334,1.16888866666667,0.394444666666667},
+ {1.15555533333333,0.387222,1.16277733333333,0.391111333333334},
+ {1.14888866666667,0.383333333333334,1.15555533333333,0.387222},
+ {1.14277733333333,0.381111333333333,1.14888866666667,0.383333333333334},
+ {1.137222,0.380555333333334,1.14277733333333,0.381111333333333},
+ {1.132222,0.382222,1.137222,0.380555333333334},
+ {1.12777733333334,0.387222,1.132222,0.382222},
+ {1.125,0.395555333333334,1.12777733333334,0.387222},
+ {1.12388866666667,0.402222,1.125,0.395555333333334},
+ {1.12277733333334,0.41,1.12388866666667,0.402222},
+ {1.12166666666667,0.419444666666667,1.12277733333334,0.41},
+ {1.12166666666667,0.43,1.12166666666667,0.419444666666667},
+ {1.12166666666667,0.441666666666666,1.12166666666667,0.43},
+ {1.12166666666667,0.455,1.12166666666667,0.441666666666666},
+ {1.122222,0.468888666666667,1.12166666666667,0.455},
+ {1.12333333333333,0.483888666666667,1.122222,0.468888666666667},
+ {1.12388866666667,0.498888666666667,1.12333333333333,0.483888666666667},
+ {1.125,0.515,1.12388866666667,0.498888666666667},
+ {1.12611066666667,0.530555333333333,1.125,0.515},
+ {1.12666666666667,0.545555333333333,1.12611066666667,0.530555333333333},
+ {1.12777733333334,0.560555333333333,1.12666666666667,0.545555333333333},
+ {1.12833333333333,0.574444666666666,1.12777733333334,0.560555333333333},
+ {1.12833333333333,0.587778,1.12833333333333,0.574444666666666},
+ {1.12833333333333,0.599444666666667,1.12833333333333,0.587778},
+ {1.12833333333333,0.61,1.12833333333333,0.599444666666667},
+ {1.127222,0.619444666666666,1.12833333333333,0.61},
+ {1.12666666666667,0.627222,1.127222,0.619444666666666},
+ {1.125,0.633888666666667,1.12666666666667,0.627222},
+ {1.12333333333333,0.638888666666666,1.125,0.633888666666667},
+ {1.12166666666667,0.642778,1.12333333333333,0.638888666666666},
+ {1.119444,0.646111333333333,1.12166666666667,0.642778},
+ {1.117222,0.648888666666667,1.119444,0.646111333333333},
+ {1.114444,0.651111333333333,1.117222,0.648888666666667},
+ {1.11166666666667,0.652778,1.114444,0.651111333333333},
+ {1.10833333333333,0.653888666666666,1.11166666666667,0.652778},
+ {1.105,0.655,1.10833333333333,0.653888666666666},
+ {1.10111066666667,0.655555333333333,1.105,0.655},
+ {1.09777733333334,0.656111333333333,1.10111066666667,0.655555333333333},
+ {1.08666666666667,0.655555333333333,1.09,0.656111333333333},
+ {1.08277733333333,0.655,1.08666666666667,0.655555333333333},
+ {1.079444,0.653888666666666,1.08277733333333,0.655},
+ {1.07611066666667,0.652778,1.079444,0.653888666666666},
+ {1.07333333333333,0.651111333333333,1.07611066666667,0.652778},
+ {1.07055533333334,0.648888666666667,1.07333333333333,0.651111333333333},
+ {1.06833333333333,0.646111333333333,1.07055533333334,0.648888666666667},
+ {1.06611066666667,0.642778,1.06833333333333,0.646111333333333},
+ {1.064444,0.638888666666666,1.06611066666667,0.642778},
+ {1.06277733333333,0.633888666666667,1.064444,0.638888666666666},
+ {1.06111066666667,0.627222,1.06277733333333,0.633888666666667},
+ {1.06055533333334,0.619444666666666,1.06111066666667,0.627222},
+ {1.059444,0.61,1.06055533333334,0.619444666666666},
+ {1.059444,0.599444666666667,1.059444,0.61},
+ {1.059444,0.587778,1.059444,0.599444666666667},
+ {1.059444,0.574444666666666,1.059444,0.587778},
+ {1.06,0.560555333333333,1.059444,0.574444666666666},
+ {1.06111066666667,0.545555333333333,1.06,0.560555333333333},
+ {1.06166666666667,0.530555333333333,1.06111066666667,0.545555333333333},
+ {1.06277733333333,0.514444666666667,1.06166666666667,0.530555333333333},
+ {1.06388866666667,0.498888666666667,1.06277733333333,0.514444666666667},
+ {1.064444,0.483888666666667,1.06388866666667,0.498888666666667},
+ {1.06555533333334,0.468888666666667,1.064444,0.483888666666667},
+ {1.06611066666667,0.455,1.06555533333334,0.468888666666667},
+ {1.06611066666667,0.441666666666666,1.06611066666667,0.455},
+ {1.06611066666667,0.43,1.06611066666667,0.441666666666666},
+ {1.06611066666667,0.419444666666667,1.06611066666667,0.43},
+ {1.065,0.41,1.06611066666667,0.419444666666667},
+ {1.064444,0.402222,1.065,0.41},
+ {1.06277733333333,0.395555333333334,1.064444,0.402222},
+ {1.06,0.387222,1.06277733333333,0.395555333333334},
+ {1.05555533333334,0.382222,1.06,0.387222},
+ {1.05055533333334,0.380555333333334,1.05555533333334,0.382222},
+ {1.045,0.381111333333333,1.05055533333334,0.380555333333334},
+ {1.03833333333334,0.383333333333334,1.045,0.381111333333333},
+ {1.03166666666667,0.387222,1.03833333333334,0.383333333333334},
+ {1.025,0.391111333333334,1.03166666666667,0.387222},
+ {1.01833333333334,0.394444666666667,1.025,0.391111333333334},
+ {1.01277733333334,0.397222,1.01833333333334,0.394444666666667},
+ {1.00777733333334,0.398333333333333,1.01277733333334,0.397222},
+ {1.00333333333333,0.397778,1.00777733333334,0.398333333333333},
+ {1.00055533333333,0.395555333333334,1.00333333333333,0.397778},
+ {0.998333333333335,0.393333333333333,1.00055533333333,0.395555333333334},
+ {0.99666666666667,0.39,0.998333333333335,0.393333333333333},
+ {0.995555333333333,0.386111333333333,0.99666666666667,0.39},
+ {0.993888666666668,0.381666666666667,0.995555333333333,0.386111333333333},
+ {0.992222000000003,0.376666666666667,0.993888666666668,0.381666666666667},
+ {0.990555333333333,0.371111333333333,0.992222000000003,0.376666666666667},
+ {0.988888666666668,0.365555333333334,0.990555333333333,0.371111333333333},
+ {0.987777333333336,0.360555333333333,0.988888666666668,0.365555333333334},
+ {0.987222000000003,0.355,0.987777333333336,0.360555333333333},
+ {0.987222000000003,0.35,0.987222000000003,0.355},
+ {0.988333333333334,0.345555333333333,0.987222000000003,0.35},
+ {0.991110666666666,0.341666666666667,0.988333333333334,0.345555333333333},
+ {0.995,0.338333333333334,0.991110666666666,0.341666666666667},
+ {1.00055533333333,0.336111333333333,0.995,0.338333333333334},
+ {1.00611066666667,0.334444666666667,1.00055533333333,0.336111333333333},
+ {1.01333333333334,0.333333333333333,1.00611066666667,0.334444666666667},
+ {1.02166666666667,0.332778,1.01333333333334,0.333333333333333},
+ {1.03166666666667,0.331666666666666,1.02166666666667,0.332778},
+ {1.042222,0.331111333333334,1.03166666666667,0.331666666666666},
+ {1.06666666666667,0.330555333333334,1.054444,0.331111333333334},
+ {1.13277733333334,0.331111333333334,1.12055533333333,0.330555333333334},
+ {1.15555533333333,0.331666666666666,1.145,0.331111333333334},
+ {1.16555533333333,0.332778,1.15555533333333,0.331666666666666},
+ {1.17388866666667,0.333333333333333,1.16555533333333,0.332778},
+ {1.18111066666667,0.334444666666667,1.17388866666667,0.333333333333333},
+ {1.18666666666667,0.336111333333333,1.18111066666667,0.334444666666667},
+ {1.192222,0.338333333333334,1.18666666666667,0.336111333333333},
+ {1.19611066666667,0.341666666666667,1.192222,0.338333333333334},
+ {1.19888866666667,0.345555333333333,1.19611066666667,0.341666666666667},
+ {1.2,0.35,1.19888866666667,0.345555333333333},
+ {1.2,0.355,1.2,0.35},
+ {1.199444,0.360555333333333,1.2,0.355},
+ {1.19833333333333,0.366111333333333,1.199444,0.360555333333333},
+ {1.19666666666667,0.371111333333333,1.19833333333333,0.366111333333333},
+ {1.195,0.376666666666667,1.19666666666667,0.371111333333333},
+ {1.19333333333333,0.381666666666667,1.195,0.376666666666667},
+ {1.19166666666667,0.386111333333333,1.19333333333333,0.381666666666667},
+ {1.19,0.39,1.19166666666667,0.386111333333333},
+ {1.18888866666667,0.393333333333333,1.19,0.39},
+ {1.18666666666667,0.395555333333334,1.18888866666667,0.393333333333333},
+ {0,0,0,0}
+};
+
+double Icon38[][4] = {
+ {0.166666666666667,0,0,1},
+ {0.166666666666667,1,0.333333333333333,0},
+ {0,0,0,0}
+};
+
+double Icon39[][4] =
+{
+ {0.25,0.25,0,0.5},
+ {0.5,0.5,0.25,0.25},
+ {0.25,0.75,0.5,0.5},
+ {0,0.5,0.25,0.75},
+
+ { 0, 0, .25, .001 }, // -----
+ { .001, .25, .25, 0.249 }, // |
+ { .25, 0.249, 0, .25 }, // -----
+ { 0, 0, 0, .25 }, // |
+// { 0, .25, .25, .25 },
+ {0,0,0,0}
+};
+
+
+typedef double LineType[4];
+typedef LineType *IconType;
+IconType Icons[] = {
+ Icon0,
+ Icon1,
+ Icon2,
+ Icon3,
+ Icon4,
+ Icon5,
+ Icon6,
+ Icon7,
+ Icon8,
+ Icon9,
+ Icon10,
+ Icon11,
+ Icon12,
+ Icon13,
+ Icon14,
+ Icon15,
+ Icon16,
+ Icon17,
+ Icon18,
+ Icon19,
+ Icon20,
+ Icon21,
+ Icon22,
+ Icon23,
+ Icon24,
+ Icon25,
+ Icon26,
+ Icon27,
+ Icon28,
+ Icon29,
+ Icon30,
+ Icon31,
+ Icon32,
+ Icon33,
+ Icon34,
+ Icon35,
+ Icon36,
+ Icon39,
+ Icon39,
+ Icon39,
+ Icon38
+};
+
+double IconWidths[] = {
+ 0.5,
+ 0.5,
+ 0.333333333333333,
+ 0.5,
+ 0.5,
+ 0.541666666666667,
+ 0.541666666666667,
+ 0.166666666666667,
+ 0.5,
+ 0.5,
+ 0.707221999999999,
+ 0.75,
+ 0.318888666666666,
+ 0.106111333333333,
+ 0.312222,
+ 0.315555333333333,
+ 0.291666666666667,
+ 0.312777333333333,
+ 0.316111333333333,
+ 0.296666666666667,
+ 0.273333333333333,
+ 0.31,
+ 0.166666666666667,
+ 0.166666666666667,
+ 0.375,
+ 0.333333333333333,
+ 0.939999999999998,
+ 1,
+ 0.356111333333333,
+ 1,
+ 0.666666666666667,
+ 0.5,
+ 0.5,
+ 0.583333333333333,
+ 0.583333333333333,
+ 0.583333333333333,
+ 0.920556,
+ .5,
+ .5,
+ .5,
+};
+
+
diff --git a/noatun-plugins/synaescope/main.cpp b/noatun-plugins/synaescope/main.cpp
new file mode 100644
index 0000000..4b4a2a5
--- /dev/null
+++ b/noatun-plugins/synaescope/main.cpp
@@ -0,0 +1,196 @@
+/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia)
+ Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au>
+ 2001 Charles Samuels <charles@kde.org>
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <time.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <pwd.h>
+#include <string.h>
+#include <math.h>
+
+#include "syna.h"
+
+void Core::allocOutput(int w,int h)
+{
+#if 0
+ delete[] output;
+ delete[] lastOutput;
+ delete[] lastLastOutput;
+ output = new unsigned char[w*h*2];
+ lastOutput = new unsigned char[w*h*2];
+ lastLastOutput = new unsigned char[w*h*2];
+ memset(output,32,w*h*2);
+ memset(lastOutput,32,w*h*2);
+ outWidth = w;
+ outHeight = h;
+#endif
+
+ outputBmp.size(w,h);
+ lastOutputBmp.size(w,h);
+ lastLastOutputBmp.size(w,h);
+ polygonEngine.size(w,h);
+ outWidth = w;
+ outHeight = h;
+}
+
+void Core::toDefaults()
+{
+ fadeMode = Stars;
+ pointsAreDiamonds = true;
+
+ brightnessTwiddler = 0.33; //0.125;
+ starSize = 0.125;
+
+ fgRedSlider=0.0;
+ fgGreenSlider=0.5;
+ bgRedSlider=1.0;
+ bgGreenSlider=0.2;
+}
+
+Core::Core() : StereoScope(40)
+{
+ setSamples(NumSamples);
+ core = this;
+ int i;
+
+ data = new sampleType[NumSamples*2+16];
+
+ for(i=0;i<NumSamples;i++)
+ {
+ negSinTable[i] = -sin(3.141592*2.0/NumSamples*i);
+ cosTable[i] = cos(3.141592*2.0/NumSamples*i);
+ bitReverse[i] = bitReverser(i);
+ }
+}
+
+bool Core::init ( void )
+{
+ windX = 1;
+ windY = 1;
+
+ screen = new SdlScreen;
+ if (!screen->init(windX,windY,windWidth,windHeight,false))
+ {
+ delete screen;
+ screen = 0;
+ return false;
+ }
+
+ allocOutput(outWidth,outHeight);
+
+ setStarSize(starSize);
+
+ interface = new Interface;
+ return true;
+}
+
+Core::~Core()
+{
+ delete interface;
+
+ screen->end();
+ delete screen;
+}
+
+bool Core::go()
+{
+ time_t startTime = time(0);
+ time_t currentTime = time(0);
+ time_t lastTime = 0;
+ char fpsString[32];
+ int frames = 0;
+ double fps=0;
+
+// printf("%u\n", static_cast<SdlScreen *>(screen)->winID());
+// fflush(stdout);
+
+ while (1)
+ {
+ fade();
+
+ if (!calculate())
+ break;
+
+ if (!interface->go()) break;
+
+ screen->show();
+
+ frames++;
+ currentTime = time(0) - startTime;
+
+ if ((currentTime - lastTime) > 1) // update fps display every 2 seconds
+ {
+ fps = double(frames) / currentTime;
+ lastTime = currentTime;
+ snprintf(fpsString, 32, "Noatun - Synaescope: %.2f fps", fps);
+ screen->updateWindowCaption(&fpsString[0]);
+ }
+ if (fps>25.0)
+ usleep(5);
+ }
+
+ return true;
+}
+
+bool start()
+{
+ return true;
+}
+
+void error(const char *str, bool)
+{
+ fprintf(stderr, "synaescope: Error %s\n",str);
+// if (syscall)
+// fprintf(stderr,"(reason for error: %s)\n",strerror(errno));
+ exit(1);
+}
+
+void warning(const char *str, bool)
+{
+ fprintf(stderr, "synaescope: Possible error %s\n",str);
+// if (syscall)
+// fprintf(stderr,"(reason for error: %s)\n",strerror(errno));
+}
+
+#include <kinstance.h>
+#include <kglobal.h>
+#include <kconfig.h>
+
+int main(void)
+{
+ KInstance in("noatunsynaescope");
+
+ core = new Core;
+
+ KConfig mConfig("noatunrc");
+ mConfig.setGroup("Synaescope");
+
+ core->windWidth = mConfig.readNumEntry("xResolution", 320);
+ core->windHeight = mConfig.readNumEntry("yResolution", 240);
+
+ if ( core->init() )
+ core->go();
+
+ delete core;
+ exit(0);
+}
diff --git a/noatun-plugins/synaescope/polygon.h b/noatun-plugins/synaescope/polygon.h
new file mode 100644
index 0000000..5c10acd
--- /dev/null
+++ b/noatun-plugins/synaescope/polygon.h
@@ -0,0 +1,106 @@
+#include <string.h>
+
+template<class Pixel>
+struct Bitmap
+{
+ int width, height, extra;
+ Pixel *data;
+
+ Bitmap(int e=0) : extra(e), data(0) { };
+ ~Bitmap() { delete[] data; };
+
+ void size(int w,int h) {
+ delete[] data;
+ width = w;
+ height = h;
+ data = new Pixel[w*h+extra];
+ clear();
+ }
+
+ void clear() {
+ memset(data,0,sizeof(Pixel)*(width*height+extra));
+ }
+};
+
+template<class Pixel, class Combiner, int superSampleShift>
+struct PolygonEngine : public Bitmap<Pixel>
+{
+ PolygonEngine() : Bitmap<Pixel>(1) { }
+
+#define super (1<<superSampleShift)
+ void apply(Pixel *dest)
+ {
+ Pixel sum=0;
+ int count = this->width*this->height;
+ Pixel *src = this->data;
+ while(count--) {
+ sum += *(src++);
+ if (sum)
+ *dest = Combiner::combine(sum,*dest);
+ dest++;
+ }
+ }
+
+ void add(Pixel color,int x,int y)
+ {
+ if (y < 0) return;
+ if (y >= this->height) return;
+ if (x < 0) x = 0;
+ if (x > this->width) x = this->width;
+ this->data[x+y*this->width] += color;
+ }
+
+ /* Color is char[layers] */
+
+ // zwoosh, yknow, it goes... zwoosh an all these bars and lines and
+ // crap intersect.
+ Pixel colorTable[2][super+1];
+ void pen(Pixel color) {
+ for(int i=0;i<super+1;i++)
+ {
+ colorTable[0][i] = color*i;
+ colorTable[1][i] = -(color*i);
+ }
+ }
+
+ void line(int x1,int y1,int x2,int y2) {
+ Pixel *colors;
+ if (y2 < y1)
+ {
+ int temp;
+ temp = x2; x2 = x1; x1 = temp;
+ temp = y2; y2 = y1; y1 = temp;
+ colors = colorTable[1];
+ }
+ else
+ {
+ if (y1 == y2) return;
+
+ colors= colorTable[0];
+ }
+
+ int slope = (x1-x2 << 16)/(y1-y2);
+ int x = x1<<16, y = y1;
+ while(y < y2)
+ {
+ add(colors[super-((x>>16)&(super-1))],
+ x>>(16+superSampleShift),y>>superSampleShift);
+ add(colors[(x>>16)&(super-1)],
+ 1+(x>>(16+superSampleShift)),y>>superSampleShift);
+ x += slope;
+ y++;
+ }
+ }
+
+ void icon(double icon[][4], Pixel color, double x, double y, double scaleX, double scaleY)
+ {
+ pen(color);
+ x *= super;
+ y *= super;
+ scaleX *= super;
+ scaleY *= super;
+ for(int i=0;icon[i][1] != icon[i][3];i++)
+ line(int(icon[i][0]*scaleX+x),int(icon[i][1]*scaleY+y), int(icon[i][2]*scaleX+x), int(icon[i][3]*scaleY+y));
+ }
+#undef super
+};
diff --git a/noatun-plugins/synaescope/sdlwrap.cpp b/noatun-plugins/synaescope/sdlwrap.cpp
new file mode 100644
index 0000000..dc7ff63
--- /dev/null
+++ b/noatun-plugins/synaescope/sdlwrap.cpp
@@ -0,0 +1,207 @@
+/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia)
+ Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au>
+ 2001 Charles Samuels <charles@kde.org>
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <string.h>
+#include "syna.h"
+#include <iostream>
+#include <SDL_syswm.h>
+#include "SDL.h"
+
+#ifdef Bool
+#undef Bool
+#endif
+
+static SDL_Surface *surface;
+
+SDL_Surface *CreateScreen(Uint16 w, Uint16 h, Uint8 bpp, Uint32 flags)
+{
+ SDL_Surface *screen;
+
+ /* Set the video mode */
+ screen = SDL_SetVideoMode(w, h, bpp, flags);
+
+ return screen;
+}
+
+void SdlScreen::setPalette(unsigned char *palette)
+{
+ SDL_Color sdlPalette[256];
+
+ for(int i=0;i<256;i++) {
+ sdlPalette[i].r = palette[i*3+0];
+ sdlPalette[i].g = palette[i*3+1];
+ sdlPalette[i].b = palette[i*3+2];
+ }
+
+ SDL_SetColors(surface, sdlPalette, 0, 256);
+}
+
+bool SdlScreen::init(int,int,int width,int height,bool fullscreen)
+{
+ Uint32 videoflags;
+
+ /* Initialize SDL */
+ if ( SDL_Init(SDL_INIT_VIDEO) < 0 )
+ {
+ fprintf(stderr, "Could not initialize SDL library: %s\n", SDL_GetError());
+ return false;
+ }
+
+ updateWindowCaption("Noatun - Synaescope");
+
+ /* See if we try to get a hardware colormap */
+ videoflags = SDL_SWSURFACE | (fullscreen?SDL_FULLSCREEN:0);
+
+ surface = CreateScreen(width, height, 8, videoflags);
+ if (!surface)
+ {
+ error("requesting screen dimensions");
+ }
+
+ core->outWidth = width;
+ core->outHeight = height;
+
+ SDL_EnableUNICODE(1);
+ SDL_ShowCursor(0);
+
+ return true;
+}
+
+void SdlScreen::end()
+{
+ SDL_Quit();
+}
+
+bool SdlScreen::inputUpdate(int &mouseX,int &mouseY,int &mouseButtons,char &keyHit)
+{
+ SDL_Event event;
+ keyHit = 0;
+ mouseButtons=0;
+
+ while ( SDL_PollEvent(&event) > 0 )
+ {
+ switch (event.type)
+ {
+ case SDL_MOUSEBUTTONUP:
+ case SDL_MOUSEBUTTONDOWN:
+ if ( event.button.state == SDL_PRESSED )
+ mouseButtons |= 1 << event.button.button;
+ else
+ mouseButtons &= ~( 1 << event.button.button );
+
+ case SDL_MOUSEMOTION :
+ mouseX = event.motion.x;
+ mouseY = event.motion.y;
+ break;
+
+ case SDL_KEYDOWN:
+ /* Ignore key releases */
+ if ( event.key.state == SDL_RELEASED )
+ break;
+
+ if(event.key.keysym.sym == SDLK_SPACE)
+ {
+ mouseButtons=0;
+ fullscreen();
+ }
+
+ if (event.key.keysym.unicode > 255)
+ break;
+
+ keyHit = event.key.keysym.unicode;
+ return true;
+
+ case SDL_QUIT:
+ //keyHit = 'q';
+ return false;
+ break;
+ }
+ }
+ return true;
+}
+
+void SdlScreen::fullscreen()
+{
+ SDL_WM_ToggleFullScreen(surface);
+}
+
+int SdlScreen::sizeUpdate() { return 0; }
+
+void SdlScreen::show()
+{
+ SDL_LockSurface(surface);
+
+ register unsigned long *ptr2 = (unsigned long*)core->output();
+ unsigned long *ptr1 = (unsigned long*)( surface->pixels );
+ int i = core->outWidth*core->outHeight/4;
+
+ do {
+ // Asger Alstrup Nielsen's (alstrup@diku.dk)
+ // optimized 32 bit screen loop
+ register unsigned int const r1 = *(ptr2++);
+ register unsigned int const r2 = *(ptr2++);
+
+ //if (r1 || r2) {
+#ifdef LITTLEENDIAN
+ register unsigned int const v =
+ ((r1 & 0x000000f0ul) >> 4)
+ | ((r1 & 0x0000f000ul) >> 8)
+ | ((r1 & 0x00f00000ul) >> 12)
+ | ((r1 & 0xf0000000ul) >> 16);
+ *(ptr1++) = v |
+ ( ((r2 & 0x000000f0ul) << 12)
+ | ((r2 & 0x0000f000ul) << 8)
+ | ((r2 & 0x00f00000ul) << 4)
+ | ((r2 & 0xf0000000ul)));
+#else
+ register unsigned int const v =
+ ((r2 & 0x000000f0ul) >> 4)
+ | ((r2 & 0x0000f000ul) >> 8)
+ | ((r2 & 0x00f00000ul) >> 12)
+ | ((r2 & 0xf0000000ul) >> 16);
+ *(ptr1++) = v |
+ ( ((r1 & 0x000000f0ul) << 12)
+ | ((r1 & 0x0000f000ul) << 8)
+ | ((r1 & 0x00f00000ul) << 4)
+ | ((r1 & 0xf0000000ul)));
+#endif
+ //} else ptr1++;
+ } while (--i);
+
+ SDL_UnlockSurface(surface);
+ SDL_UpdateRect(surface, 0, 0, 0, 0);
+}
+
+void SdlScreen::updateWindowCaption(const char *string)
+{
+ SDL_WM_SetCaption(string, "synaescope");
+}
+/*
+int SdlScreen::winID()
+{
+ SDL_SysWMinfo info;
+ info.version.major = SDL_MAJOR_VERSION;
+ info.subsystem = SDL_SYSWM_X11;
+
+ SDL_GetWMInfo(&info);
+ return info.info.x11.wmwindow;
+}*/
diff --git a/noatun-plugins/synaescope/symbol.h b/noatun-plugins/synaescope/symbol.h
new file mode 100644
index 0000000..53137c0
--- /dev/null
+++ b/noatun-plugins/synaescope/symbol.h
@@ -0,0 +1,1021 @@
+#define SYMBOLSWIDTH 586
+#define SYMBOLSHEIGHT 50
+unsigned char Symbols[586*50] = {
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,241,72,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,13,30,37,31,24,5,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,132,254,237,72,0,0,0,0,0,0,0,0,0,0,0,1,7,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,46,0,0,0,0,0,0,0,0,0,0,0,0,0,10,87,
+ 176,225,244,246,244,238,206,135,39,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,254,
+ 254,236,73,0,0,0,0,0,0,0,0,0,0,3,154,138,58,9,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,36,211,80,0,0,0,0,0,0,0,0,0,0,0,2,77,204,252,254,254,254,
+ 254,254,254,254,254,239,145,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,254,255,245,
+ 215,72,0,0,0,0,0,0,0,0,0,0,115,254,249,213,138,58,8,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,36,212,253,80,0,0,0,0,0,0,0,0,0,0,7,136,247,254,254,254,254,
+ 254,254,254,254,254,254,254,254,208,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,254,
+ 255,225,66,210,72,0,0,0,0,0,0,0,0,0,40,244,254,254,254,249,214,137,57,8,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,37,212,254,254,80,0,0,0,0,0,0,0,0,0,4,150,253,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,227,50,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,132,254,255,225,10,55,217,71,0,0,0,0,0,0,0,0,4,194,254,255,255,
+ 255,255,254,250,214,137,57,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,211,254,254,254,80,0,0,
+ 0,0,0,0,0,0,0,100,250,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,203,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,254,255,225,10,1,196,187,1,
+ 0,0,0,0,0,0,0,0,115,254,255,255,255,255,255,254,254,254,249,212,137,57,
+ 10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,36,211,254,254,254,254,80,0,0,0,0,0,0,0,0,29,230,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,255,255,254,130,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,41,244,255,255,
+ 255,255,255,255,255,255,254,254,254,249,212,137,58,8,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,212,254,254,254,
+ 254,254,80,0,0,0,0,0,0,0,0,134,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,255,255,255,232,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,254,255,
+ 225,10,1,196,190,1,0,0,0,0,0,0,0,0,4,196,254,255,255,255,255,255,255,255,
+ 255,255,255,255,254,254,249,212,137,57,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,212,254,254,254,254,254,254,80,0,0,
+ 0,0,0,0,0,16,225,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,255,255,255,254,112,0,0,0,0,0,0,0,3,12,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,
+ 0,0,0,0,0,0,7,9,0,0,0,0,0,0,0,0,0,0,0,0,111,155,155,111,0,0,0,16,148,155,
+ 155,58,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,132,254,
+ 255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,115,253,254,255,255,255,255,255,
+ 255,255,255,255,255,255,255,254,254,254,250,194,15,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,7,147,99,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,38,179,
+ 38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,211,254,254,254,254,254,
+ 254,254,80,0,0,0,0,0,0,0,62,251,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,255,255,255,254,182,1,0,0,0,0,0,0,18,171,19,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,1,162,44,0,0,0,0,0,37,159,11,0,0,0,0,0,0,0,0,0,0,1,182,254,
+ 254,182,1,0,0,27,243,254,254,96,0,0,0,0,0,0,0,0,0,0,0,23,136,1,0,0,0,0,
+ 0,68,92,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,
+ 40,244,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,
+ 232,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,151,253,245,99,1,0,0,
+ 6,50,106,155,166,174,166,162,115,52,11,0,0,0,38,213,254,213,39,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,210,254,254,254,254,254,254,254,254,80,
+ 0,0,0,0,0,0,0,108,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,255,255,255,254,223,9,0,0,0,0,0,0,18,239,185,19,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,197,219,45,0,0,0,0,38,246,166,11,0,0,0,0,0,0,0,0,0,1,182,254,254,
+ 182,1,0,0,27,243,254,254,96,0,0,0,0,0,0,0,0,0,0,23,192,196,1,0,0,0,0,68,
+ 233,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,
+ 4,196,254,255,255,255,255,255,255,255,255,255,255,255,255,255,254,232,65,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,180,252,255,254,244,95,10,97,
+ 197,248,254,254,255,255,255,254,254,248,210,118,20,36,212,254,255,254,213,
+ 39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,211,254,254,254,254,254,254,254,
+ 254,254,80,0,0,0,0,0,0,0,117,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,255,255,255,255,228,11,0,0,0,0,0,0,18,240,254,185,
+ 19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
+ 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 1,1,0,0,0,0,0,0,0,1,197,254,218,44,0,0,0,38,247,253,165,11,0,0,0,0,0,0,
+ 0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,0,0,0,0,0,0,0,0,23,192,
+ 254,196,1,0,0,0,67,234,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,
+ 1,0,0,0,0,0,0,0,0,0,0,116,254,255,255,255,255,255,255,255,255,255,255,255,
+ 255,254,233,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,186,254,255,
+ 254,254,225,74,34,220,254,254,255,255,255,255,255,255,255,254,254,248,95,
+ 44,205,254,254,255,254,213,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,211,254,
+ 254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,122,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,255,255,255,255,228,
+ 11,0,0,0,0,0,0,18,240,254,254,186,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 17,187,197,197,197,197,197,195,46,0,0,0,0,0,0,0,142,197,197,197,197,197,
+ 197,107,0,0,0,0,0,0,0,81,196,197,197,197,197,197,197,197,197,197,197,197,
+ 197,197,197,197,197,197,197,197,197,194,37,0,0,0,0,0,0,1,197,254,254,219,
+ 44,0,0,38,247,254,253,165,11,0,0,0,0,0,0,0,1,182,254,254,182,1,0,0,27,243,
+ 254,254,96,0,0,0,0,0,0,0,0,22,192,254,254,196,1,0,0,66,235,254,254,111,
+ 0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,39,246,
+ 254,255,255,255,255,255,255,255,255,255,255,254,234,64,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,17,187,254,255,254,254,204,34,0,0,47,222,254,254,
+ 255,255,255,255,255,255,254,248,113,2,0,18,175,254,254,255,254,214,36,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,36,211,254,254,254,254,254,254,254,254,254,254,
+ 254,80,0,0,0,0,0,0,0,114,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,255,255,255,254,227,11,0,0,0,0,0,0,18,240,255,254,254,
+ 185,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,
+ 0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,251,47,0,0,0,0,0,0,1,197,254,254,254,220,43,0,38,247,254,254,253,166,
+ 11,0,0,0,0,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,0,0,0,0,0,0,
+ 22,193,254,254,254,196,1,0,67,234,254,255,254,111,0,0,0,0,0,0,0,132,254,
+ 255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,3,196,254,255,255,255,255,255,
+ 255,255,255,255,255,236,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,
+ 211,254,255,254,204,30,0,0,0,0,47,221,254,255,255,255,255,255,254,243,112,
+ 2,0,0,0,14,175,253,255,254,231,54,0,0,0,0,0,0,1,5,5,5,5,5,5,5,5,5,5,5,5,
+ 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,5,5,5,1,
+ 0,0,0,0,0,0,0,0,0,0,0,5,5,5,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,210,254,255,
+ 254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,74,253,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,255,255,255,254,
+ 194,2,0,0,0,0,0,0,18,240,255,255,255,254,184,19,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,23,242,255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,
+ 254,254,138,0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,
+ 254,254,219,44,38,247,254,254,254,253,166,11,0,0,0,0,0,1,182,254,254,182,
+ 1,0,0,27,243,254,254,96,0,0,0,0,0,0,23,192,254,254,254,254,196,1,68,233,
+ 254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,
+ 0,0,0,0,0,0,0,0,116,254,255,255,255,255,255,255,255,255,255,255,231,53,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,210,254,225,33,0,0,0,0,0,
+ 0,48,221,254,254,255,255,254,237,78,1,0,0,0,0,0,15,198,254,231,61,0,0,0,
+ 0,0,0,0,73,213,214,214,214,214,214,214,214,213,214,214,214,214,214,214,
+ 214,214,214,214,214,214,214,214,213,214,214,214,214,214,214,214,214,214,
+ 156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,8,145,213,214,213,133,5,0,0,0,0,0,0,0,0,0,88,211,213,
+ 214,181,24,0,0,0,0,3,11,11,11,11,11,11,11,40,210,254,255,255,254,254,254,
+ 254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,26,235,254,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,255,255,255,254,131,0,0,0,0,
+ 0,0,0,18,240,255,255,255,254,254,184,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,
+ 242,255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,
+ 138,0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,
+ 254,218,83,247,254,254,254,254,253,165,11,0,0,0,0,1,182,254,254,182,1,0,
+ 0,27,243,254,254,96,0,0,0,0,0,23,191,254,254,254,254,254,197,69,233,254,
+ 254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,
+ 0,0,0,0,0,0,0,0,40,245,255,255,255,255,255,255,255,255,255,255,254,226,
+ 52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,205,79,0,0,0,0,0,0,0,
+ 0,47,222,254,254,254,238,76,0,0,0,0,0,0,0,0,45,212,62,0,0,0,0,0,0,0,0,87,
+ 253,185,168,168,168,168,168,171,243,249,175,168,204,254,255,254,220,168,
+ 170,239,243,171,168,220,254,195,168,168,168,168,168,169,236,185,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,11,11,11,5,
+ 0,0,0,0,0,0,0,0,0,0,7,11,11,11,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,11,11,11,11,4,0,0,0,0,0,0,0,0,0,0,8,11,11,11,8,0,0,0,0,0,
+ 0,0,0,0,0,4,11,11,11,11,1,0,0,0,0,0,0,0,0,0,1,11,11,11,11,4,0,0,0,0,0,0,
+ 0,0,0,0,8,11,11,11,7,0,0,0,0,0,0,0,0,0,0,5,11,11,11,10,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,151,252,254,254,254,251,136,2,0,
+ 0,0,0,0,0,0,88,242,254,224,246,254,194,22,0,0,0,64,228,229,229,229,229,
+ 229,229,239,254,254,254,254,254,254,254,254,254,254,254,254,254,254,80,
+ 0,0,0,0,0,0,0,1,163,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,255,255,255,244,45,0,0,0,0,0,0,0,18,240,255,255,255,255,254,
+ 254,185,18,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,
+ 0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,237,253,254,254,254,
+ 254,254,253,165,11,0,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,0,
+ 0,0,22,191,254,254,254,254,254,254,233,235,254,254,254,255,255,254,111,
+ 0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,4,196,
+ 255,255,255,255,255,255,255,255,255,255,255,254,225,52,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,4,0,0,0,0,0,0,0,0,0,48,222,254,239,77,0,
+ 0,0,0,0,0,0,0,0,1,24,0,0,0,0,0,0,0,0,0,87,251,50,0,0,0,0,0,10,223,251,67,
+ 0,53,246,255,253,99,0,31,241,222,9,0,153,253,80,0,0,0,0,0,2,200,185,1,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,224,229,
+ 229,229,179,18,0,0,0,0,0,0,0,0,37,203,229,229,229,214,55,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,98,226,229,229,229,170,14,0,0,0,0,0,0,
+ 0,0,45,208,229,229,229,209,47,0,0,0,0,0,0,0,0,13,167,229,229,229,227,101,
+ 1,0,0,0,0,0,0,0,1,109,227,229,229,229,161,11,0,0,0,0,0,0,0,0,52,213,229,
+ 229,229,205,39,0,0,0,0,0,0,0,0,16,177,229,229,229,225,90,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,251,254,255,255,255,255,238,15,
+ 0,0,0,0,0,0,11,225,254,207,34,104,247,253,80,0,0,0,71,253,255,255,255,255,
+ 254,254,254,255,255,255,255,254,254,254,254,254,254,254,254,254,254,80,
+ 0,0,0,0,0,0,0,0,49,243,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,255,255,254,161,1,0,0,0,0,0,0,0,18,240,255,255,255,255,254,
+ 254,254,185,18,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,
+ 0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,253,165,11,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,
+ 0,0,22,192,254,254,254,254,254,254,254,254,254,254,254,254,255,255,254,
+ 111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,
+ 0,116,253,254,255,255,255,254,235,219,254,255,255,255,254,226,53,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,21,21,21,21,21,21,21,21,21,
+ 21,21,21,21,21,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,114,2,0,0,0,0,0,
+ 0,0,0,0,47,207,76,0,0,0,0,0,0,0,0,0,0,80,130,0,0,0,0,0,0,0,0,0,87,251,50,
+ 0,0,0,0,0,9,223,254,161,0,5,193,254,235,28,0,116,254,222,9,0,153,254,79,
+ 0,0,0,0,0,1,200,185,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,88,242,254,254,255,255,254,185,18,0,0,0,0,0,0,37,214,254,254,
+ 255,255,254,228,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,98,246,254,
+ 254,255,255,254,175,14,0,0,0,0,0,0,44,220,254,254,255,255,254,222,47,0,
+ 0,0,0,0,0,13,172,254,254,255,255,254,246,101,1,0,0,0,0,0,1,109,248,254,
+ 254,255,255,253,165,11,0,0,0,0,0,0,53,226,254,254,255,255,254,216,39,0,
+ 0,0,0,0,0,17,182,254,254,255,255,254,243,91,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,69,253,254,255,255,255,255,239,16,0,0,0,0,0,0,12,
+ 230,212,32,0,1,113,253,81,0,0,0,71,253,254,255,255,255,254,255,255,255,
+ 255,254,255,254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,0,
+ 2,141,253,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 229,36,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255,254,254,184,19,0,
+ 0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,
+ 254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,251,47,0,0,0,0,
+ 0,0,1,197,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,253,
+ 165,11,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,0,22,192,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,255,255,254,111,0,0,0,0,0,0,0,132,
+ 254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,41,244,254,255,255,254,
+ 233,66,37,212,254,255,255,255,254,226,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,108,240,241,241,241,241,241,241,241,241,241,241,241,241,
+ 241,224,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,199,249,115,2,0,0,0,0,0,0,0,
+ 29,99,119,113,55,4,0,0,0,0,0,0,0,80,240,230,22,0,0,0,0,0,0,0,0,87,251,50,
+ 0,0,0,0,0,9,223,255,228,18,0,97,253,165,1,4,196,254,222,9,0,153,254,79,
+ 0,0,0,0,0,1,200,185,1,0,0,0,0,0,0,0,0,0,0,0,0,0,8,53,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,6,176,254,255,255,255,255,254,242,110,18,0,0,0,0,0,106,250,255,
+ 255,255,255,254,252,154,44,0,0,0,0,10,51,0,0,0,0,0,0,0,3,56,2,0,0,0,1,64,
+ 193,254,255,255,255,255,254,237,57,0,0,0,0,0,39,143,251,255,255,255,255,
+ 254,251,123,0,0,0,0,0,0,54,236,254,255,255,255,254,254,196,66,1,0,0,0,2,
+ 69,202,254,255,255,255,255,254,234,98,11,0,0,0,0,43,151,252,255,255,255,
+ 255,254,251,137,35,0,0,0,0,17,108,241,254,255,255,255,254,254,187,61,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,253,255,255,255,255,255,
+ 239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,253,254,255,255,
+ 255,254,255,255,254,255,254,255,254,254,254,254,254,254,254,254,254,254,
+ 80,0,0,0,0,0,0,0,0,0,13,192,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,244,84,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255,
+ 255,254,254,184,19,0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,
+ 0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,253,165,11,1,182,254,254,182,1,0,0,27,243,254,254,96,
+ 0,23,191,254,254,254,254,254,254,254,254,254,254,254,254,254,254,255,255,
+ 254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,4,196,254,255,254,233,66,0,0,37,211,254,255,255,255,254,225,34,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,219,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,254,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53,
+ 248,254,248,115,2,0,0,0,0,3,112,186,152,158,153,173,163,23,0,0,0,0,0,80,
+ 240,254,253,85,0,0,0,0,0,0,0,0,87,251,50,0,5,36,37,37,45,228,255,252,79,
+ 0,20,226,73,0,40,244,254,222,9,0,153,253,105,37,15,0,1,32,38,208,185,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,8,150,240,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,186,
+ 253,253,253,253,242,144,228,183,19,0,0,0,0,3,126,249,253,253,253,251,170,
+ 192,227,55,0,0,10,161,237,76,0,0,0,0,0,3,123,243,112,2,0,1,98,241,163,201,
+ 253,253,253,253,238,78,0,0,0,0,0,45,219,201,162,250,253,253,253,250,140,
+ 6,0,0,0,0,0,0,0,75,237,253,253,253,253,203,161,242,102,1,0,2,109,243,157,
+ 207,253,253,253,253,234,143,236,164,11,0,0,52,225,194,169,251,253,253,253,
+ 250,158,206,214,40,0,0,17,181,229,143,241,253,253,253,253,196,167,240,91,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,253,255,255,255,255,255,
+ 239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,253,254,255,255,
+ 255,254,254,255,254,255,254,254,254,254,254,254,254,254,254,254,254,254,
+ 80,0,0,0,0,0,0,0,0,0,0,24,188,253,254,254,254,254,254,254,254,254,254,254,
+ 254,254,237,97,1,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255,255,254,
+ 254,254,184,18,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,0,0,
+ 0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,253,164,12,182,254,254,182,1,0,0,27,243,254,254,96,
+ 22,191,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,255,
+ 255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,116,254,254,233,66,0,0,0,0,37,212,254,255,254,253,161,9,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,253,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,234,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,
+ 254,254,254,248,115,2,0,0,0,113,161,193,249,253,252,224,149,171,14,0,0,
+ 0,80,239,254,255,254,154,0,0,0,0,0,0,0,0,87,251,50,0,38,240,247,247,247,
+ 253,255,254,165,1,0,115,12,0,121,254,255,222,9,0,153,254,249,247,102,0,
+ 8,214,247,253,185,1,0,0,0,0,0,0,0,0,0,0,0,2,145,252,254,241,58,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,17,67,68,68,68,93,228,254,254,171,2,0,0,0,0,3,59,68,
+ 68,68,73,190,254,254,226,27,3,156,253,254,237,48,0,0,0,0,115,250,254,247,
+ 86,0,87,245,254,251,135,67,68,68,68,46,0,0,0,0,0,34,219,254,254,192,67,
+ 68,68,68,62,6,0,0,0,0,0,0,0,0,0,45,68,68,68,68,149,251,254,245,74,0,99,
+ 247,254,250,126,67,68,68,68,105,237,254,253,146,0,41,225,254,254,182,66,
+ 68,68,68,78,205,254,254,211,15,7,179,254,254,229,78,68,68,68,68,158,252,
+ 254,243,63,0,0,0,0,0,0,0,0,0,0,1,3,0,0,0,0,0,0,0,0,0,0,69,253,254,254,254,
+ 254,254,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,253,254,
+ 255,255,255,254,255,255,255,255,255,255,254,254,254,254,254,254,254,254,
+ 254,254,80,0,0,0,0,0,0,0,0,0,0,0,11,133,239,254,254,254,254,254,254,254,
+ 254,254,252,200,55,0,0,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255,
+ 255,255,255,254,254,185,17,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,
+ 60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,254,253,165,193,254,254,182,1,0,0,27,243,254,
+ 254,118,191,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,41,244,234,65,0,0,0,0,0,0,36,213,254,253,161,10,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,219,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,254,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 159,254,255,255,254,248,115,2,0,31,186,194,254,255,255,254,254,238,162,
+ 105,0,0,80,239,254,255,255,255,201,3,0,0,0,0,0,0,0,87,251,50,0,16,102,116,
+ 246,254,255,255,255,236,26,0,10,0,7,208,254,255,222,9,0,153,255,255,254,
+ 106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,5,213,254,255,254,88,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,91,254,255,255,211,4,0,0,0,0,0,0,0,
+ 0,0,23,241,254,255,250,46,9,223,254,255,253,75,0,0,0,1,184,254,255,254,
+ 122,0,152,254,255,255,154,0,0,0,0,0,0,0,0,0,0,73,253,254,255,224,10,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,197,254,255,254,108,0,166,254,255,254,
+ 140,0,0,0,0,118,254,255,255,187,1,87,254,255,255,214,6,0,0,0,43,249,254,
+ 255,243,26,20,240,254,255,252,49,0,0,0,3,208,254,255,254,95,0,0,0,0,0,0,
+ 0,0,0,68,189,198,107,5,0,0,0,0,0,0,0,0,69,252,144,104,105,104,183,239,16,
+ 0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,253,254,255,255,255,254,
+ 255,255,255,255,255,255,254,254,254,254,254,254,254,254,254,254,80,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,37,147,225,249,254,254,253,252,242,193,87,8,0,0,0,
+ 0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255,255,255,255,255,254,254,
+ 184,18,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,
+ 254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,251,47,0,0,0,0,
+ 0,0,1,197,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,252,254,254,182,1,0,0,27,243,254,254,242,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,255,255,254,111,0,0,
+ 0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,4,176,
+ 65,0,0,0,0,0,0,0,0,36,211,160,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,109,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,233,29,0,0,0,0,0,0,0,0,0,0,0,0,0,170,255,255,255,255,255,249,115,
+ 2,103,151,250,255,255,255,255,255,254,169,172,3,80,240,254,255,255,255,
+ 255,211,5,0,0,0,0,0,0,0,87,251,50,0,0,0,19,240,255,255,255,255,253,94,0,
+ 0,0,53,248,255,255,222,9,0,153,255,255,254,106,0,8,220,255,255,185,1,0,
+ 0,0,0,0,0,0,0,0,0,0,5,213,255,255,254,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,91,254,255,255,211,4,0,0,0,0,0,0,0,0,0,23,242,255,255,250,46,9,
+ 223,255,255,253,75,0,0,0,1,184,255,255,254,122,0,153,255,255,255,154,0,
+ 0,0,0,0,0,0,0,0,0,74,253,255,255,224,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,197,255,255,254,108,0,166,255,255,254,140,0,0,0,0,118,254,255,255,
+ 187,1,87,254,255,255,214,6,0,0,0,43,249,255,255,243,26,20,240,255,255,252,
+ 49,0,0,0,3,209,255,255,254,95,0,0,0,0,0,0,0,0,34,233,254,254,251,82,0,0,
+ 0,0,0,0,0,0,69,252,67,0,0,0,133,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,
+ 252,81,0,0,0,71,253,254,255,255,254,254,254,255,254,255,254,254,254,254,
+ 254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,52,
+ 83,84,84,73,32,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,
+ 255,255,255,255,255,254,254,254,156,2,0,0,0,0,0,0,23,242,255,255,255,255,
+ 255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,
+ 104,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,182,1,0,0,27,
+ 243,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,
+ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,26,10,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,218,254,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,254,135,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,178,255,255,255,255,255,255,249,112,123,158,254,255,255,255,255,255,254,
+ 187,177,81,240,254,255,255,255,255,255,211,5,0,0,0,0,0,0,0,87,251,50,0,
+ 0,0,19,240,255,255,255,255,254,161,0,0,0,116,254,255,255,222,9,0,153,255,
+ 255,254,106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,5,213,255,255,254,
+ 88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,91,254,255,255,211,4,0,0,0,0,0,
+ 0,0,0,0,23,242,255,255,250,46,9,223,255,255,253,75,0,0,0,1,184,255,255,
+ 254,122,0,153,255,255,255,154,0,0,0,0,0,0,0,0,0,0,74,253,255,255,224,10,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,197,255,255,254,108,0,166,255,255,
+ 254,140,0,0,0,0,118,254,255,255,187,1,87,254,255,255,214,6,0,0,0,43,249,
+ 255,255,243,26,20,240,255,255,252,49,0,0,0,3,209,255,255,254,95,0,0,0,0,
+ 0,0,0,0,72,253,255,254,254,136,0,0,0,0,0,0,0,0,69,252,121,73,73,73,168,
+ 239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,253,255,255,255,
+ 255,254,255,255,255,255,255,255,254,254,254,254,254,254,254,254,254,254,
+ 80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,18,240,255,255,255,255,255,255,255,255,255,255,255,254,218,43,0,0,
+ 0,0,0,0,0,23,242,255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,
+ 254,254,254,138,0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,182,1,0,0,27,243,254,254,252,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,255,255,254,111,0,0,0,0,0,0,0,132,
+ 254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,251,253,253,253,
+ 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,230,29,
+ 0,0,0,0,0,0,0,0,0,0,0,0,170,255,255,255,255,255,254,248,112,120,153,253,
+ 255,255,255,255,255,254,181,176,81,240,254,255,255,255,255,255,211,5,0,
+ 0,0,0,0,0,0,87,251,50,0,0,0,19,240,255,255,255,255,254,113,0,0,0,69,251,
+ 255,255,222,9,0,153,255,255,254,106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,
+ 0,0,0,0,5,211,254,255,254,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,89,254,
+ 255,255,211,4,0,0,0,0,0,0,1,1,1,23,240,255,255,250,45,9,221,254,255,253,
+ 75,1,1,1,2,181,254,255,254,122,0,150,254,255,254,154,1,1,1,1,0,0,0,0,0,
+ 0,71,253,255,255,224,10,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,194,254,255,
+ 254,108,0,163,254,255,254,140,1,1,1,1,116,254,255,254,187,1,84,253,255,
+ 255,214,7,1,1,1,42,248,255,255,242,26,19,238,255,255,252,49,0,0,0,3,206,
+ 254,255,254,94,0,0,0,0,0,0,0,0,47,244,254,254,253,104,0,0,0,0,0,0,0,0,69,
+ 253,252,252,252,252,253,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,
+ 0,0,71,253,254,255,255,255,254,255,255,255,255,255,255,254,254,254,254,
+ 254,254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,3,81,94,94,94,94,94,
+ 94,94,94,94,93,19,0,0,0,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255,
+ 255,255,255,255,254,219,43,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,
+ 60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,205,208,254,254,182,1,0,0,27,243,254,
+ 254,145,224,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,11,134,158,158,158,158,158,158,158,158,158,158,158,158,
+ 158,158,158,158,158,158,158,158,158,66,0,0,0,0,0,0,0,0,0,0,0,0,167,254,
+ 255,255,255,254,248,115,2,62,170,229,254,254,255,255,255,251,159,145,1,
+ 80,240,254,255,255,255,255,208,4,0,0,0,0,0,0,0,87,251,50,0,14,91,106,245,
+ 254,255,255,255,243,39,0,2,0,14,222,255,255,222,9,0,153,255,255,254,106,
+ 0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,0,90,243,254,214,32,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,54,184,190,190,190,155,195,254,250,124,1,0,0,0,0,17,
+ 161,190,190,190,176,157,250,254,187,14,1,101,246,254,210,142,190,190,190,
+ 188,140,235,254,229,52,0,46,222,254,240,136,187,190,190,190,127,4,0,0,0,
+ 0,14,174,254,252,162,169,190,190,190,167,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 75,239,254,224,43,0,54,227,254,236,135,187,190,190,190,148,208,254,247,
+ 100,0,17,184,254,251,156,173,190,190,190,169,168,253,253,167,7,2,123,250,
+ 254,190,15,0,0,0,0,85,242,254,218,35,0,0,0,0,0,0,0,0,1,115,233,237,163,
+ 14,0,0,0,0,0,0,0,0,69,252,114,63,63,63,164,239,16,0,0,0,0,0,0,12,230,146,
+ 0,0,0,55,252,81,0,0,0,71,253,254,255,255,255,254,255,255,254,255,254,255,
+ 254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,8,217,
+ 250,250,250,250,250,250,250,250,250,248,51,0,0,0,0,0,0,0,0,0,0,0,0,18,240,
+ 255,255,255,255,255,255,255,255,255,254,218,43,0,0,0,0,0,0,0,0,0,23,242,
+ 255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,
+ 0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,204,31,182,254,254,
+ 182,1,0,0,27,243,254,254,96,49,223,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,
+ 1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,245,252,250,250,250,250,250,250,
+ 250,250,250,250,250,250,250,250,250,250,250,250,250,254,127,0,0,0,0,0,0,
+ 0,0,0,0,0,0,121,254,255,255,254,248,115,2,0,5,170,149,242,254,254,254,252,
+ 181,184,44,0,0,80,239,254,254,255,254,166,0,0,0,0,0,0,0,0,87,251,50,0,38,
+ 243,250,250,250,254,254,254,187,4,0,82,6,0,144,254,254,222,9,0,153,255,
+ 255,254,106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,0,0,90,204,37,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,55,227,254,254,255,255,253,168,191,126,3,0,0,
+ 0,0,17,184,254,254,255,255,254,207,157,184,19,0,0,1,101,203,155,250,254,
+ 254,255,254,238,141,211,57,0,0,0,47,207,142,233,254,254,255,255,252,137,
+ 5,0,0,0,0,14,173,164,199,254,254,255,255,254,195,24,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,76,208,49,0,0,0,55,210,141,237,254,254,255,254,250,157,202,104,
+ 1,0,0,17,182,159,205,254,254,255,255,254,194,168,166,12,0,0,3,123,186,21,
+ 0,0,0,0,0,0,86,205,41,0,0,0,0,0,0,0,0,0,0,0,15,16,1,0,0,0,0,0,0,0,0,0,69,
+ 252,67,0,0,0,133,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,
+ 253,254,255,254,254,254,254,254,254,255,254,254,254,254,254,254,254,254,
+ 254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,1,38,44,44,44,44,44,44,44,44,
+ 44,44,9,0,0,0,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255,255,255,
+ 254,218,44,0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,0,0,0,
+ 0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,251,
+ 47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,204,30,1,182,254,254,182,1,0,0,27,243,254,254,96,0,49,223,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,255,255,254,111,
+ 0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,
+ 245,137,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,62,243,127,
+ 0,0,0,0,0,0,0,0,0,0,0,0,65,251,254,254,248,115,2,0,0,0,27,177,159,174,192,
+ 185,159,183,80,0,0,0,0,80,239,254,254,254,99,0,0,0,0,0,0,0,0,87,251,50,
+ 0,6,43,44,44,52,229,254,253,98,0,11,209,53,0,56,249,254,222,9,0,153,255,
+ 255,254,106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,0,0,3,37,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,31,192,254,255,255,255,255,254,248,85,3,0,0,0,0,0,
+ 118,253,255,255,255,255,254,254,159,31,0,0,0,0,1,63,241,254,255,255,255,
+ 254,254,215,54,0,0,0,0,0,24,201,254,255,255,255,255,254,245,85,5,0,0,0,
+ 0,26,146,253,255,255,255,255,254,253,144,18,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+ 38,0,0,0,0,0,53,212,254,255,255,255,255,254,242,89,5,0,0,0,0,11,148,254,
+ 255,255,255,255,254,253,139,24,0,0,0,0,9,31,0,0,0,0,0,0,0,2,37,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,252,67,0,0,0,133,239,16,0,0,
+ 0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,253,254,255,255,255,254,255,
+ 255,255,255,255,255,254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,240,
+ 255,255,255,255,255,255,255,254,218,44,0,0,0,0,0,0,0,0,0,0,0,23,242,255,
+ 255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,
+ 0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,204,30,0,1,182,254,254,182,
+ 1,0,0,27,243,254,254,96,0,0,49,223,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,
+ 190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,245,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,21,241,127,0,0,0,0,0,0,0,0,0,0,0,0,14,216,254,248,115,2,0,0,0,0,0,
+ 18,115,175,181,180,148,47,0,0,0,0,0,0,80,239,254,239,36,0,0,0,0,0,0,0,0,
+ 87,251,50,0,0,0,0,0,9,223,255,238,28,0,75,252,146,0,8,212,254,222,9,0,153,
+ 255,255,254,106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,0,2,111,220,
+ 52,0,0,0,0,0,0,0,0,0,0,0,0,54,220,151,217,254,254,254,254,250,127,3,0,0,
+ 0,0,0,0,11,165,253,254,254,254,254,194,168,201,29,0,0,0,0,1,102,245,254,
+ 254,254,254,230,143,225,75,0,0,0,0,0,47,221,254,254,254,254,248,153,210,
+ 137,5,0,0,23,191,177,186,254,254,254,254,254,188,175,194,24,0,0,0,0,0,0,
+ 0,0,0,0,0,1,96,223,66,0,0,0,72,224,144,228,254,254,254,254,246,149,215,
+ 126,3,0,0,0,0,19,184,254,254,254,254,253,181,181,185,20,0,0,6,144,203,32,
+ 0,0,0,0,0,2,106,221,57,0,0,0,0,0,0,0,0,0,0,2,34,41,5,0,0,0,0,0,0,0,0,0,
+ 69,252,67,0,0,0,133,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,
+ 71,253,254,255,255,255,254,255,255,255,255,255,255,254,254,254,254,254,
+ 254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,4,118,137,137,137,137,137,
+ 137,137,137,137,135,28,0,0,0,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,
+ 255,254,219,43,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,
+ 0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,204,31,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,
+ 0,0,50,224,254,254,254,254,254,254,254,254,254,254,254,254,255,255,254,
+ 111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,31,245,112,0,44,136,137,137,137,137,137,137,137,137,137,137,137,137,137,
+ 120,6,20,241,127,0,0,0,0,0,0,0,0,0,0,0,0,0,126,248,115,2,0,0,0,0,0,0,0,
+ 0,5,43,9,0,0,0,0,0,0,0,0,0,80,240,169,2,0,0,0,0,0,0,0,0,87,251,50,0,0,0,
+ 0,0,9,223,254,179,2,2,172,254,222,17,0,135,254,222,9,0,153,255,255,254,
+ 106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,1,109,247,254,225,41,0,
+ 0,0,0,0,0,0,0,0,0,51,226,254,247,138,115,116,116,116,90,3,0,0,0,0,0,0,0,
+ 0,11,105,116,116,116,116,167,252,254,202,18,0,0,0,0,1,78,116,116,116,116,
+ 134,241,254,237,64,0,0,0,0,0,43,116,116,116,116,118,214,254,251,129,0,20,
+ 191,254,253,172,111,116,116,116,116,174,253,254,193,14,0,0,0,0,0,0,0,0,
+ 0,0,93,244,254,233,54,0,69,236,254,242,127,116,116,116,116,120,219,254,
+ 250,117,0,0,0,0,0,19,110,116,116,116,116,181,254,254,184,10,4,143,252,254,
+ 205,20,0,0,0,0,104,246,254,228,45,0,0,0,0,0,0,0,0,3,136,242,246,185,20,
+ 0,0,0,0,0,0,0,0,69,252,168,137,137,137,198,239,16,0,0,0,0,0,0,12,230,146,
+ 0,0,0,55,252,81,0,0,0,66,236,237,237,237,237,237,237,247,254,255,254,254,
+ 254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,8,206,
+ 237,237,237,237,237,237,237,237,237,235,49,0,0,0,0,0,0,0,0,0,0,0,0,18,240,
+ 255,255,255,255,255,254,219,43,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,
+ 255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,
+ 0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,
+ 251,254,254,254,254,254,254,254,205,31,0,0,0,1,182,254,254,182,1,0,0,27,
+ 243,254,254,96,0,0,0,0,50,224,254,254,254,254,254,254,245,249,254,254,254,
+ 255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,29,228,104,2,170,254,254,254,254,253,252,251,249,251,252,
+ 254,254,254,254,250,76,19,224,118,0,0,0,0,0,0,0,0,0,0,0,0,0,22,76,2,0,0,
+ 0,0,0,0,0,0,0,78,233,114,2,0,0,0,0,0,0,0,0,0,57,43,0,0,0,0,0,0,0,0,0,87,
+ 251,50,0,0,0,0,0,9,223,253,89,0,36,240,254,252,80,0,48,247,222,9,0,153,
+ 254,255,254,106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,5,212,254,255,
+ 254,88,0,0,0,0,0,0,0,0,0,0,138,254,255,254,167,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,23,241,254,255,250,46,0,0,0,0,0,0,0,0,0,1,183,254,255,254,
+ 122,0,0,0,0,0,0,0,0,0,0,104,254,255,255,200,1,73,253,254,255,224,10,0,0,
+ 0,32,245,254,255,247,36,0,0,0,0,0,0,0,0,0,1,196,254,255,254,108,0,165,254,
+ 255,254,140,0,0,0,0,117,254,255,254,187,1,0,0,0,0,0,0,0,0,0,42,249,254,
+ 255,243,26,19,239,254,255,252,49,0,0,0,3,207,254,255,254,94,0,0,0,0,0,0,
+ 0,0,53,248,255,254,254,112,0,0,0,0,0,0,0,0,69,253,241,237,237,237,246,239,
+ 16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,4,14,14,14,14,14,14,14,
+ 72,235,254,254,254,254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,12,14,14,14,14,14,14,14,14,14,14,2,0,0,0,0,0,0,0,0,0,0,
+ 0,0,18,240,255,255,255,255,254,218,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242,
+ 255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,
+ 0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,
+ 240,119,248,254,254,254,254,254,204,30,0,0,0,0,1,182,254,254,182,1,0,0,
+ 27,243,254,254,96,0,0,0,0,0,50,223,254,254,254,254,254,198,112,247,254,
+ 254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,1,14,6,54,246,255,253,219,141,82,49,48,42,49,55,102,172,
+ 241,254,254,194,7,14,7,0,0,0,0,0,0,0,0,0,0,0,0,0,59,43,0,0,0,0,0,0,0,0,
+ 0,79,240,254,249,114,2,0,0,0,0,0,0,0,0,23,78,1,0,0,0,0,0,0,0,0,87,253,177,
+ 158,158,158,158,158,161,242,251,170,158,189,254,254,254,206,158,162,242,
+ 242,161,158,216,254,255,254,198,158,161,241,255,255,185,1,0,0,0,0,0,0,0,
+ 0,0,0,0,5,213,255,255,254,88,0,0,0,0,0,0,0,0,0,0,139,254,255,255,167,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,250,46,0,0,0,0,0,0,0,
+ 0,0,1,184,255,255,254,122,0,0,0,0,0,0,0,0,0,0,105,254,255,255,201,1,74,
+ 253,255,255,224,10,0,0,0,33,246,255,255,247,36,0,0,0,0,0,0,0,0,0,1,197,
+ 255,255,254,108,0,166,255,255,254,140,0,0,0,0,118,254,255,255,187,1,0,0,
+ 0,0,0,0,0,0,0,43,249,255,255,243,26,20,240,255,255,252,49,0,0,0,3,209,255,
+ 255,254,95,0,0,0,0,0,0,0,0,72,253,255,254,254,136,0,0,0,0,0,0,0,0,69,252,
+ 78,14,14,14,140,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,0,0,
+ 0,0,0,0,0,0,0,70,235,254,255,254,254,254,254,254,254,254,254,254,254,80,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,18,240,255,255,255,254,218,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,
+ 255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,
+ 0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,240,
+ 81,38,247,254,254,254,254,205,30,0,0,0,0,0,1,182,254,254,182,1,0,0,27,243,
+ 254,254,96,0,0,0,0,0,0,50,223,254,254,254,254,196,4,111,247,254,255,255,
+ 254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,2,171,254,254,177,18,0,0,0,0,0,0,0,0,1,59,238,255,251,76,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,64,232,199,14,0,0,0,0,0,0,0,78,239,254,255,255,
+ 248,113,2,0,0,0,0,0,0,4,163,244,96,1,0,0,0,0,0,0,0,75,221,221,221,221,221,
+ 221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+ 221,221,221,221,221,221,221,221,221,221,161,1,0,0,0,0,0,0,0,0,0,0,0,5,213,
+ 255,255,254,88,0,0,0,0,0,0,0,0,0,0,139,254,255,255,167,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,250,46,0,0,0,0,0,0,0,0,0,1,184,255,
+ 255,254,122,0,0,0,0,0,0,0,0,0,0,105,254,255,255,201,1,74,253,255,255,224,
+ 10,0,0,0,33,246,255,255,247,36,0,0,0,0,0,0,0,0,0,1,197,255,255,254,108,
+ 0,166,255,255,254,140,0,0,0,0,118,254,255,255,187,1,0,0,0,0,0,0,0,0,0,43,
+ 249,255,255,243,26,20,240,255,255,252,49,0,0,0,3,209,255,255,254,95,0,0,
+ 0,0,0,0,0,0,27,224,254,254,248,71,0,0,0,0,0,0,0,0,69,252,68,0,0,0,134,239,
+ 16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,0,0,0,0,0,0,0,0,0,0,70,
+ 235,254,254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,
+ 0,0,5,155,179,179,179,179,179,179,179,179,179,177,36,0,0,0,0,0,0,0,0,0,
+ 0,0,0,18,240,255,255,254,219,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242,
+ 255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,
+ 0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,241,81,
+ 0,38,247,254,254,254,204,31,0,0,0,0,0,0,1,182,254,254,182,1,0,0,27,243,
+ 254,254,96,0,0,0,0,0,0,0,50,224,254,254,254,196,1,2,111,248,254,255,254,
+ 111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,54,246,254,254,129,1,0,0,0,0,0,0,0,0,0,15,223,255,254,193,6,0,0,0,
+ 0,0,0,0,0,0,0,0,0,64,232,254,253,165,11,0,0,0,0,0,78,239,254,255,255,255,
+ 254,248,113,2,0,0,0,0,4,129,251,254,244,96,1,0,0,0,0,0,0,2,8,8,8,8,8,8,
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,6,0,0,0,0,0,0,0,0,
+ 0,0,0,0,5,213,255,255,254,88,0,0,0,0,0,0,0,0,0,0,139,254,255,255,167,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,241,255,255,250,46,0,0,0,0,0,0,0,
+ 0,0,1,183,254,255,254,122,0,0,0,0,0,0,0,0,0,0,104,254,255,255,201,1,73,
+ 253,255,255,224,10,0,0,0,33,245,255,255,247,36,0,0,0,0,0,0,0,0,0,1,197,
+ 255,255,254,108,0,166,254,255,254,140,0,0,0,0,118,254,255,255,187,1,0,0,
+ 0,0,0,0,0,0,0,43,249,255,255,243,26,20,240,255,255,252,49,0,0,0,3,208,255,
+ 255,254,95,0,0,0,0,0,0,0,0,0,51,162,167,84,2,0,0,0,0,0,0,0,0,69,253,199,
+ 179,179,179,218,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,70,236,254,254,254,254,254,254,254,254,254,254,80,0,0,
+ 0,0,0,0,0,0,0,0,0,0,6,179,206,206,206,206,206,206,206,206,206,204,42,0,
+ 0,0,0,0,0,0,0,0,0,0,0,18,240,255,254,220,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,18,196,206,206,206,206,206,204,48,0,0,0,0,0,0,0,148,206,206,206,206,
+ 206,206,112,0,0,0,0,0,0,0,84,206,206,206,206,206,206,206,206,206,206,206,
+ 206,206,206,206,206,206,206,206,206,206,203,38,0,0,0,0,0,0,1,197,254,254,
+ 241,82,0,0,38,247,254,254,205,31,0,0,0,0,0,0,0,1,182,254,254,182,1,0,0,
+ 27,243,254,254,96,0,0,0,0,0,0,0,0,50,224,254,254,196,1,0,2,111,248,254,
+ 254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,2,170,254,255,255,242,137,48,10,1,1,1,1,3,19,76,187,253,255,255,
+ 250,75,0,0,0,0,0,0,0,0,0,0,0,39,231,254,254,254,253,164,11,0,0,0,78,238,
+ 254,255,255,255,255,255,254,248,113,2,0,0,4,129,250,255,255,254,244,72,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,127,251,254,234,49,0,0,0,0,0,0,0,0,
+ 0,0,63,236,254,250,143,136,142,142,141,91,1,0,0,0,0,0,0,0,0,6,113,142,142,
+ 142,131,178,253,254,215,23,0,0,0,0,0,0,0,0,0,0,98,246,254,243,75,0,0,0,
+ 0,0,34,138,142,142,141,126,224,254,253,145,0,26,206,254,254,182,123,142,
+ 142,142,130,185,254,254,207,17,0,0,0,0,0,0,0,0,0,0,109,249,254,240,64,0,
+ 84,242,254,247,130,139,142,142,141,128,229,254,252,132,0,0,0,0,0,0,0,0,
+ 0,0,13,185,254,254,198,12,5,161,253,254,220,114,141,142,142,137,152,250,
+ 254,237,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,253,255,255,255,
+ 255,255,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,70,236,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,2,3,3,3,3,3,3,3,3,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,18,240,254,
+ 219,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,3,3,3,3,2,0,0,0,0,0,0,
+ 0,0,2,3,3,3,3,3,2,1,0,0,0,0,0,0,0,1,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
+ 3,3,3,2,0,0,0,0,0,0,0,1,197,254,240,82,0,0,0,38,247,254,205,30,0,0,0,0,
+ 0,0,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,0,0,0,0,0,0,0,0,50,
+ 224,254,196,1,0,0,1,111,248,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,
+ 196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,245,255,255,255,254,254,247,225,
+ 200,199,199,199,204,237,252,254,255,255,255,254,192,6,0,0,0,0,0,0,0,0,0,
+ 0,7,151,252,254,255,254,253,188,37,0,75,239,254,255,255,255,255,255,255,
+ 255,254,248,113,2,22,160,251,254,255,255,254,185,17,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,4,130,231,66,0,0,0,0,0,0,0,0,0,0,0,0,68,232,158,207,254,
+ 254,254,254,248,108,1,0,0,0,0,0,0,6,147,252,254,254,254,254,183,179,215,
+ 40,0,0,0,0,0,0,0,0,0,0,0,1,102,236,92,1,0,0,0,0,35,211,254,254,254,254,
+ 245,146,222,155,8,0,0,31,206,188,174,253,254,254,254,253,176,186,208,33,
+ 0,0,0,0,0,0,0,0,0,0,0,2,113,234,81,0,0,0,88,235,148,220,254,254,254,254,
+ 242,144,227,144,6,0,0,0,0,0,0,0,0,0,0,0,18,186,200,28,0,0,10,162,219,148,
+ 247,254,254,254,254,209,156,232,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,69,253,255,255,255,255,255,239,16,0,0,0,0,0,0,12,230,146,0,0,
+ 0,55,252,81,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,235,254,254,254,254,254,
+ 254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,6,6,6,6,6,6,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,18,240,218,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,197,240,82,0,0,0,0,38,
+ 247,205,30,0,0,0,0,0,0,0,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,
+ 0,0,0,0,0,0,0,0,0,0,50,224,196,1,0,0,0,2,111,247,111,0,0,0,0,0,0,0,132,
+ 254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,117,193,193,193,193,
+ 193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,189,44,
+ 0,0,0,0,0,0,0,0,0,0,0,7,151,252,254,255,255,254,223,38,128,235,254,254,
+ 255,255,255,255,255,254,254,241,169,19,178,254,254,255,255,254,190,18,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 43,190,254,255,255,255,255,254,246,72,0,0,0,0,0,0,114,252,255,255,255,255,
+ 254,253,155,30,0,0,0,0,0,0,0,0,0,0,0,0,0,1,37,0,0,0,0,0,10,196,254,255,
+ 255,255,255,254,243,93,8,0,0,0,0,25,142,253,255,255,255,255,254,253,145,
+ 26,0,0,0,0,0,0,0,0,0,0,0,0,0,2,37,0,0,0,0,0,51,209,254,255,255,255,255,
+ 254,240,85,6,0,0,0,0,0,0,0,0,0,0,0,0,0,17,23,0,0,0,0,10,99,245,255,255,
+ 255,255,254,254,193,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 69,253,255,255,255,255,255,239,16,0,0,0,0,0,0,12,230,147,0,0,0,55,252,81,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,235,254,254,254,254,254,254,254,80,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,205,216,216,216,215,147,7,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,18,204,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,183,82,0,0,0,0,0,38,198,31,
+ 0,0,0,0,0,0,0,0,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,0,0,0,0,
+ 0,0,0,0,0,0,50,167,1,0,0,0,0,2,112,104,0,0,0,0,0,0,0,132,254,255,225,10,
+ 1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,209,217,217,217,217,217,217,217,
+ 217,217,217,217,217,217,217,217,217,217,217,217,217,217,108,0,0,0,0,0,0,
+ 0,0,0,0,0,0,8,151,252,254,254,245,99,1,1,28,104,164,209,218,218,218,214,
+ 173,106,40,2,0,38,212,254,254,254,213,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,234,254,255,255,255,253,
+ 166,11,0,0,0,0,0,0,26,198,254,255,255,255,254,215,41,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,79,239,254,255,255,255,253,155,9,0,0,0,0,0,0,
+ 32,206,254,255,255,255,254,208,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,89,243,254,255,255,255,252,144,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,10,162,253,255,255,255,254,236,73,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,69,253,255,255,255,255,255,239,16,0,0,0,0,0,0,12,
+ 230,222,45,0,3,131,253,81,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,236,254,
+ 254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,86,165,166,166,147,
+ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,
+ 0,0,15,27,0,0,0,0,0,0,0,0,0,0,0,0,119,166,166,118,0,0,0,17,158,166,165,
+ 62,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,2,17,0,0,0,0,0,0,0,132,254,255,
+ 225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,159,166,166,166,166,166,
+ 166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,82,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,8,151,252,245,99,1,0,0,0,0,0,6,7,7,7,7,1,0,0,0,0,
+ 0,38,213,254,213,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,67,164,166,166,166,137,11,0,0,0,0,0,0,0,0,26,
+ 153,166,166,166,160,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 75,165,166,166,166,130,9,0,0,0,0,0,0,0,0,32,156,166,166,166,157,34,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,165,166,166,166,123,7,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,135,166,166,166,165,70,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,250,255,255,255,255,
+ 255,237,15,0,0,0,0,0,0,10,221,254,219,49,124,250,253,79,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,70,237,254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,254,255,225,
+ 10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,147,99,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,38,179,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,131,251,
+ 254,254,254,249,116,1,0,0,0,0,0,0,0,69,237,254,236,250,254,178,15,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,236,254,254,254,254,80,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,254,
+ 255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,105,144,
+ 145,144,96,2,0,0,0,0,0,0,0,0,0,64,144,145,145,129,14,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,71,235,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,254,255,225,10,
+ 1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,
+ 236,254,253,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,132,254,255,225,10,12,209,141,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,237,254,80,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,254,255,
+ 224,21,163,155,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,71,236,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,132,254,255,233,173,155,8,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,63,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,254,255,
+ 252,155,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,132,254,253,155,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,253,156,9,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 132,160,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
diff --git a/noatun-plugins/synaescope/syna.h b/noatun-plugins/synaescope/syna.h
new file mode 100644
index 0000000..0b58ae8
--- /dev/null
+++ b/noatun-plugins/synaescope/syna.h
@@ -0,0 +1,253 @@
+/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia)
+ Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au>
+ 2001 Charles Samuels <charles@kde.org>
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SYNA_H
+#define SYNA_H
+
+#include "config.h"
+#include <qptrlist.h>
+#include "polygon.h"
+#include <noatun/plugin.h>
+
+//**************************************
+// For the incurably fiddle prone:
+
+// log2 of sample size
+#define LogSize 9
+
+// overlap amount between samples. Set to 1 or 2 if you have a fast computer
+#define Overlap 1
+
+// Brightness
+#define Brightness 150
+
+// Sample frequency
+#define Frequency 22050
+
+//***************************************
+
+#define DefaultWidth 260
+#define DefaultHeight 260
+
+#define NumSamples (1<<LogSize)
+#define RecSize (1<<LogSize-Overlap)
+
+#ifndef __linux__
+#warning This target has not been tested!
+#endif
+
+#ifdef __FreeBSD__
+#include <machine/endian.h>
+typedef unsigned short sampleType;
+#else
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_ENDIAN_H
+#include <endian.h>
+#elif defined(_BIG_ENDIAN)
+#define BIG_ENDIAN 1
+#define BYTE_ORDER BIG_ENDIAN
+#endif
+typedef short sampleType;
+#endif
+
+#if BYTE_ORDER == BIG_ENDIAN
+#define BIGENDIAN
+#else
+#define LITTLEENDIAN
+#endif
+
+void error(const char *str, bool syscall=false);
+void warning(const char *str, bool syscall=false);
+
+enum SymbolID
+{
+ Speaker, Bulb,
+ Play, Pause, Stop, SkipFwd, SkipBack,
+ Handle, Pointer, Open, NoCD, Exit,
+ Zero, One, Two, Three, Four,
+ Five, Six, Seven, Eight, Nine,
+ Slider, Selector, Plug, Loop, Box, Bar,
+ Flame, Wave, Stars, Star, Diamond, Size, FgColor, BgColor,
+ Save, Reset, TrackSelect, FullScreen,
+ NotASymbol
+};
+
+// wrap
+struct BaseScreen
+{
+ virtual bool init(int xHint, int yHint, int widthHint, int heightHint, bool fullscreen) = 0;
+ virtual void setPalette(unsigned char *palette) = 0;
+ virtual void end() = 0;
+ virtual void fullscreen()=0;
+ virtual int sizeUpdate() = 0;
+ virtual bool inputUpdate(int &mouseX,int &mouseY,int &mouseButtons,char &keyHit) = 0;
+ virtual void show() = 0;
+ virtual void updateWindowCaption(const char *string)=0;
+};
+
+struct SdlScreen : public BaseScreen
+{
+ bool init(int xHint, int yHint, int widthHint, int heightHint, bool fullscreen);
+ void setPalette(unsigned char *palette);
+ void end();
+ void fullscreen();
+ int sizeUpdate();
+ bool inputUpdate(int &mouseX,int &mouseY,int &mouseButtons,char &keyHit);
+ void show();
+// int winID();
+ void updateWindowCaption(const char *string);
+};
+
+// core
+class Combiner
+{
+public:
+ static unsigned short combine(unsigned short a,unsigned short b)
+ {
+ //Not that i want to give the compiler a hint or anything...
+ unsigned char ah = a>>8, al = a&255, bh = b>>8, bl = b&255;
+ if (ah < 64) ah *= 4; else ah = 255;
+ if (al < 64) al *= 4; else al = 255;
+ if (bh > ah) ah = bh;
+ if (bl > al) al = bl;
+ return ah*256+al;
+ }
+};
+
+class Interface;
+
+class Core : public StereoScope
+{
+public:
+ Core();
+ ~Core();
+
+ inline unsigned char *output() { return (unsigned char*)outputBmp.data; }
+ inline unsigned char *lastOutput() { return (unsigned char*)lastOutputBmp.data; }
+ inline unsigned char *lastLastOutput() { return (unsigned char*)lastLastOutputBmp.data; }
+
+ void allocOutput(int w,int h);
+ void interfaceInit();
+ //void coreInit();
+ void setStarSize(double size);
+ void setupPalette(double);
+
+ bool init ( void );
+
+ bool go();
+ bool calculate();
+
+ void toDefaults();
+ void fade();
+ void fadeFade();
+ void fadePixelWave(int x, int y, int where, int step);
+ void fadeWave();
+ void fadePixelHeat(int x,int y,int where,int step);
+ void fadeHeat();
+
+ void fft(double*, double*);
+
+ void addPixel(int x, int y, int br1, int br2);
+ void addPixelFast(unsigned char *p, int br1, int br2);
+ unsigned char getPixel(int x, int y, int where);
+
+ static int bitReverser(int);
+
+protected:
+ void scopeEvent(float *, float *, int) {}
+
+public:
+ BaseScreen *screen;
+ Interface *interface;
+ sampleType *data;
+ Bitmap<unsigned short> outputBmp, lastOutputBmp, lastLastOutputBmp;
+ PolygonEngine<unsigned short,Combiner,2> polygonEngine;
+
+ double cosTable[NumSamples], negSinTable[NumSamples];
+ int bitReverse[NumSamples];
+ int scaleDown[256];
+ int maxStarRadius;
+
+
+public:
+ int outWidth, outHeight;
+ SymbolID fadeMode;
+ bool pointsAreDiamonds;
+
+ double brightnessTwiddler;
+ double starSize;
+
+ double fgRedSlider, fgGreenSlider, bgRedSlider, bgGreenSlider;
+ SymbolID state;
+
+ int windX, windY, windWidth, windHeight;
+};
+
+extern Core *core;
+
+inline unsigned char Core::getPixel(int x,int y,int where)
+{
+ if (x < 0 || y < 0 || x >= outWidth || y >= outHeight) return 0;
+ return lastOutput()[where];
+}
+
+struct Button;
+
+struct UIObject
+{
+ int visibleMask, activeMask;
+ double x,y,width,height;
+ bool active;
+
+ virtual int go(bool mouseDown,bool mouseClick,bool mouseOver,
+ double x, double y, double scale, char &hotKey, int &action)
+ = 0;
+
+ virtual void handleKey(char key, int &action) = 0;
+ void changed();
+};
+
+class Interface
+{
+public:
+ Interface();
+ ~Interface();
+ bool go();
+ void syncToState();
+ void setupPalette();
+
+ void putString(char *string,int x,int y,int red,int blue);
+
+protected:
+ void addUI(UIObject *obj);
+ void changeState(int transitionSymbol);
+
+private:
+ QPtrList<UIObject> uiObjects;
+ Button *stateButton, *starsButton, *waveButton, *flameButton, *starButton, *diamondButton;
+ int mouseButtons;
+
+ int visibleMask;
+ int mouseX, mouseY, lastX, lastY, countDown;
+
+};
+
+#endif
diff --git a/noatun-plugins/synaescope/synaescope.cpp b/noatun-plugins/synaescope/synaescope.cpp
new file mode 100644
index 0000000..7e4df1c
--- /dev/null
+++ b/noatun-plugins/synaescope/synaescope.cpp
@@ -0,0 +1,110 @@
+/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia)
+ Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au>
+ 2001 Charles Samuels <charles@kde.org>
+
+ this file is X11 source
+ */
+
+#include "synaescope.h"
+#include "cmodule.h"
+
+#include <kdebug.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+
+extern "C"
+{
+ Plugin *create_plugin()
+ {
+ KGlobal::locale()->insertCatalogue("synaescope");
+ return new SynaeScope();
+ }
+}
+
+SynaeScope::SynaeScope() : Plugin(), scopeExePath(0)
+{
+ kdDebug(66666) << k_funcinfo << endl;
+ restarting=false;
+ connect(&process, SIGNAL(processExited(KProcess *)),
+ this, SLOT(processExited(KProcess *)));
+ connect(&process, SIGNAL(receivedStdout(KProcess *,char *,int)),
+ this, SLOT(receivedStdout(KProcess *,char *,int)));
+ connect(&process, SIGNAL(receivedStderr(KProcess *,char *,int)),
+ this, SLOT(receivedStderr(KProcess *,char *,int)));
+}
+
+SynaeScope::~SynaeScope()
+{
+ kdDebug(66666) << k_funcinfo << endl;
+ process.kill();
+}
+
+void SynaeScope::init()
+{
+ kdDebug(66666) << k_funcinfo << endl;
+ mPrefs = new SynaePrefs(this);
+ mPrefs->reopen();
+ mPrefs->save();
+ connect(mPrefs, SIGNAL(configChanged()), this, SLOT(readConfig()));
+
+ scopeExePath = KStandardDirs::findExe("noatunsynaescope.bin");
+ if (scopeExePath.isEmpty())
+ {
+ KMessageBox::error(0, i18n("Unable to locate noatunsynaescope.bin in your path. Check your installation."));
+ unload();
+ }
+
+ process << scopeExePath;
+
+ runScope();
+}
+
+void SynaeScope::runScope()
+{
+ kdDebug(66666) << k_funcinfo << endl;
+ if(!process.start(KProcess::NotifyOnExit, (KProcess::Communication)(KProcess::Stdin | KProcess::Stdout)))
+ {
+ KMessageBox::error(0, i18n("Unable to start noatunsynaescope. Check your installation."));
+ unload();
+ }
+}
+
+
+void SynaeScope::readConfig()
+{
+ kdDebug(66666) << k_funcinfo << endl;
+ if (!process.isRunning())
+ return;
+
+ restarting=true;
+ process.kill();
+}
+
+void SynaeScope::processExited(KProcess *)
+{
+ kdDebug(66666) << k_funcinfo << endl;
+ if(restarting)
+ {
+ restarting=false;
+ runScope();
+ }
+ else
+ {
+ unload();
+ }
+}
+
+void SynaeScope::receivedStdout(KProcess *, char *buf, int len)
+{
+ QCString debugString(buf,len);
+ kdDebug(66666) << k_funcinfo << debugString << endl;
+}
+
+void SynaeScope::receivedStderr(KProcess *, char *buf, int len)
+{
+ QCString debugString(buf,len);
+ kdDebug(66666) << k_funcinfo << debugString << endl;
+}
+
+#include "synaescope.moc"
diff --git a/noatun-plugins/synaescope/synaescope.h b/noatun-plugins/synaescope/synaescope.h
new file mode 100644
index 0000000..718c2b9
--- /dev/null
+++ b/noatun-plugins/synaescope/synaescope.h
@@ -0,0 +1,41 @@
+/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia)
+ Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au>
+ 2001 Charles Samuels <charles@kde.org>
+
+ this file is X11 source
+ */
+
+#ifndef SYNABLEH_H
+#define SYNABLEH_H
+
+#include "syna.h"
+#include <kprocess.h>
+
+class SynaePrefs;
+class KProcess;
+
+class SynaeScope : public QObject, public Plugin
+{
+Q_OBJECT
+
+public:
+ SynaeScope();
+ virtual ~SynaeScope();
+
+ void init();
+ void runScope();
+
+private slots:
+ void processExited(KProcess *);
+ void readConfig();
+ void receivedStdout(KProcess *, char *buf, int len);
+ void receivedStderr(KProcess *, char *buf, int len);
+
+private:
+ KProcess process;
+ QString scopeExePath;
+ bool restarting;
+ SynaePrefs *mPrefs;
+};
+
+#endif
diff --git a/noatun-plugins/synaescope/synaescope.plugin b/noatun-plugins/synaescope/synaescope.plugin
new file mode 100644
index 0000000..b400dd4
--- /dev/null
+++ b/noatun-plugins/synaescope/synaescope.plugin
@@ -0,0 +1,80 @@
+Filename=noatunsynaescope.la
+Author=Charles Samuels, et al
+Site=http://noatun.kde.org/
+Email=charles@kde.org
+Type=visualization
+License=GPL
+Name=Synaescope
+Name[da]=Synaeskop
+Name[de]=Synaeskop
+Name[eo]=Sinaeskopo
+Name[fy]=Synaeskoop
+Name[hi]=सिनेस्कोप
+Name[hr]=Sinaeskop
+Name[ne]=साइनेस्कोप
+Name[nl]=Synaescoop
+Name[ru]=Зрительный образ Synaescope
+Name[sv]=Synaeskop
+Name[ta]=ஸ்னஸ்வரையெல்லை
+Name[tg]=Намуди тамошобини Synaescope
+Name[tr]=Sineskop
+Comment=Noatun visualization
+Comment[af]=Noatun visualiseering
+Comment[ar]=مرئيات Noatun
+Comment[az]=Noatun əyani efekti
+Comment[bg]=Приставка за визуализация за Noatun
+Comment[bs]=Noatun vizualizacija
+Comment[ca]=Visualització en el Noatun
+Comment[cs]=Vizualizace pro Noatun
+Comment[cy]=Dychmygydd Noatun
+Comment[da]=Noatun-visualisering
+Comment[de]=Visualisierung für Noatun
+Comment[el]=Οπτικοποίηση του Noatun
+Comment[en_GB]=Noatun visualisation
+Comment[eo]=Noatuna vidado
+Comment[es]=Visualización con Noatun
+Comment[et]=Noatuni ostsilloskoop
+Comment[eu]=Noatun bisualizazioa
+Comment[fa]=تجسم Noatun
+Comment[fi]=Noatun visualisaatio
+Comment[fr]=Affichage de Noatun
+Comment[fy]=Noatun-fisualisaasje
+Comment[ga]=Amharcléiriú Noatun
+Comment[gl]=Visualización de Noatun
+Comment[he]=המחשה של Noatun
+Comment[hi]=नोआट्यून विज़ुअलाइज़ेशन
+Comment[hr]=Vizualizacija za Noatun
+Comment[hu]=Noatun vizuális modul
+Comment[is]=Sjónræn brella fyrir Noatun
+Comment[it]=Visualizzazione di Noatun
+Comment[ja]=Noatun の視覚効果
+Comment[ka]=Noatun ვიზუალიზაცია
+Comment[kk]=Noatun визуализациясы
+Comment[km]= រូបភាព​មើល​ឃើញ​របស់ Noatun
+Comment[lt]=Noatun vizualizacija
+Comment[mk]=Визуелизација за Noatun
+Comment[ms]=Visualisasi Noatun
+Comment[nb]=Noatun visualisering
+Comment[nds]=Noatun-Filmmaker
+Comment[ne]=नउटन दृष्टीकरण
+Comment[nl]=Noatun-visualisatie
+Comment[nn]=Noatun visualisering
+Comment[pa]=ਨੌਟਮ ਝਲਕੀਆਂ
+Comment[pl]=Wizualizacja dla Noatun
+Comment[pt]=Visualização do Noatun
+Comment[pt_BR]=A visualização do Noatun
+Comment[ro]=Vizualizare Noatun
+Comment[ru]=Визуализация Noatun
+Comment[sk]=Vizualizácia pre Noatun
+Comment[sl]=Vizualizacija za Noatun
+Comment[sr]=Noatun-ова визуелизација
+Comment[sr@Latn]=Noatun-ova vizuelizacija
+Comment[sv]=Noatun-visualisering
+Comment[ta]=நோடன் காட்சியமைப்பு
+Comment[tg]=Визулизатсиякунонии Noatun
+Comment[tr]=Noatun görselleştirme
+Comment[uk]=Візуалізація Noatun
+Comment[vi]=Ô xem Noatun
+Comment[xh]=Umboniso wengqondo weNoatun
+Comment[zh_CN]=Noatun 视觉化显示
+Comment[zh_TW]=Noatun 視覺化
diff --git a/noatun-plugins/synaescope/ui.cpp b/noatun-plugins/synaescope/ui.cpp
new file mode 100644
index 0000000..d02bfb7
--- /dev/null
+++ b/noatun-plugins/synaescope/ui.cpp
@@ -0,0 +1,609 @@
+#include "font.h"
+#include "icons.h"
+#include "syna.h"
+#include <math.h>
+#include <stdlib.h>
+#include <kconfig.h>
+#include <dcopclient.h>
+#include <unistd.h>
+
+#define output core->output()
+
+static void putChar(unsigned char character,int x,int y,int red,int blue)
+{
+ unsigned short *ptr = ((unsigned short *)output) + x + y*core->outWidth;
+ unsigned short put = (blue<<8)+red;
+ int i,j;
+ for(i=0;i<8;i++,ptr += core->outWidth-8)
+ for(j=0;j<8;j++,ptr++)
+ if (font[character*8+i] & (128>>j))
+ *ptr = put;
+}
+
+void Interface::putString(char *string,int x,int y,int red,int blue)
+{
+ if (x < 0 || y < 0 || y >= core->outHeight-8)
+ return;
+ for(;*string && x <= core->outWidth-8;string++,x+=8)
+ putChar((unsigned char)(*string),x,y,red,blue);
+}
+
+void UIObject::changed()
+{
+}
+
+struct Button : public UIObject
+{
+ int icon;
+ char hotKey;
+
+ bool passive, bright;
+
+ Button(int _am,int _vm,double _x,double _y,
+ double _size,int _icon,char _key = 0,
+ bool _passive = false, bool _bright = false)
+ {
+ activeMask = _am; visibleMask = _vm;
+ x = _x; y = _y; width = height = _size;
+ icon = _icon; hotKey = _key; passive = _passive; bright = _bright;
+ }
+
+ virtual int go(bool mouseDown,bool mouseClick,bool mouseOver,
+ double _x, double _y, double scale, char &_hotKey, int &action)
+ {
+ (void)mouseDown;
+ (void)_x;
+ (void)_y;
+ core->polygonEngine.icon(
+ Icons[icon],
+ (bright ? 0x0202 : 0x0100),
+ x*scale,y*scale,width*scale,height*scale);
+
+ if (mouseOver && !passive)
+ core->polygonEngine.icon(
+ Icons[icon],
+ 0x0002,
+ (x-IconWidths[icon]*width/2)*scale,
+ (y-height/2)*scale,width*scale*2,height*scale*2);
+
+ if (mouseOver && mouseClick && !passive)
+ action = icon;
+
+ if (mouseOver && !passive && hotKey)
+ _hotKey = hotKey;
+
+ return 0;
+ }
+
+ void handleKey(char key, int &action)
+ {
+ if (key == hotKey && !passive)
+ action = icon;
+ }
+};
+
+struct FullScreenButton : public Button
+{
+ FullScreenButton(int _bleh, int _vm,double _x,double _y,
+ double _size,int _icon,char _key = 0,
+ bool _passive = false, bool _bright = false)
+ : Button(_bleh, _vm, _x, _y, _size, _icon, _key, _passive, _bright)
+ {
+ }
+
+ int go(bool mouseDown,bool mouseClick,bool mouseOver,
+ double _x, double _y, double scale, char &a, int &b)
+ {
+ int bleh;
+ char bleh2;
+ Button::go(mouseDown, mouseClick, mouseOver, _x, _y, scale, bleh2, bleh);
+ a=0;
+ b=0;
+ if (mouseOver && mouseClick && !passive)
+ {
+ core->screen->fullscreen();
+ }
+
+ return 0;
+ }
+};
+
+struct NoatunActionButton : public Button
+{
+ NoatunActionButton(int _bleh, int _vm,double _x,double _y,
+ double _size,int _icon,char _key = 0,
+ bool _passive = false, bool _bright = false)
+ : Button(_bleh, _vm, _x, _y, _size, _icon, _key, _passive, _bright)
+ {
+ }
+
+ int go(bool mouseDown,bool mouseClick,bool mouseOver,
+ double _x, double _y, double scale, char &a, int &b)
+ {
+ Button::go(mouseDown, mouseClick, mouseOver, _x, _y, scale, a, b);
+
+ if (mouseOver && mouseClick && !passive)
+ {
+ QCString action;
+ switch (icon)
+ {
+ case Play:
+ action="playpause";
+ break;
+ case Stop:
+ action="stop";
+ break;
+ case SkipFwd:
+ action="fastForward";
+ break;
+ case SkipBack:
+ action="back";
+ break;
+ default:
+ action="";
+ }
+
+ if (action)
+ {
+ action+="()";
+ DCOPClient c;
+ c.attach();
+ QCString appName("noatun");
+ if (c.isApplicationRegistered(appName))
+ {
+ c.send(appName, "Noatun", action, QByteArray());
+ }
+ else
+ {
+ appName.setNum(getppid());
+ appName.prepend("noatun");
+ if (c.isApplicationRegistered(appName))
+ c.send(appName, "Noatun", action, QByteArray());
+ }
+ }
+ }
+ return 0;
+ }
+};
+
+#define BarWidth 0.1
+struct SliderBar : public UIObject
+{
+ double *value;
+ char leftKey, rightKey;
+
+ typedef void (Core::*Callback)(double v);
+ Callback callback;
+
+ SliderBar(int _am,int _vm,double _x,double _y,
+ double _width,double _height, double *_value,
+ Callback _callback, char _leftKey, char _rightKey)
+ {
+ activeMask = _am; visibleMask = _vm;
+ x = _x; y = _y; width = _width; height = _height;
+ value = _value; callback = _callback;
+ leftKey = _leftKey; rightKey = _rightKey;
+ }
+
+ int go(bool mouseDown,bool mouseClick,bool mouseOver,
+ double _x, double _y, double scale, char &_hotKey, int &action)
+ {
+ (void)mouseClick;
+ (void)_y;
+ (void)action;
+ core->polygonEngine.icon(
+ Icons[Bar],
+ 0x0100,
+ x*scale,y*scale,width*scale,height*scale);
+ core->polygonEngine.icon(
+ Icons[Slider],
+ 0x0200,
+ (x+*value*width-IconWidths[Slider]*height/2)*scale,
+ y*scale,height*scale,height*scale);
+
+ if (mouseOver)
+ {
+ double newValue = (_x)/(width);
+ if (newValue < 0.0) newValue = 0.0;
+ if (newValue > 1.0) newValue = 1.0;
+
+ core->polygonEngine.icon(
+ Icons[Selector],
+ 0x0002,
+ (x+newValue*width-IconWidths[Selector]*height/2)*scale,
+ y*scale,height*scale,height*scale);
+
+ if (mouseDown)
+ {
+ *value = newValue;
+
+ if (callback)
+ (core->*callback)(*value);
+ changed();
+ }
+
+ if (mouseOver)
+ _hotKey = (newValue < *value ? leftKey : rightKey);
+ }
+
+ return 0;
+ }
+ void handleKey(char key, int &action)
+ {
+ (void)action;
+ if (key == leftKey || key == rightKey)
+ {
+ if (key == leftKey)
+ {
+ if (*value == 0.0) return;
+ *value -= 0.05;
+ if (*value < 0.0) *value = 0.0;
+ }
+ else
+ {
+ if (*value == 1.0) return;
+ *value += 0.05;
+ if (*value > 1.0) *value = 1.0;
+ }
+
+ if (callback)
+ (core->*callback)(*value);
+ changed();
+ }
+ }
+};
+#undef BarWidth
+
+
+struct PopperUpper : public UIObject
+{
+ int maskAdd;
+
+ PopperUpper(int _am,int _vm,double _x,double _y,
+ double _width,double _height, int _maskAdd)
+ {
+ activeMask = _am; visibleMask = _vm;
+ x = _x; y = _y; width = _width; height = _height;
+ maskAdd = _maskAdd;
+ }
+
+ int go(bool mouseDown,bool mouseClick, bool mouseOver,
+ double _x, double _y, double scale, char &_hotKey, int &action)
+ {
+ (void)mouseDown;
+ (void)mouseClick;
+ (void)_x;
+ (void)_y;
+ (void)_hotKey;
+ (void)action;
+
+ core->polygonEngine.icon(
+ Icons[Box],
+ 0x0200,
+ x*scale,y*scale,width*scale,height*scale);
+
+ return mouseOver ? maskAdd : 0;
+ }
+
+ void handleKey(char key, int &action)
+ {
+ (void)key;
+ (void)action;
+ }
+};
+
+void Interface::setupPalette()
+{
+#define BOUND(x) ((x) > 255 ? 255 : (x))
+#define PEAKIFY(x) int(BOUND((x) - (x)*(255-(x))/255/2))
+#define MAX(x,y) ((x) > (y) ? (x) : (y))
+ int i;
+ unsigned char palette[768];
+
+ double scale, fgRed, fgGreen, fgBlue, bgRed, bgGreen, bgBlue;
+ fgRed = core->fgRedSlider;
+ fgGreen = core->fgGreenSlider;
+ fgBlue = 1.0 - MAX(core->fgRedSlider,core->fgGreenSlider);
+ scale = MAX(MAX(fgRed,fgGreen),fgBlue);
+ fgRed /= scale;
+ fgGreen /= scale;
+ fgBlue /= scale;
+
+ bgRed = core->bgRedSlider;
+ bgGreen = core->bgGreenSlider;
+ bgBlue = 1.0 - MAX(core->bgRedSlider, core->bgGreenSlider);
+ scale = MAX(MAX(bgRed, bgGreen), bgBlue);
+ bgRed /= scale;
+ bgGreen /= scale;
+ bgBlue /= scale;
+
+ for(i=0;i<256;i++)
+ {
+ int f = i&15, b = i/16;
+ palette[i*3+0] = PEAKIFY(b*bgRed*16+f*fgRed*16);
+ palette[i*3+1] = PEAKIFY(b*bgGreen*16+f*fgGreen*16);
+ palette[i*3+2] = PEAKIFY(b*bgBlue*16+f*fgBlue*16);
+ }
+ core->screen->setPalette(palette);
+#undef BOUND
+#undef PEAKIFY
+#undef MAX
+}
+
+//Visible mask
+#define ALL 1
+#define BUTTONBAR 2
+#define TRACKBAR 4
+#define DIALBAR 8
+#define VOLUMEBAR 16
+
+//Active mask
+//#define ALL 1
+#define PLAYING 2
+#define PAUSED 4
+#define STOPPED 8
+#define NOCD 32
+#define OPEN 64
+
+
+// TODO Lay things out with parents and a stack, like QT
+Interface::Interface()
+{
+ static const float IconSize=0.2;
+ static const float SliderSize=0.125;
+
+ {
+ KConfig config("noatun/synaescope", false, false, "data");
+ core->fadeMode=(SymbolID)config.readNumEntry("mode", (int)Stars);
+ core->pointsAreDiamonds=config.readBoolEntry("diamonds", false);
+ core->brightnessTwiddler=config.readDoubleNumEntry("brightness", .4);
+ core->starSize=config.readDoubleNumEntry("starsize", .1);
+ core->fgRedSlider=config.readDoubleNumEntry("FGRed", 0.0);
+ core->fgGreenSlider=config.readDoubleNumEntry("FGgreen", 1.0);
+ core->bgRedSlider=config.readDoubleNumEntry("BGRed", 0.0);
+ core->bgGreenSlider=config.readDoubleNumEntry("BGGreen", 0.0);
+ }
+
+ uiObjects.setAutoDelete(true);
+
+ double x,y;
+ y = 0.025;
+
+ addUI(new PopperUpper(ALL, ALL, 0, 0, 0.25, 0.25, TRACKBAR));
+ addUI(new Button(ALL, ALL, 0.07, y, IconSize, Speaker, 0, true, false));
+
+ addUI(new PopperUpper(ALL,TRACKBAR,x=0.25,y=0.0,.9,.25, TRACKBAR));
+ x += 0.1;
+
+ addUI(new NoatunActionButton(ALL,TRACKBAR,x,y,IconSize, SkipBack, 0));
+ addUI(new NoatunActionButton(ALL,TRACKBAR,x+IconSize*1,y,IconSize, Stop, 0));
+ addUI(new NoatunActionButton(ALL,TRACKBAR,x+IconSize*2,y,IconSize, Play, 0));
+ addUI(new NoatunActionButton(ALL,TRACKBAR,x+IconSize*2.8,y,IconSize, SkipFwd, 0));
+
+
+// addUI(new Button(ALL,0.025,0.525,IconSize, 0, 'x'));
+// addUI(new PopperUpper(ALL,ALL,0,0,0.25,0.25, BUTTONBAR));
+// addUI(stateButton = new Button(ALL,ALL,0.05,0.025,IconSize, 0, 0, true, false));
+
+ addUI(new PopperUpper(ALL,BUTTONBAR,x=0.25,y=0,1.375,0.25, BUTTONBAR));
+// x += 0.1; y += 0.025;
+
+// addUI(new PopperUpper(PLAYING|PAUSED|STOPPED, ALL,0,0.25,0.25,0.25, TRACKBAR));
+// addUI(new PopperUpper(PLAYING|PAUSED|STOPPED, TRACKBAR,x=0.25,y=0.25,1.0,0.625, TRACKBAR));
+// x += 0.1; y += 0.1;
+
+ addUI(new PopperUpper(ALL,ALL,0,0.25,0.25,0.25, DIALBAR));
+ addUI(new Button(ALL,ALL,0.075,IconSize+0.05*1.7,IconSize, Bulb, 0, true, false));
+
+ addUI(new PopperUpper(ALL, ALL, 0, 0.50, 0.25, 0.25, 0));
+ addUI(new FullScreenButton(ALL, ALL, 0.075, 2*IconSize+0.05*2.5, IconSize, Plug, 0));
+
+ addUI(new PopperUpper(ALL,DIALBAR,x=0.25,y=0.0,1.25,1.0, DIALBAR));
+ x += 0.05; y += 0.025;
+
+ addUI(starsButton = new Button(ALL,DIALBAR,x,y,IconSize, Stars, 'd'));
+ addUI(waveButton = new Button(ALL,DIALBAR,x+IconSize,y,IconSize, Wave, 'f'));
+ addUI(flameButton = new Button(ALL,DIALBAR,x+IconSize*2.5,y,IconSize, Flame, 'g'));
+
+ addUI(starButton = new Button(ALL,DIALBAR,x+IconSize*3.5,y,IconSize, Star, 'h'));
+ addUI(diamondButton = new Button(ALL,DIALBAR,x+IconSize*4.5,y,IconSize, Diamond, 'j'));
+
+ y += IconSize*1.3;
+
+ addUI(new Button(ALL,DIALBAR,x,y-0.05,IconSize, Bulb, 0, true));
+ addUI(new SliderBar(ALL,DIALBAR,
+ x+IconSize,y, 0.75, SliderSize, &core->brightnessTwiddler, /*&Core::setBrightness,*/0, 'z', 'x'));
+
+ addUI(new Button(ALL,DIALBAR,x,y+SliderSize*1,IconSize, Size, 'x', true));
+ addUI(new SliderBar(ALL,DIALBAR,
+ x+IconSize,y+SliderSize, 0.75, SliderSize, &core->starSize, &Core::setStarSize, 'c','v'));
+
+ addUI(new Button(ALL,DIALBAR,x+0.5,y+SliderSize*2-0.025,IconSize, FgColor, 0, true));
+ addUI(new SliderBar(ALL,DIALBAR,
+ x,y+SliderSize*2, 0.45, SliderSize, &(core->fgRedSlider), &Core::setupPalette, 'b','n'));
+ addUI(new SliderBar(ALL,DIALBAR,
+ x+0.5+SliderSize,y+SliderSize*2, 0.45, SliderSize, &core->fgGreenSlider, &Core::setupPalette, 'm',','));
+
+ addUI(new Button(ALL,DIALBAR,x+0.5,y+SliderSize*3,IconSize, BgColor, 0, true));
+ addUI(new SliderBar(ALL,DIALBAR,
+ x,y+SliderSize*3, 0.45, SliderSize, &core->bgRedSlider, &Core::setupPalette, 'B','N'));
+ addUI(new SliderBar(ALL,DIALBAR,
+ x+0.5+SliderSize,y+SliderSize*3, 0.45, SliderSize, &core->bgGreenSlider, &Core::setupPalette, 'M','<'));
+
+ x += 0.1;// y += 0.0625;
+ //static double value = 0.5;
+ //addUI(new SliderBar(ALL,0,0.75,1.0,0.25,&value));
+
+ //addUI(new Button(BUTTONBAR,x,y,IconSize, 1, 'x'));
+ //addUI(new Button(BUTTONBAR,x += IconSize,y,IconSize, 2, 'x'));
+ //addUI(new Button(BUTTONBAR,x += IconSize,y,IconSize, 3, 'x'));
+
+ visibleMask = ALL;
+ mouseX = -1;
+ mouseY = -1;
+ lastY = -1;
+ lastY = -1;
+ countDown = 0;
+ mouseButtons = 0;
+
+ syncToState();
+
+}
+
+Interface::~Interface()
+{
+ KConfig config("noatun/synaescope", false, false, "data");
+ config.writeEntry("mode",core->fadeMode);
+ config.writeEntry("diamonds", core->pointsAreDiamonds);
+ config.writeEntry("brightness", core->brightnessTwiddler);
+ config.writeEntry("starsize", core->starSize);
+ config.writeEntry("FGRed", core->fgRedSlider);
+ config.writeEntry("FGgreen", core->fgGreenSlider);
+ config.writeEntry("BGRed", core->bgRedSlider);
+ config.writeEntry("BGGreen", core->bgGreenSlider);
+}
+
+void Interface::addUI(UIObject *obj)
+{
+ uiObjects.append(obj);
+}
+
+void Interface::syncToState()
+{
+ starsButton->bright = (core->fadeMode == Stars);
+ flameButton->bright = (core->fadeMode == Flame);
+ waveButton->bright = (core->fadeMode == Wave);
+
+ starButton->bright = !core->pointsAreDiamonds;
+ diamondButton->bright = core->pointsAreDiamonds;
+
+ setupPalette();
+}
+
+void Interface::changeState(int transitionSymbol)
+{
+ if (transitionSymbol < 0)
+ {
+ return ;
+ }
+
+ int retVal = 0;
+ switch(transitionSymbol)
+ {
+ case Flame :
+ starsButton->bright = false;
+ flameButton->bright = true;
+ waveButton->bright = false;
+ core->fadeMode = Flame;
+ core->setStarSize(core->starSize);
+ break;
+ case Wave :
+ starsButton->bright = false;
+ flameButton->bright = false;
+ waveButton->bright = true;
+ core->fadeMode = Wave;
+ core->setStarSize(core->starSize);
+ break;
+ case Stars :
+ starsButton->bright = true;
+ flameButton->bright = false;
+ waveButton->bright = false;
+ core->fadeMode = Stars;
+ core->setStarSize(core->starSize);
+ break;
+
+ case Star :
+ core->pointsAreDiamonds = false;
+ starButton->bright = true;
+ diamondButton->bright = false;
+ break;
+ case Diamond :
+ core->pointsAreDiamonds = true;
+ starButton->bright = false;
+ diamondButton->bright = true;
+ break;
+
+ case Exit :
+ retVal = 1; break;
+ }
+// return retVal;
+}
+
+bool Interface::go()
+{
+ int newVisibleMask = ALL;
+ char keyHit;
+ int action = NotASymbol;
+ int oldButtons = mouseButtons;
+
+ core->screen->sizeUpdate();
+ if (!core->screen->inputUpdate(mouseX,mouseY,mouseButtons,keyHit))
+ return false;
+
+ bool mouseClick = (mouseButtons && !oldButtons);
+
+ if ((mouseX != lastX || mouseY != lastY) &&
+ lastX > 0 && lastY > 0 &&
+ lastX < core->outWidth && lastY < core->outHeight)
+ countDown = 40;
+
+ int activeMask = ALL;
+
+ if (countDown)
+ {
+ countDown--;
+
+ double scale =
+ (core->outWidth*0.625 < core->outHeight ? core->outWidth*0.625 : core->outHeight);
+ double scaledX = mouseX / scale;
+ double scaledY = mouseY / scale;
+
+ char hotKey = 0;
+
+ core->polygonEngine.clear();
+
+// stateButton->icon = core->state;
+
+
+ for (UIObject *i=uiObjects.first(); i!=0; i = uiObjects.next())
+ {
+ if ((i->visibleMask & visibleMask) && (i->activeMask & activeMask))
+ newVisibleMask |= i->go(mouseButtons,mouseClick,
+ (scaledX >= i->x &&
+ scaledY >= i->y &&
+ scaledX < i->x+i->width &&
+ scaledY < i->y+i->height),
+ scaledX - i->x,
+ scaledY - i->y,
+ scale,
+ hotKey,
+ action);
+ }
+
+ visibleMask = newVisibleMask;
+ if (visibleMask != 1)
+ countDown = 20;
+
+ core->polygonEngine.icon(Icons[Pointer],0x0303,mouseX,mouseY,50,50);
+
+ core->polygonEngine.apply(core->outputBmp.data);
+
+ char hint[2] = " ";
+ hint[0] = hotKey;
+ putString(hint,mouseX+6,mouseY+7,0,0);
+ }
+
+ if (keyHit)
+ for(UIObject *i=uiObjects.first(); i!=0; i = uiObjects.next())
+ if (i->activeMask & activeMask)
+ i->handleKey(keyHit,action);
+
+
+ lastX = mouseX;
+ lastY = mouseY;
+
+ changeState(action);
+
+ return true;
+}
+
diff --git a/noatun-plugins/tippercanoe/Makefile.am b/noatun-plugins/tippercanoe/Makefile.am
new file mode 100644
index 0000000..b557d10
--- /dev/null
+++ b/noatun-plugins/tippercanoe/Makefile.am
@@ -0,0 +1,21 @@
+INCLUDES= $(all_includes) $(SDL_CFLAGS)
+
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = noatuntippecanoe.la
+
+noatuntippecanoe_la_SOURCES = synaescope.cpp
+noatuntippecanoe_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+noatuntippecanoe_la_LIBADD = $(LIB_KFILE) -lnoatun -lm
+
+bin_PROGRAMS = noatuntippecanoe.bin
+
+noatuntippecanoe_bin_SOURCES = core.cpp main.cpp ui.cpp sdlwrap.cpp
+noatuntippecanoe_bin_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+noatuntippecanoe_bin_LDADD = $(LIB_KDEUI) -lm $(SDL_LIBS)
+
+noatun_DATA = tippecanoe.plugin
+noatundir = $(kde_datadir)/noatun
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/tippecanoe.pot
diff --git a/noatun-plugins/tippercanoe/core.cpp b/noatun-plugins/tippercanoe/core.cpp
new file mode 100644
index 0000000..0fb6fa2
--- /dev/null
+++ b/noatun-plugins/tippercanoe/core.cpp
@@ -0,0 +1,425 @@
+/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia)
+ Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au>
+ 2001 Charles Samuels <charles@kde.org>
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+#include "syna.h"
+#include <unistd.h>
+Core *core;
+
+#define outputs unsigned char *Dlo=(unsigned char*)lastOutputBmp.data; \
+unsigned char *Dllo=(unsigned char*)lastLastOutputBmp.data; \
+unsigned char *Do=(unsigned char*)outputBmp.data;
+
+void Core::setupPalette(double) { interface->setupPalette(); }
+
+int Core::bitReverser(int i)
+{
+ int sum=0,j;
+ for(j=0;j<LogSize;j++)
+ {
+ sum = (i&1)+sum*2;
+ i >>= 1;
+ }
+ return sum;
+}
+
+void Core::fft(double *x,double *y)
+{
+ int n2 = NumSamples, n1;
+ int twoToTheK;
+ for(twoToTheK=1;twoToTheK<NumSamples;twoToTheK*=2)
+ {
+ n1 = n2;
+ n2 /= 2;
+ for(int j=0;j<n2;j++)
+ {
+ double c = cosTable[j*twoToTheK&(NumSamples-1)],
+ s = negSinTable[j*twoToTheK&(NumSamples-1)];
+ for(int i=j;i<NumSamples;i+=n1)
+ {
+ int l = i+n2;
+ double xt = x[i] - x[l];
+ x[i] = (x[i] + x[l]);
+ double yt = y[i] - y[l];
+ y[i] = (y[i] + y[l]);
+ x[l] = xt*c - yt*s;
+ y[l] = xt*s + yt*c;
+ }
+ }
+ }
+}
+
+void Core::setStarSize(double size)
+{
+ //int factor = (fadeMode == Flame ? 100 :
+ // (fadeMode == Wave ? 150 : 200));
+
+ double fadeModeFudge = (fadeMode == Wave ? 0.4 :
+ (fadeMode == Flame ? 0.6 : 0.78));
+
+ int factor;
+ if (size > 0.0)
+ factor = int(exp(log(fadeModeFudge) / (size*8.0))*255);
+ else
+ factor = 0;
+
+ if (factor > 255) factor = 255;
+
+ for(int i=0;i<256;i++)
+ scaleDown[i] = i*factor>>8;
+
+ maxStarRadius = 1;
+ for(int i=255;i;i = scaleDown[i])
+ maxStarRadius++;
+}
+
+inline void Core::addPixel(int x,int y,int br1,int br2)
+{
+ if (x < 0 || x >= outWidth || y < 0 || y >= outHeight) return;
+
+ unsigned char *p = output()+x*2+y*outWidth*2;
+ if (p[0] < 255-br1) p[0] += br1; else p[0] = 255;
+ if (p[1] < 255-br2) p[1] += br2; else p[1] = 255;
+ //p += lastOutput()-output();
+ //if (p[0] < 255-br1) p[0] += br1; else p[0] = 255;
+ //if (p[1] < 255-br2) p[1] += br2; else p[1] = 255;
+}
+
+inline void Core::addPixelFast(unsigned char *p,int br1,int br2)
+{
+ if (p[0] < 255-br1) p[0] += br1; else p[0] = 255;
+ if (p[1] < 255-br2) p[1] += br2; else p[1] = 255;
+ //p += lastOutput()-output();
+ //if (p[0] < 255-br1) p[0] += br1; else p[0] = 255;
+ //if (p[1] < 255-br2) p[1] += br2; else p[1] = 255;
+}
+
+void Core::fadeFade()
+{
+ register unsigned long *ptr = (unsigned long*)output();
+ int i = outWidth*outHeight*2/4;
+ do {
+ //Bytewize version was: *(ptr++) -= *ptr+(*ptr>>1)>>4;
+ if (*ptr) {
+ //if (*ptr & 0xf0f0f0f0ul)
+ *ptr -= ((*ptr & 0xf0f0f0f0ul) >> 4) + ((*ptr & 0xe0e0e0e0ul) >> 5);
+ ptr++;
+ }
+
+ //else {
+ // *(ptr++) = (*ptr * 14 >> 4) & 0x0f0f0f0ful;
+ //}
+ else
+ ptr++;
+ } while(--i > 0);
+}
+
+inline void Core::fadePixelWave(int x,int y,int where,int step)
+{
+outputs
+ short j =
+ ( short(getPixel(x-1,y,where-2))+
+ getPixel(x+1,y,where+2)+
+ getPixel(x,y-1,where-step)+
+ getPixel(x,y+1,where+step)
+ >> 2)
+ +Dlo[where];
+ if (!j) { Do[where] = 0; return; }
+ j = j
+ -Dllo[where]
+ -1;
+ if (j < 0) Do[where] = 0;
+ else if (j & (255*256)) Do[where] = 255;
+ else Do[where] = j;
+}
+
+void Core::fadeWave()
+{
+ unsigned short *t = lastLastOutputBmp.data;
+ lastLastOutputBmp.data = lastOutputBmp.data;
+ lastOutputBmp.data = outputBmp.data;
+ outputBmp.data = t;
+
+ int x,y,i,j,start,end;
+ int step = outWidth*2;
+ for(x=0,i=0,j=outWidth*(outHeight-1)*2;x<outWidth;x++,i+=2,j+=2) {
+ fadePixelWave(x,0,i,step);
+ fadePixelWave(x,0,i+1,step);
+ fadePixelWave(x,outHeight-1,j,step);
+ fadePixelWave(x,outHeight-1,j+1,step);
+ }
+
+ for(y=1,i=outWidth*2,j=outWidth*4-2;y<outHeight;y++,i+=step,j+=step) {
+ fadePixelWave(0,y,i,step);
+ fadePixelWave(0,y,i+1,step);
+ fadePixelWave(outWidth-1,y,j,step);
+ fadePixelWave(outWidth-1,y,j+1,step);
+ }
+outputs
+
+ for(y=1,
+ start=outWidth*2+2,
+ end=outWidth*4-2; y<outHeight-1; y++,start+=step,end+=step) {
+ int i = start;
+ do {
+ short j =
+ ( short(Dlo[i-2])+
+ Dlo[i+2]+
+ Dlo[i-step]+
+ Dlo[i+step]
+ >> 2)
+ +Dlo[i];
+ if (!j) {
+ Do[i] = 0;
+ } else {
+ j = j
+ -Dllo[i]
+ -1;
+ if (j < 0) Do[i] = 0;
+ else if (j & (255*256)) Do[i] = 255;
+ else Do[i] = j;
+ }
+ } while(++i < end);
+ }
+}
+
+inline void Core::fadePixelHeat(int x,int y,int where,int step)
+{
+outputs
+ short j =
+ ( short(getPixel(x-1,y,where-2))+
+ getPixel(x+1,y,where+2)+
+ getPixel(x,y-1,where-step)+
+ getPixel(x,y+1,where+step)
+ >> 2)
+ +Dlo[where];
+ if (!j) { Do[where] = 0; return; }
+ j = j
+ -Dllo[where]
+ -1;
+ if (j < 0) Do[where] = 0;
+ else if (j & (255*256)) Do[where] = 255;
+ else Do[where] = j;
+}
+
+void Core::fadeHeat()
+{
+ unsigned short *t = lastLastOutputBmp.data;
+ lastLastOutputBmp.data = lastOutputBmp.data;
+ lastOutputBmp.data = outputBmp.data;
+ outputBmp.data = t;
+
+ int x,y,i,j,start,end;
+ int step = outWidth*2;
+ for(x=0,i=0,j=outWidth*(outHeight-1)*2;x<outWidth;x++,i+=2,j+=2)
+ {
+ fadePixelHeat(x,0,i,step);
+ fadePixelHeat(x,0,i+1,step);
+ fadePixelHeat(x,outHeight-1,j,step);
+ fadePixelHeat(x,outHeight-1,j+1,step);
+ }
+
+ for(y=1,i=outWidth*2,j=outWidth*4-2;y<outHeight;y++,i+=step,j+=step)
+ {
+ fadePixelHeat(0,y,i,step);
+ fadePixelHeat(0,y,i+1,step);
+ fadePixelHeat(outWidth-1,y,j,step);
+ fadePixelHeat(outWidth-1,y,j+1,step);
+ }
+
+outputs
+ for(y=1,start=outWidth*2+2,
+ end=outWidth*4-2; y<outHeight-1; y++,start+=step,end+=step)
+ {
+ int i = start;
+ do
+ {
+ short j =
+ ( short(Dlo[i-2])+
+ Dlo[i+2]+
+ +Dlo[i-step]
+ +Dlo[i+step]
+ >> 2)
+ +Dlo[i];
+ if (!j) {
+ Do[i] = 0;
+ }
+ else
+ {
+ j = j
+ -Dllo[i]
+ +(Dllo[i]
+ -Dlo[i]>>2)
+ -1;
+ if (j < 0) Do[i] = 0;
+ else if (j & (255*256)) Do[i] = 255;
+ else Do[i] = j;
+ }
+ } while(++i < end);
+ }
+}
+
+void Core::fade()
+{
+ switch(fadeMode)
+ {
+ case Stars :
+ fadeFade();
+ break;
+ case Flame :
+ fadeHeat();
+ break;
+ case Wave :
+ fadeWave();
+ break;
+ default:
+ break;
+ }
+}
+
+bool Core::calculate()
+{
+ double x[NumSamples], y[NumSamples];
+ double a[NumSamples], b[NumSamples];
+ int clarity[NumSamples]; //Surround sound
+ int i,j,k;
+#ifndef LITTLEENDIAN
+ register sampleType temp;
+#endif
+
+ int brightFactor = int(Brightness * brightnessTwiddler /(starSize+0.01));
+
+ int num;
+ if ((num=read(0, data, NumSamples))==0)
+ return false;
+
+ for(i=0;i<NumSamples;i++)
+ {
+# ifdef LITTLEENDIAN
+ x[i] = data[i*2];
+ y[i] = data[i*2+1];
+# else
+ // Need to convert to big-endian
+ temp = data[i*2];
+ temp = (temp >> 8) | (temp << 8);
+ x[i] = temp;
+ temp = data[i*2+1];
+ temp = (temp << 8) | (temp >> 8);
+ y[i] = temp;
+# endif
+ }
+
+ fft(x,y);
+
+ for(i=0 +1;i<NumSamples;i++)
+ {
+ double x1 = x[bitReverse[i]],
+ y1 = y[bitReverse[i]],
+ x2 = x[bitReverse[NumSamples-i]],
+ y2 = y[bitReverse[NumSamples-i]],
+ aa,bb;
+ a[i] = sqrt(aa= (x1+x2)*(x1+x2) + (y1-y2)*(y1-y2) );
+ b[i] = sqrt(bb= (x1-x2)*(x1-x2) + (y1+y2)*(y1+y2) );
+ if (aa+bb != 0.0)
+ clarity[i] = (int)(
+ ( (x1+x2) * (x1-x2) + (y1+y2) * (y1-y2) )/(aa+bb) * 256 );
+ else
+ clarity[i] = 0;
+ }
+
+ int heightFactor = NumSamples/2 / outHeight + 1;
+ int actualHeight = NumSamples/2/heightFactor;
+ int heightAdd = outHeight + actualHeight >> 1;
+
+ // Correct for window size
+ double brightFactor2 = (brightFactor/65536.0/NumSamples)*
+ sqrt(actualHeight*outWidth/(320.0*200.0));
+
+ for(i=1;i<NumSamples/2;i++) {
+ //int h = (int)( b[i]*280 / (a[i]+b[i]+0.0001)+20 );
+ if (a[i] > 0 || b[i] > 0) {
+ int h = (int)( b[i]*outWidth / (a[i]+b[i]) );
+ int br1, br2, br = (int)(
+ (a[i]+b[i])*i*brightFactor2 );
+ br1 = br*(clarity[i]+128)>>8;
+ br2 = br*(128-clarity[i])>>8;
+ if (br1 < 0) br1 = 0; else if (br1 > 255) br1 = 255;
+ if (br2 < 0) br2 = 0; else if (br2 > 255) br2 = 255;
+ //unsigned char *p = output+ h*2+(164-((i<<8)>>m))*(outWidth*2);
+ int px = h,
+ py = heightAdd - i / heightFactor;
+
+ if (pointsAreDiamonds)
+ {
+ addPixel(px,py,br1,br2);
+ br1=scaleDown[br1];br2=scaleDown[br2];
+
+ //TODO: Use addpixelfast
+ for(j=1;br1>0||br2>0;j++,br1=scaleDown[br1],br2=scaleDown[br2])
+ {
+ for(k=0;k<j;k++)
+ {
+ addPixel(px-j+k,py-k,br1,br2);
+ addPixel(px+k,py-j+k,br1,br2);
+ addPixel(px+j-k,py+k,br1,br2);
+ addPixel(px-k,py+j-k,br1,br2);
+ }
+ }
+ }
+ else
+ {
+ if (px < maxStarRadius || py < maxStarRadius ||
+ px > outWidth-maxStarRadius || py > outHeight-maxStarRadius)
+ {
+ addPixel(px,py,br1,br2);
+ for(j=1;br1>0||br2>0;j++,br1=scaleDown[br1],br2=scaleDown[br2])
+ {
+ addPixel(px+j,py,br1,br2);
+ addPixel(px,py+j,br1,br2);
+ addPixel(px-j,py,br1,br2);
+ addPixel(px,py-j,br1,br2);
+ }
+ }
+ else
+ {
+ unsigned char *p = output()+px*2+py*outWidth*2, *p1=p, *p2=p, *p3=p, *p4=p;
+ addPixelFast(p,br1,br2);
+ for(;br1>0||br2>0;br1=scaleDown[br1],br2=scaleDown[br2])
+ {
+ p1 += 2;
+ addPixelFast(p1,br1,br2);
+ p2 -= 2;
+ addPixelFast(p2,br1,br2);
+ p3 += outWidth*2;
+ addPixelFast(p3,br1,br2);
+ p4 -= outWidth*2;
+ addPixelFast(p4,br1,br2);
+ }
+ }
+ }
+ }
+ }
+ return true;
+}
+
+#undef outputs
+
diff --git a/noatun-plugins/tippercanoe/font.h b/noatun-plugins/tippercanoe/font.h
new file mode 100644
index 0000000..94d2627
--- /dev/null
+++ b/noatun-plugins/tippercanoe/font.h
@@ -0,0 +1,258 @@
+unsigned char font[] = {
+ 0,0,0,0,0,0,0,0,
+ 126,129,165,129,189,129,126,0,
+ 126,255,219,255,195,255,126,0,
+ 54,127,127,127,62,28,8,0,
+ 8,28,62,127,62,28,8,0,
+ 28,28,8,107,127,107,8,28,
+ 8,28,62,127,62,8,28,62,
+ 0,0,24,60,60,24,0,0,
+ 255,255,231,195,195,231,255,255,
+ 0,60,102,66,66,102,60,0,
+ 255,195,153,189,189,153,195,255,
+ 15,7,13,60,102,102,102,60,
+ 60,102,102,102,60,24,126,24,
+ 48,56,60,54,52,112,240,224,
+ 127,99,127,99,99,103,230,192,
+ 24,219,126,102,102,126,219,24,
+ 64,112,124,127,124,112,64,0,
+ 1,7,31,127,31,7,1,0,
+ 24,60,126,24,24,126,60,24,
+ 102,102,102,102,102,0,102,0,
+ 63,122,122,58,10,10,10,0,
+ 30,51,28,54,54,28,102,60,
+ 0,0,0,0,126,126,126,0,
+ 24,60,126,24,126,60,24,126,
+ 24,60,126,24,24,24,24,0,
+ 24,24,24,24,126,60,24,0,
+ 0,12,14,127,14,12,0,0,
+ 0,24,56,127,56,24,0,0,
+ 0,0,96,96,96,127,0,0,
+ 0,36,102,255,102,36,0,0,
+ 0,24,60,126,255,255,0,0,
+ 0,255,255,126,60,24,0,0,
+ 0,0,0,0,0,0,0,0,
+ 24,24,24,24,24,0,24,0,
+ 102,102,102,0,0,0,0,0,
+ 108,108,254,108,254,108,108,0,
+ 16,124,208,124,22,124,16,0,
+ 0,198,204,24,48,102,198,0,
+ 56,108,56,118,220,204,118,0,
+ 24,24,48,0,0,0,0,0,
+ 12,24,48,48,48,24,12,0,
+ 48,24,12,12,12,24,48,0,
+ 0,108,56,254,56,108,0,0,
+ 0,24,24,126,24,24,0,0,
+ 0,0,0,0,0,24,24,48,
+ 0,0,0,126,0,0,0,0,
+ 0,0,0,0,0,48,48,0,
+ 0,6,12,24,48,96,192,0,
+ 60,102,110,126,118,102,60,0,
+ 12,28,60,12,12,12,12,0,
+ 60,102,6,28,48,96,126,0,
+ 60,102,6,28,6,102,60,0,
+ 28,60,108,204,254,12,12,0,
+ 126,96,96,124,6,102,60,0,
+ 60,96,96,124,102,102,60,0,
+ 126,6,6,12,24,48,48,0,
+ 60,102,102,60,102,102,60,0,
+ 60,102,102,62,6,6,60,0,
+ 0,48,48,0,0,48,48,0,
+ 0,24,24,0,0,24,24,48,
+ 12,24,48,96,48,24,12,0,
+ 0,0,126,0,0,126,0,0,
+ 48,24,12,6,12,24,48,0,
+ 60,102,6,12,24,0,24,0,
+ 60,102,110,110,108,96,60,0,
+ 24,60,102,102,126,102,102,0,
+ 124,102,102,124,102,102,124,0,
+ 60,102,96,96,96,102,60,0,
+ 124,102,102,102,102,102,124,0,
+ 126,96,96,124,96,96,126,0,
+ 126,96,96,124,96,96,96,0,
+ 60,102,96,110,102,102,60,0,
+ 102,102,102,126,102,102,102,0,
+ 60,24,24,24,24,24,60,0,
+ 6,6,6,6,102,102,60,0,
+ 102,108,120,112,120,108,102,0,
+ 96,96,96,96,96,96,126,0,
+ 198,238,254,214,198,198,198,0,
+ 102,118,126,110,102,102,102,0,
+ 60,102,102,102,102,102,60,0,
+ 124,102,102,124,96,96,96,0,
+ 60,102,102,102,102,110,60,6,
+ 124,102,102,124,102,102,102,0,
+ 60,102,96,60,6,102,60,0,
+ 126,24,24,24,24,24,24,0,
+ 102,102,102,102,102,102,60,0,
+ 102,102,102,102,102,60,24,0,
+ 198,198,198,214,254,238,198,0,
+ 102,102,60,24,60,102,102,0,
+ 102,102,102,60,24,24,24,0,
+ 126,6,12,24,48,96,126,0,
+ 60,48,48,48,48,48,60,0,
+ 0,192,96,48,24,12,6,0,
+ 60,12,12,12,12,12,60,0,
+ 24,60,102,0,0,0,0,0,
+ 0,0,0,0,0,0,0,255,
+ 24,24,12,0,0,0,0,0,
+ 0,0,60,6,62,102,62,0,
+ 96,96,96,124,102,102,124,0,
+ 0,0,60,102,96,102,60,0,
+ 6,6,6,62,102,102,62,0,
+ 0,0,60,102,126,96,62,0,
+ 28,54,48,124,48,48,48,0,
+ 0,0,62,102,102,62,6,60,
+ 96,96,124,102,102,102,102,0,
+ 24,0,24,24,24,24,24,0,
+ 12,0,12,12,12,12,108,56,
+ 96,96,102,108,120,108,102,0,
+ 48,48,48,48,48,48,24,0,
+ 0,0,236,254,214,214,198,0,
+ 0,0,124,102,102,102,102,0,
+ 0,0,60,102,102,102,60,0,
+ 0,0,124,102,102,124,96,96,
+ 0,0,62,102,102,62,6,6,
+ 0,0,124,102,96,96,96,0,
+ 0,0,62,96,60,6,124,0,
+ 48,48,124,48,48,54,28,0,
+ 0,0,102,102,102,102,62,0,
+ 0,0,102,102,102,60,24,0,
+ 0,0,198,214,254,238,68,0,
+ 0,0,102,60,24,60,102,0,
+ 0,0,102,102,102,62,6,60,
+ 0,0,126,12,24,48,126,0,
+ 28,48,48,96,48,48,28,0,
+ 24,24,24,24,24,24,24,0,
+ 56,12,12,6,12,12,56,0,
+ 118,220,0,0,0,0,0,0,
+ 0,0,24,60,102,102,126,0,
+ 60,102,96,96,102,60,24,48,
+ 102,0,102,102,102,102,62,0,
+ 14,0,60,102,126,96,60,0,
+ 60,102,60,6,62,102,62,0,
+ 102,0,60,6,62,102,62,0,
+ 112,0,60,6,62,102,62,0,
+ 24,24,60,6,62,102,62,0,
+ 0,0,62,96,96,62,24,48,
+ 60,102,60,102,126,96,60,0,
+ 102,0,60,102,126,96,60,0,
+ 112,0,60,102,126,96,60,0,
+ 102,0,24,24,24,24,24,0,
+ 60,102,24,24,24,24,24,0,
+ 112,0,24,24,24,24,24,0,
+ 198,56,108,198,254,198,198,0,
+ 24,24,0,60,102,126,102,0,
+ 14,0,124,96,120,96,124,0,
+ 0,0,126,26,126,216,126,0,
+ 62,120,216,222,248,216,222,0,
+ 60,102,60,102,102,102,60,0,
+ 102,0,60,102,102,102,60,0,
+ 112,0,60,102,102,102,60,0,
+ 60,102,0,102,102,102,62,0,
+ 112,0,102,102,102,102,62,0,
+ 102,0,102,102,102,62,6,60,
+ 102,60,102,102,102,102,60,0,
+ 102,0,102,102,102,102,60,0,
+ 12,12,62,96,96,62,12,12,
+ 56,108,96,240,96,102,252,0,
+ 102,102,60,24,126,24,126,24,
+ 124,102,102,124,102,111,102,99,
+ 14,27,24,60,24,24,120,48,
+ 14,0,60,6,62,102,62,0,
+ 14,0,24,24,24,24,24,0,
+ 14,0,60,102,102,102,60,0,
+ 14,0,102,102,102,102,62,0,
+ 118,220,0,124,102,102,102,0,
+ 126,0,102,118,126,110,102,0,
+ 62,102,102,62,0,126,0,0,
+ 60,102,102,60,0,126,0,0,
+ 24,0,24,48,96,102,60,0,
+ 0,0,0,126,96,96,0,0,
+ 0,0,0,126,6,6,0,0,
+ 198,204,216,62,99,198,12,31,
+ 198,204,216,54,110,214,31,6,
+ 24,0,24,24,24,24,24,0,
+ 0,54,108,216,108,54,0,0,
+ 0,216,108,54,108,216,0,0,
+ 34,136,34,136,34,136,34,136,
+ 85,170,85,170,85,170,85,170,
+ 221,119,221,119,221,119,221,119,
+ 8,8,8,8,8,8,8,8,
+ 8,8,8,8,248,8,8,8,
+ 8,8,8,248,248,8,8,8,
+ 28,28,28,28,252,28,28,28,
+ 0,0,0,0,252,28,28,28,
+ 0,0,0,248,248,8,8,8,
+ 28,28,28,252,252,28,28,28,
+ 28,28,28,28,28,28,28,28,
+ 0,0,0,252,252,28,28,28,
+ 28,28,28,252,252,0,0,0,
+ 28,28,28,28,252,0,0,0,
+ 8,8,8,248,248,0,0,0,
+ 0,0,0,0,248,8,8,8,
+ 8,8,8,8,15,0,0,0,
+ 8,8,8,8,255,0,0,0,
+ 0,0,0,0,255,8,8,8,
+ 8,8,8,8,15,8,8,8,
+ 0,0,0,0,255,0,0,0,
+ 8,8,8,8,255,8,8,8,
+ 8,8,8,15,15,8,8,8,
+ 28,28,28,28,31,28,28,28,
+ 28,28,28,31,31,0,0,0,
+ 0,0,0,31,31,28,28,28,
+ 28,28,28,255,255,0,0,0,
+ 0,0,0,255,255,28,28,28,
+ 28,28,28,31,31,28,28,28,
+ 0,0,0,255,255,0,0,0,
+ 28,28,28,255,255,28,28,28,
+ 8,8,8,255,255,0,0,0,
+ 28,28,28,28,255,0,0,0,
+ 0,0,0,255,255,8,8,8,
+ 0,0,0,0,255,28,28,28,
+ 28,28,28,28,31,0,0,0,
+ 8,8,8,15,15,0,0,0,
+ 0,0,0,15,15,8,8,8,
+ 0,0,0,0,31,28,28,28,
+ 28,28,28,28,255,28,28,28,
+ 8,8,8,255,255,8,8,8,
+ 8,8,8,8,248,0,0,0,
+ 0,0,0,0,15,8,8,8,
+ 255,255,255,255,255,255,255,255,
+ 0,0,0,0,255,255,255,255,
+ 240,240,240,240,240,240,240,240,
+ 15,15,15,15,15,15,15,15,
+ 255,255,255,255,0,0,0,0,
+ 0,0,118,204,204,204,118,0,
+ 60,102,102,124,102,102,124,96,
+ 126,102,96,96,96,96,96,0,
+ 0,0,254,108,108,108,102,0,
+ 126,102,48,24,48,102,126,0,
+ 0,0,62,108,108,108,56,0,
+ 0,0,102,102,102,102,127,192,
+ 0,0,126,216,24,24,12,0,
+ 124,56,124,214,214,124,56,124,
+ 124,198,198,254,198,198,124,0,
+ 124,198,198,198,108,108,238,0,
+ 30,48,24,60,102,102,60,0,
+ 0,0,126,219,219,126,0,0,
+ 3,6,62,107,115,62,96,192,
+ 30,48,96,126,96,48,30,0,
+ 124,198,198,198,198,198,198,0,
+ 0,126,0,126,0,126,0,0,
+ 24,24,126,24,24,0,126,0,
+ 48,24,12,24,48,0,126,0,
+ 12,24,48,24,12,0,126,0,
+ 14,27,27,24,24,24,24,24,
+ 24,24,24,24,24,216,216,112,
+ 24,24,0,126,0,24,24,0,
+ 0,118,220,0,118,220,0,0,
+ 60,102,102,60,0,0,0,0,
+ 0,0,0,24,24,0,0,0,
+ 0,0,0,0,24,0,0,0,
+ 30,24,24,24,24,216,120,56,
+ 120,108,108,108,108,0,0,0,
+ 56,12,24,48,60,0,0,0,
+ 0,0,60,60,60,60,0,0,
+ 0,0,0,0,0,0,0,0
+};
diff --git a/noatun-plugins/tippercanoe/icons.h b/noatun-plugins/tippercanoe/icons.h
new file mode 100644
index 0000000..2056e19
--- /dev/null
+++ b/noatun-plugins/tippercanoe/icons.h
@@ -0,0 +1,4847 @@
+double Icon0[][4] = {
+ {0.5,0,0.166666666666667,0.333333333333333},
+ {0.5,1,0.5,0},
+ {0.166666666666667,0.666666666666667,0.5,1},
+ {0,0.333333333333333,0,0.666666666666667},
+ {0,0,0,0}
+};
+
+double Icon1[][4] = {
+ {0.5,0.262222,0.487778,0.185},
+ {0.487778,0.185,0.452222666666667,0.115},
+ {0.452222666666667,0.115,0.397222666666667,0.0599999999999999},
+ {0.397222666666667,0.0599999999999999,0.327222666666667,0.0244446666666664},
+ {0.327222666666667,0.0244446666666664,0.25,0.0122220000000002},
+ {0.25,0.0122220000000002,0.172778,0.0244446666666664},
+ {0.172778,0.0244446666666664,0.102778,0.0599999999999999},
+ {0.102778,0.0599999999999999,0.047778,0.115},
+ {0.047778,0.115,0.0122226666666666,0.185},
+ {0.0122226666666666,0.185,0,0.262222},
+ {0,0.262222,0.0122226666666666,0.339444666666667},
+ {0.0122226666666666,0.339444666666667,0.047778,0.409444666666667},
+ {0.047778,0.409444666666667,0.102778,0.464444666666667},
+ {0.102778,0.464444666666667,0.172778,0.5},
+ {0.172778,0.5,0.25,0.512222},
+ {0.25,0.512222,0.327222666666667,0.5},
+ {0.327222666666667,0.5,0.397222666666667,0.464444666666667},
+ {0.397222666666667,0.464444666666667,0.452222666666667,0.409444666666667},
+ {0.452222666666667,0.409444666666667,0.487778,0.339444666666667},
+ {0.487778,0.339444666666667,0.5,0.262222},
+ {0.381111333333333,0.583333333333333,0.381111333333333,0.541666666666667},
+ {0.131111333333333,0.541666666666667,0.131111333333333,0.583333333333333},
+ {0.381111333333333,0.666666666666667,0.381111333333333,0.625},
+ {0.131111333333333,0.625,0.131111333333333,0.666666666666667},
+ {0.381111333333333,0.75,0.381111333333333,0.708333333333333},
+ {0.131111333333333,0.708333333333333,0.131111333333333,0.75},
+ {0.297778,0.833333333333333,0.339444666666667,0.791666666666667},
+ {0.172778,0.791666666666667,0.214444666666667,0.833333333333333},
+ {0,0,0,0}
+};
+
+double Icon2[][4] = {
+ {0,0.166666666666667,0,0.833333333333333},
+ {0,0.833333333333333,0.333333333333333,0.5},
+ {0.333333333333333,0.5,0,0.166666666666667},
+ {0,0,0,0}
+};
+
+double Icon3[][4] = {
+ {0.166666666666667,0.75,0.166666666666667,0.25},
+ {0,0.25,0,0.75},
+ {0.5,0.75,0.5,0.25},
+ {0.333333333333333,0.25,0.333333333333333,0.75},
+ {0,0,0,0}
+};
+
+double Icon4[][4] = {
+ {0.5,0.75,0.5,0.25},
+ {0,0.25,0,0.75},
+ {0,0,0,0}
+};
+
+double Icon5[][4] = {
+ {0,0.166666666666667,0,0.833333333333333},
+ {0,0.833333333333333,0.166666666666667,0.666666666666667},
+ {0.166666666666667,0.666666666666667,0.166666666666667,0.833333333333333},
+ {0.166666666666667,0.833333333333333,0.458333333333333,0.541666666666667},
+ {0.458333333333333,0.541666666666667,0.458333333333333,0.833333333333333},
+ {0.541666666666667,0.833333333333333,0.541666666666667,0.166666666666667},
+ {0.458333333333333,0.166666666666667,0.458333333333333,0.458333333333333},
+ {0.458333333333333,0.458333333333333,0.166666666666667,0.166666666666667},
+ {0.166666666666667,0.166666666666667,0.166666666666667,0.333333333333333},
+ {0.166666666666667,0.333333333333333,0,0.166666666666667},
+ {0,0,0,0}
+};
+
+double Icon6[][4] = {
+ {0.541666666666667,0.833333333333333,0.541666666666667,0.166666666666667},
+ {0.541666666666667,0.166666666666667,0.375,0.333333333333333},
+ {0.375,0.333333333333333,0.375,0.166666666666667},
+ {0.375,0.166666666666667,0.0833333333333333,0.458333333333333},
+ {0.0833333333333333,0.458333333333333,0.0833333333333333,0.166666666666667},
+ {0,0.166666666666667,0,0.833333333333333},
+ {0.0833333333333333,0.833333333333333,0.0833333333333333,0.541666666666667},
+ {0.0833333333333333,0.541666666666667,0.375,0.833333333333333},
+ {0.375,0.833333333333333,0.375,0.666666666666667},
+ {0.375,0.666666666666667,0.541666666666667,0.833333333333333},
+ {0,0,0,0}
+};
+
+double Icon7[][4] = {
+ {0,0,0,1},
+ {0,1,0.166666666666667,0.833333333333333},
+ {0.166666666666667,0.833333333333333,0.166666666666667,0.166666666666667},
+ {0.166666666666667,0.166666666666667,0,0},
+ {0.125,0.166666666666667,0.125,0.833333333333333},
+ {0.125,0.833333333333333,0.0833333333333333,0.875},
+ {0.0833333333333333,0.875,0.0833333333333333,0.125},
+ {0.0833333333333333,0.125,0.125,0.166666666666667},
+ {0,0,0,0}
+};
+
+double Icon8[][4] = {
+ {0,0,0.166666666666667,0.5},
+ {0.166666666666667,0.5,0.291666666666667,0.375},
+ {0.291666666666667,0.375,0.416666666666667,0.5},
+ {0.416666666666667,0.5,0.5,0.416666666666667},
+ {0.5,0.416666666666667,0.375,0.291666666666667},
+ {0.375,0.291666666666667,0.5,0.166666666666667},
+ {0.5,0.166666666666667,0,0},
+ {0,0,0,0}
+};
+
+double Icon9[][4] = {
+ {0.5,0.833333333333333,0.5,0.791666666666667},
+ {0,0.791666666666667,0,0.833333333333333},
+ {0.0833333333333333,0.625,0,0.791666666666667},
+ {0.5,0.791666666666667,0.416666666666667,0.625},
+ {0.5,0.541666666666667,0.416666666666667,0.375},
+ {0.0833333333333333,0.375,0,0.541666666666667},
+ {0,0.541666666666667,0,0.666666666666667},
+ {0.0416666666666667,0.666666666666667,0.0416666666666667,0.583333333333333},
+ {0.458333333333333,0.583333333333333,0.458333333333333,0.666666666666667},
+ {0.5,0.666666666666667,0.5,0.541666666666667},
+ {0.166666666666667,0.666666666666667,0.173888666666667,0.664444666666667},
+ {0.173888666666667,0.664444666666667,0.181666666666667,0.662778},
+ {0.181666666666667,0.662778,0.191111333333333,0.661111333333333},
+ {0.191111333333333,0.661111333333333,0.201111333333333,0.660555333333334},
+ {0.201111333333333,0.660555333333334,0.212778,0.659444666666667},
+ {0.224444666666667,0.659444666666667,0.237222,0.658888666666667},
+ {0.262778,0.658888666666667,0.275555333333333,0.659444666666667},
+ {0.287222,0.659444666666667,0.298888666666667,0.660555333333334},
+ {0.298888666666667,0.660555333333334,0.308888666666667,0.661111333333333},
+ {0.308888666666667,0.661111333333333,0.318333333333333,0.662778},
+ {0.318333333333333,0.662778,0.326111333333333,0.664444666666667},
+ {0.326111333333333,0.664444666666667,0.333333333333333,0.666666666666667},
+ {0.333333333333333,0.666666666666667,0.339444666666666,0.669444666666667},
+ {0.339444666666666,0.669444666666667,0.345,0.673333333333333},
+ {0.345,0.673333333333333,0.35,0.677778},
+ {0.35,0.677778,0.355,0.682778},
+ {0.355,0.682778,0.359999999999999,0.688888666666667},
+ {0.359999999999999,0.688888666666667,0.364444666666666,0.695},
+ {0.364444666666666,0.695,0.369444666666666,0.701666666666667},
+ {0.369444666666666,0.701666666666667,0.373888666666667,0.708333333333333},
+ {0.373888666666667,0.708333333333333,0.377778,0.715},
+ {0.377778,0.715,0.381111333333333,0.721666666666666},
+ {0.381111333333333,0.721666666666666,0.383888666666666,0.727778},
+ {0.383888666666666,0.727778,0.385,0.733888666666667},
+ {0.385,0.733888666666667,0.385,0.738888666666667},
+ {0.385,0.738888666666667,0.383888666666666,0.743333333333334},
+ {0.383888666666666,0.743333333333334,0.380555333333334,0.747222},
+ {0.380555333333334,0.747222,0.375,0.75},
+ {0.375,0.75,0.368888666666667,0.751666666666667},
+ {0.368888666666667,0.751666666666667,0.361666666666667,0.753333333333333},
+ {0.361666666666667,0.753333333333333,0.352222,0.754444666666667},
+ {0.352222,0.754444666666667,0.341111333333333,0.755555333333334},
+ {0.341111333333333,0.755555333333334,0.328888666666666,0.756111333333333},
+ {0.328888666666666,0.756111333333333,0.315,0.756666666666667},
+ {0.315,0.756666666666667,0.299444666666666,0.757222},
+ {0.299444666666666,0.757222,0.283888666666667,0.757778},
+ {0.216111333333333,0.757778,0.200555333333334,0.757222},
+ {0.200555333333334,0.757222,0.185,0.756666666666667},
+ {0.185,0.756666666666667,0.171111333333333,0.756111333333333},
+ {0.171111333333333,0.756111333333333,0.158888666666667,0.755555333333334},
+ {0.158888666666667,0.755555333333334,0.147778,0.754444666666667},
+ {0.147778,0.754444666666667,0.138333333333333,0.753333333333333},
+ {0.138333333333333,0.753333333333333,0.131111333333333,0.751666666666667},
+ {0.131111333333333,0.751666666666667,0.125,0.75},
+ {0.125,0.75,0.119444666666666,0.747222},
+ {0.119444666666666,0.747222,0.116111333333334,0.743333333333334},
+ {0.116111333333334,0.743333333333334,0.115,0.738888666666667},
+ {0.115,0.738888666666667,0.115,0.733888666666667},
+ {0.115,0.733888666666667,0.116111333333334,0.727778},
+ {0.116111333333334,0.727778,0.118888666666667,0.721666666666666},
+ {0.118888666666667,0.721666666666666,0.122222,0.715},
+ {0.122222,0.715,0.126111333333333,0.708333333333333},
+ {0.126111333333333,0.708333333333333,0.130555333333334,0.701666666666667},
+ {0.130555333333334,0.701666666666667,0.135555333333334,0.695},
+ {0.135555333333334,0.695,0.140000000000001,0.688888666666667},
+ {0.140000000000001,0.688888666666667,0.145,0.682778},
+ {0.145,0.682778,0.15,0.677778},
+ {0.15,0.677778,0.155,0.673333333333333},
+ {0.155,0.673333333333333,0.160555333333334,0.669444666666667},
+ {0.160555333333334,0.669444666666667,0.166666666666667,0.666666666666667},
+ {0,0,0,0}
+};
+
+double Icon10[][4] = {
+ {0.707221999999999,0.271111333333333,0.589444666666666,0.153333333333334},
+ {0.471111333333333,0.507222,0.707221999999999,0.271111333333333},
+ {0.707221999999999,0.742778,0.471111333333333,0.507222},
+ {0.589444666666666,0.860555333333333,0.707221999999999,0.742778},
+ {0.353333333333333,0.625,0.589444666666666,0.860555333333333},
+ {0.117778,0.860555333333333,0.353333333333333,0.625},
+ {0,0.742778,0.117778,0.860555333333333},
+ {0.235555333333333,0.507222,0,0.742778},
+ {0,0.271111333333333,0.235555333333333,0.507222},
+ {0.117778,0.153333333333334,0,0.271111333333333},
+ {0.353333333333333,0.388888666666666,0.117778,0.153333333333334},
+ {0.589444666666666,0.153333333333334,0.353333333333333,0.388888666666666},
+ {0,0,0,0}
+};
+
+double Icon11[][4] = {
+ {0.75,0.708333333333333,0.75,0.291666666666667},
+ {0,0.291666666666667,0,0.708333333333333},
+ {0.184444666666667,0.333333333333333,0.184444666666667,0.416666666666667},
+ {0.0894446666666665,0.416666666666667,0.0894446666666665,0.458333333333333},
+ {0.136666666666667,0.458333333333333,0.136666666666667,0.541666666666667},
+ {0.0894446666666665,0.541666666666667,0.0894446666666665,0.583333333333333},
+ {0.184444666666667,0.583333333333333,0.184444666666667,0.666666666666667},
+ {0.0416666666666667,0.666666666666667,0.0416666666666667,0.333333333333333},
+ {0.28,0.333333333333333,0.327778,0.458333333333333},
+ {0.327778,0.458333333333333,0.375,0.333333333333333},
+ {0.422222,0.333333333333333,0.363333333333333,0.5},
+ {0.363333333333333,0.5,0.422222,0.666666666666667},
+ {0.375,0.666666666666667,0.327778,0.541666666666667},
+ {0.327778,0.541666666666667,0.28,0.666666666666667},
+ {0.232222,0.666666666666667,0.291666666666667,0.5},
+ {0.291666666666667,0.5,0.232222,0.333333333333333},
+ {0.517778,0.333333333333333,0.517778,0.666666666666667},
+ {0.47,0.666666666666667,0.47,0.333333333333333},
+ {0.708333333333333,0.333333333333333,0.708333333333333,0.416666666666667},
+ {0.660555333333333,0.416666666666667,0.660555333333333,0.666666666666667},
+ {0.613333333333333,0.666666666666667,0.613333333333333,0.416666666666667},
+ {0.565555333333333,0.416666666666667,0.565555333333333,0.333333333333333},
+ {0,0,0,0}
+};
+
+double Icon12[][4] = {
+ {0.298333333333333,0.31,0.293888666666666,0.301666666666667},
+ {0.302221999999999,0.32,0.298333333333333,0.31},
+ {0.305555333333333,0.331111333333334,0.302221999999999,0.32},
+ {0.308333333333334,0.343888666666667,0.305555333333333,0.331111333333334},
+ {0.310555333333333,0.357222,0.308333333333334,0.343888666666667},
+ {0.312777333333333,0.372778,0.310555333333333,0.357222},
+ {0.314443999999999,0.388888666666666,0.312777333333333,0.372778},
+ {0.315555333333333,0.406111333333333,0.314443999999999,0.388888666666666},
+ {0.316666666666666,0.424444666666667,0.315555333333333,0.406111333333333},
+ {0.317777333333333,0.443888666666667,0.316666666666666,0.424444666666667},
+ {0.318333333333333,0.463333333333334,0.317777333333333,0.443888666666667},
+ {0.318888666666666,0.483888666666667,0.318333333333333,0.463333333333334},
+ {0.318888666666666,0.505,0.318888666666666,0.483888666666667},
+ {0.318888666666666,0.526111333333333,0.318888666666666,0.505},
+ {0.318888666666666,0.546666666666667,0.318888666666666,0.526111333333333},
+ {0.318888666666666,0.567778,0.318888666666666,0.546666666666667},
+ {0.318333333333333,0.588333333333334,0.318888666666666,0.567778},
+ {0.317777333333333,0.607778,0.318333333333333,0.588333333333334},
+ {0.316666666666666,0.627222,0.317777333333333,0.607778},
+ {0.315555333333333,0.645555333333334,0.316666666666666,0.627222},
+ {0.314443999999999,0.662778,0.315555333333333,0.645555333333334},
+ {0.312777333333333,0.678888666666667,0.314443999999999,0.662778},
+ {0.310555333333333,0.694444666666667,0.312777333333333,0.678888666666667},
+ {0.308333333333334,0.707778,0.310555333333333,0.694444666666667},
+ {0.305555333333333,0.720555333333333,0.308333333333334,0.707778},
+ {0.302221999999999,0.731666666666667,0.305555333333333,0.720555333333333},
+ {0.298333333333333,0.741666666666667,0.302221999999999,0.731666666666667},
+ {0.293888666666666,0.75,0.298333333333333,0.741666666666667},
+ {0.287777333333333,0.758333333333334,0.293888666666666,0.75},
+ {0.280555333333333,0.765555333333333,0.287777333333333,0.758333333333334},
+ {0.272777333333333,0.771666666666667,0.280555333333333,0.765555333333333},
+ {0.263333333333333,0.776666666666667,0.272777333333333,0.771666666666667},
+ {0.252777333333333,0.781111333333333,0.263333333333333,0.776666666666667},
+ {0.241666666666666,0.783888666666667,0.252777333333333,0.781111333333333},
+ {0.229444,0.786666666666667,0.241666666666666,0.783888666666667},
+ {0.216666666666666,0.788888666666667,0.229444,0.786666666666667},
+ {0.202777333333334,0.79,0.216666666666666,0.788888666666667},
+ {0.188888666666666,0.791111333333333,0.202777333333334,0.79},
+ {0.173888666666667,0.791666666666667,0.188888666666666,0.791111333333333},
+ {0.159443999999999,0.792222,0.173888666666667,0.791666666666667},
+ {0.145,0.791666666666667,0.159443999999999,0.792222},
+ {0.13,0.791111333333333,0.145,0.791666666666667},
+ {0.116110666666666,0.79,0.13,0.791111333333333},
+ {0.102222,0.788888666666667,0.116110666666666,0.79},
+ {0.0894440000000003,0.786666666666667,0.102222,0.788888666666667},
+ {0.0772220000000002,0.783888666666667,0.0894440000000003,0.786666666666667},
+ {0.0661106666666669,0.781111333333333,0.0772220000000002,0.783888666666667},
+ {0.0555553333333331,0.776666666666667,0.0661106666666669,0.781111333333333},
+ {0.0461106666666661,0.771666666666667,0.0555553333333331,0.776666666666667},
+ {0.0383333333333328,0.765555333333333,0.0461106666666661,0.771666666666667},
+ {0.0311106666666667,0.758333333333334,0.0383333333333328,0.765555333333333},
+ {0.0249999999999998,0.75,0.0311106666666667,0.758333333333334},
+ {0.020555333333333,0.741666666666667,0.0249999999999998,0.75},
+ {0.0166666666666669,0.731666666666667,0.020555333333333,0.741666666666667},
+ {0.013333333333333,0.720555333333333,0.0166666666666669,0.731666666666667},
+ {0.0105553333333326,0.707778,0.013333333333333,0.720555333333333},
+ {0.00833333333333286,0.694444666666667,0.0105553333333326,0.707778},
+ {0.00611066666666697,0.678888666666667,0.00833333333333286,0.694444666666667},
+ {0.00444399999999945,0.662778,0.00611066666666697,0.678888666666667},
+ {0.00333333333333267,0.645555333333334,0.00444399999999945,0.662778},
+ {0.00222199999999972,0.627222,0.00333333333333267,0.645555333333334},
+ {0.00111066666666678,0.607778,0.00222199999999972,0.627222},
+ {0.000555333333333389,0.588333333333334,0.00111066666666678,0.607778},
+ {0,0.567778,0.000555333333333389,0.588333333333334},
+ {0,0.546666666666667,0,0.567778},
+ {0,0.525555333333333,0,0.546666666666667},
+ {0,0.505,0,0.525555333333333},
+ {0,0.483888666666667,0,0.505},
+ {0.000555333333333389,0.463333333333334,0,0.483888666666667},
+ {0.00111066666666678,0.443888666666667,0.000555333333333389,0.463333333333334},
+ {0.00222199999999972,0.424444666666667,0.00111066666666678,0.443888666666667},
+ {0.00333333333333267,0.406111333333333,0.00222199999999972,0.424444666666667},
+ {0.00444399999999945,0.388888666666666,0.00333333333333267,0.406111333333333},
+ {0.00611066666666697,0.372778,0.00444399999999945,0.388888666666666},
+ {0.00833333333333286,0.357222,0.00611066666666697,0.372778},
+ {0.0105553333333326,0.343888666666667,0.00833333333333286,0.357222},
+ {0.013333333333333,0.331111333333334,0.0105553333333326,0.343888666666667},
+ {0.0166666666666669,0.32,0.013333333333333,0.331111333333334},
+ {0.020555333333333,0.31,0.0166666666666669,0.32},
+ {0.0249999999999998,0.301666666666667,0.020555333333333,0.31},
+ {0.0311106666666667,0.293333333333334,0.0249999999999998,0.301666666666667},
+ {0.0383333333333328,0.286111333333333,0.0311106666666667,0.293333333333334},
+ {0.0461106666666661,0.28,0.0383333333333328,0.286111333333333},
+ {0.0555553333333331,0.275,0.0461106666666661,0.28},
+ {0.0661106666666669,0.270555333333334,0.0555553333333331,0.275},
+ {0.0772220000000002,0.267778,0.0661106666666669,0.270555333333334},
+ {0.0894440000000003,0.265,0.0772220000000002,0.267778},
+ {0.102222,0.262778,0.0894440000000003,0.265},
+ {0.116110666666666,0.261666666666667,0.102222,0.262778},
+ {0.13,0.260555333333333,0.116110666666666,0.261666666666667},
+ {0.145,0.26,0.13,0.260555333333333},
+ {0.159443999999999,0.259444666666666,0.145,0.26},
+ {0.173888666666667,0.26,0.159443999999999,0.259444666666666},
+ {0.188888666666666,0.260555333333333,0.173888666666667,0.26},
+ {0.202777333333334,0.261666666666667,0.188888666666666,0.260555333333333},
+ {0.216666666666666,0.262778,0.202777333333334,0.261666666666667},
+ {0.229444,0.265,0.216666666666666,0.262778},
+ {0.241666666666666,0.267778,0.229444,0.265},
+ {0.252777333333333,0.270555333333334,0.241666666666666,0.267778},
+ {0.263333333333333,0.275,0.252777333333333,0.270555333333334},
+ {0.272777333333333,0.28,0.263333333333333,0.275},
+ {0.280555333333333,0.286111333333333,0.272777333333333,0.28},
+ {0.287777333333333,0.293333333333334,0.280555333333333,0.286111333333333},
+ {0.293888666666666,0.301666666666667,0.287777333333333,0.293333333333334},
+ {0.210555333333333,0.397222,0.212221999999999,0.403888666666666},
+ {0.212221999999999,0.403888666666666,0.213888666666667,0.411666666666667},
+ {0.213888666666667,0.411666666666667,0.215,0.421111333333334},
+ {0.215,0.421111333333334,0.216110666666667,0.431666666666667},
+ {0.216110666666667,0.431666666666667,0.217222,0.443333333333333},
+ {0.217222,0.443333333333333,0.217777333333333,0.456111333333334},
+ {0.217777333333333,0.456111333333334,0.218333333333333,0.47},
+ {0.218333333333333,0.47,0.218333333333333,0.485},
+ {0.218333333333333,0.485,0.218888666666666,0.5},
+ {0.218888666666666,0.5,0.218888666666666,0.516111333333334},
+ {0.218888666666666,0.516111333333334,0.218888666666666,0.532222},
+ {0.218888666666666,0.532222,0.218888666666666,0.547778},
+ {0.218888666666666,0.547778,0.218888666666666,0.563888666666667},
+ {0.218888666666666,0.563888666666667,0.218333333333333,0.578888666666667},
+ {0.218333333333333,0.578888666666667,0.218333333333333,0.593888666666667},
+ {0.218333333333333,0.593888666666667,0.217777333333333,0.607778},
+ {0.217777333333333,0.607778,0.217222,0.620555333333333},
+ {0.217222,0.620555333333333,0.216110666666667,0.632222},
+ {0.216110666666667,0.632222,0.215,0.642778},
+ {0.215,0.642778,0.213888666666667,0.652222},
+ {0.213888666666667,0.652222,0.212221999999999,0.66},
+ {0.212221999999999,0.66,0.210555333333333,0.666666666666667},
+ {0.210555333333333,0.666666666666667,0.208333333333333,0.672778},
+ {0.208333333333333,0.672778,0.204999999999999,0.677778},
+ {0.204999999999999,0.677778,0.201666666666667,0.681666666666667},
+ {0.201666666666667,0.681666666666667,0.197777333333333,0.685},
+ {0.197777333333333,0.685,0.193333333333333,0.687222},
+ {0.193333333333333,0.687222,0.188333333333333,0.688888666666667},
+ {0.188333333333333,0.688888666666667,0.182777333333333,0.690555333333334},
+ {0.182777333333333,0.690555333333334,0.177221999999999,0.691111333333333},
+ {0.177221999999999,0.691111333333333,0.171666666666667,0.691666666666666},
+ {0.159443999999999,0.691666666666666,0.153888666666666,0.691111333333333},
+ {0.153888666666666,0.691111333333333,0.148333333333333,0.690555333333334},
+ {0.148333333333333,0.690555333333334,0.142777333333332,0.688888666666667},
+ {0.142777333333332,0.688888666666667,0.137777333333333,0.687222},
+ {0.137777333333333,0.687222,0.133333333333333,0.685},
+ {0.133333333333333,0.685,0.129443999999999,0.681666666666667},
+ {0.129443999999999,0.681666666666667,0.126110666666667,0.677778},
+ {0.126110666666667,0.677778,0.122777333333333,0.672778},
+ {0.122777333333333,0.672778,0.120555333333333,0.666666666666667},
+ {0.120555333333333,0.666666666666667,0.118888666666667,0.66},
+ {0.118888666666667,0.66,0.117221999999999,0.652222},
+ {0.117221999999999,0.652222,0.116110666666666,0.642778},
+ {0.116110666666666,0.642778,0.115,0.632222},
+ {0.115,0.632222,0.113888666666667,0.620555333333333},
+ {0.113888666666667,0.620555333333333,0.113333333333333,0.607778},
+ {0.113333333333333,0.607778,0.112777333333333,0.593888666666667},
+ {0.112777333333333,0.593888666666667,0.112777333333333,0.578888666666667},
+ {0.112777333333333,0.578888666666667,0.112221999999999,0.563888666666667},
+ {0.112221999999999,0.563888666666667,0.112221999999999,0.547778},
+ {0.112221999999999,0.547778,0.112221999999999,0.531666666666667},
+ {0.112221999999999,0.531666666666667,0.112221999999999,0.516111333333334},
+ {0.112221999999999,0.516111333333334,0.112221999999999,0.5},
+ {0.112221999999999,0.5,0.112777333333333,0.485},
+ {0.112777333333333,0.485,0.112777333333333,0.47},
+ {0.112777333333333,0.47,0.113333333333333,0.456111333333334},
+ {0.113333333333333,0.456111333333334,0.113888666666667,0.443333333333333},
+ {0.113888666666667,0.443333333333333,0.115,0.431666666666667},
+ {0.115,0.431666666666667,0.116110666666666,0.421111333333334},
+ {0.116110666666666,0.421111333333334,0.117221999999999,0.411666666666667},
+ {0.117221999999999,0.411666666666667,0.118888666666667,0.403888666666666},
+ {0.118888666666667,0.403888666666666,0.120555333333333,0.397222},
+ {0.120555333333333,0.397222,0.122777333333333,0.391111333333334},
+ {0.122777333333333,0.391111333333334,0.126110666666667,0.386111333333333},
+ {0.126110666666667,0.386111333333333,0.129443999999999,0.382222},
+ {0.129443999999999,0.382222,0.133333333333333,0.378888666666667},
+ {0.133333333333333,0.378888666666667,0.137777333333333,0.376666666666667},
+ {0.137777333333333,0.376666666666667,0.142777333333332,0.375},
+ {0.142777333333332,0.375,0.148333333333333,0.373333333333333},
+ {0.148333333333333,0.373333333333333,0.153888666666666,0.372778},
+ {0.153888666666666,0.372778,0.159443999999999,0.372222},
+ {0.171666666666667,0.372222,0.177221999999999,0.372778},
+ {0.177221999999999,0.372778,0.182777333333333,0.373333333333333},
+ {0.182777333333333,0.373333333333333,0.188333333333333,0.375},
+ {0.188333333333333,0.375,0.193333333333333,0.376666666666667},
+ {0.193333333333333,0.376666666666667,0.197777333333333,0.378888666666667},
+ {0.197777333333333,0.378888666666667,0.201666666666667,0.382222},
+ {0.201666666666667,0.382222,0.204999999999999,0.386111333333333},
+ {0.204999999999999,0.386111333333333,0.208333333333333,0.391111333333334},
+ {0.208333333333333,0.391111333333334,0.210555333333333,0.397222},
+ {0,0,0,0}
+};
+
+double Icon13[][4] = {
+ {0.0994446666666668,0.297222,0.0977779999999993,0.288888666666667},
+ {0.100555333333332,0.307222,0.0994446666666668,0.297222},
+ {0.101666666666667,0.318333333333333,0.100555333333332,0.307222},
+ {0.102778,0.331111333333334,0.101666666666667,0.318333333333333},
+ {0.103333333333333,0.344444666666667,0.102778,0.331111333333334},
+ {0.103888666666666,0.36,0.103333333333333,0.344444666666667},
+ {0.104444666666666,0.376111333333334,0.103888666666666,0.36},
+ {0.104999999999999,0.393333333333333,0.104444666666666,0.376111333333334},
+ {0.105555333333333,0.411666666666667,0.104999999999999,0.393333333333333},
+ {0.105555333333333,0.431111333333333,0.105555333333333,0.411666666666667},
+ {0.106111333333333,0.450555333333333,0.105555333333333,0.431111333333333},
+ {0.106111333333333,0.471111333333334,0.106111333333333,0.450555333333333},
+ {0.106111333333333,0.492222,0.106111333333333,0.471111333333334},
+ {0.106111333333333,0.513333333333333,0.106111333333333,0.492222},
+ {0.106111333333333,0.533888666666667,0.106111333333333,0.513333333333333},
+ {0.106111333333333,0.555,0.106111333333333,0.533888666666667},
+ {0.106111333333333,0.575555333333333,0.106111333333333,0.555},
+ {0.105555333333333,0.595,0.106111333333333,0.575555333333333},
+ {0.105555333333333,0.614444666666667,0.105555333333333,0.595},
+ {0.104999999999999,0.632778,0.105555333333333,0.614444666666667},
+ {0.104444666666666,0.65,0.104999999999999,0.632778},
+ {0.103888666666666,0.666111333333333,0.104444666666666,0.65},
+ {0.103333333333333,0.681666666666667,0.103888666666666,0.666111333333333},
+ {0.102778,0.695,0.103333333333333,0.681666666666667},
+ {0.101666666666667,0.707778,0.102778,0.695},
+ {0.100555333333332,0.718888666666667,0.101666666666667,0.707778},
+ {0.0994446666666668,0.728888666666667,0.100555333333332,0.718888666666667},
+ {0.0977779999999993,0.737222,0.0994446666666668,0.728888666666667},
+ {0.096111333333333,0.744444666666666,0.0977779999999993,0.737222},
+ {0.0944446666666666,0.750555333333333,0.096111333333333,0.744444666666666},
+ {0.0922219999999996,0.755555333333334,0.0944446666666666,0.750555333333333},
+ {0.0899999999999999,0.76,0.0922219999999996,0.755555333333334},
+ {0.0877780000000001,0.763888666666666,0.0899999999999999,0.76},
+ {0.0849999999999997,0.767222,0.0877780000000001,0.763888666666666},
+ {0.0816666666666658,0.77,0.0849999999999997,0.767222},
+ {0.0788886666666665,0.772222,0.0816666666666658,0.77},
+ {0.0755553333333327,0.774444666666666,0.0788886666666665,0.772222},
+ {0.072222,0.776111333333333,0.0755553333333327,0.774444666666666},
+ {0.0683333333333328,0.777222,0.072222,0.776111333333333},
+ {0.0644446666666667,0.778333333333334,0.0683333333333328,0.777222},
+ {0.0611113333333329,0.778888666666666,0.0644446666666667,0.778333333333334},
+ {0.052778,0.779444666666667,0.0572219999999994,0.778888666666666},
+ {0.0488886666666666,0.778888666666666,0.052778,0.779444666666667},
+ {0.0416666666666667,0.778333333333334,0.0449999999999993,0.778888666666666},
+ {0.0377779999999994,0.777222,0.0416666666666667,0.778333333333334},
+ {0.033888666666666,0.776111333333333,0.0377779999999994,0.777222},
+ {0.0305553333333333,0.774444666666666,0.033888666666666,0.776111333333333},
+ {0.0272219999999995,0.772222,0.0305553333333333,0.774444666666666},
+ {0.0244446666666664,0.77,0.0272219999999995,0.772222},
+ {0.0211113333333325,0.767222,0.0244446666666664,0.77},
+ {0.0183333333333332,0.763888666666666,0.0211113333333325,0.767222},
+ {0.0161113333333335,0.76,0.0183333333333332,0.763888666666666},
+ {0.0138886666666664,0.755555333333334,0.0161113333333335,0.76},
+ {0.0116666666666667,0.750555333333333,0.0138886666666664,0.755555333333334},
+ {0.00999999999999919,0.744444666666666,0.0116666666666667,0.750555333333333},
+ {0.00833333333333286,0.737222,0.00999999999999919,0.744444666666666},
+ {0.00666666666666652,0.728888666666667,0.00833333333333286,0.737222},
+ {0.00555533333333358,0.718888666666667,0.00666666666666652,0.728888666666667},
+ {0.0044446666666668,0.707778,0.00555533333333358,0.718888666666667},
+ {0.00333333333333267,0.695,0.0044446666666668,0.707778},
+ {0.00277799999999928,0.681666666666667,0.00333333333333267,0.695},
+ {0.00222199999999972,0.666111333333333,0.00277799999999928,0.681666666666667},
+ {0.00166666666666634,0.65,0.00222199999999972,0.666111333333333},
+ {0.00111133333333295,0.632778,0.00166666666666634,0.65},
+ {0.000555333333333389,0.614444666666667,0.00111133333333295,0.632778},
+ {0.000555333333333389,0.595,0.000555333333333389,0.614444666666667},
+ {0,0.575555333333333,0.000555333333333389,0.595},
+ {0,0.555,0,0.575555333333333},
+ {0,0.533888666666667,0,0.555},
+ {0,0.512778,0,0.533888666666667},
+ {0,0.492222,0,0.512778},
+ {0,0.471111333333334,0,0.492222},
+ {0,0.450555333333333,0,0.471111333333334},
+ {0.000555333333333389,0.431111333333333,0,0.450555333333333},
+ {0.000555333333333389,0.411666666666667,0.000555333333333389,0.431111333333333},
+ {0.00111133333333295,0.393333333333333,0.000555333333333389,0.411666666666667},
+ {0.00166666666666634,0.376111333333334,0.00111133333333295,0.393333333333333},
+ {0.00222199999999972,0.36,0.00166666666666634,0.376111333333334},
+ {0.00277799999999928,0.344444666666667,0.00222199999999972,0.36},
+ {0.00333333333333267,0.331111333333334,0.00277799999999928,0.344444666666667},
+ {0.0044446666666668,0.318333333333333,0.00333333333333267,0.331111333333334},
+ {0.00555533333333358,0.307222,0.0044446666666668,0.318333333333333},
+ {0.00666666666666652,0.297222,0.00555533333333358,0.307222},
+ {0.00833333333333286,0.288888666666667,0.00666666666666652,0.297222},
+ {0.00999999999999919,0.281666666666667,0.00833333333333286,0.288888666666667},
+ {0.0116666666666667,0.275555333333333,0.00999999999999919,0.281666666666667},
+ {0.0138886666666664,0.270555333333334,0.0116666666666667,0.275555333333333},
+ {0.0161113333333335,0.266111333333334,0.0138886666666664,0.270555333333334},
+ {0.0183333333333332,0.262222,0.0161113333333335,0.266111333333334},
+ {0.0211113333333325,0.258888666666667,0.0183333333333332,0.262222},
+ {0.0244446666666664,0.256111333333333,0.0211113333333325,0.258888666666667},
+ {0.0272219999999995,0.253888666666667,0.0244446666666664,0.256111333333333},
+ {0.0305553333333333,0.251666666666667,0.0272219999999995,0.253888666666667},
+ {0.033888666666666,0.25,0.0305553333333333,0.251666666666667},
+ {0.0377779999999994,0.248888666666667,0.033888666666666,0.25},
+ {0.0416666666666667,0.247778,0.0377779999999994,0.248888666666667},
+ {0.0449999999999993,0.247222,0.0416666666666667,0.247778},
+ {0.0533333333333334,0.246666666666667,0.0488886666666666,0.247222},
+ {0.0572219999999994,0.247222,0.0533333333333334,0.246666666666667},
+ {0.0644446666666667,0.247778,0.0611113333333329,0.247222},
+ {0.0683333333333328,0.248888666666667,0.0644446666666667,0.247778},
+ {0.072222,0.25,0.0683333333333328,0.248888666666667},
+ {0.0755553333333327,0.251666666666667,0.072222,0.25},
+ {0.0788886666666665,0.253888666666667,0.0755553333333327,0.251666666666667},
+ {0.0816666666666658,0.256111333333333,0.0788886666666665,0.253888666666667},
+ {0.0849999999999997,0.258888666666667,0.0816666666666658,0.256111333333333},
+ {0.0877780000000001,0.262222,0.0849999999999997,0.258888666666667},
+ {0.0899999999999999,0.266111333333334,0.0877780000000001,0.262222},
+ {0.0922219999999996,0.270555333333334,0.0899999999999999,0.266111333333334},
+ {0.0944446666666666,0.275555333333333,0.0922219999999996,0.270555333333334},
+ {0.096111333333333,0.281666666666667,0.0944446666666666,0.275555333333333},
+ {0.0977779999999993,0.288888666666667,0.096111333333333,0.281666666666667},
+ {0,0,0,0}
+};
+
+double Icon14[][4] = {
+ {0.296110666666666,0.295555333333333,0.290555333333332,0.288888666666667},
+ {0.300555333333333,0.303333333333333,0.296110666666666,0.295555333333333},
+ {0.304444,0.312778,0.300555333333333,0.303333333333333},
+ {0.307221999999999,0.323333333333334,0.304444,0.312778},
+ {0.309443999999999,0.335,0.307221999999999,0.323333333333334},
+ {0.310555333333333,0.347778,0.309443999999999,0.335},
+ {0.311666666666666,0.361666666666667,0.310555333333333,0.347778},
+ {0.312222,0.376111333333334,0.311666666666666,0.361666666666667},
+ {0.312222,0.391666666666667,0.312222,0.376111333333334},
+ {0.312222,0.407222,0.312222,0.391666666666667},
+ {0.311666666666666,0.423333333333333,0.312222,0.407222},
+ {0.310555333333333,0.439444666666667,0.311666666666666,0.423333333333333},
+ {0.31,0.455,0.310555333333333,0.439444666666667},
+ {0.308888666666667,0.470555333333333,0.31,0.455},
+ {0.307221999999999,0.485,0.308888666666667,0.470555333333333},
+ {0.306110666666666,0.498888666666667,0.307221999999999,0.485},
+ {0.304444,0.511666666666667,0.306110666666666,0.498888666666667},
+ {0.302221999999999,0.523333333333333,0.304444,0.511666666666667},
+ {0.299999999999999,0.533888666666667,0.302221999999999,0.523333333333333},
+ {0.297222,0.543333333333334,0.299999999999999,0.533888666666667},
+ {0.294444,0.551111333333333,0.297222,0.543333333333334},
+ {0.290555333333332,0.557778,0.294444,0.551111333333333},
+ {0.284443999999999,0.565,0.290555333333332,0.557778},
+ {0.276110666666667,0.570555333333333,0.284443999999999,0.565},
+ {0.266666666666667,0.573333333333334,0.276110666666667,0.570555333333333},
+ {0.255555333333334,0.574444666666666,0.266666666666667,0.573333333333334},
+ {0.243333333333333,0.573888666666667,0.255555333333334,0.574444666666666},
+ {0.229999999999999,0.572222,0.243333333333333,0.573888666666667},
+ {0.215555333333333,0.569444666666667,0.229999999999999,0.572222},
+ {0.201110666666666,0.566111333333333,0.215555333333333,0.569444666666667},
+ {0.186110666666667,0.562778,0.201110666666666,0.566111333333333},
+ {0.171666666666667,0.559444666666667,0.186110666666667,0.562778},
+ {0.158333333333333,0.556666666666667,0.171666666666667,0.559444666666667},
+ {0.146110666666666,0.554444666666667,0.158333333333333,0.556666666666667},
+ {0.134999999999999,0.553888666666667,0.146110666666666,0.554444666666667},
+ {0.117221999999999,0.555555333333333,0.125555333333333,0.553888666666667},
+ {0.111110666666666,0.557778,0.117221999999999,0.555555333333333},
+ {0.106110666666666,0.561111333333334,0.111110666666666,0.557778},
+ {0.102222,0.565,0.106110666666666,0.561111333333334},
+ {0.0994439999999995,0.569444666666667,0.102222,0.565},
+ {0.0972219999999998,0.575,0.0994439999999995,0.569444666666667},
+ {0.0961106666666668,0.581666666666666,0.0972219999999998,0.575},
+ {0.095,0.588333333333334,0.0961106666666668,0.581666666666666},
+ {0.0944439999999993,0.595555333333333,0.095,0.588333333333334},
+ {0.0944439999999993,0.602778,0.0944439999999993,0.595555333333333},
+ {0.0944439999999993,0.61,0.0944439999999993,0.602778},
+ {0.095,0.617222,0.0944439999999993,0.61},
+ {0.0961106666666668,0.623888666666667,0.095,0.617222},
+ {0.0972219999999998,0.630555333333334,0.0961106666666668,0.623888666666667},
+ {0.0994439999999995,0.636111333333333,0.0972219999999998,0.630555333333334},
+ {0.102222,0.640555333333333,0.0994439999999995,0.636111333333333},
+ {0.106110666666666,0.644444666666667,0.102222,0.640555333333333},
+ {0.111110666666666,0.647778,0.106110666666666,0.644444666666667},
+ {0.117221999999999,0.65,0.111110666666666,0.647778},
+ {0.125555333333333,0.651666666666667,0.117221999999999,0.65},
+ {0.134999999999999,0.652778,0.125555333333333,0.651666666666667},
+ {0.158333333333333,0.652222,0.146110666666666,0.652778},
+ {0.171666666666667,0.651111333333333,0.158333333333333,0.652222},
+ {0.186110666666667,0.649444666666666,0.171666666666667,0.651111333333333},
+ {0.201110666666666,0.647778,0.186110666666667,0.649444666666666},
+ {0.215555333333333,0.646111333333333,0.201110666666666,0.647778},
+ {0.229999999999999,0.644444666666667,0.215555333333333,0.646111333333333},
+ {0.243333333333333,0.643333333333333,0.229999999999999,0.644444666666667},
+ {0.255555333333334,0.642778,0.243333333333333,0.643333333333333},
+ {0.276110666666667,0.643888666666667,0.266666666666667,0.642778},
+ {0.284443999999999,0.645555333333334,0.276110666666667,0.643888666666667},
+ {0.290555333333332,0.647778,0.284443999999999,0.645555333333334},
+ {0.294999999999999,0.650555333333333,0.290555333333332,0.647778},
+ {0.298888666666667,0.653888666666666,0.294999999999999,0.650555333333333},
+ {0.301666666666666,0.657778,0.298888666666667,0.653888666666666},
+ {0.303888666666667,0.662778,0.301666666666666,0.657778},
+ {0.306110666666666,0.667778,0.303888666666667,0.662778},
+ {0.307777333333333,0.673333333333333,0.306110666666666,0.667778},
+ {0.309443999999999,0.679444666666667,0.307777333333333,0.673333333333333},
+ {0.310555333333333,0.686111333333334,0.309443999999999,0.679444666666667},
+ {0.311666666666666,0.692778,0.310555333333333,0.686111333333334},
+ {0.312222,0.698888666666667,0.311666666666666,0.692778},
+ {0.312222,0.705555333333334,0.312222,0.698888666666667},
+ {0.312222,0.711666666666667,0.312222,0.705555333333334},
+ {0.311110666666667,0.717222,0.312222,0.711666666666667},
+ {0.308888666666667,0.722222,0.311110666666667,0.717222},
+ {0.306110666666666,0.727222,0.308888666666667,0.722222},
+ {0.302221999999999,0.731111333333333,0.306110666666666,0.727222},
+ {0.297222,0.734444666666667,0.302221999999999,0.731111333333333},
+ {0.290555333333332,0.737222,0.297222,0.734444666666667},
+ {0.283888666666666,0.738888666666667,0.290555333333332,0.737222},
+ {0.276110666666667,0.740555333333334,0.283888666666666,0.738888666666667},
+ {0.266666666666667,0.742222,0.276110666666667,0.740555333333334},
+ {0.256110666666667,0.743888666666667,0.266666666666667,0.742222},
+ {0.244444,0.745,0.256110666666667,0.743888666666667},
+ {0.231666666666667,0.746666666666667,0.244444,0.745},
+ {0.217777333333333,0.748333333333333,0.231666666666667,0.746666666666667},
+ {0.203333333333333,0.749444666666667,0.217777333333333,0.748333333333333},
+ {0.187777333333333,0.751111333333334,0.203333333333333,0.749444666666667},
+ {0.172222,0.752778,0.187777333333333,0.751111333333334},
+ {0.156110666666667,0.753888666666667,0.172222,0.752778},
+ {0.139999999999999,0.755,0.156110666666667,0.753888666666667},
+ {0.124443999999999,0.756111333333333,0.139999999999999,0.755},
+ {0.108888666666666,0.756666666666667,0.124443999999999,0.756111333333333},
+ {0.0805553333333329,0.756111333333333,0.0944439999999993,0.756666666666667},
+ {0.0677773333333332,0.755,0.0805553333333329,0.756111333333333},
+ {0.0561106666666665,0.753333333333333,0.0677773333333332,0.755},
+ {0.0455553333333327,0.750555333333333,0.0561106666666665,0.753333333333333},
+ {0.0361106666666669,0.747222,0.0455553333333327,0.750555333333333},
+ {0.0283333333333336,0.742778,0.0361106666666669,0.747222},
+ {0.0216666666666659,0.737222,0.0283333333333336,0.742778},
+ {0.0161106666666662,0.730555333333333,0.0216666666666659,0.737222},
+ {0.0116666666666667,0.722778,0.0161106666666662,0.730555333333333},
+ {0.0077773333333333,0.713333333333334,0.0116666666666667,0.722778},
+ {0.00500000000000019,0.702778,0.0077773333333333,0.713333333333334},
+ {0.00277733333333311,0.691111333333333,0.00500000000000019,0.702778},
+ {0.00166666666666634,0.678333333333333,0.00277733333333311,0.691111333333333},
+ {0.000555333333333389,0.664444666666667,0.00166666666666634,0.678333333333333},
+ {0,0.65,0.000555333333333389,0.664444666666667},
+ {0,0.634444666666666,0,0.65},
+ {0,0.618888666666667,0,0.634444666666666},
+ {0.000555333333333389,0.602778,0,0.618888666666667},
+ {0.00166666666666634,0.586666666666667,0.000555333333333389,0.602778},
+ {0.00222199999999972,0.571111333333333,0.00166666666666634,0.586666666666667},
+ {0.00333333333333267,0.555555333333333,0.00222199999999972,0.571111333333333},
+ {0.00500000000000019,0.541111333333333,0.00333333333333267,0.555555333333333},
+ {0.00611066666666697,0.527222,0.00500000000000019,0.541111333333333},
+ {0.0077773333333333,0.514444666666667,0.00611066666666697,0.527222},
+ {0.00999999999999919,0.502778,0.0077773333333333,0.514444666666667},
+ {0.0122220000000001,0.492222,0.00999999999999919,0.502778},
+ {0.0149999999999994,0.482778,0.0122220000000001,0.492222},
+ {0.0177773333333325,0.475,0.0149999999999994,0.482778},
+ {0.0216666666666659,0.468333333333333,0.0177773333333325,0.475},
+ {0.0277773333333329,0.461111333333333,0.0216666666666659,0.468333333333333},
+ {0.0361106666666669,0.455555333333334,0.0277773333333329,0.461111333333333},
+ {0.0455553333333327,0.452778,0.0361106666666669,0.455555333333334},
+ {0.056666666666666,0.451666666666667,0.0455553333333327,0.452778},
+ {0.0688886666666662,0.452222,0.056666666666666,0.451666666666667},
+ {0.0822219999999992,0.453888666666667,0.0688886666666662,0.452222},
+ {0.0966666666666664,0.456666666666666,0.0822219999999992,0.453888666666667},
+ {0.111666666666667,0.46,0.0966666666666664,0.456666666666666},
+ {0.126110666666667,0.463333333333334,0.111666666666667,0.46},
+ {0.140555333333333,0.466666666666667,0.126110666666667,0.463333333333334},
+ {0.153888666666666,0.469444666666667,0.140555333333333,0.466666666666667},
+ {0.166110666666666,0.471666666666666,0.153888666666666,0.469444666666667},
+ {0.177221999999999,0.472222,0.166110666666666,0.471666666666666},
+ {0.195,0.470555333333333,0.186666666666666,0.472222},
+ {0.201110666666666,0.468333333333333,0.195,0.470555333333333},
+ {0.206110666666666,0.465,0.201110666666666,0.468333333333333},
+ {0.21,0.461111333333333,0.206110666666666,0.465},
+ {0.212777333333333,0.456666666666666,0.21,0.461111333333333},
+ {0.215,0.451111333333333,0.212777333333333,0.456666666666666},
+ {0.216110666666667,0.444444666666667,0.215,0.451111333333333},
+ {0.217222,0.437778,0.216110666666667,0.444444666666667},
+ {0.217777333333333,0.430555333333333,0.217222,0.437778},
+ {0.217777333333333,0.423333333333333,0.217777333333333,0.430555333333333},
+ {0.217777333333333,0.416111333333333,0.217777333333333,0.423333333333333},
+ {0.217222,0.408888666666667,0.217777333333333,0.416111333333333},
+ {0.216110666666667,0.402222,0.217222,0.408888666666667},
+ {0.215,0.395555333333334,0.216110666666667,0.402222},
+ {0.212777333333333,0.39,0.215,0.395555333333334},
+ {0.21,0.385555333333333,0.212777333333333,0.39},
+ {0.206110666666666,0.381666666666667,0.21,0.385555333333333},
+ {0.201110666666666,0.378333333333333,0.206110666666666,0.381666666666667},
+ {0.195,0.376111333333334,0.201110666666666,0.378333333333333},
+ {0.186666666666666,0.374444666666667,0.195,0.376111333333334},
+ {0.177221999999999,0.373333333333333,0.186666666666666,0.374444666666667},
+ {0.153888666666666,0.373888666666667,0.166110666666666,0.373333333333333},
+ {0.140555333333333,0.375,0.153888666666666,0.373888666666667},
+ {0.126110666666667,0.376666666666667,0.140555333333333,0.375},
+ {0.111666666666667,0.378333333333333,0.126110666666667,0.376666666666667},
+ {0.0966666666666664,0.38,0.111666666666667,0.378333333333333},
+ {0.0822219999999992,0.381666666666667,0.0966666666666664,0.38},
+ {0.0688886666666662,0.382778,0.0822219999999992,0.381666666666667},
+ {0.056666666666666,0.383333333333334,0.0688886666666662,0.382778},
+ {0.0361106666666669,0.382222,0.0455553333333327,0.383333333333334},
+ {0.0277773333333329,0.380555333333334,0.0361106666666669,0.382222},
+ {0.0216666666666659,0.378333333333333,0.0277773333333329,0.380555333333334},
+ {0.0172220000000003,0.375555333333333,0.0216666666666659,0.378333333333333},
+ {0.013333333333333,0.372222,0.0172220000000003,0.375555333333333},
+ {0.0105553333333326,0.368333333333334,0.013333333333333,0.372222},
+ {0.00833333333333286,0.363333333333333,0.0105553333333326,0.368333333333334},
+ {0.00611066666666697,0.358333333333333,0.00833333333333286,0.363333333333333},
+ {0.00444399999999945,0.352778,0.00611066666666697,0.358333333333333},
+ {0.00277733333333311,0.346666666666666,0.00444399999999945,0.352778},
+ {0.00166666666666634,0.34,0.00277733333333311,0.346666666666666},
+ {0.000555333333333389,0.333333333333333,0.00166666666666634,0.34},
+ {0,0.327222,0.000555333333333389,0.333333333333333},
+ {0,0.320555333333333,0,0.327222},
+ {0,0.314444666666667,0,0.320555333333333},
+ {0.00111066666666678,0.308888666666667,0,0.314444666666667},
+ {0.00333333333333267,0.303888666666667,0.00111066666666678,0.308888666666667},
+ {0.00611066666666697,0.298888666666667,0.00333333333333267,0.303888666666667},
+ {0.00999999999999919,0.295,0.00611066666666697,0.298888666666667},
+ {0.0149999999999994,0.291666666666667,0.00999999999999919,0.295},
+ {0.0216666666666659,0.288888666666667,0.0149999999999994,0.291666666666667},
+ {0.0283333333333336,0.287222,0.0216666666666659,0.288888666666667},
+ {0.0361106666666669,0.285555333333334,0.0283333333333336,0.287222},
+ {0.0455553333333327,0.283888666666667,0.0361106666666669,0.285555333333334},
+ {0.0561106666666665,0.282222,0.0455553333333327,0.283888666666667},
+ {0.0677773333333332,0.281111333333333,0.0561106666666665,0.282222},
+ {0.0805553333333329,0.279444666666667,0.0677773333333332,0.281111333333333},
+ {0.0944439999999993,0.277778,0.0805553333333329,0.279444666666667},
+ {0.108888666666666,0.276666666666667,0.0944439999999993,0.277778},
+ {0.124443999999999,0.275,0.108888666666666,0.276666666666667},
+ {0.139999999999999,0.273333333333333,0.124443999999999,0.275},
+ {0.156110666666667,0.272222,0.139999999999999,0.273333333333333},
+ {0.172222,0.271111333333333,0.156110666666667,0.272222},
+ {0.187777333333333,0.27,0.172222,0.271111333333333},
+ {0.203333333333333,0.269444666666667,0.187777333333333,0.27},
+ {0.231666666666667,0.27,0.217777333333333,0.269444666666667},
+ {0.244444,0.271111333333333,0.231666666666667,0.27},
+ {0.256110666666667,0.272778,0.244444,0.271111333333333},
+ {0.266666666666667,0.275555333333333,0.256110666666667,0.272778},
+ {0.276110666666667,0.278888666666666,0.266666666666667,0.275555333333333},
+ {0.283888666666666,0.283333333333333,0.276110666666667,0.278888666666666},
+ {0.290555333333332,0.288888666666667,0.283888666666666,0.283333333333333},
+ {0,0,0,0}
+};
+
+double Icon15[][4] = {
+ {0.294999999999999,0.297222,0.290555333333334,0.288888666666667},
+ {0.298888666666667,0.307222,0.294999999999999,0.297222},
+ {0.302222,0.318333333333333,0.298888666666667,0.307222},
+ {0.305,0.331111333333334,0.302222,0.318333333333333},
+ {0.307221999999999,0.344444666666667,0.305,0.331111333333334},
+ {0.309444666666666,0.36,0.307221999999999,0.344444666666667},
+ {0.311111333333333,0.376111333333334,0.309444666666666,0.36},
+ {0.312222,0.393333333333333,0.311111333333333,0.376111333333334},
+ {0.313333333333334,0.411666666666667,0.312222,0.393333333333333},
+ {0.314444666666667,0.431111333333333,0.313333333333334,0.411666666666667},
+ {0.315,0.450555333333333,0.314444666666667,0.431111333333333},
+ {0.315555333333333,0.471111333333334,0.315,0.450555333333333},
+ {0.315555333333333,0.492222,0.315555333333333,0.471111333333334},
+ {0.315555333333333,0.513333333333333,0.315555333333333,0.492222},
+ {0.315555333333333,0.533888666666667,0.315555333333333,0.513333333333333},
+ {0.315555333333333,0.555,0.315555333333333,0.533888666666667},
+ {0.315,0.575555333333333,0.315555333333333,0.555},
+ {0.314444666666667,0.595,0.315,0.575555333333333},
+ {0.313333333333334,0.614444666666667,0.314444666666667,0.595},
+ {0.312222,0.632778,0.313333333333334,0.614444666666667},
+ {0.311111333333333,0.65,0.312222,0.632778},
+ {0.309444666666666,0.666111333333333,0.311111333333333,0.65},
+ {0.307221999999999,0.681666666666667,0.309444666666666,0.666111333333333},
+ {0.305,0.695,0.307221999999999,0.681666666666667},
+ {0.302222,0.707778,0.305,0.695},
+ {0.298888666666667,0.718888666666667,0.302222,0.707778},
+ {0.294999999999999,0.728888666666667,0.298888666666667,0.718888666666667},
+ {0.290555333333334,0.737222,0.294999999999999,0.728888666666667},
+ {0.283888666666666,0.746666666666667,0.290555333333334,0.737222},
+ {0.276111333333333,0.753888666666667,0.283888666666666,0.746666666666667},
+ {0.266666666666667,0.76,0.276111333333333,0.753888666666667},
+ {0.256111333333333,0.763888666666666,0.266666666666667,0.76},
+ {0.244444666666666,0.766666666666667,0.256111333333333,0.763888666666666},
+ {0.231666666666667,0.768333333333333,0.244444666666666,0.766666666666667},
+ {0.217778,0.768888666666667,0.231666666666667,0.768333333333333},
+ {0.203333333333333,0.768333333333333,0.217778,0.768888666666667},
+ {0.187778,0.766666666666667,0.203333333333333,0.768333333333333},
+ {0.172222,0.765,0.187778,0.766666666666667},
+ {0.156111333333333,0.762222,0.172222,0.765},
+ {0.139999999999999,0.76,0.156111333333333,0.762222},
+ {0.124444666666667,0.757222,0.139999999999999,0.76},
+ {0.108888666666666,0.753888666666667,0.124444666666667,0.757222},
+ {0.0944446666666666,0.751666666666667,0.108888666666666,0.753888666666667},
+ {0.0805553333333329,0.748888666666667,0.0944446666666666,0.751666666666667},
+ {0.0677779999999994,0.746666666666667,0.0805553333333329,0.748888666666667},
+ {0.0561113333333327,0.744444666666666,0.0677779999999994,0.746666666666667},
+ {0.0455553333333327,0.742778,0.0561113333333327,0.744444666666666},
+ {0.0361113333333331,0.741111333333333,0.0455553333333327,0.742778},
+ {0.0283333333333336,0.738888666666667,0.0361113333333331,0.741111333333333},
+ {0.0216666666666671,0.737222,0.0283333333333336,0.738888666666667},
+ {0.0149999999999994,0.734444666666667,0.0216666666666671,0.737222},
+ {0.0100000000000004,0.731111333333333,0.0149999999999994,0.734444666666667},
+ {0.00611133333333314,0.727222,0.0100000000000004,0.731111333333333},
+ {0.00333333333333267,0.722222,0.00611133333333314,0.727222},
+ {0.00111133333333295,0.717222,0.00333333333333267,0.722222},
+ {0,0.711666666666667,0.00111133333333295,0.717222},
+ {0,0.705555333333334,0,0.711666666666667},
+ {0,0.698888666666667,0,0.705555333333334},
+ {0.000555333333333389,0.692222,0,0.698888666666667},
+ {0.00166666666666634,0.686111333333334,0.000555333333333389,0.692222},
+ {0.00277800000000046,0.679444666666667,0.00166666666666634,0.686111333333334},
+ {0.0044446666666668,0.673333333333333,0.00277800000000046,0.679444666666667},
+ {0.00611133333333314,0.667778,0.0044446666666668,0.673333333333333},
+ {0.00833333333333286,0.662778,0.00611133333333314,0.667778},
+ {0.0105553333333338,0.657778,0.00833333333333286,0.662778},
+ {0.013333333333333,0.653888666666666,0.0105553333333338,0.657778},
+ {0.0172220000000003,0.650555333333333,0.013333333333333,0.653888666666666},
+ {0.0216666666666671,0.647778,0.0172220000000003,0.650555333333333},
+ {0.0277780000000002,0.645555333333334,0.0216666666666671,0.647778},
+ {0.0361113333333331,0.643888666666667,0.0277780000000002,0.645555333333334},
+ {0.0455553333333327,0.642778,0.0361113333333331,0.643888666666667},
+ {0.0688886666666662,0.643333333333333,0.056666666666666,0.642778},
+ {0.0822220000000004,0.644444666666667,0.0688886666666662,0.643333333333333},
+ {0.0966666666666664,0.646111333333333,0.0822220000000004,0.644444666666667},
+ {0.111666666666667,0.647778,0.0966666666666664,0.646111333333333},
+ {0.126111333333333,0.649444666666666,0.111666666666667,0.647778},
+ {0.140555333333333,0.651111333333333,0.126111333333333,0.649444666666666},
+ {0.153888666666667,0.652222,0.140555333333333,0.651111333333333},
+ {0.166111333333333,0.652778,0.153888666666667,0.652222},
+ {0.186666666666666,0.651666666666667,0.177222,0.652778},
+ {0.195,0.65,0.186666666666666,0.651666666666667},
+ {0.201111333333333,0.647778,0.195,0.65},
+ {0.206666666666667,0.643888666666667,0.201111333333333,0.647778},
+ {0.210555333333333,0.639444666666667,0.206666666666667,0.643888666666667},
+ {0.213333333333334,0.633333333333334,0.210555333333333,0.639444666666667},
+ {0.214444666666666,0.626666666666667,0.213333333333334,0.633333333333334},
+ {0.215,0.619444666666666,0.214444666666666,0.626666666666667},
+ {0.214444666666666,0.611111333333334,0.215,0.619444666666666},
+ {0.213888666666667,0.602778,0.214444666666666,0.611111333333334},
+ {0.212778,0.594444666666667,0.213888666666667,0.602778},
+ {0.211111333333334,0.586111333333333,0.212778,0.594444666666667},
+ {0.209444666666666,0.578888666666667,0.211111333333334,0.586111333333333},
+ {0.207778,0.572222,0.209444666666666,0.578888666666667},
+ {0.206111333333334,0.566111333333333,0.207778,0.572222},
+ {0.203888666666667,0.561666666666667,0.206111333333334,0.566111333333333},
+ {0.201111333333333,0.557778,0.203888666666667,0.561666666666667},
+ {0.196666666666667,0.554444666666667,0.201111333333333,0.557778},
+ {0.191111333333333,0.552778,0.196666666666667,0.554444666666667},
+ {0.175,0.553888666666667,0.183888666666667,0.552778},
+ {0.166111333333333,0.555555333333333,0.175,0.553888666666667},
+ {0.156111333333333,0.557778,0.166111333333333,0.555555333333333},
+ {0.146111333333334,0.56,0.156111333333333,0.557778},
+ {0.137222,0.561666666666667,0.146111333333334,0.56},
+ {0.128333333333333,0.562778,0.137222,0.561666666666667},
+ {0.121111333333333,0.562222,0.128333333333333,0.562778},
+ {0.115555333333333,0.561111333333334,0.121111333333333,0.562222},
+ {0.111111333333334,0.557778,0.115555333333333,0.561111333333334},
+ {0.107778,0.553333333333333,0.111111333333334,0.557778},
+ {0.105555333333334,0.547778,0.107778,0.553333333333333},
+ {0.104444666666667,0.540555333333333,0.105555333333334,0.547778},
+ {0.103333333333333,0.532222,0.104444666666667,0.540555333333333},
+ {0.102778,0.522778,0.103333333333333,0.532222},
+ {0.102778,0.512778,0.102778,0.522778},
+ {0.102778,0.503333333333333,0.102778,0.512778},
+ {0.103333333333333,0.493888666666667,0.102778,0.503333333333333},
+ {0.104444666666667,0.485555333333333,0.103333333333333,0.493888666666667},
+ {0.105555333333334,0.478333333333333,0.104444666666667,0.485555333333333},
+ {0.107778,0.472778,0.105555333333334,0.478333333333333},
+ {0.111111333333334,0.468333333333333,0.107778,0.472778},
+ {0.115555333333333,0.465,0.111111333333334,0.468333333333333},
+ {0.121111333333333,0.463888666666667,0.115555333333333,0.465},
+ {0.128333333333333,0.463333333333334,0.121111333333333,0.463888666666667},
+ {0.137222,0.464444666666667,0.128333333333333,0.463333333333334},
+ {0.146111333333334,0.466111333333333,0.137222,0.464444666666667},
+ {0.156111333333333,0.468333333333333,0.146111333333334,0.466111333333333},
+ {0.166111333333333,0.470555333333333,0.156111333333333,0.468333333333333},
+ {0.175,0.472222,0.166111333333333,0.470555333333333},
+ {0.183888666666667,0.473333333333333,0.175,0.472222},
+ {0.196666666666667,0.471666666666666,0.191111333333333,0.473333333333333},
+ {0.201111333333333,0.468333333333333,0.196666666666667,0.471666666666666},
+ {0.203888666666667,0.464444666666667,0.201111333333333,0.468333333333333},
+ {0.206111333333334,0.46,0.203888666666667,0.464444666666667},
+ {0.207778,0.453888666666667,0.206111333333334,0.46},
+ {0.209444666666666,0.447222,0.207778,0.453888666666667},
+ {0.211111333333334,0.44,0.209444666666666,0.447222},
+ {0.212778,0.431666666666667,0.211111333333334,0.44},
+ {0.213888666666667,0.423333333333333,0.212778,0.431666666666667},
+ {0.214444666666666,0.415,0.213888666666667,0.423333333333333},
+ {0.215,0.406666666666667,0.214444666666666,0.415},
+ {0.214444666666666,0.399444666666666,0.215,0.406666666666667},
+ {0.213333333333334,0.392778,0.214444666666666,0.399444666666666},
+ {0.210555333333333,0.386666666666667,0.213333333333334,0.392778},
+ {0.206666666666667,0.382222,0.210555333333333,0.386666666666667},
+ {0.201111333333333,0.378333333333333,0.206666666666667,0.382222},
+ {0.195,0.376111333333334,0.201111333333333,0.378333333333333},
+ {0.186666666666666,0.374444666666667,0.195,0.376111333333334},
+ {0.177222,0.373333333333333,0.186666666666666,0.374444666666667},
+ {0.153888666666667,0.373888666666667,0.166111333333333,0.373333333333333},
+ {0.140555333333333,0.375,0.153888666666667,0.373888666666667},
+ {0.126111333333333,0.376666666666667,0.140555333333333,0.375},
+ {0.111666666666667,0.378333333333333,0.126111333333333,0.376666666666667},
+ {0.0966666666666664,0.38,0.111666666666667,0.378333333333333},
+ {0.0822220000000004,0.381666666666667,0.0966666666666664,0.38},
+ {0.0688886666666662,0.382778,0.0822220000000004,0.381666666666667},
+ {0.056666666666666,0.383333333333334,0.0688886666666662,0.382778},
+ {0.0361113333333331,0.382222,0.0455553333333327,0.383333333333334},
+ {0.0277780000000002,0.380555333333334,0.0361113333333331,0.382222},
+ {0.0216666666666671,0.378333333333333,0.0277780000000002,0.380555333333334},
+ {0.0172220000000003,0.375555333333333,0.0216666666666671,0.378333333333333},
+ {0.013333333333333,0.372222,0.0172220000000003,0.375555333333333},
+ {0.0105553333333338,0.368333333333334,0.013333333333333,0.372222},
+ {0.00833333333333286,0.363333333333333,0.0105553333333338,0.368333333333334},
+ {0.00611133333333314,0.358333333333333,0.00833333333333286,0.363333333333333},
+ {0.0044446666666668,0.352778,0.00611133333333314,0.358333333333333},
+ {0.00277800000000046,0.346666666666666,0.0044446666666668,0.352778},
+ {0.00166666666666634,0.34,0.00277800000000046,0.346666666666666},
+ {0.000555333333333389,0.333333333333333,0.00166666666666634,0.34},
+ {0,0.327222,0.000555333333333389,0.333333333333333},
+ {0,0.320555333333333,0,0.327222},
+ {0,0.314444666666667,0,0.320555333333333},
+ {0.00111133333333295,0.308888666666667,0,0.314444666666667},
+ {0.00333333333333267,0.303888666666667,0.00111133333333295,0.308888666666667},
+ {0.00611133333333314,0.298888666666667,0.00333333333333267,0.303888666666667},
+ {0.0100000000000004,0.295,0.00611133333333314,0.298888666666667},
+ {0.0149999999999994,0.291666666666667,0.0100000000000004,0.295},
+ {0.0216666666666671,0.288888666666667,0.0149999999999994,0.291666666666667},
+ {0.0283333333333336,0.287222,0.0216666666666671,0.288888666666667},
+ {0.0361113333333331,0.285,0.0283333333333336,0.287222},
+ {0.0455553333333327,0.283333333333333,0.0361113333333331,0.285},
+ {0.0561113333333327,0.281666666666667,0.0455553333333327,0.283333333333333},
+ {0.0677779999999994,0.279444666666667,0.0561113333333327,0.281666666666667},
+ {0.0805553333333329,0.277222,0.0677779999999994,0.279444666666667},
+ {0.0944446666666666,0.274444666666666,0.0805553333333329,0.277222},
+ {0.108888666666666,0.272222,0.0944446666666666,0.274444666666666},
+ {0.124444666666667,0.268888666666667,0.108888666666666,0.272222},
+ {0.139999999999999,0.266111333333334,0.124444666666667,0.268888666666667},
+ {0.156111333333333,0.263888666666666,0.139999999999999,0.266111333333334},
+ {0.172222,0.261111333333333,0.156111333333333,0.263888666666666},
+ {0.187778,0.259444666666666,0.172222,0.261111333333333},
+ {0.203333333333333,0.257778,0.187778,0.259444666666666},
+ {0.217778,0.257222,0.203333333333333,0.257778},
+ {0.231666666666667,0.257778,0.217778,0.257222},
+ {0.244444666666666,0.259444666666666,0.231666666666667,0.257778},
+ {0.256111333333333,0.262222,0.244444666666666,0.259444666666666},
+ {0.266666666666667,0.266111333333334,0.256111333333333,0.262222},
+ {0.276111333333333,0.272222,0.266666666666667,0.266111333333334},
+ {0.283888666666666,0.279444666666667,0.276111333333333,0.272222},
+ {0.290555333333334,0.288888666666667,0.283888666666666,0.279444666666667},
+ {0,0,0,0}
+};
+
+double Icon16[][4] = {
+ {0.105555333333333,0.295,0.103333333333333,0.288888666666667},
+ {0.107221999999999,0.303333333333333,0.105555333333333,0.295},
+ {0.108333333333333,0.312778,0.107221999999999,0.303333333333333},
+ {0.108333333333333,0.323888666666667,0.108333333333333,0.312778},
+ {0.107778,0.336111333333333,0.108333333333333,0.323888666666667},
+ {0.106666666666666,0.349444666666667,0.107778,0.336111333333333},
+ {0.104999999999999,0.363888666666667,0.106666666666666,0.349444666666667},
+ {0.103333333333333,0.378888666666667,0.104999999999999,0.363888666666667},
+ {0.101666666666667,0.393333333333333,0.103333333333333,0.378888666666667},
+ {0.099999999999999,0.407778,0.101666666666667,0.393333333333333},
+ {0.0988886666666661,0.421111333333334,0.099999999999999,0.407778},
+ {0.0983333333333327,0.433333333333334,0.0988886666666661,0.421111333333334},
+ {0.0983333333333327,0.444444666666667,0.0983333333333327,0.433333333333334},
+ {0.0994446666666657,0.453888666666667,0.0983333333333327,0.444444666666667},
+ {0.101111333333333,0.462222,0.0994446666666657,0.453888666666667},
+ {0.103333333333333,0.468333333333333,0.101111333333333,0.462222},
+ {0.106666666666666,0.473333333333333,0.103333333333333,0.468333333333333},
+ {0.110555333333333,0.477222,0.106666666666666,0.473333333333333},
+ {0.115,0.48,0.110555333333333,0.477222},
+ {0.120555333333333,0.482222,0.115,0.48},
+ {0.127222,0.483333333333333,0.120555333333333,0.482222},
+ {0.133888666666666,0.484444666666667,0.127222,0.483333333333333},
+ {0.141111333333332,0.485,0.133888666666666,0.484444666666667},
+ {0.162777999999999,0.484444666666667,0.155555333333333,0.485},
+ {0.169444666666666,0.483333333333333,0.162777999999999,0.484444666666667},
+ {0.176111333333332,0.482222,0.169444666666666,0.483333333333333},
+ {0.181666666666666,0.48,0.176111333333332,0.482222},
+ {0.186111333333333,0.477222,0.181666666666666,0.48},
+ {0.189999999999999,0.473333333333333,0.186111333333333,0.477222},
+ {0.193333333333333,0.468333333333333,0.189999999999999,0.473333333333333},
+ {0.195555333333332,0.462222,0.193333333333333,0.468333333333333},
+ {0.197222,0.453888666666667,0.195555333333332,0.462222},
+ {0.198333333333333,0.444444666666667,0.197222,0.453888666666667},
+ {0.198333333333333,0.433333333333334,0.198333333333333,0.444444666666667},
+ {0.197778,0.421111333333334,0.198333333333333,0.433333333333334},
+ {0.196666666666667,0.407778,0.197778,0.421111333333334},
+ {0.194999999999999,0.393333333333333,0.196666666666667,0.407778},
+ {0.193333333333333,0.378888666666667,0.194999999999999,0.393333333333333},
+ {0.191666666666666,0.363888666666667,0.193333333333333,0.378888666666667},
+ {0.189999999999999,0.349444666666667,0.191666666666666,0.363888666666667},
+ {0.188888666666666,0.336111333333333,0.189999999999999,0.349444666666667},
+ {0.188333333333333,0.323888666666667,0.188888666666666,0.336111333333333},
+ {0.188333333333333,0.312778,0.188333333333333,0.323888666666667},
+ {0.189444666666666,0.303333333333333,0.188333333333333,0.312778},
+ {0.191111333333333,0.295,0.189444666666666,0.303333333333333},
+ {0.193333333333333,0.288888666666667,0.191111333333333,0.295},
+ {0.195555333333332,0.285,0.193333333333333,0.288888666666667},
+ {0.198333333333333,0.281666666666667,0.195555333333332,0.285},
+ {0.201111333333332,0.278888666666666,0.198333333333333,0.281666666666667},
+ {0.204999999999999,0.276111333333333,0.201111333333332,0.278888666666666},
+ {0.208888666666666,0.273888666666667,0.204999999999999,0.276111333333333},
+ {0.212777999999999,0.271111333333333,0.208888666666666,0.273888666666667},
+ {0.217777999999999,0.268888666666667,0.212777999999999,0.271111333333333},
+ {0.222777999999999,0.266111333333334,0.217777999999999,0.268888666666667},
+ {0.227778,0.263888666666666,0.222777999999999,0.266111333333334},
+ {0.232778,0.261666666666667,0.227778,0.263888666666666},
+ {0.238333333333333,0.259444666666666,0.232778,0.261666666666667},
+ {0.243888666666666,0.257778,0.238333333333333,0.259444666666666},
+ {0.248888666666666,0.256666666666667,0.243888666666666,0.257778},
+ {0.253888666666666,0.255555333333334,0.248888666666666,0.256666666666667},
+ {0.263888666666666,0.256666666666667,0.258888666666666,0.255555333333334},
+ {0.267778,0.258333333333334,0.263888666666666,0.256666666666667},
+ {0.271666666666666,0.261666666666667,0.267778,0.258333333333334},
+ {0.275555333333333,0.266111333333334,0.271666666666666,0.261666666666667},
+ {0.278333333333332,0.272222,0.275555333333333,0.266111333333334},
+ {0.281111333333333,0.279444666666667,0.278333333333332,0.272222},
+ {0.283333333333333,0.288888666666667,0.281111333333333,0.279444666666667},
+ {0.284999999999999,0.297222,0.283333333333333,0.288888666666667},
+ {0.286111333333333,0.307222,0.284999999999999,0.297222},
+ {0.287222,0.318333333333333,0.286111333333333,0.307222},
+ {0.288333333333333,0.331111333333334,0.287222,0.318333333333333},
+ {0.288888666666666,0.344444666666667,0.288333333333333,0.331111333333334},
+ {0.289444666666666,0.36,0.288888666666666,0.344444666666667},
+ {0.289999999999999,0.376111333333334,0.289444666666666,0.36},
+ {0.290555333333332,0.393333333333333,0.289999999999999,0.376111333333334},
+ {0.291111333333333,0.411666666666667,0.290555333333332,0.393333333333333},
+ {0.291111333333333,0.431111333333333,0.291111333333333,0.411666666666667},
+ {0.291666666666667,0.450555333333333,0.291111333333333,0.431111333333333},
+ {0.291666666666667,0.471111333333334,0.291666666666667,0.450555333333333},
+ {0.291666666666667,0.492222,0.291666666666667,0.471111333333334},
+ {0.291666666666667,0.513333333333333,0.291666666666667,0.492222},
+ {0.291666666666667,0.533888666666667,0.291666666666667,0.513333333333333},
+ {0.291666666666667,0.555,0.291666666666667,0.533888666666667},
+ {0.291666666666667,0.575555333333333,0.291666666666667,0.555},
+ {0.291111333333333,0.595,0.291666666666667,0.575555333333333},
+ {0.291111333333333,0.614444666666667,0.291111333333333,0.595},
+ {0.290555333333332,0.632778,0.291111333333333,0.614444666666667},
+ {0.289999999999999,0.65,0.290555333333332,0.632778},
+ {0.289444666666666,0.666111333333333,0.289999999999999,0.65},
+ {0.288888666666666,0.681666666666667,0.289444666666666,0.666111333333333},
+ {0.288333333333333,0.695,0.288888666666666,0.681666666666667},
+ {0.287222,0.707778,0.288333333333333,0.695},
+ {0.286111333333333,0.718888666666667,0.287222,0.707778},
+ {0.284999999999999,0.728888666666667,0.286111333333333,0.718888666666667},
+ {0.283333333333333,0.737222,0.284999999999999,0.728888666666667},
+ {0.281111333333333,0.746666666666667,0.283333333333333,0.737222},
+ {0.278333333333332,0.753888666666667,0.281111333333333,0.746666666666667},
+ {0.275555333333333,0.76,0.278333333333332,0.753888666666667},
+ {0.271666666666666,0.764444666666667,0.275555333333333,0.76},
+ {0.267778,0.767778,0.271666666666666,0.764444666666667},
+ {0.263888666666666,0.769444666666667,0.267778,0.767778},
+ {0.258888666666666,0.770555333333334,0.263888666666666,0.769444666666667},
+ {0.248888666666666,0.769444666666667,0.253888666666666,0.770555333333334},
+ {0.243888666666666,0.768333333333333,0.248888666666666,0.769444666666667},
+ {0.238333333333333,0.766666666666667,0.243888666666666,0.768333333333333},
+ {0.232778,0.764444666666667,0.238333333333333,0.766666666666667},
+ {0.227778,0.762222,0.232778,0.764444666666667},
+ {0.222777999999999,0.76,0.227778,0.762222},
+ {0.217777999999999,0.757222,0.222777999999999,0.76},
+ {0.212777999999999,0.755,0.217777999999999,0.757222},
+ {0.208888666666666,0.752222,0.212777999999999,0.755},
+ {0.204999999999999,0.75,0.208888666666666,0.752222},
+ {0.201111333333332,0.747222,0.204999999999999,0.75},
+ {0.198333333333333,0.744444666666666,0.201111333333332,0.747222},
+ {0.195555333333332,0.741111333333333,0.198333333333333,0.744444666666666},
+ {0.193333333333333,0.737222,0.195555333333332,0.741111333333333},
+ {0.191111333333333,0.731111333333333,0.193333333333333,0.737222},
+ {0.189444666666666,0.722778,0.191111333333333,0.731111333333333},
+ {0.188888666666666,0.713333333333334,0.189444666666666,0.722778},
+ {0.189444666666666,0.702222,0.188888666666666,0.713333333333334},
+ {0.190555333333332,0.69,0.189444666666666,0.702222},
+ {0.192222,0.676666666666667,0.190555333333332,0.69},
+ {0.194999999999999,0.662222,0.192222,0.676666666666667},
+ {0.197778,0.647778,0.194999999999999,0.662222},
+ {0.199999999999999,0.632778,0.197778,0.647778},
+ {0.202221999999999,0.618333333333334,0.199999999999999,0.632778},
+ {0.203888666666667,0.605,0.202221999999999,0.618333333333334},
+ {0.204444666666666,0.592778,0.203888666666667,0.605},
+ {0.203888666666667,0.581666666666666,0.204444666666666,0.592778},
+ {0.201666666666666,0.572222,0.203888666666667,0.581666666666666},
+ {0.198333333333333,0.563888666666667,0.201666666666666,0.572222},
+ {0.193333333333333,0.557778,0.198333333333333,0.563888666666667},
+ {0.187222,0.552778,0.193333333333333,0.557778},
+ {0.178888666666666,0.55,0.187222,0.552778},
+ {0.169444666666666,0.548333333333333,0.178888666666666,0.55},
+ {0.158333333333333,0.548888666666667,0.169444666666666,0.548333333333333},
+ {0.146111333333333,0.550555333333334,0.158333333333333,0.548888666666667},
+ {0.132777999999999,0.553888666666667,0.146111333333333,0.550555333333334},
+ {0.118333333333332,0.557778,0.132777999999999,0.553888666666667},
+ {0.103888666666666,0.562222,0.118333333333332,0.557778},
+ {0.0888886666666657,0.566111333333333,0.103888666666666,0.562222},
+ {0.0744446666666659,0.57,0.0888886666666657,0.566111333333333},
+ {0.0611113333333329,0.572778,0.0744446666666659,0.57},
+ {0.0488886666666666,0.573888666666667,0.0611113333333329,0.572778},
+ {0.0377779999999994,0.572778,0.0488886666666666,0.573888666666667},
+ {0.0283333333333324,0.57,0.0377779999999994,0.572778},
+ {0.0199999999999996,0.565,0.0283333333333324,0.57},
+ {0.0138886666666664,0.557778,0.0199999999999996,0.565},
+ {0.00999999999999919,0.551111333333333,0.0138886666666664,0.557778},
+ {0.00722199999999991,0.543333333333334,0.00999999999999919,0.551111333333333},
+ {0.00499999999999901,0.533888666666667,0.00722199999999991,0.543333333333334},
+ {0.00277799999999928,0.523333333333333,0.00499999999999901,0.533888666666667},
+ {0.00166666666666634,0.511666666666667,0.00277799999999928,0.523333333333333},
+ {0.000555333333332205,0.498888666666667,0.00166666666666634,0.511666666666667},
+ {0.000555333333332205,0.485,0.000555333333332205,0.498888666666667},
+ {0,0.470555333333333,0.000555333333332205,0.485},
+ {0.000555333333332205,0.455,0,0.470555333333333},
+ {0.000555333333332205,0.439444666666667,0.000555333333332205,0.455},
+ {0.00111133333333295,0.423333333333333,0.000555333333332205,0.439444666666667},
+ {0.00222199999999972,0.407222,0.00111133333333295,0.423333333333333},
+ {0.00277799999999928,0.391666666666667,0.00222199999999972,0.407222},
+ {0.00388866666666606,0.376111333333334,0.00277799999999928,0.391666666666667},
+ {0.00444466666666562,0.361666666666667,0.00388866666666606,0.376111333333334},
+ {0.00555533333333239,0.347778,0.00444466666666562,0.361666666666667},
+ {0.00666666666666652,0.335,0.00555533333333239,0.347778},
+ {0.00777799999999947,0.323333333333334,0.00666666666666652,0.335},
+ {0.00888866666666625,0.312778,0.00777799999999947,0.323333333333334},
+ {0.0105553333333326,0.303333333333333,0.00888866666666625,0.312778},
+ {0.0122219999999989,0.295555333333333,0.0105553333333326,0.303333333333333},
+ {0.0138886666666664,0.288888666666667,0.0122219999999989,0.295555333333333},
+ {0.0166666666666657,0.282222,0.0138886666666664,0.288888666666667},
+ {0.0199999999999996,0.277222,0.0166666666666657,0.282222},
+ {0.0238886666666656,0.273333333333333,0.0199999999999996,0.277222},
+ {0.0288886666666658,0.270555333333334,0.0238886666666656,0.273333333333333},
+ {0.033888666666666,0.268333333333333,0.0288886666666658,0.270555333333334},
+ {0.0394446666666658,0.267222,0.033888666666666,0.268333333333333},
+ {0.0588886666666658,0.267778,0.0522219999999992,0.267222},
+ {0.0649999999999989,0.268888666666667,0.0588886666666658,0.267778},
+ {0.0716666666666666,0.27,0.0649999999999989,0.268888666666667},
+ {0.0777779999999998,0.271666666666667,0.0716666666666666,0.27},
+ {0.0833333333333333,0.273333333333333,0.0777779999999998,0.271666666666667},
+ {0.0883333333333323,0.275555333333333,0.0833333333333333,0.273333333333333},
+ {0.0933333333333325,0.277778,0.0883333333333323,0.275555333333333},
+ {0.0972219999999998,0.280555333333333,0.0933333333333325,0.277778},
+ {0.100555333333332,0.284444666666667,0.0972219999999998,0.280555333333333},
+ {0.103333333333333,0.288888666666667,0.100555333333332,0.284444666666667},
+ {0,0,0,0}
+};
+
+double Icon17[][4] = {
+ {0.297777333333332,0.291666666666667,0.291110666666666,0.288888666666667},
+ {0.302777333333333,0.295,0.297777333333332,0.291666666666667},
+ {0.306666666666666,0.298888666666667,0.302777333333333,0.295},
+ {0.309443999999999,0.303888666666667,0.306666666666666,0.298888666666667},
+ {0.311666666666666,0.308888666666667,0.309443999999999,0.303888666666667},
+ {0.312777333333333,0.314444666666667,0.311666666666666,0.308888666666667},
+ {0.312777333333333,0.320555333333333,0.312777333333333,0.314444666666667},
+ {0.312777333333333,0.327222,0.312777333333333,0.320555333333333},
+ {0.312222,0.333888666666667,0.312777333333333,0.327222},
+ {0.311110666666667,0.34,0.312222,0.333888666666667},
+ {0.31,0.346666666666666,0.311110666666667,0.34},
+ {0.308333333333332,0.352778,0.31,0.346666666666666},
+ {0.306666666666666,0.358333333333333,0.308333333333332,0.352778},
+ {0.304444,0.363333333333333,0.306666666666666,0.358333333333333},
+ {0.302221999999999,0.368333333333334,0.304444,0.363333333333333},
+ {0.299444,0.372222,0.302221999999999,0.368333333333334},
+ {0.295555333333333,0.375555333333333,0.299444,0.372222},
+ {0.291110666666666,0.378333333333333,0.295555333333333,0.375555333333333},
+ {0.285,0.380555333333334,0.291110666666666,0.378333333333333},
+ {0.276666666666666,0.382222,0.285,0.380555333333334},
+ {0.267221999999999,0.383333333333334,0.276666666666666,0.382222},
+ {0.243888666666666,0.382778,0.256110666666666,0.383333333333334},
+ {0.230555333333333,0.381666666666667,0.243888666666666,0.382778},
+ {0.216110666666667,0.38,0.230555333333333,0.381666666666667},
+ {0.201666666666667,0.378333333333333,0.216110666666667,0.38},
+ {0.186666666666666,0.376666666666667,0.201666666666667,0.378333333333333},
+ {0.172221999999999,0.375,0.186666666666666,0.376666666666667},
+ {0.158888666666666,0.373888666666667,0.172221999999999,0.375},
+ {0.146666666666666,0.373333333333333,0.158888666666666,0.373888666666667},
+ {0.126110666666667,0.374444666666667,0.135555333333333,0.373333333333333},
+ {0.117777333333333,0.376111333333334,0.126110666666667,0.374444666666667},
+ {0.111666666666666,0.378333333333333,0.117777333333333,0.376111333333334},
+ {0.106666666666667,0.381666666666667,0.111666666666666,0.378333333333333},
+ {0.102777333333333,0.385555333333333,0.106666666666667,0.381666666666667},
+ {0.099999999999999,0.39,0.102777333333333,0.385555333333333},
+ {0.0977773333333332,0.395555333333334,0.099999999999999,0.39},
+ {0.0966666666666664,0.402222,0.0977773333333332,0.395555333333334},
+ {0.0955553333333334,0.408888666666667,0.0966666666666664,0.402222},
+ {0.095,0.416111333333333,0.0955553333333334,0.408888666666667},
+ {0.095,0.423333333333333,0.095,0.416111333333333},
+ {0.095,0.430555333333333,0.095,0.423333333333333},
+ {0.0955553333333334,0.437778,0.095,0.430555333333333},
+ {0.0966666666666664,0.444444666666667,0.0955553333333334,0.437778},
+ {0.0977773333333332,0.451111333333333,0.0966666666666664,0.444444666666667},
+ {0.099999999999999,0.456666666666666,0.0977773333333332,0.451111333333333},
+ {0.102777333333333,0.461111333333333,0.099999999999999,0.456666666666666},
+ {0.106666666666667,0.465,0.102777333333333,0.461111333333333},
+ {0.111666666666666,0.468333333333333,0.106666666666667,0.465},
+ {0.117777333333333,0.470555333333333,0.111666666666666,0.468333333333333},
+ {0.126110666666667,0.472222,0.117777333333333,0.470555333333333},
+ {0.146666666666666,0.471666666666666,0.135555333333333,0.472222},
+ {0.158888666666666,0.469444666666667,0.146666666666666,0.471666666666666},
+ {0.172221999999999,0.466666666666667,0.158888666666666,0.469444666666667},
+ {0.186666666666666,0.463333333333334,0.172221999999999,0.466666666666667},
+ {0.201666666666667,0.46,0.186666666666666,0.463333333333334},
+ {0.216110666666667,0.456666666666666,0.201666666666667,0.46},
+ {0.230555333333333,0.453888666666667,0.216110666666667,0.456666666666666},
+ {0.243888666666666,0.452222,0.230555333333333,0.453888666666667},
+ {0.256110666666666,0.451666666666667,0.243888666666666,0.452222},
+ {0.267221999999999,0.452778,0.256110666666666,0.451666666666667},
+ {0.276666666666666,0.455555333333334,0.267221999999999,0.452778},
+ {0.285,0.461111333333333,0.276666666666666,0.455555333333334},
+ {0.291110666666666,0.468333333333333,0.285,0.461111333333333},
+ {0.294999999999999,0.475,0.291110666666666,0.468333333333333},
+ {0.297777333333332,0.482778,0.294999999999999,0.475},
+ {0.300555333333333,0.492222,0.297777333333332,0.482778},
+ {0.302777333333333,0.502778,0.300555333333333,0.492222},
+ {0.305,0.514444666666667,0.302777333333333,0.502778},
+ {0.306666666666666,0.527222,0.305,0.514444666666667},
+ {0.307777333333333,0.541111333333333,0.306666666666666,0.527222},
+ {0.309443999999999,0.555555333333333,0.307777333333333,0.541111333333333},
+ {0.310555333333333,0.571111333333333,0.309443999999999,0.555555333333333},
+ {0.311666666666666,0.586666666666667,0.310555333333333,0.571111333333333},
+ {0.312222,0.602778,0.311666666666666,0.586666666666667},
+ {0.312777333333333,0.618888666666667,0.312222,0.602778},
+ {0.312777333333333,0.634444666666666,0.312777333333333,0.618888666666667},
+ {0.312777333333333,0.65,0.312777333333333,0.634444666666666},
+ {0.312222,0.664444666666667,0.312777333333333,0.65},
+ {0.311110666666667,0.678333333333333,0.312222,0.664444666666667},
+ {0.31,0.691111333333333,0.311110666666667,0.678333333333333},
+ {0.307777333333333,0.702778,0.31,0.691111333333333},
+ {0.305,0.713333333333334,0.307777333333333,0.702778},
+ {0.301110666666666,0.722778,0.305,0.713333333333334},
+ {0.296666666666666,0.730555333333333,0.301110666666666,0.722778},
+ {0.291110666666666,0.737222,0.296666666666666,0.730555333333333},
+ {0.284443999999999,0.742778,0.291110666666666,0.737222},
+ {0.276666666666666,0.747222,0.284443999999999,0.742778},
+ {0.267221999999999,0.750555333333333,0.276666666666666,0.747222},
+ {0.256666666666666,0.753333333333333,0.267221999999999,0.750555333333333},
+ {0.245,0.755,0.256666666666666,0.753333333333333},
+ {0.232222,0.756111333333333,0.245,0.755},
+ {0.218333333333333,0.756666666666667,0.232222,0.756111333333333},
+ {0.188333333333333,0.756111333333333,0.203333333333333,0.756666666666667},
+ {0.172221999999999,0.755,0.188333333333333,0.756111333333333},
+ {0.156110666666667,0.753888666666667,0.172221999999999,0.755},
+ {0.140555333333333,0.752778,0.156110666666667,0.753888666666667},
+ {0.124443999999999,0.751111333333334,0.140555333333333,0.752778},
+ {0.109444,0.749444666666667,0.124443999999999,0.751111333333334},
+ {0.0944439999999993,0.748333333333333,0.109444,0.749444666666667},
+ {0.0805553333333329,0.746666666666667,0.0944439999999993,0.748333333333333},
+ {0.0677773333333332,0.745,0.0805553333333329,0.746666666666667},
+ {0.0561106666666665,0.743888666666667,0.0677773333333332,0.745},
+ {0.0455553333333327,0.742222,0.0561106666666665,0.743888666666667},
+ {0.0361106666666657,0.740555333333334,0.0455553333333327,0.742222},
+ {0.0283333333333324,0.738888666666667,0.0361106666666657,0.740555333333334},
+ {0.0216666666666659,0.737222,0.0283333333333324,0.738888666666667},
+ {0.0149999999999994,0.734444666666667,0.0216666666666659,0.737222},
+ {0.00999999999999919,0.731111333333333,0.0149999999999994,0.734444666666667},
+ {0.00611066666666578,0.727222,0.00999999999999919,0.731111333333333},
+ {0.00333333333333267,0.722222,0.00611066666666578,0.727222},
+ {0.00111066666666678,0.717222,0.00333333333333267,0.722222},
+ {0,0.711666666666667,0.00111066666666678,0.717222},
+ {0,0.705555333333334,0,0.711666666666667},
+ {0,0.698888666666667,0,0.705555333333334},
+ {0.000555333333333389,0.692222,0,0.698888666666667},
+ {0.00166666666666634,0.686111333333334,0.000555333333333389,0.692222},
+ {0.00277733333333311,0.679444666666667,0.00166666666666634,0.686111333333334},
+ {0.00444399999999945,0.673333333333333,0.00277733333333311,0.679444666666667},
+ {0.00611066666666578,0.667778,0.00444399999999945,0.673333333333333},
+ {0.00833333333333286,0.662778,0.00611066666666578,0.667778},
+ {0.0105553333333326,0.657778,0.00833333333333286,0.662778},
+ {0.013333333333333,0.653888666666666,0.0105553333333326,0.657778},
+ {0.0172219999999991,0.650555333333333,0.013333333333333,0.653888666666666},
+ {0.0216666666666659,0.647778,0.0172219999999991,0.650555333333333},
+ {0.0277773333333329,0.645555333333334,0.0216666666666659,0.647778},
+ {0.0361106666666657,0.643888666666667,0.0277773333333329,0.645555333333334},
+ {0.0455553333333327,0.642778,0.0361106666666657,0.643888666666667},
+ {0.0688886666666662,0.643333333333333,0.056666666666666,0.642778},
+ {0.0822219999999992,0.644444666666667,0.0688886666666662,0.643333333333333},
+ {0.0966666666666664,0.646111333333333,0.0822219999999992,0.644444666666667},
+ {0.111666666666666,0.647778,0.0966666666666664,0.646111333333333},
+ {0.126110666666667,0.649444666666666,0.111666666666666,0.647778},
+ {0.140555333333333,0.651111333333333,0.126110666666667,0.649444666666666},
+ {0.153888666666666,0.652222,0.140555333333333,0.651111333333333},
+ {0.166110666666666,0.652778,0.153888666666666,0.652222},
+ {0.186666666666666,0.651666666666667,0.177221999999999,0.652778},
+ {0.194999999999999,0.65,0.186666666666666,0.651666666666667},
+ {0.201110666666666,0.647778,0.194999999999999,0.65},
+ {0.206110666666666,0.644444666666667,0.201110666666666,0.647778},
+ {0.21,0.640555333333333,0.206110666666666,0.644444666666667},
+ {0.212777333333333,0.636111333333333,0.21,0.640555333333333},
+ {0.215,0.630555333333334,0.212777333333333,0.636111333333333},
+ {0.216110666666667,0.623888666666667,0.215,0.630555333333334},
+ {0.217222,0.617222,0.216110666666667,0.623888666666667},
+ {0.217777333333333,0.61,0.217222,0.617222},
+ {0.217777333333333,0.602778,0.217777333333333,0.61},
+ {0.217777333333333,0.595555333333333,0.217777333333333,0.602778},
+ {0.217222,0.588333333333334,0.217777333333333,0.595555333333333},
+ {0.216110666666667,0.581666666666666,0.217222,0.588333333333334},
+ {0.215,0.575,0.216110666666667,0.581666666666666},
+ {0.212777333333333,0.569444666666667,0.215,0.575},
+ {0.21,0.565,0.212777333333333,0.569444666666667},
+ {0.206110666666666,0.561111333333334,0.21,0.565},
+ {0.201110666666666,0.557778,0.206110666666666,0.561111333333334},
+ {0.194999999999999,0.555555333333333,0.201110666666666,0.557778},
+ {0.186666666666666,0.553888666666667,0.194999999999999,0.555555333333333},
+ {0.166110666666666,0.554444666666667,0.177221999999999,0.553888666666667},
+ {0.153888666666666,0.556666666666667,0.166110666666666,0.554444666666667},
+ {0.140555333333333,0.559444666666667,0.153888666666666,0.556666666666667},
+ {0.126110666666667,0.562778,0.140555333333333,0.559444666666667},
+ {0.111666666666666,0.566111333333333,0.126110666666667,0.562778},
+ {0.0966666666666664,0.569444666666667,0.111666666666666,0.566111333333333},
+ {0.0822219999999992,0.572222,0.0966666666666664,0.569444666666667},
+ {0.0688886666666662,0.573888666666667,0.0822219999999992,0.572222},
+ {0.056666666666666,0.574444666666666,0.0688886666666662,0.573888666666667},
+ {0.0455553333333327,0.573333333333334,0.056666666666666,0.574444666666666},
+ {0.0361106666666657,0.570555333333333,0.0455553333333327,0.573333333333334},
+ {0.0277773333333329,0.565,0.0361106666666657,0.570555333333333},
+ {0.0216666666666659,0.557778,0.0277773333333329,0.565},
+ {0.0177773333333325,0.551111333333333,0.0216666666666659,0.557778},
+ {0.0149999999999994,0.543333333333334,0.0177773333333325,0.551111333333333},
+ {0.0122220000000001,0.533888666666667,0.0149999999999994,0.543333333333334},
+ {0.00999999999999919,0.523333333333333,0.0122220000000001,0.533888666666667},
+ {0.0077773333333333,0.511666666666667,0.00999999999999919,0.523333333333333},
+ {0.00611066666666578,0.498888666666667,0.0077773333333333,0.511666666666667},
+ {0.00499999999999901,0.485,0.00611066666666578,0.498888666666667},
+ {0.00333333333333267,0.470555333333333,0.00499999999999901,0.485},
+ {0.00222199999999972,0.455,0.00333333333333267,0.470555333333333},
+ {0.00111066666666678,0.439444666666667,0.00222199999999972,0.455},
+ {0.000555333333333389,0.423333333333333,0.00111066666666678,0.439444666666667},
+ {0,0.407222,0.000555333333333389,0.423333333333333},
+ {0,0.391666666666667,0,0.407222},
+ {0,0.376111333333334,0,0.391666666666667},
+ {0.000555333333333389,0.361666666666667,0,0.376111333333334},
+ {0.00166666666666634,0.347778,0.000555333333333389,0.361666666666667},
+ {0.00277733333333311,0.335,0.00166666666666634,0.347778},
+ {0.00499999999999901,0.323333333333334,0.00277733333333311,0.335},
+ {0.0077773333333333,0.312778,0.00499999999999901,0.323333333333334},
+ {0.0116666666666667,0.303333333333333,0.0077773333333333,0.312778},
+ {0.0161106666666662,0.295555333333333,0.0116666666666667,0.303333333333333},
+ {0.0216666666666659,0.288888666666667,0.0161106666666662,0.295555333333333},
+ {0.0283333333333324,0.283333333333333,0.0216666666666659,0.288888666666667},
+ {0.0361106666666657,0.278888666666666,0.0283333333333324,0.283333333333333},
+ {0.0455553333333327,0.275555333333333,0.0361106666666657,0.278888666666666},
+ {0.0561106666666665,0.272778,0.0455553333333327,0.275555333333333},
+ {0.0677773333333332,0.271111333333333,0.0561106666666665,0.272778},
+ {0.0805553333333329,0.27,0.0677773333333332,0.271111333333333},
+ {0.0944439999999993,0.269444666666667,0.0805553333333329,0.27},
+ {0.124443999999999,0.27,0.109444,0.269444666666667},
+ {0.140555333333333,0.271111333333333,0.124443999999999,0.27},
+ {0.156666666666666,0.272222,0.140555333333333,0.271111333333333},
+ {0.172221999999999,0.273333333333333,0.156666666666666,0.272222},
+ {0.188333333333333,0.275,0.172221999999999,0.273333333333333},
+ {0.203333333333333,0.276666666666667,0.188333333333333,0.275},
+ {0.218333333333333,0.277778,0.203333333333333,0.276666666666667},
+ {0.232222,0.279444666666667,0.218333333333333,0.277778},
+ {0.245,0.281111333333333,0.232222,0.279444666666667},
+ {0.256666666666666,0.282222,0.245,0.281111333333333},
+ {0.267221999999999,0.283888666666667,0.256666666666666,0.282222},
+ {0.276666666666666,0.285555333333334,0.267221999999999,0.283888666666667},
+ {0.284443999999999,0.287222,0.276666666666666,0.285555333333334},
+ {0.291110666666666,0.288888666666667,0.284443999999999,0.287222},
+ {0,0,0,0}
+};
+
+double Icon18[][4] = {
+ {0.0249999999999998,0.288888666666667,0.0205553333333341,0.297222},
+ {0.0205553333333341,0.297222,0.0166666666666669,0.307222},
+ {0.0166666666666669,0.307222,0.013333333333333,0.318333333333333},
+ {0.013333333333333,0.318333333333333,0.0105553333333338,0.331111333333334},
+ {0.0105553333333338,0.331111333333334,0.00833333333333404,0.344444666666667},
+ {0.00833333333333404,0.344444666666667,0.00611133333333314,0.36},
+ {0.00611133333333314,0.36,0.0044446666666668,0.376111333333334},
+ {0.0044446666666668,0.376111333333334,0.00333333333333385,0.393333333333333},
+ {0.00333333333333385,0.393333333333333,0.00222199999999972,0.411666666666667},
+ {0.00222199999999972,0.411666666666667,0.00111133333333413,0.431111333333333},
+ {0.00111133333333413,0.431111333333333,0.000555333333333389,0.450555333333333},
+ {0.000555333333333389,0.450555333333333,0,0.471111333333334},
+ {0,0.471111333333334,0,0.492222},
+ {0,0.492222,0,0.513333333333333},
+ {0,0.513333333333333,0,0.533888666666667},
+ {0,0.533888666666667,0,0.555},
+ {0,0.555,0.000555333333333389,0.575555333333333},
+ {0.000555333333333389,0.575555333333333,0.00111133333333413,0.595},
+ {0.00111133333333413,0.595,0.00222199999999972,0.614444666666667},
+ {0.00222199999999972,0.614444666666667,0.00333333333333385,0.632778},
+ {0.00333333333333385,0.632778,0.0044446666666668,0.65},
+ {0.0044446666666668,0.65,0.00611133333333314,0.666111333333333},
+ {0.00611133333333314,0.666111333333333,0.00833333333333404,0.681666666666667},
+ {0.00833333333333404,0.681666666666667,0.0105553333333338,0.695},
+ {0.0105553333333338,0.695,0.013333333333333,0.707778},
+ {0.013333333333333,0.707778,0.0166666666666669,0.718888666666667},
+ {0.0166666666666669,0.718888666666667,0.0205553333333341,0.728888666666667},
+ {0.0205553333333341,0.728888666666667,0.0249999999999998,0.737222},
+ {0.0249999999999998,0.737222,0.0311113333333341,0.745555333333333},
+ {0.0311113333333341,0.745555333333333,0.038333333333334,0.752778},
+ {0.038333333333334,0.752778,0.0466666666666669,0.758888666666667},
+ {0.0466666666666669,0.758888666666667,0.0555553333333331,0.763333333333333},
+ {0.0555553333333331,0.763333333333333,0.066111333333333,0.767222},
+ {0.066111333333333,0.767222,0.0772220000000002,0.769444666666667},
+ {0.0772220000000002,0.769444666666667,0.0894446666666665,0.771111333333333},
+ {0.0894446666666665,0.771111333333333,0.102778000000001,0.772222},
+ {0.102778000000001,0.772222,0.116111333333334,0.772778},
+ {0.116111333333334,0.772778,0.130555333333334,0.772222},
+ {0.130555333333334,0.772222,0.145000000000001,0.771666666666667},
+ {0.145000000000001,0.771666666666667,0.16,0.771111333333333},
+ {0.16,0.771111333333333,0.174444666666667,0.769444666666667},
+ {0.174444666666667,0.769444666666667,0.188888666666667,0.767778},
+ {0.188888666666667,0.767778,0.203333333333333,0.766111333333334},
+ {0.203333333333333,0.766111333333334,0.216666666666667,0.763888666666666},
+ {0.216666666666667,0.763888666666666,0.23,0.762222},
+ {0.23,0.762222,0.242222000000001,0.759444666666666},
+ {0.242222000000001,0.759444666666666,0.253333333333334,0.756666666666667},
+ {0.253333333333334,0.756666666666667,0.263888666666666,0.753888666666667},
+ {0.263888666666666,0.753888666666667,0.272778,0.750555333333333},
+ {0.272778,0.750555333333333,0.281111333333334,0.746666666666667},
+ {0.281111333333334,0.746666666666667,0.288333333333334,0.742222},
+ {0.288333333333334,0.742222,0.294444666666667,0.737222},
+ {0.294444666666667,0.737222,0.300000000000001,0.730555333333333},
+ {0.300000000000001,0.730555333333333,0.304444666666667,0.722778},
+ {0.304444666666667,0.722778,0.308333333333334,0.713333333333334},
+ {0.308333333333334,0.713333333333334,0.311111333333334,0.702778},
+ {0.311111333333334,0.702778,0.313333333333334,0.691111333333333},
+ {0.313333333333334,0.691111333333333,0.314444666666667,0.678333333333333},
+ {0.314444666666667,0.678333333333333,0.315555333333333,0.664444666666667},
+ {0.315555333333333,0.664444666666667,0.316111333333333,0.65},
+ {0.316111333333333,0.65,0.316111333333333,0.634444666666666},
+ {0.316111333333333,0.634444666666666,0.316111333333333,0.618888666666667},
+ {0.316111333333333,0.618888666666667,0.315555333333333,0.602778},
+ {0.315555333333333,0.602778,0.315,0.586666666666667},
+ {0.315,0.586666666666667,0.313888666666667,0.571111333333333},
+ {0.313888666666667,0.571111333333333,0.312778,0.555555333333333},
+ {0.312778,0.555555333333333,0.311111333333334,0.541111333333333},
+ {0.311111333333334,0.541111333333333,0.31,0.527222},
+ {0.31,0.527222,0.308333333333334,0.514444666666667},
+ {0.308333333333334,0.514444666666667,0.306111333333334,0.502778},
+ {0.306111333333334,0.502778,0.303888666666667,0.492222},
+ {0.303888666666667,0.492222,0.301111333333334,0.482778},
+ {0.301111333333334,0.482778,0.298333333333333,0.475},
+ {0.298333333333333,0.475,0.294444666666667,0.468333333333333},
+ {0.294444666666667,0.468333333333333,0.288333333333334,0.461111333333333},
+ {0.288333333333334,0.461111333333333,0.28,0.455555333333334},
+ {0.28,0.455555333333334,0.270555333333334,0.452778},
+ {0.270555333333334,0.452778,0.259444666666667,0.451666666666667},
+ {0.259444666666667,0.451666666666667,0.247222000000001,0.452222},
+ {0.247222000000001,0.452222,0.233888666666666,0.453888666666667},
+ {0.233888666666666,0.453888666666667,0.219444666666667,0.456666666666666},
+ {0.219444666666667,0.456666666666666,0.205000000000001,0.46},
+ {0.205000000000001,0.46,0.19,0.463333333333334},
+ {0.19,0.463333333333334,0.175555333333334,0.466666666666667},
+ {0.175555333333334,0.466666666666667,0.162222,0.469444666666667},
+ {0.162222,0.469444666666667,0.15,0.471666666666666},
+ {0.15,0.471666666666666,0.138888666666666,0.472222},
+ {0.129444666666667,0.472222,0.121111333333334,0.470555333333333},
+ {0.121111333333334,0.470555333333333,0.115000000000001,0.468333333333333},
+ {0.115000000000001,0.468333333333333,0.110000000000001,0.465},
+ {0.110000000000001,0.465,0.106111333333333,0.461111333333333},
+ {0.106111333333333,0.461111333333333,0.103333333333334,0.456666666666666},
+ {0.103333333333334,0.456666666666666,0.101111333333333,0.451111333333333},
+ {0.101111333333333,0.451111333333333,0.1,0.444444666666667},
+ {0.1,0.444444666666667,0.0988886666666673,0.437778},
+ {0.0988886666666673,0.437778,0.0983333333333339,0.430555333333333},
+ {0.0983333333333339,0.430555333333333,0.0983333333333339,0.423333333333333},
+ {0.0983333333333339,0.423333333333333,0.0983333333333339,0.416111333333333},
+ {0.0983333333333339,0.416111333333333,0.0988886666666673,0.408888666666667},
+ {0.0988886666666673,0.408888666666667,0.1,0.402222},
+ {0.1,0.402222,0.101111333333333,0.395555333333334},
+ {0.101111333333333,0.395555333333334,0.103333333333334,0.39},
+ {0.103333333333334,0.39,0.106111333333333,0.385555333333333},
+ {0.106111333333333,0.385555333333333,0.110000000000001,0.381666666666667},
+ {0.110000000000001,0.381666666666667,0.115000000000001,0.378333333333333},
+ {0.115000000000001,0.378333333333333,0.121111333333334,0.376111333333334},
+ {0.121111333333334,0.376111333333334,0.129444666666667,0.374444666666667},
+ {0.129444666666667,0.374444666666667,0.138888666666666,0.373333333333333},
+ {0.15,0.373333333333333,0.162222,0.373888666666667},
+ {0.162222,0.373888666666667,0.175555333333334,0.375},
+ {0.175555333333334,0.375,0.19,0.376666666666667},
+ {0.19,0.376666666666667,0.205000000000001,0.378333333333333},
+ {0.205000000000001,0.378333333333333,0.219444666666667,0.38},
+ {0.219444666666667,0.38,0.233888666666666,0.381666666666667},
+ {0.233888666666666,0.381666666666667,0.247222000000001,0.382778},
+ {0.247222000000001,0.382778,0.259444666666667,0.383333333333334},
+ {0.270555333333334,0.383333333333334,0.28,0.382222},
+ {0.28,0.382222,0.288333333333334,0.380555333333334},
+ {0.288333333333334,0.380555333333334,0.294444666666667,0.378333333333333},
+ {0.294444666666667,0.378333333333333,0.298888666666667,0.375555333333333},
+ {0.298888666666667,0.375555333333333,0.302778,0.372222},
+ {0.302778,0.372222,0.305555333333333,0.368333333333334},
+ {0.305555333333333,0.368333333333334,0.307778,0.363333333333333},
+ {0.307778,0.363333333333333,0.31,0.358333333333333},
+ {0.31,0.358333333333333,0.311666666666667,0.352778},
+ {0.311666666666667,0.352778,0.313333333333334,0.346666666666666},
+ {0.313333333333334,0.346666666666666,0.314444666666667,0.34},
+ {0.314444666666667,0.34,0.315555333333333,0.333333333333333},
+ {0.315555333333333,0.333333333333333,0.316111333333333,0.327222},
+ {0.316111333333333,0.327222,0.316111333333333,0.320555333333333},
+ {0.316111333333333,0.320555333333333,0.316111333333333,0.314444666666667},
+ {0.316111333333333,0.314444666666667,0.315,0.308888666666667},
+ {0.315,0.308888666666667,0.312778,0.303888666666667},
+ {0.312778,0.303888666666667,0.31,0.298888666666667},
+ {0.31,0.298888666666667,0.306111333333334,0.295},
+ {0.306111333333334,0.295,0.301111333333334,0.291666666666667},
+ {0.301111333333334,0.291666666666667,0.294444666666667,0.288888666666667},
+ {0.294444666666667,0.288888666666667,0.287778000000001,0.287222},
+ {0.287778000000001,0.287222,0.28,0.285},
+ {0.28,0.285,0.270555333333334,0.283333333333333},
+ {0.270555333333334,0.283333333333333,0.26,0.281666666666667},
+ {0.26,0.281666666666667,0.248333333333334,0.279444666666667},
+ {0.248333333333334,0.279444666666667,0.235555333333334,0.277222},
+ {0.235555333333334,0.277222,0.221666666666666,0.274444666666666},
+ {0.221666666666666,0.274444666666666,0.206666666666667,0.272222},
+ {0.206666666666667,0.272222,0.191666666666666,0.268888666666667},
+ {0.191666666666666,0.268888666666667,0.175555333333334,0.266111333333334},
+ {0.175555333333334,0.266111333333334,0.159444666666667,0.263888666666666},
+ {0.159444666666667,0.263888666666666,0.143888666666667,0.261111333333333},
+ {0.143888666666667,0.261111333333333,0.127778,0.259444666666666},
+ {0.127778,0.259444666666666,0.112778,0.257778},
+ {0.112778,0.257778,0.0977780000000005,0.257222},
+ {0.0977780000000005,0.257222,0.0838886666666667,0.257778},
+ {0.0838886666666667,0.257778,0.0711113333333332,0.259444666666666},
+ {0.0711113333333332,0.259444666666666,0.0594446666666665,0.262222},
+ {0.0594446666666665,0.262222,0.0488886666666666,0.266111333333334},
+ {0.0488886666666666,0.266111333333334,0.0394446666666669,0.272222},
+ {0.0394446666666669,0.272222,0.0316666666666675,0.279444666666667},
+ {0.0316666666666675,0.279444666666667,0.0249999999999998,0.288888666666667},
+ {0.204444666666667,0.557778,0.207778,0.562222},
+ {0.207778,0.562222,0.210000000000001,0.567778},
+ {0.210000000000001,0.567778,0.211111333333334,0.575},
+ {0.211111333333334,0.575,0.212222000000001,0.583888666666667},
+ {0.212222000000001,0.583888666666667,0.212778,0.592778},
+ {0.212778,0.592778,0.212778,0.602778},
+ {0.212778,0.602778,0.212778,0.612778},
+ {0.212778,0.612778,0.212222000000001,0.621666666666667},
+ {0.212222000000001,0.621666666666667,0.211111333333334,0.630555333333334},
+ {0.211111333333334,0.630555333333334,0.210000000000001,0.637778},
+ {0.210000000000001,0.637778,0.207778,0.643333333333333},
+ {0.207778,0.643333333333333,0.204444666666667,0.647778},
+ {0.204444666666667,0.647778,0.2,0.651111333333333},
+ {0.2,0.651111333333333,0.194444666666667,0.653333333333334},
+ {0.194444666666667,0.653333333333334,0.187222000000001,0.654444666666667},
+ {0.187222000000001,0.654444666666667,0.178888666666667,0.655555333333333},
+ {0.178888666666667,0.655555333333333,0.169444666666667,0.656111333333333},
+ {0.15,0.656111333333333,0.140555333333334,0.655555333333333},
+ {0.140555333333334,0.655555333333333,0.132222,0.654444666666667},
+ {0.132222,0.654444666666667,0.125,0.653333333333334},
+ {0.125,0.653333333333334,0.119444666666666,0.651111333333333},
+ {0.119444666666666,0.651111333333333,0.115000000000001,0.647778},
+ {0.115000000000001,0.647778,0.111666666666667,0.643333333333333},
+ {0.111666666666667,0.643333333333333,0.109444666666667,0.637778},
+ {0.109444666666667,0.637778,0.108333333333333,0.630555333333334},
+ {0.108333333333333,0.630555333333334,0.107222,0.621666666666667},
+ {0.107222,0.621666666666667,0.106666666666667,0.612778},
+ {0.106666666666667,0.612778,0.106666666666667,0.602778},
+ {0.106666666666667,0.602778,0.106666666666667,0.592778},
+ {0.106666666666667,0.592778,0.107222,0.583888666666667},
+ {0.107222,0.583888666666667,0.108333333333333,0.575},
+ {0.108333333333333,0.575,0.109444666666667,0.567778},
+ {0.109444666666667,0.567778,0.111666666666667,0.562222},
+ {0.111666666666667,0.562222,0.115000000000001,0.557778},
+ {0.115000000000001,0.557778,0.119444666666666,0.554444666666667},
+ {0.119444666666666,0.554444666666667,0.125,0.552222},
+ {0.125,0.552222,0.132222,0.551111333333333},
+ {0.132222,0.551111333333333,0.140555333333334,0.55},
+ {0.140555333333334,0.55,0.15,0.549444666666667},
+ {0.169444666666667,0.549444666666667,0.178888666666667,0.55},
+ {0.178888666666667,0.55,0.187222000000001,0.551111333333333},
+ {0.187222000000001,0.551111333333333,0.194444666666667,0.552222},
+ {0.194444666666667,0.552222,0.2,0.554444666666667},
+ {0.2,0.554444666666667,0.204444666666667,0.557778},
+ {0,0,0,0}
+};
+
+double Icon19[][4] = {
+ {0.293889333333333,0.297222,0.291111333333333,0.288888666666667},
+ {0.295556,0.307222,0.293889333333333,0.297222},
+ {0.296666666666667,0.318333333333333,0.295556,0.307222},
+ {0.296666666666667,0.331111333333334,0.296666666666667,0.318333333333333},
+ {0.296111333333333,0.344444666666667,0.296666666666667,0.331111333333334},
+ {0.294444666666666,0.36,0.296111333333333,0.344444666666667},
+ {0.292222666666667,0.376111333333334,0.294444666666666,0.36},
+ {0.289444666666666,0.393333333333333,0.292222666666667,0.376111333333334},
+ {0.286111333333333,0.411666666666667,0.289444666666666,0.393333333333333},
+ {0.282222666666667,0.431111333333333,0.286111333333333,0.411666666666667},
+ {0.277778,0.450555333333333,0.282222666666667,0.431111333333333},
+ {0.272778,0.471111333333334,0.277778,0.450555333333333},
+ {0.268333333333333,0.492222,0.272778,0.471111333333334},
+ {0.262778,0.513333333333333,0.268333333333333,0.492222},
+ {0.257777999999999,0.533888666666667,0.262778,0.513333333333333},
+ {0.252222666666666,0.555,0.257777999999999,0.533888666666667},
+ {0.247222666666666,0.575555333333333,0.252222666666666,0.555},
+ {0.241666666666667,0.595,0.247222666666666,0.575555333333333},
+ {0.236666666666667,0.614444666666667,0.241666666666667,0.595},
+ {0.231666666666667,0.632778,0.236666666666667,0.614444666666667},
+ {0.227222666666667,0.65,0.231666666666667,0.632778},
+ {0.222778000000001,0.666111333333333,0.227222666666667,0.65},
+ {0.218889333333334,0.681666666666667,0.222778000000001,0.666111333333333},
+ {0.215000000000001,0.695,0.218889333333334,0.681666666666667},
+ {0.211111333333333,0.707778,0.215000000000001,0.695},
+ {0.207778,0.718888666666667,0.211111333333333,0.707778},
+ {0.204444666666667,0.728888666666667,0.207778,0.718888666666667},
+ {0.201111333333332,0.737222,0.204444666666667,0.728888666666667},
+ {0.197778,0.744444666666666,0.201111333333332,0.737222},
+ {0.194444666666667,0.751111333333334,0.197778,0.744444666666666},
+ {0.191111333333334,0.756666666666667,0.194444666666667,0.751111333333334},
+ {0.187777999999999,0.761111333333333,0.191111333333334,0.756666666666667},
+ {0.184444666666667,0.765,0.187777999999999,0.761111333333333},
+ {0.180556,0.767778,0.184444666666667,0.765},
+ {0.176666666666667,0.770555333333334,0.180556,0.767778},
+ {0.172778000000001,0.772222,0.176666666666667,0.770555333333334},
+ {0.168889333333333,0.773888666666667,0.172778000000001,0.772222},
+ {0.164999999999999,0.774444666666666,0.168889333333333,0.773888666666667},
+ {0.160556,0.775555333333333,0.164999999999999,0.774444666666666},
+ {0.147778,0.775,0.152222666666667,0.775555333333333},
+ {0.143889333333334,0.774444666666666,0.147778,0.775},
+ {0.140000000000001,0.773333333333333,0.143889333333334,0.774444666666666},
+ {0.136111333333332,0.772222,0.140000000000001,0.773333333333333},
+ {0.132222666666666,0.771111333333333,0.136111333333332,0.772222},
+ {0.128333333333333,0.769444666666667,0.132222666666666,0.771111333333333},
+ {0.125,0.767778,0.128333333333333,0.769444666666667},
+ {0.122222666666666,0.765555333333333,0.125,0.767778},
+ {0.119444666666666,0.762778,0.122222666666666,0.765555333333333},
+ {0.117222666666666,0.76,0.119444666666666,0.762778},
+ {0.115,0.756666666666667,0.117222666666666,0.76},
+ {0.113889333333333,0.752778,0.115,0.756666666666667},
+ {0.112778000000001,0.748333333333333,0.113889333333333,0.752778},
+ {0.111666666666667,0.743333333333334,0.112778000000001,0.748333333333333},
+ {0.111666666666667,0.737222,0.111666666666667,0.743333333333334},
+ {0.112222666666668,0.728888666666667,0.111666666666667,0.737222},
+ {0.112778000000001,0.719444666666667,0.112222666666668,0.728888666666667},
+ {0.115,0.708888666666667,0.112778000000001,0.719444666666667},
+ {0.117222666666666,0.696111333333333,0.115,0.708888666666667},
+ {0.121111333333334,0.682778,0.117222666666666,0.696111333333333},
+ {0.125,0.667222,0.121111333333334,0.682778},
+ {0.13,0.651111333333333,0.125,0.667222},
+ {0.135,0.633888666666667,0.13,0.651111333333333},
+ {0.141111333333332,0.615555333333334,0.135,0.633888666666667},
+ {0.147222666666667,0.596666666666666,0.141111333333332,0.615555333333334},
+ {0.153889333333334,0.577222,0.147222666666667,0.596666666666666},
+ {0.160556,0.557778,0.153889333333334,0.577222},
+ {0.167222666666667,0.538333333333333,0.160556,0.557778},
+ {0.173889333333333,0.518888666666667,0.167222666666667,0.538333333333333},
+ {0.179444666666666,0.5,0.173889333333333,0.518888666666667},
+ {0.185556000000001,0.481666666666667,0.179444666666666,0.5},
+ {0.190556000000001,0.464444666666667,0.185556000000001,0.481666666666667},
+ {0.194444666666667,0.448333333333334,0.190556000000001,0.464444666666667},
+ {0.198333333333333,0.432778,0.194444666666667,0.448333333333334},
+ {0.200555999999999,0.419444666666667,0.198333333333333,0.432778},
+ {0.202222666666666,0.406666666666667,0.200555999999999,0.419444666666667},
+ {0.202778,0.396111333333333,0.202222666666666,0.406666666666667},
+ {0.202778,0.386666666666667,0.202778,0.396111333333333},
+ {0.201111333333332,0.378333333333333,0.202778,0.386666666666667},
+ {0.197222666666666,0.368333333333334,0.201111333333332,0.378333333333333},
+ {0.191111333333334,0.361666666666667,0.197222666666666,0.368333333333334},
+ {0.182777999999999,0.357222,0.191111333333334,0.361666666666667},
+ {0.172222666666668,0.355555333333333,0.182777999999999,0.357222},
+ {0.159999999999999,0.356111333333333,0.172222666666668,0.355555333333333},
+ {0.146111333333333,0.358333333333333,0.159999999999999,0.356111333333333},
+ {0.131111333333334,0.361666666666667,0.146111333333333,0.358333333333333},
+ {0.115556,0.365555333333334,0.131111333333334,0.361666666666667},
+ {0.099999999999999,0.37,0.115556,0.365555333333334},
+ {0.0850000000000009,0.374444666666667,0.099999999999999,0.37},
+ {0.070556000000001,0.377778,0.0850000000000009,0.374444666666667},
+ {0.0572226666666656,0.380555333333334,0.070556000000001,0.377778},
+ {0.0461113333333335,0.381666666666667,0.0572226666666656,0.380555333333334},
+ {0.0361113333333331,0.382222,0.0461113333333335,0.381666666666667},
+ {0.0277780000000002,0.380555333333334,0.0361113333333331,0.382222},
+ {0.0216666666666671,0.378333333333333,0.0277780000000002,0.380555333333334},
+ {0.0172226666666665,0.375555333333333,0.0216666666666671,0.378333333333333},
+ {0.013333333333333,0.372222,0.0172226666666665,0.375555333333333},
+ {0.0105559999999999,0.368333333333334,0.013333333333333,0.372222},
+ {0.00833333333333286,0.363333333333333,0.0105559999999999,0.368333333333334},
+ {0.00611133333333314,0.358333333333333,0.00833333333333286,0.363333333333333},
+ {0.0044446666666668,0.352778,0.00611133333333314,0.358333333333333},
+ {0.00277800000000046,0.346666666666666,0.0044446666666668,0.352778},
+ {0.00166666666666634,0.34,0.00277800000000046,0.346666666666666},
+ {0.000555999999999557,0.333333333333333,0.00166666666666634,0.34},
+ {0,0.327222,0.000555999999999557,0.333333333333333},
+ {0,0.320555333333333,0,0.327222},
+ {0,0.314444666666667,0,0.320555333333333},
+ {0.00111133333333295,0.308888666666667,0,0.314444666666667},
+ {0.00333333333333385,0.303888666666667,0.00111133333333295,0.308888666666667},
+ {0.00611133333333314,0.298888666666667,0.00333333333333385,0.303888666666667},
+ {0.0100000000000004,0.295,0.00611133333333314,0.298888666666667},
+ {0.0149999999999994,0.291666666666667,0.0100000000000004,0.295},
+ {0.0216666666666671,0.288888666666667,0.0149999999999994,0.291666666666667},
+ {0.0283333333333336,0.287222,0.0216666666666671,0.288888666666667},
+ {0.0361113333333331,0.285,0.0283333333333336,0.287222},
+ {0.0455560000000001,0.283333333333333,0.0361113333333331,0.285},
+ {0.0566666666666672,0.281666666666667,0.0455560000000001,0.283333333333333},
+ {0.0683333333333328,0.279444666666667,0.0566666666666672,0.281666666666667},
+ {0.0816666666666658,0.277222,0.0683333333333328,0.279444666666667},
+ {0.096111333333333,0.274444666666666,0.0816666666666658,0.277222},
+ {0.111666666666667,0.272222,0.096111333333333,0.274444666666666},
+ {0.127222666666666,0.268888666666667,0.111666666666667,0.272222},
+ {0.143889333333334,0.266111333333334,0.127222666666666,0.268888666666667},
+ {0.160556,0.263888666666666,0.143889333333334,0.266111333333334},
+ {0.177222666666668,0.261111333333333,0.160556,0.263888666666666},
+ {0.193333333333333,0.259444666666666,0.177222666666668,0.261111333333333},
+ {0.209444666666667,0.257778,0.193333333333333,0.259444666666666},
+ {0.224444666666666,0.257222,0.209444666666667,0.257778},
+ {0.238333333333332,0.257778,0.224444666666666,0.257222},
+ {0.251111333333334,0.259444666666666,0.238333333333332,0.257778},
+ {0.262222666666666,0.262222,0.251111333333334,0.259444666666666},
+ {0.271666666666666,0.266111333333334,0.262222666666666,0.262222},
+ {0.279999999999999,0.272222,0.271666666666666,0.266111333333334},
+ {0.286111333333333,0.279444666666667,0.279999999999999,0.272222},
+ {0.291111333333333,0.288888666666667,0.286111333333333,0.279444666666667},
+ {0,0,0,0}
+};
+
+double Icon20[][4] = {
+ {0.0988886666666673,0.285555333333334,0.0916666666666662,0.288888666666667},
+ {0.106666666666667,0.283333333333333,0.0988886666666673,0.285555333333334},
+ {0.113888666666665,0.282222,0.106666666666667,0.283333333333333},
+ {0.121666666666667,0.281111333333333,0.113888666666665,0.282222},
+ {0.128888666666666,0.280555333333333,0.121666666666667,0.281111333333333},
+ {0.151666666666666,0.281111333333333,0.144444,0.280555333333333},
+ {0.159444000000001,0.282222,0.151666666666666,0.281111333333333},
+ {0.166666666666667,0.283333333333333,0.159444000000001,0.282222},
+ {0.174443999999999,0.285555333333334,0.166666666666667,0.283333333333333},
+ {0.181666666666667,0.288888666666667,0.174443999999999,0.285555333333334},
+ {0.188333333333333,0.292778,0.181666666666667,0.288888666666667},
+ {0.195,0.297222,0.188333333333333,0.292778},
+ {0.201666666666666,0.302222,0.195,0.297222},
+ {0.208888666666667,0.307778,0.201666666666666,0.302222},
+ {0.216110666666665,0.313888666666667,0.208888666666667,0.307778},
+ {0.223888666666667,0.320555333333333,0.216110666666665,0.313888666666667},
+ {0.231666666666667,0.327222,0.223888666666667,0.320555333333333},
+ {0.239443999999999,0.334444666666667,0.231666666666667,0.327222},
+ {0.246110666666667,0.341111333333333,0.239443999999999,0.334444666666667},
+ {0.252777333333334,0.348333333333333,0.246110666666667,0.341111333333333},
+ {0.258888666666666,0.355555333333333,0.252777333333334,0.348333333333333},
+ {0.263888666666666,0.362778,0.258888666666666,0.355555333333333},
+ {0.268333333333333,0.370555333333333,0.263888666666666,0.362778},
+ {0.271110666666667,0.378333333333333,0.268333333333333,0.370555333333333},
+ {0.272777333333333,0.386666666666667,0.271110666666667,0.378333333333333},
+ {0.273333333333333,0.395555333333334,0.272777333333333,0.386666666666667},
+ {0.273333333333333,0.404444666666667,0.273333333333333,0.395555333333334},
+ {0.271666666666666,0.413888666666667,0.273333333333333,0.404444666666667},
+ {0.269444,0.423888666666667,0.271666666666666,0.413888666666667},
+ {0.266666666666666,0.433333333333334,0.269444,0.423888666666667},
+ {0.263333333333333,0.443888666666667,0.266666666666666,0.433333333333334},
+ {0.26,0.453888666666667,0.263333333333333,0.443888666666667},
+ {0.256666666666668,0.463888666666667,0.26,0.453888666666667},
+ {0.253888666666666,0.473888666666667,0.256666666666668,0.463888666666667},
+ {0.251666666666667,0.483888666666667,0.253888666666666,0.473888666666667},
+ {0.25,0.493888666666667,0.251666666666667,0.483888666666667},
+ {0.248888666666666,0.503888666666667,0.25,0.493888666666667},
+ {0.248888666666666,0.513333333333333,0.248888666666666,0.503888666666667},
+ {0.248888666666666,0.522778,0.248888666666666,0.513333333333333},
+ {0.25,0.532778,0.248888666666666,0.522778},
+ {0.251666666666667,0.542222,0.25,0.532778},
+ {0.253888666666666,0.552222,0.251666666666667,0.542222},
+ {0.256666666666668,0.562222,0.253888666666666,0.552222},
+ {0.26,0.572778,0.256666666666668,0.562222},
+ {0.263333333333333,0.582778,0.26,0.572778},
+ {0.266666666666666,0.592778,0.263333333333333,0.582778},
+ {0.269444,0.602778,0.266666666666666,0.592778},
+ {0.271666666666666,0.612222,0.269444,0.602778},
+ {0.273333333333333,0.621666666666667,0.271666666666666,0.612222},
+ {0.273333333333333,0.631111333333333,0.273333333333333,0.621666666666667},
+ {0.272777333333333,0.639444666666667,0.273333333333333,0.631111333333333},
+ {0.271110666666667,0.647778,0.272777333333333,0.639444666666667},
+ {0.268333333333333,0.655555333333333,0.271110666666667,0.647778},
+ {0.263888666666666,0.663333333333333,0.268333333333333,0.655555333333333},
+ {0.258888666666666,0.670555333333333,0.263888666666666,0.663333333333333},
+ {0.252777333333334,0.677778,0.258888666666666,0.670555333333333},
+ {0.246110666666667,0.685,0.252777333333334,0.677778},
+ {0.239443999999999,0.691666666666666,0.246110666666667,0.685},
+ {0.231666666666667,0.698888666666667,0.239443999999999,0.691666666666666},
+ {0.223888666666667,0.705555333333334,0.231666666666667,0.698888666666667},
+ {0.216110666666665,0.712222,0.223888666666667,0.705555333333334},
+ {0.208888666666667,0.718333333333333,0.216110666666665,0.712222},
+ {0.201666666666666,0.723888666666667,0.208888666666667,0.718333333333333},
+ {0.195,0.728888666666667,0.201666666666666,0.723888666666667},
+ {0.188333333333333,0.733333333333333,0.195,0.728888666666667},
+ {0.181666666666667,0.737222,0.188333333333333,0.733333333333333},
+ {0.174443999999999,0.740555333333334,0.181666666666667,0.737222},
+ {0.166666666666667,0.742778,0.174443999999999,0.740555333333334},
+ {0.159444000000001,0.743888666666667,0.166666666666667,0.742778},
+ {0.151666666666666,0.745,0.159444000000001,0.743888666666667},
+ {0.144444,0.745555333333333,0.151666666666666,0.745},
+ {0.121666666666667,0.745,0.128888666666666,0.745555333333333},
+ {0.113888666666665,0.743888666666667,0.121666666666667,0.745},
+ {0.106666666666667,0.742778,0.113888666666665,0.743888666666667},
+ {0.0988886666666673,0.740555333333334,0.106666666666667,0.742778},
+ {0.0916666666666662,0.737222,0.0988886666666673,0.740555333333334},
+ {0.0850000000000009,0.733333333333333,0.0916666666666662,0.737222},
+ {0.0783333333333331,0.728888666666667,0.0850000000000009,0.733333333333333},
+ {0.0716666666666654,0.723888666666667,0.0783333333333331,0.728888666666667},
+ {0.0644439999999993,0.718333333333333,0.0716666666666654,0.723888666666667},
+ {0.0572220000000006,0.712222,0.0644439999999993,0.718333333333333},
+ {0.0494439999999988,0.705555333333334,0.0572220000000006,0.712222},
+ {0.0416666666666667,0.698888666666667,0.0494439999999988,0.705555333333334},
+ {0.0338886666666672,0.691666666666666,0.0416666666666667,0.698888666666667},
+ {0.0272219999999995,0.685,0.0338886666666672,0.691666666666666},
+ {0.0205553333333341,0.677778,0.0272219999999995,0.685},
+ {0.0144439999999998,0.670555333333333,0.0205553333333341,0.677778},
+ {0.00944399999999964,0.663333333333333,0.0144439999999998,0.670555333333333},
+ {0.00500000000000019,0.655555333333333,0.00944399999999964,0.663333333333333},
+ {0.00222200000000091,0.647778,0.00500000000000019,0.655555333333333},
+ {0.000555333333333389,0.639444666666667,0.00222200000000091,0.647778},
+ {0,0.631111333333333,0.000555333333333389,0.639444666666667},
+ {0,0.621666666666667,0,0.631111333333333},
+ {0.00166666666666752,0.612222,0,0.621666666666667},
+ {0.00388866666666606,0.602778,0.00166666666666752,0.612222},
+ {0.00666666666666771,0.592778,0.00388866666666606,0.602778},
+ {0.0100000000000004,0.582778,0.00666666666666771,0.592778},
+ {0.013333333333333,0.572778,0.0100000000000004,0.582778},
+ {0.0166666666666657,0.562222,0.013333333333333,0.572778},
+ {0.019444,0.552222,0.0166666666666657,0.562222},
+ {0.0216666666666659,0.542222,0.019444,0.552222},
+ {0.0233333333333334,0.532778,0.0216666666666659,0.542222},
+ {0.0244440000000002,0.522778,0.0233333333333334,0.532778},
+ {0.0244440000000002,0.513333333333333,0.0244440000000002,0.522778},
+ {0.0244440000000002,0.503888666666667,0.0244440000000002,0.513333333333333},
+ {0.0233333333333334,0.493888666666667,0.0244440000000002,0.503888666666667},
+ {0.0216666666666659,0.483888666666667,0.0233333333333334,0.493888666666667},
+ {0.019444,0.473888666666667,0.0216666666666659,0.483888666666667},
+ {0.0166666666666657,0.463888666666667,0.019444,0.473888666666667},
+ {0.013333333333333,0.453888666666667,0.0166666666666657,0.463888666666667},
+ {0.0100000000000004,0.443888666666667,0.013333333333333,0.453888666666667},
+ {0.00666666666666771,0.433333333333334,0.0100000000000004,0.443888666666667},
+ {0.00388866666666606,0.423888666666667,0.00666666666666771,0.433333333333334},
+ {0.00166666666666752,0.413888666666667,0.00388866666666606,0.423888666666667},
+ {0,0.404444666666667,0.00166666666666752,0.413888666666667},
+ {0,0.395555333333334,0,0.404444666666667},
+ {0.000555333333333389,0.386666666666667,0,0.395555333333334},
+ {0.00222200000000091,0.378333333333333,0.000555333333333389,0.386666666666667},
+ {0.00500000000000019,0.370555333333333,0.00222200000000091,0.378333333333333},
+ {0.00944399999999964,0.362778,0.00500000000000019,0.370555333333333},
+ {0.0144439999999998,0.355555333333333,0.00944399999999964,0.362778},
+ {0.0205553333333341,0.348333333333333,0.0144439999999998,0.355555333333333},
+ {0.0272219999999995,0.341111333333333,0.0205553333333341,0.348333333333333},
+ {0.0338886666666672,0.334444666666667,0.0272219999999995,0.341111333333333},
+ {0.0416666666666667,0.327222,0.0338886666666672,0.334444666666667},
+ {0.0494439999999988,0.320555333333333,0.0416666666666667,0.327222},
+ {0.0572220000000006,0.313888666666667,0.0494439999999988,0.320555333333333},
+ {0.0644439999999993,0.307778,0.0572220000000006,0.313888666666667},
+ {0.0716666666666654,0.302222,0.0644439999999993,0.307778},
+ {0.0783333333333331,0.297222,0.0716666666666654,0.302222},
+ {0.0850000000000009,0.292778,0.0783333333333331,0.297222},
+ {0.0916666666666662,0.288888666666667,0.0850000000000009,0.292778},
+ {0.181666666666667,0.557778,0.185,0.562222},
+ {0.185,0.562222,0.187222000000001,0.567778},
+ {0.187222000000001,0.567778,0.188333333333333,0.575},
+ {0.188333333333333,0.575,0.189443999999999,0.583888666666667},
+ {0.189443999999999,0.583888666666667,0.19,0.592778},
+ {0.19,0.592778,0.19,0.602778},
+ {0.19,0.602778,0.19,0.612778},
+ {0.19,0.612778,0.189443999999999,0.621666666666667},
+ {0.189443999999999,0.621666666666667,0.188333333333333,0.630555333333334},
+ {0.188333333333333,0.630555333333334,0.187222000000001,0.637778},
+ {0.187222000000001,0.637778,0.185,0.643333333333333},
+ {0.185,0.643333333333333,0.181666666666667,0.647778},
+ {0.181666666666667,0.647778,0.177222,0.651111333333333},
+ {0.177222,0.651111333333333,0.171666666666667,0.653333333333334},
+ {0.171666666666667,0.653333333333334,0.164444000000001,0.654444666666667},
+ {0.164444000000001,0.654444666666667,0.155555333333332,0.655555333333333},
+ {0.155555333333332,0.655555333333333,0.146666666666666,0.656111333333333},
+ {0.126666666666668,0.656111333333333,0.117777333333334,0.655555333333333},
+ {0.117777333333334,0.655555333333333,0.108888666666668,0.654444666666667},
+ {0.108888666666668,0.654444666666667,0.101666666666667,0.653333333333334},
+ {0.101666666666667,0.653333333333334,0.0961106666666656,0.651111333333333},
+ {0.0961106666666656,0.651111333333333,0.0916666666666662,0.647778},
+ {0.0916666666666662,0.647778,0.0883333333333335,0.643333333333333},
+ {0.0883333333333335,0.643333333333333,0.0861106666666676,0.637778},
+ {0.0861106666666676,0.637778,0.0850000000000009,0.630555333333334},
+ {0.0850000000000009,0.630555333333334,0.0838886666666667,0.621666666666667},
+ {0.0838886666666667,0.621666666666667,0.0833333333333333,0.612778},
+ {0.0833333333333333,0.612778,0.0833333333333333,0.602778},
+ {0.0833333333333333,0.602778,0.0833333333333333,0.592778},
+ {0.0833333333333333,0.592778,0.0838886666666667,0.583888666666667},
+ {0.0838886666666667,0.583888666666667,0.0850000000000009,0.575},
+ {0.0850000000000009,0.575,0.0861106666666676,0.567778},
+ {0.0861106666666676,0.567778,0.0883333333333335,0.562222},
+ {0.0883333333333335,0.562222,0.0916666666666662,0.557778},
+ {0.0916666666666662,0.557778,0.0961106666666656,0.554444666666667},
+ {0.0961106666666656,0.554444666666667,0.101666666666667,0.552222},
+ {0.101666666666667,0.552222,0.108888666666668,0.551111333333333},
+ {0.108888666666668,0.551111333333333,0.117777333333334,0.55},
+ {0.117777333333334,0.55,0.126666666666668,0.549444666666667},
+ {0.146666666666666,0.549444666666667,0.155555333333332,0.55},
+ {0.155555333333332,0.55,0.164444000000001,0.551111333333333},
+ {0.164444000000001,0.551111333333333,0.171666666666667,0.552222},
+ {0.171666666666667,0.552222,0.177222,0.554444666666667},
+ {0.177222,0.554444666666667,0.181666666666667,0.557778},
+ {0.181666666666667,0.378333333333333,0.185,0.382778},
+ {0.185,0.382778,0.187222000000001,0.388333333333333},
+ {0.187222000000001,0.388333333333333,0.188333333333333,0.395555333333334},
+ {0.188333333333333,0.395555333333334,0.189443999999999,0.404444666666667},
+ {0.189443999999999,0.404444666666667,0.19,0.413333333333333},
+ {0.19,0.413333333333333,0.19,0.423333333333333},
+ {0.19,0.423333333333333,0.19,0.433333333333334},
+ {0.19,0.433333333333334,0.189443999999999,0.442222},
+ {0.189443999999999,0.442222,0.188333333333333,0.451111333333333},
+ {0.188333333333333,0.451111333333333,0.187222000000001,0.458333333333333},
+ {0.187222000000001,0.458333333333333,0.185,0.463888666666667},
+ {0.185,0.463888666666667,0.181666666666667,0.468333333333333},
+ {0.181666666666667,0.468333333333333,0.177222,0.471666666666666},
+ {0.177222,0.471666666666666,0.171666666666667,0.473888666666667},
+ {0.171666666666667,0.473888666666667,0.164444000000001,0.475},
+ {0.164444000000001,0.475,0.155555333333332,0.476111333333333},
+ {0.155555333333332,0.476111333333333,0.146666666666666,0.476666666666667},
+ {0.126666666666668,0.476666666666667,0.117777333333334,0.476111333333333},
+ {0.117777333333334,0.476111333333333,0.108888666666668,0.475},
+ {0.108888666666668,0.475,0.101666666666667,0.473888666666667},
+ {0.101666666666667,0.473888666666667,0.0961106666666656,0.471666666666666},
+ {0.0961106666666656,0.471666666666666,0.0916666666666662,0.468333333333333},
+ {0.0916666666666662,0.468333333333333,0.0883333333333335,0.463888666666667},
+ {0.0883333333333335,0.463888666666667,0.0861106666666676,0.458333333333333},
+ {0.0861106666666676,0.458333333333333,0.0850000000000009,0.451111333333333},
+ {0.0850000000000009,0.451111333333333,0.0838886666666667,0.442222},
+ {0.0838886666666667,0.442222,0.0833333333333333,0.433333333333334},
+ {0.0833333333333333,0.433333333333334,0.0833333333333333,0.423333333333333},
+ {0.0833333333333333,0.423333333333333,0.0833333333333333,0.413333333333333},
+ {0.0833333333333333,0.413333333333333,0.0838886666666667,0.404444666666667},
+ {0.0838886666666667,0.404444666666667,0.0850000000000009,0.395555333333334},
+ {0.0850000000000009,0.395555333333334,0.0861106666666676,0.388333333333333},
+ {0.0861106666666676,0.388333333333333,0.0883333333333335,0.382778},
+ {0.0883333333333335,0.382778,0.0916666666666662,0.378333333333333},
+ {0.0916666666666662,0.378333333333333,0.0961106666666656,0.375},
+ {0.0961106666666656,0.375,0.101666666666667,0.372778},
+ {0.101666666666667,0.372778,0.108888666666668,0.371666666666667},
+ {0.108888666666668,0.371666666666667,0.117777333333334,0.370555333333333},
+ {0.117777333333334,0.370555333333333,0.126666666666668,0.37},
+ {0.146666666666666,0.37,0.155555333333332,0.370555333333333},
+ {0.155555333333332,0.370555333333333,0.164444000000001,0.371666666666667},
+ {0.164444000000001,0.371666666666667,0.171666666666667,0.372778},
+ {0.171666666666667,0.372778,0.177222,0.375},
+ {0.177222,0.375,0.181666666666667,0.378333333333333},
+ {0,0,0,0}
+};
+
+double Icon21[][4] = {
+ {0.0277780000000002,0.283888666666667,0.0216666666666659,0.288888666666667},
+ {0.034999999999999,0.279444666666667,0.0277780000000002,0.283888666666667},
+ {0.0427779999999984,0.275555333333333,0.034999999999999,0.279444666666667},
+ {0.0522226666666654,0.272222,0.0427779999999984,0.275555333333333},
+ {0.0627779999999992,0.269444666666667,0.0522226666666654,0.272222},
+ {0.0738893333333337,0.266666666666667,0.0627779999999992,0.269444666666667},
+ {0.0861113333333326,0.263888666666666,0.0738893333333337,0.266666666666667},
+ {0.0988893333333323,0.262222,0.0861113333333326,0.263888666666666},
+ {0.112777999999999,0.26,0.0988893333333323,0.262222},
+ {0.126666666666665,0.258333333333334,0.112777999999999,0.26},
+ {0.141666666666666,0.256666666666667,0.126666666666665,0.258333333333334},
+ {0.156111333333333,0.255,0.141666666666666,0.256666666666667},
+ {0.170556,0.254444666666667,0.156111333333333,0.255},
+ {0.185556000000001,0.253888666666667,0.170556,0.254444666666667},
+ {0.199444666666667,0.253333333333333,0.185556000000001,0.253888666666667},
+ {0.213333333333334,0.253888666666667,0.199444666666667,0.253333333333333},
+ {0.226111333333333,0.255,0.213333333333334,0.253888666666667},
+ {0.238333333333332,0.256666666666667,0.226111333333333,0.255},
+ {0.249444666666667,0.258888666666667,0.238333333333332,0.256666666666667},
+ {0.26,0.262778,0.249444666666667,0.258888666666667},
+ {0.269444666666667,0.267222,0.26,0.262778},
+ {0.277222666666667,0.273333333333333,0.269444666666667,0.267222},
+ {0.284444666666666,0.280555333333333,0.277222666666667,0.273333333333333},
+ {0.290556,0.288888666666667,0.284444666666666,0.280555333333333},
+ {0.294999999999999,0.297222,0.290556,0.288888666666667},
+ {0.298889333333333,0.307222,0.294999999999999,0.297222},
+ {0.302222666666665,0.318333333333333,0.298889333333333,0.307222},
+ {0.304444666666666,0.331111333333334,0.302222666666665,0.318333333333333},
+ {0.306666666666667,0.344444666666667,0.304444666666666,0.331111333333334},
+ {0.308333333333332,0.36,0.306666666666667,0.344444666666667},
+ {0.309444666666666,0.376111333333334,0.308333333333332,0.36},
+ {0.31,0.393333333333333,0.309444666666666,0.376111333333334},
+ {0.31,0.411666666666667,0.31,0.393333333333333},
+ {0.31,0.431111333333333,0.31,0.411666666666667},
+ {0.309444666666666,0.450555333333333,0.31,0.431111333333333},
+ {0.308889333333333,0.471111333333334,0.309444666666666,0.450555333333333},
+ {0.308333333333332,0.492222,0.308889333333333,0.471111333333334},
+ {0.307222666666666,0.513333333333333,0.308333333333332,0.492222},
+ {0.306111333333334,0.533888666666667,0.307222666666666,0.513333333333333},
+ {0.305,0.555,0.306111333333334,0.533888666666667},
+ {0.303889333333333,0.575555333333333,0.305,0.555},
+ {0.302777999999999,0.595,0.303889333333333,0.575555333333333},
+ {0.301666666666667,0.614444666666667,0.302777999999999,0.595},
+ {0.300556,0.632778,0.301666666666667,0.614444666666667},
+ {0.299444666666666,0.65,0.300556,0.632778},
+ {0.298333333333332,0.666111333333333,0.299444666666666,0.65},
+ {0.296666666666667,0.681666666666667,0.298333333333332,0.666111333333333},
+ {0.295556,0.695,0.296666666666667,0.681666666666667},
+ {0.294444666666666,0.707778,0.295556,0.695},
+ {0.293333333333332,0.718888666666667,0.294444666666666,0.707778},
+ {0.292222666666667,0.728888666666667,0.293333333333332,0.718888666666667},
+ {0.290556,0.737222,0.292222666666667,0.728888666666667},
+ {0.288333333333334,0.745555333333333,0.290556,0.737222},
+ {0.286111333333333,0.752778,0.288333333333334,0.745555333333333},
+ {0.283333333333334,0.758888666666667,0.286111333333333,0.752778},
+ {0.280555999999999,0.763333333333333,0.283333333333334,0.758888666666667},
+ {0.276666666666666,0.766111333333334,0.280555999999999,0.763333333333333},
+ {0.273333333333333,0.768888666666667,0.276666666666666,0.766111333333334},
+ {0.268889333333334,0.77,0.273333333333333,0.768888666666667},
+ {0.265000000000001,0.770555333333334,0.268889333333334,0.77},
+ {0.26,0.77,0.265000000000001,0.770555333333334},
+ {0.255555999999999,0.769444666666667,0.26,0.77},
+ {0.250556000000001,0.768333333333333,0.255555999999999,0.769444666666667},
+ {0.245556000000001,0.766666666666667,0.250556000000001,0.768333333333333},
+ {0.241111333333334,0.765,0.245556000000001,0.766666666666667},
+ {0.236111333333334,0.762778,0.241111333333334,0.765},
+ {0.231666666666667,0.760555333333333,0.236111333333334,0.762778},
+ {0.226666666666667,0.758333333333334,0.231666666666667,0.760555333333333},
+ {0.222778000000001,0.756111333333333,0.226666666666667,0.758333333333334},
+ {0.218333333333334,0.753888666666667,0.222778000000001,0.756111333333333},
+ {0.214999999999999,0.751111333333334,0.218333333333334,0.753888666666667},
+ {0.211111333333333,0.748888666666667,0.214999999999999,0.751111333333334},
+ {0.208333333333333,0.746666666666667,0.211111333333333,0.748888666666667},
+ {0.205555999999999,0.743888666666667,0.208333333333333,0.746666666666667},
+ {0.203333333333333,0.740555333333334,0.205555999999999,0.743888666666667},
+ {0.201111333333332,0.737222,0.203333333333333,0.740555333333334},
+ {0.198889333333334,0.731111333333333,0.201111333333332,0.737222},
+ {0.197222666666666,0.722778,0.198889333333334,0.731111333333333},
+ {0.196666666666665,0.713333333333334,0.197222666666666,0.722778},
+ {0.197222666666666,0.702222,0.196666666666665,0.713333333333334},
+ {0.198333333333333,0.69,0.197222666666666,0.702222},
+ {0.200555999999999,0.676666666666667,0.198333333333333,0.69},
+ {0.202778,0.662222,0.200555999999999,0.676666666666667},
+ {0.205555999999999,0.647778,0.202778,0.662222},
+ {0.207778,0.632778,0.205555999999999,0.647778},
+ {0.209999999999998,0.618333333333334,0.207778,0.632778},
+ {0.211666666666666,0.605,0.209999999999998,0.618333333333334},
+ {0.212222666666667,0.592778,0.211666666666666,0.605},
+ {0.211666666666666,0.581666666666666,0.212222666666667,0.592778},
+ {0.209444666666665,0.572222,0.211666666666666,0.581666666666666},
+ {0.206111333333332,0.563888666666667,0.209444666666665,0.572222},
+ {0.201111333333332,0.557778,0.206111333333332,0.563888666666667},
+ {0.195,0.552778,0.201111333333332,0.557778},
+ {0.186666666666665,0.55,0.195,0.552778},
+ {0.177222666666665,0.548333333333333,0.186666666666665,0.55},
+ {0.166111333333333,0.548888666666667,0.177222666666665,0.548333333333333},
+ {0.153889333333332,0.550555333333334,0.166111333333333,0.548888666666667},
+ {0.140555999999999,0.553888666666667,0.153889333333332,0.550555333333334},
+ {0.126111333333332,0.557778,0.140555999999999,0.553888666666667},
+ {0.111666666666667,0.562222,0.126111333333332,0.557778},
+ {0.0966666666666664,0.566111333333333,0.111666666666667,0.562222},
+ {0.0822226666666666,0.57,0.0966666666666664,0.566111333333333},
+ {0.0688893333333335,0.572778,0.0822226666666666,0.57},
+ {0.0566666666666672,0.573888666666667,0.0688893333333335,0.572778},
+ {0.0455560000000001,0.572778,0.0566666666666672,0.573888666666667},
+ {0.0361113333333331,0.57,0.0455560000000001,0.572778},
+ {0.0277780000000002,0.565,0.0361113333333331,0.57},
+ {0.0216666666666659,0.557778,0.0277780000000002,0.565},
+ {0.0177779999999998,0.551111333333333,0.0216666666666659,0.557778},
+ {0.0150000000000006,0.543333333333334,0.0177779999999998,0.551111333333333},
+ {0.0122226666666663,0.533888666666667,0.0150000000000006,0.543333333333334},
+ {0.0100000000000004,0.523333333333333,0.0122226666666663,0.533888666666667},
+ {0.00777799999999947,0.511666666666667,0.0100000000000004,0.523333333333333},
+ {0.00611133333333195,0.498888666666667,0.00777799999999947,0.511666666666667},
+ {0.00500000000000019,0.485,0.00611133333333195,0.498888666666667},
+ {0.00333333333333267,0.470555333333333,0.00500000000000019,0.485},
+ {0.00222266666666589,0.455,0.00333333333333267,0.470555333333333},
+ {0.00166666666666515,0.439444666666667,0.00222266666666589,0.455},
+ {0.000556000000000741,0.423333333333333,0.00166666666666515,0.439444666666667},
+ {0,0.407222,0.000556000000000741,0.423333333333333},
+ {0,0.391666666666667,0,0.407222},
+ {0,0.376111333333334,0,0.391666666666667},
+ {0.000556000000000741,0.361666666666667,0,0.376111333333334},
+ {0.00166666666666515,0.347778,0.000556000000000741,0.361666666666667},
+ {0.00277799999999928,0.335,0.00166666666666515,0.347778},
+ {0.00500000000000019,0.323333333333334,0.00277799999999928,0.335},
+ {0.00777799999999947,0.312778,0.00500000000000019,0.323333333333334},
+ {0.0116666666666655,0.303333333333333,0.00777799999999947,0.312778},
+ {0.0161113333333323,0.295555333333333,0.0116666666666655,0.303333333333333},
+ {0.0216666666666659,0.288888666666667,0.0161113333333323,0.295555333333333},
+ {0.201111333333332,0.378333333333333,0.204444666666667,0.382778},
+ {0.204444666666667,0.382778,0.206666666666666,0.388333333333333},
+ {0.206666666666666,0.388333333333333,0.207778,0.395555333333334},
+ {0.207778,0.395555333333334,0.208889333333334,0.404444666666667},
+ {0.208889333333334,0.404444666666667,0.209444666666665,0.413333333333333},
+ {0.209444666666665,0.413333333333333,0.209444666666665,0.423333333333333},
+ {0.209444666666665,0.423333333333333,0.209444666666665,0.433333333333334},
+ {0.209444666666665,0.433333333333334,0.208889333333334,0.442222},
+ {0.208889333333334,0.442222,0.207778,0.451111333333333},
+ {0.207778,0.451111333333333,0.206666666666666,0.458333333333333},
+ {0.206666666666666,0.458333333333333,0.204444666666667,0.463888666666667},
+ {0.204444666666667,0.463888666666667,0.201111333333332,0.468333333333333},
+ {0.201111333333332,0.468333333333333,0.196666666666665,0.471666666666666},
+ {0.196666666666665,0.471666666666666,0.191111333333332,0.473888666666667},
+ {0.191111333333332,0.473888666666667,0.183889333333333,0.475},
+ {0.183889333333333,0.475,0.175,0.476111333333333},
+ {0.175,0.476111333333333,0.166111333333333,0.476666666666667},
+ {0.146111333333333,0.476666666666667,0.137222666666666,0.476111333333333},
+ {0.137222666666666,0.476111333333333,0.128333333333333,0.475},
+ {0.128333333333333,0.475,0.121111333333334,0.473888666666667},
+ {0.121111333333334,0.473888666666667,0.115556,0.471666666666666},
+ {0.115556,0.471666666666666,0.111111333333334,0.468333333333333},
+ {0.111111333333334,0.468333333333333,0.107777999999999,0.463888666666667},
+ {0.107777999999999,0.463888666666667,0.105556,0.458333333333333},
+ {0.105556,0.458333333333333,0.104444666666666,0.451111333333333},
+ {0.104444666666666,0.451111333333333,0.103333333333332,0.442222},
+ {0.103333333333332,0.442222,0.102778000000001,0.433333333333334},
+ {0.102778000000001,0.433333333333334,0.102778000000001,0.423333333333333},
+ {0.102778000000001,0.423333333333333,0.102778000000001,0.413333333333333},
+ {0.102778000000001,0.413333333333333,0.103333333333332,0.404444666666667},
+ {0.103333333333332,0.404444666666667,0.104444666666666,0.395555333333334},
+ {0.104444666666666,0.395555333333334,0.105556,0.388333333333333},
+ {0.105556,0.388333333333333,0.107777999999999,0.382778},
+ {0.107777999999999,0.382778,0.111111333333334,0.378333333333333},
+ {0.111111333333334,0.378333333333333,0.115556,0.375},
+ {0.115556,0.375,0.121111333333334,0.372778},
+ {0.121111333333334,0.372778,0.128333333333333,0.371666666666667},
+ {0.128333333333333,0.371666666666667,0.137222666666666,0.370555333333333},
+ {0.137222666666666,0.370555333333333,0.146111333333333,0.37},
+ {0.166111333333333,0.37,0.175,0.370555333333333},
+ {0.175,0.370555333333333,0.183889333333333,0.371666666666667},
+ {0.183889333333333,0.371666666666667,0.191111333333332,0.372778},
+ {0.191111333333332,0.372778,0.196666666666665,0.375},
+ {0.196666666666665,0.375,0.201111333333332,0.378333333333333},
+ {0,0,0,0}
+};
+
+double Icon22[][4] = {
+ {0.0416666666666667,0.208333333333333,0,0.25},
+ {0.166666666666667,0.25,0.125,0.208333333333333},
+ {0.166666666666667,0.75,0.166666666666667,0.25},
+ {0.125,0.791666666666667,0.166666666666667,0.75},
+ {0,0.75,0.0416666666666667,0.791666666666667},
+ {0,0.25,0,0.75},
+ {0.125,0.375,0.125,0.416666666666667},
+ {0.0416666666666667,0.416666666666667,0.0416666666666667,0.375},
+ {0.125,0.458333333333333,0.125,0.541666666666667},
+ {0.0416666666666667,0.541666666666667,0.0416666666666667,0.458333333333333},
+ {0.125,0.583333333333333,0.125,0.625},
+ {0.0416666666666667,0.625,0.0416666666666667,0.583333333333333},
+ {0,0,0,0}
+};
+
+double Icon23[][4] = {
+ {0.0416666666666667,0.208333333333333,0,0.25},
+ {0.166666666666667,0.25,0.125,0.208333333333333},
+ {0.166666666666667,0.75,0.166666666666667,0.25},
+ {0.125,0.791666666666667,0.166666666666667,0.75},
+ {0,0.75,0.0416666666666667,0.791666666666667},
+ {0,0.25,0,0.75},
+ {0.0416666666666667,0.291666666666667,0.0833333333333333,0.25},
+ {0.0833333333333333,0.25,0.125,0.291666666666667},
+ {0.125,0.291666666666667,0.125,0.708333333333333},
+ {0.125,0.708333333333333,0.0833333333333333,0.75},
+ {0.0833333333333333,0.75,0.0416666666666667,0.708333333333333},
+ {0.0416666666666667,0.708333333333333,0.0416666666666667,0.291666666666667},
+ {0,0,0,0}
+};
+
+double Icon24[][4] = {
+ {0.0377780000000006,0.191666666666666,0.0377780000000006,0.341666666666667},
+ {0.0377780000000006,0.153888666666666,0.0750000000000005,0.191666666666666},
+ {0.112778000000001,0.0416666666666667,0.0377780000000006,0.153888666666666},
+ {0.187777999999999,0.153888666666666,0.112778000000001,0.0416666666666667},
+ {0.150000000000001,0.191666666666666,0.187777999999999,0.153888666666666},
+ {0.187777999999999,0.341666666666667,0.187777999999999,0.191666666666666},
+ {0.224999999999999,0.678888666666667,0.224999999999999,0.341666666666667},
+ {0,0.341666666666667,0,0.678888666666667},
+ {0.0750000000000005,0.678888666666667,0.112778000000001,0.941666666666666},
+ {0.112778000000001,0.941666666666666,0.150000000000001,0.978888666666667},
+ {0.375,0.978888666666667,0.375,0.866666666666667},
+ {0.224999999999999,0.866666666666667,0.187777999999999,0.828888666666667},
+ {0.187777999999999,0.828888666666667,0.150000000000001,0.678888666666667},
+ {0,0,0,0}
+};
+
+double Icon25[][4] = {
+ {0.166666666666667,0.583333333333333,0.333333333333333,0.416666666666667},
+ {0,0.416666666666667,0.166666666666667,0.583333333333333},
+ {0,0,0,0}
+};
+
+double Icon26[][4] = {
+ {0.148888666666664,0.0399999999999998,0.136666666666666,0.0416666666666667},
+ {0.161666666666666,0.0383333333333334,0.148888666666664,0.0399999999999998},
+ {0.176111333333331,0.0372219999999999,0.161666666666666,0.0383333333333334},
+ {0.191111333333332,0.0361113333333332,0.176111333333331,0.0372219999999999},
+ {0.207778,0.0350000000000001,0.191111333333332,0.0361113333333332},
+ {0.224999999999999,0.0338886666666667,0.207778,0.0350000000000001},
+ {0.243888666666666,0.0333333333333332,0.224999999999999,0.0338886666666667},
+ {0.263333333333333,0.0322220000000003,0.243888666666666,0.0333333333333332},
+ {0.283333333333331,0.031666666666667,0.263333333333333,0.0322220000000003},
+ {0.305,0.0311113333333335,0.283333333333331,0.031666666666667},
+ {0.349444666666666,0.0305553333333334,0.326666666666666,0.0311113333333335},
+ {0.396666666666666,0.03,0.372777999999999,0.0305553333333334},
+ {0.567221999999999,0.0305553333333334,0.543333333333332,0.03},
+ {0.613333333333332,0.0311113333333335,0.590555333333332,0.0305553333333334},
+ {0.656666666666666,0.031666666666667,0.634999999999998,0.0311113333333335},
+ {0.676666666666665,0.0322220000000003,0.656666666666666,0.031666666666667},
+ {0.696111333333332,0.0333333333333332,0.676666666666665,0.0322220000000003},
+ {0.714999999999999,0.0338886666666667,0.696111333333332,0.0333333333333332},
+ {0.732221999999998,0.0350000000000001,0.714999999999999,0.0338886666666667},
+ {0.748888666666666,0.0361113333333332,0.732221999999998,0.0350000000000001},
+ {0.763888666666666,0.0372219999999999,0.748888666666666,0.0361113333333332},
+ {0.778333333333331,0.0383333333333334,0.763888666666666,0.0372219999999999},
+ {0.791111333333333,0.0399999999999998,0.778333333333331,0.0383333333333334},
+ {0.803333333333332,0.0416666666666667,0.791111333333333,0.0399999999999998},
+ {0.818888666666666,0.0444446666666666,0.803333333333332,0.0416666666666667},
+ {0.832778,0.0472220000000003,0.818888666666666,0.0444446666666666},
+ {0.844444666666665,0.0505553333333335,0.832778,0.0472220000000003},
+ {0.854999999999999,0.0533333333333335,0.844444666666665,0.0505553333333335},
+ {0.863888666666665,0.0566666666666666,0.854999999999999,0.0533333333333335},
+ {0.871666666666665,0.058888666666667,0.863888666666665,0.0566666666666666},
+ {0.877777999999999,0.0616666666666669,0.871666666666665,0.058888666666667},
+ {0.883333333333333,0.0638886666666666,0.877777999999999,0.0616666666666669},
+ {0.887778,0.0661113333333331,0.883333333333333,0.0638886666666666},
+ {0.891111333333332,0.0683333333333334,0.887778,0.0661113333333331},
+ {0.894444666666665,0.0705553333333331,0.891111333333332,0.0683333333333334},
+ {0.897221999999999,0.0727780000000002,0.894444666666665,0.0705553333333331},
+ {0.899444666666665,0.0755553333333333,0.897221999999999,0.0727780000000002},
+ {0.901666666666666,0.0788886666666666,0.899444666666665,0.0755553333333333},
+ {0.903888666666665,0.0822219999999998,0.901666666666666,0.0788886666666666},
+ {0.906111333333333,0.0866666666666667,0.903888666666665,0.0822219999999998},
+ {0.908333333333331,0.0922220000000002,0.906111333333333,0.0866666666666667},
+ {0.911111333333333,0.0983333333333334,0.908333333333331,0.0922220000000002},
+ {0.913333333333332,0.106111333333333,0.911111333333333,0.0983333333333334},
+ {0.916666666666667,0.115,0.913333333333332,0.106111333333333},
+ {0.919444666666666,0.125555333333333,0.916666666666667,0.115},
+ {0.922777999999999,0.137222,0.919444666666666,0.125555333333333},
+ {0.925555333333333,0.151111333333333,0.922777999999999,0.137222},
+ {0.928333333333332,0.166666666666667,0.925555333333333,0.151111333333333},
+ {0.93,0.178888666666667,0.928333333333332,0.166666666666667},
+ {0.931666666666665,0.191666666666666,0.93,0.178888666666667},
+ {0.932777999999999,0.206111333333334,0.931666666666665,0.191666666666666},
+ {0.933888666666666,0.221111333333334,0.932777999999999,0.206111333333334},
+ {0.935,0.237778,0.933888666666666,0.221111333333334},
+ {0.936111333333332,0.255,0.935,0.237778},
+ {0.936666666666665,0.273888666666667,0.936111333333332,0.255},
+ {0.937777999999999,0.293333333333334,0.936666666666665,0.273888666666667},
+ {0.938333333333333,0.313333333333333,0.937777999999999,0.293333333333334},
+ {0.938888666666666,0.335,0.938333333333333,0.313333333333333},
+ {0.938888666666666,0.356666666666667,0.938888666666666,0.335},
+ {0.939444666666667,0.379444666666667,0.938888666666666,0.356666666666667},
+ {0.939444666666667,0.402778,0.939444666666667,0.379444666666667},
+ {0.939999999999998,0.426666666666667,0.939444666666667,0.402778},
+ {0.939999999999998,0.451111333333333,0.939999999999998,0.426666666666667},
+ {0.939999999999998,0.475555333333334,0.939999999999998,0.451111333333333},
+ {0.939999999999998,0.5,0.939999999999998,0.475555333333334},
+ {0.939999999999998,0.524444666666666,0.939999999999998,0.5},
+ {0.939999999999998,0.548888666666667,0.939999999999998,0.524444666666666},
+ {0.939999999999998,0.573333333333334,0.939999999999998,0.548888666666667},
+ {0.939444666666667,0.597222,0.939999999999998,0.573333333333334},
+ {0.939444666666667,0.620555333333333,0.939444666666667,0.597222},
+ {0.938888666666666,0.643333333333333,0.939444666666667,0.620555333333333},
+ {0.938888666666666,0.665,0.938888666666666,0.643333333333333},
+ {0.938333333333333,0.686666666666667,0.938888666666666,0.665},
+ {0.937777999999999,0.706666666666666,0.938333333333333,0.686666666666667},
+ {0.936666666666665,0.726111333333333,0.937777999999999,0.706666666666666},
+ {0.936111333333332,0.745,0.936666666666665,0.726111333333333},
+ {0.935,0.762222,0.936111333333332,0.745},
+ {0.933888666666666,0.778888666666666,0.935,0.762222},
+ {0.932777999999999,0.793888666666666,0.933888666666666,0.778888666666666},
+ {0.931666666666665,0.808333333333334,0.932777999999999,0.793888666666666},
+ {0.93,0.821111333333333,0.931666666666665,0.808333333333334},
+ {0.928333333333332,0.833333333333333,0.93,0.821111333333333},
+ {0.925555333333333,0.848888666666667,0.928333333333332,0.833333333333333},
+ {0.922777999999999,0.862778,0.925555333333333,0.848888666666667},
+ {0.919444666666666,0.874444666666667,0.922777999999999,0.862778},
+ {0.916666666666667,0.885,0.919444666666666,0.874444666666667},
+ {0.913333333333332,0.893888666666667,0.916666666666667,0.885},
+ {0.911111333333333,0.901666666666667,0.913333333333332,0.893888666666667},
+ {0.908333333333331,0.907778,0.911111333333333,0.901666666666667},
+ {0.906111333333333,0.913333333333333,0.908333333333331,0.907778},
+ {0.903888666666665,0.917778,0.906111333333333,0.913333333333333},
+ {0.901666666666666,0.921111333333334,0.903888666666665,0.917778},
+ {0.899444666666665,0.924444666666667,0.901666666666666,0.921111333333334},
+ {0.897221999999999,0.927222,0.899444666666665,0.924444666666667},
+ {0.894444666666665,0.929444666666667,0.897221999999999,0.927222},
+ {0.891111333333332,0.931666666666667,0.894444666666665,0.929444666666667},
+ {0.887778,0.933888666666667,0.891111333333332,0.931666666666667},
+ {0.883333333333333,0.936111333333333,0.887778,0.933888666666667},
+ {0.877777999999999,0.938333333333333,0.883333333333333,0.936111333333333},
+ {0.871666666666665,0.941111333333333,0.877777999999999,0.938333333333333},
+ {0.863888666666665,0.943333333333333,0.871666666666665,0.941111333333333},
+ {0.854999999999999,0.946666666666667,0.863888666666665,0.943333333333333},
+ {0.844444666666665,0.949444666666666,0.854999999999999,0.946666666666667},
+ {0.832778,0.952778,0.844444666666665,0.949444666666666},
+ {0.818888666666666,0.955555333333333,0.832778,0.952778},
+ {0.803333333333332,0.958333333333333,0.818888666666666,0.955555333333333},
+ {0.791111333333333,0.96,0.803333333333332,0.958333333333333},
+ {0.778333333333331,0.961666666666667,0.791111333333333,0.96},
+ {0.763888666666666,0.962778,0.778333333333331,0.961666666666667},
+ {0.748888666666666,0.963888666666667,0.763888666666666,0.962778},
+ {0.732221999999998,0.965,0.748888666666666,0.963888666666667},
+ {0.714999999999999,0.966111333333333,0.732221999999998,0.965},
+ {0.696111333333332,0.966666666666667,0.714999999999999,0.966111333333333},
+ {0.676666666666665,0.967778,0.696111333333332,0.966666666666667},
+ {0.656666666666666,0.968333333333333,0.676666666666665,0.967778},
+ {0.634999999999998,0.968888666666667,0.656666666666666,0.968333333333333},
+ {0.590555333333332,0.969444666666667,0.613333333333332,0.968888666666667},
+ {0.543333333333332,0.97,0.567221999999999,0.969444666666667},
+ {0.372777999999999,0.969444666666667,0.396666666666666,0.97},
+ {0.326666666666666,0.968888666666667,0.349444666666666,0.969444666666667},
+ {0.283333333333331,0.968333333333333,0.305,0.968888666666667},
+ {0.263333333333333,0.967778,0.283333333333331,0.968333333333333},
+ {0.243888666666666,0.966666666666667,0.263333333333333,0.967778},
+ {0.224999999999999,0.966111333333333,0.243888666666666,0.966666666666667},
+ {0.207778,0.965,0.224999999999999,0.966111333333333},
+ {0.191111333333332,0.963888666666667,0.207778,0.965},
+ {0.176111333333331,0.962778,0.191111333333332,0.963888666666667},
+ {0.161666666666666,0.961666666666667,0.176111333333331,0.962778},
+ {0.148888666666664,0.96,0.161666666666666,0.961666666666667},
+ {0.136666666666666,0.958333333333333,0.148888666666664,0.96},
+ {0.121111333333332,0.955555333333333,0.136666666666666,0.958333333333333},
+ {0.107221999999998,0.952778,0.121111333333332,0.955555333333333},
+ {0.0955553333333322,0.949444666666666,0.107221999999998,0.952778},
+ {0.0849999999999985,0.946666666666667,0.0955553333333322,0.949444666666666},
+ {0.0761113333333322,0.943333333333333,0.0849999999999985,0.946666666666667},
+ {0.0683333333333328,0.941111333333333,0.0761113333333322,0.943333333333333},
+ {0.0622219999999984,0.938333333333333,0.0683333333333328,0.941111333333333},
+ {0.0566666666666649,0.936111333333333,0.0622219999999984,0.938333333333333},
+ {0.0522219999999981,0.933888666666667,0.0566666666666649,0.936111333333333},
+ {0.0488886666666654,0.931666666666667,0.0522219999999981,0.933888666666667},
+ {0.0455553333333327,0.929444666666667,0.0488886666666654,0.931666666666667},
+ {0.0427779999999984,0.927222,0.0455553333333327,0.929444666666667},
+ {0.0405553333333325,0.924444666666667,0.0427779999999984,0.927222},
+ {0.0383333333333316,0.921111333333334,0.0405553333333325,0.924444666666667},
+ {0.0361113333333331,0.917778,0.0383333333333316,0.921111333333334},
+ {0.0338886666666648,0.913333333333333,0.0361113333333331,0.917778},
+ {0.0316666666666663,0.907778,0.0338886666666648,0.913333333333333},
+ {0.0288886666666646,0.901666666666667,0.0316666666666663,0.907778},
+ {0.0266666666666661,0.893888666666667,0.0288886666666646,0.901666666666667},
+ {0.0233333333333311,0.885,0.0266666666666661,0.893888666666667},
+ {0.0205553333333318,0.874444666666667,0.0233333333333311,0.885},
+ {0.0172219999999991,0.862778,0.0205553333333318,0.874444666666667},
+ {0.0144446666666648,0.848888666666667,0.0172219999999991,0.862778},
+ {0.0116666666666655,0.833333333333333,0.0144446666666648,0.848888666666667},
+ {0.00999999999999801,0.821111333333333,0.0116666666666655,0.833333333333333},
+ {0.00833333333333286,0.808333333333334,0.00999999999999801,0.821111333333333},
+ {0.00722199999999873,0.793888666666666,0.00833333333333286,0.808333333333334},
+ {0.00611133333333195,0.778888666666666,0.00722199999999873,0.793888666666666},
+ {0.00499999999999782,0.762222,0.00611133333333195,0.778888666666666},
+ {0.00388866666666606,0.745,0.00499999999999782,0.762222},
+ {0.00333333333333267,0.726111333333333,0.00388866666666606,0.745},
+ {0.00222199999999854,0.706666666666666,0.00333333333333267,0.726111333333333},
+ {0.00166666666666515,0.686666666666667,0.00222199999999854,0.706666666666666},
+ {0.00111133333333176,0.665,0.00166666666666515,0.686666666666667},
+ {0.00111133333333176,0.643333333333333,0.00111133333333176,0.665},
+ {0.000555333333331021,0.620555333333333,0.00111133333333176,0.643333333333333},
+ {0.000555333333331021,0.597222,0.000555333333331021,0.620555333333333},
+ {0,0.573333333333334,0.000555333333331021,0.597222},
+ {0,0.548888666666667,0,0.573333333333334},
+ {0,0.524444666666666,0,0.548888666666667},
+ {0,0.5,0,0.524444666666666},
+ {0,0.475555333333334,0,0.5},
+ {0,0.451111333333333,0,0.475555333333334},
+ {0,0.426666666666667,0,0.451111333333333},
+ {0.000555333333331021,0.402778,0,0.426666666666667},
+ {0.000555333333331021,0.379444666666667,0.000555333333331021,0.402778},
+ {0.00111133333333176,0.356666666666667,0.000555333333331021,0.379444666666667},
+ {0.00111133333333176,0.335,0.00111133333333176,0.356666666666667},
+ {0.00166666666666515,0.313333333333333,0.00111133333333176,0.335},
+ {0.00222199999999854,0.293333333333334,0.00166666666666515,0.313333333333333},
+ {0.00333333333333267,0.273888666666667,0.00222199999999854,0.293333333333334},
+ {0.00388866666666606,0.255,0.00333333333333267,0.273888666666667},
+ {0.00499999999999782,0.237778,0.00388866666666606,0.255},
+ {0.00611133333333195,0.221111333333334,0.00499999999999782,0.237778},
+ {0.00722199999999873,0.206111333333334,0.00611133333333195,0.221111333333334},
+ {0.00833333333333286,0.191666666666666,0.00722199999999873,0.206111333333334},
+ {0.00999999999999801,0.178888666666667,0.00833333333333286,0.191666666666666},
+ {0.0116666666666655,0.166666666666667,0.00999999999999801,0.178888666666667},
+ {0.0144446666666648,0.151111333333333,0.0116666666666655,0.166666666666667},
+ {0.0172219999999991,0.137222,0.0144446666666648,0.151111333333333},
+ {0.0205553333333318,0.125555333333333,0.0172219999999991,0.137222},
+ {0.0233333333333311,0.115,0.0205553333333318,0.125555333333333},
+ {0.0266666666666661,0.106111333333333,0.0233333333333311,0.115},
+ {0.0288886666666646,0.0983333333333334,0.0266666666666661,0.106111333333333},
+ {0.0316666666666663,0.0922220000000002,0.0288886666666646,0.0983333333333334},
+ {0.0338886666666648,0.0866666666666667,0.0316666666666663,0.0922220000000002},
+ {0.0361113333333331,0.0822219999999998,0.0338886666666648,0.0866666666666667},
+ {0.0383333333333316,0.0788886666666666,0.0361113333333331,0.0822219999999998},
+ {0.0405553333333325,0.0755553333333333,0.0383333333333316,0.0788886666666666},
+ {0.0427779999999984,0.0727780000000002,0.0405553333333325,0.0755553333333333},
+ {0.0455553333333327,0.0705553333333331,0.0427779999999984,0.0727780000000002},
+ {0.0488886666666654,0.0683333333333334,0.0455553333333327,0.0705553333333331},
+ {0.0522219999999981,0.0661113333333331,0.0488886666666654,0.0683333333333334},
+ {0.0566666666666649,0.0638886666666666,0.0522219999999981,0.0661113333333331},
+ {0.0622219999999984,0.0616666666666669,0.0566666666666649,0.0638886666666666},
+ {0.0683333333333328,0.058888666666667,0.0622219999999984,0.0616666666666669},
+ {0.0761113333333322,0.0566666666666666,0.0683333333333328,0.058888666666667},
+ {0.0849999999999985,0.0533333333333335,0.0761113333333322,0.0566666666666666},
+ {0.0955553333333322,0.0505553333333335,0.0849999999999985,0.0533333333333335},
+ {0.107221999999998,0.0472220000000003,0.0955553333333322,0.0505553333333335},
+ {0.121111333333332,0.0444446666666666,0.107221999999998,0.0472220000000003},
+ {0.136666666666666,0.0416666666666667,0.121111333333332,0.0444446666666666},
+ {0,0,0,0}
+};
+
+double Icon27[][4] = {
+ {0,0.458333333333333,0,0.541666666666667},
+ {1,0.541666666666667,1,0.458333333333333},
+ {0,0,0,0}
+};
+
+double Icon28[][4] = {
+ {0.0838893333333317,0.25,0.0822226666666666,0.251111333333334},
+ {0.0822226666666666,0.251111333333334,0.0794446666666649,0.253333333333333},
+ {0.0794446666666649,0.253333333333333,0.0738893333333337,0.256666666666667},
+ {0.0738893333333337,0.256666666666667,0.0661113333333319,0.262222},
+ {0.0661113333333319,0.262222,0.0572226666666656,0.268888666666667},
+ {0.0572226666666656,0.268888666666667,0.0472226666666652,0.276666666666667},
+ {0.0472226666666652,0.276666666666667,0.0366666666666665,0.284444666666667},
+ {0.0366666666666665,0.284444666666667,0.0272226666666668,0.292778},
+ {0.0272226666666668,0.292778,0.0188893333333316,0.300555333333334},
+ {0.0188893333333316,0.300555333333334,0.0116666666666655,0.308888666666667},
+ {0.0116666666666655,0.308888666666667,0.00666666666666534,0.316666666666666},
+ {0.00666666666666534,0.316666666666666,0.00277799999999928,0.325},
+ {0.00277799999999928,0.325,0.000555999999998373,0.333333333333333},
+ {0.000555999999998373,0.333333333333333,0,0.341666666666667},
+ {0,0.341666666666667,0,0.350555333333334},
+ {0,0.350555333333334,0.00111133333333176,0.360555333333333},
+ {0.00111133333333176,0.360555333333333,0.00277799999999928,0.371111333333333},
+ {0.00277799999999928,0.371111333333333,0.00500000000000019,0.382778},
+ {0.00500000000000019,0.382778,0.00833333333333286,0.395},
+ {0.00833333333333286,0.395,0.0116666666666655,0.407778},
+ {0.0116666666666655,0.407778,0.0155559999999989,0.420555333333333},
+ {0.0155559999999989,0.420555333333333,0.019444666666665,0.433333333333334},
+ {0.019444666666665,0.433333333333334,0.0233333333333334,0.445555333333333},
+ {0.0233333333333334,0.445555333333333,0.0272226666666668,0.457778},
+ {0.0272226666666668,0.457778,0.0305559999999995,0.468333333333333},
+ {0.0305559999999995,0.468333333333333,0.0338893333333322,0.478333333333333},
+ {0.0338893333333322,0.478333333333333,0.0366666666666665,0.486666666666667},
+ {0.0366666666666665,0.486666666666667,0.0394446666666658,0.493888666666667},
+ {0.0394446666666658,0.493888666666667,0.042222666666665,0.5},
+ {0.042222666666665,0.5,0.0449999999999993,0.505},
+ {0.0449999999999993,0.505,0.048333333333332,0.508333333333334},
+ {0.048333333333332,0.508333333333334,0.0516666666666647,0.510555333333333},
+ {0.0516666666666647,0.510555333333333,0.0555559999999981,0.511666666666667},
+ {0.0555559999999981,0.511666666666667,0.0599999999999999,0.511111333333333},
+ {0.0599999999999999,0.511111333333333,0.0638893333333333,0.51},
+ {0.0638893333333333,0.51,0.0688893333333335,0.508333333333334},
+ {0.0688893333333335,0.508333333333334,0.0727779999999996,0.506111333333333},
+ {0.0727779999999996,0.506111333333333,0.0766666666666656,0.504444666666667},
+ {0.0766666666666656,0.504444666666667,0.0799999999999983,0.502778},
+ {0.0799999999999983,0.502778,0.0822226666666666,0.501111333333334},
+ {0.0822226666666666,0.501111333333334,0.0833333333333333,0.500555333333333},
+ {0.0833333333333333,0.500555333333333,0.0838893333333317,0.5},
+ {0.187777999999999,0.333333333333333,0.187777999999999,0.335},
+ {0.187777999999999,0.335,0.188889333333333,0.338333333333334},
+ {0.188889333333333,0.338333333333334,0.189444666666667,0.345},
+ {0.189444666666667,0.345,0.191111333333332,0.353888666666667},
+ {0.191111333333332,0.353888666666667,0.192777999999999,0.365555333333334},
+ {0.192777999999999,0.365555333333334,0.194444666666667,0.379444666666667},
+ {0.194444666666667,0.379444666666667,0.196111333333332,0.394444666666667},
+ {0.196111333333332,0.394444666666667,0.197778,0.41},
+ {0.197778,0.41,0.198889333333334,0.425555333333334},
+ {0.198889333333334,0.425555333333334,0.199444666666665,0.440555333333334},
+ {0.199444666666665,0.440555333333334,0.198889333333334,0.453888666666667},
+ {0.198889333333334,0.453888666666667,0.197778,0.466666666666667},
+ {0.197778,0.466666666666667,0.195555999999999,0.478333333333333},
+ {0.195555999999999,0.478333333333333,0.192222666666666,0.489444666666667},
+ {0.192222666666666,0.489444666666667,0.187777999999999,0.5},
+ {0.187777999999999,0.5,0.183333333333332,0.508333333333334},
+ {0.183333333333332,0.508333333333334,0.177777999999999,0.516666666666667},
+ {0.177777999999999,0.516666666666667,0.170556,0.525},
+ {0.170556,0.525,0.162777999999998,0.533333333333333},
+ {0.162777999999998,0.533333333333333,0.153889333333332,0.541666666666667},
+ {0.153889333333332,0.541666666666667,0.144444666666665,0.55},
+ {0.144444666666665,0.55,0.133333333333333,0.558333333333334},
+ {0.133333333333333,0.558333333333334,0.122222666666666,0.566666666666666},
+ {0.122222666666666,0.566666666666666,0.110556,0.575},
+ {0.110556,0.575,0.0983333333333315,0.583333333333333},
+ {0.0983333333333315,0.583333333333333,0.086666666666666,0.591666666666667},
+ {0.086666666666666,0.591666666666667,0.0749999999999981,0.6},
+ {0.0749999999999981,0.6,0.0644446666666667,0.608333333333333},
+ {0.0644446666666667,0.608333333333333,0.0544446666666663,0.616666666666667},
+ {0.0544446666666663,0.616666666666667,0.0449999999999993,0.625},
+ {0.0449999999999993,0.625,0.0372226666666648,0.633333333333334},
+ {0.0372226666666648,0.633333333333334,0.0311113333333329,0.641666666666667},
+ {0.0311113333333329,0.641666666666667,0.0261113333333327,0.65},
+ {0.0261113333333327,0.65,0.022778,0.658333333333333},
+ {0.022778,0.658333333333333,0.0211113333333325,0.666666666666667},
+ {0.0211113333333325,0.666666666666667,0.0211113333333325,0.676111333333333},
+ {0.0211113333333325,0.676111333333333,0.0222226666666666,0.685555333333333},
+ {0.0222226666666666,0.685555333333333,0.0255559999999993,0.695},
+ {0.0255559999999993,0.695,0.0311113333333329,0.705},
+ {0.0311113333333329,0.705,0.0372226666666648,0.715},
+ {0.0372226666666648,0.715,0.0455560000000001,0.725555333333334},
+ {0.0455560000000001,0.725555333333334,0.0538893333333329,0.736111333333334},
+ {0.0538893333333329,0.736111333333334,0.0638893333333333,0.747222},
+ {0.0638893333333333,0.747222,0.0738893333333337,0.757778},
+ {0.0738893333333337,0.757778,0.0838893333333317,0.768333333333333},
+ {0.0838893333333317,0.768333333333333,0.0944446666666655,0.778888666666666},
+ {0.0944446666666655,0.778888666666666,0.103889333333332,0.788888666666667},
+ {0.103889333333332,0.788888666666667,0.113333333333332,0.798333333333333},
+ {0.113333333333332,0.798333333333333,0.121666666666665,0.807222},
+ {0.121666666666665,0.807222,0.128889333333333,0.815},
+ {0.128889333333333,0.815,0.135555999999999,0.822222},
+ {0.135555999999999,0.822222,0.141111333333332,0.828333333333333},
+ {0.141111333333332,0.828333333333333,0.146111333333333,0.833333333333333},
+ {0.146111333333333,0.833333333333333,0.151666666666666,0.838333333333334},
+ {0.151666666666666,0.838333333333334,0.156666666666666,0.841666666666667},
+ {0.156666666666666,0.841666666666667,0.161111333333333,0.843888666666667},
+ {0.161111333333333,0.843888666666667,0.164999999999999,0.845},
+ {0.164999999999999,0.845,0.169444666666666,0.844444666666667},
+ {0.169444666666666,0.844444666666667,0.173333333333332,0.843333333333333},
+ {0.173333333333332,0.843333333333333,0.176666666666665,0.841666666666667},
+ {0.176666666666665,0.841666666666667,0.18,0.839444666666667},
+ {0.18,0.839444666666667,0.182777999999999,0.837778},
+ {0.182777999999999,0.837778,0.185,0.836111333333333},
+ {0.185,0.836111333333333,0.186666666666665,0.834444666666667},
+ {0.186666666666665,0.834444666666667,0.187222666666666,0.833888666666667},
+ {0.187222666666666,0.833888666666667,0.187777999999999,0.833333333333333},
+ {0.354444666666666,1,0.354444666666666,0.916666666666667},
+ {0.0211113333333325,0.916666666666667,0.0211113333333325,1},
+ {0.0833333333333333,0.251666666666667,0.0838893333333317,0.25},
+ {0.0827779999999999,0.255555333333334,0.0833333333333333,0.251666666666667},
+ {0.0822226666666666,0.262222,0.0827779999999999,0.255555333333334},
+ {0.0811113333333324,0.270555333333334,0.0822226666666666,0.262222},
+ {0.0794446666666649,0.280555333333333,0.0811113333333324,0.270555333333334},
+ {0.0788893333333315,0.291111333333333,0.0794446666666649,0.280555333333333},
+ {0.0783333333333331,0.301111333333333,0.0788893333333315,0.291111333333333},
+ {0.0783333333333331,0.310555333333333,0.0783333333333331,0.301111333333333},
+ {0.0794446666666649,0.318888666666667,0.0783333333333331,0.310555333333333},
+ {0.0811113333333324,0.326111333333333,0.0794446666666649,0.318888666666667},
+ {0.0838893333333317,0.333333333333333,0.0811113333333324,0.326111333333333},
+ {0.0872226666666667,0.339444666666667,0.0838893333333317,0.333333333333333},
+ {0.0916666666666662,0.345,0.0872226666666667,0.339444666666667},
+ {0.0972226666666648,0.351111333333333,0.0916666666666662,0.345},
+ {0.104444666666666,0.357222,0.0972226666666648,0.351111333333333},
+ {0.111666666666667,0.363333333333333,0.104444666666666,0.357222},
+ {0.12,0.368888666666667,0.111666666666667,0.363333333333333},
+ {0.128333333333333,0.375,0.12,0.368888666666667},
+ {0.136666666666666,0.381111333333333,0.128333333333333,0.375},
+ {0.144999999999998,0.386666666666667,0.136666666666666,0.381111333333333},
+ {0.152222666666667,0.392778,0.144999999999998,0.386666666666667},
+ {0.157777999999998,0.398888666666667,0.152222666666667,0.392778},
+ {0.162777999999998,0.405,0.157777999999998,0.398888666666667},
+ {0.165556,0.410555333333334,0.162777999999998,0.405},
+ {0.167222666666665,0.416666666666667,0.165556,0.410555333333334},
+ {0.167222666666665,0.423888666666667,0.167222666666665,0.416666666666667},
+ {0.164999999999999,0.431111333333333,0.167222666666665,0.423888666666667},
+ {0.160556,0.438333333333333,0.164999999999999,0.431111333333333},
+ {0.154999999999999,0.446111333333333,0.160556,0.438333333333333},
+ {0.148333333333333,0.454444666666667,0.154999999999999,0.446111333333333},
+ {0.140555999999999,0.462222,0.148333333333333,0.454444666666667},
+ {0.132777999999999,0.47,0.140555999999999,0.462222},
+ {0.125555999999998,0.477778,0.132777999999999,0.47},
+ {0.118889333333333,0.484444666666667,0.125555999999998,0.477778},
+ {0.112777999999999,0.490555333333334,0.118889333333333,0.484444666666667},
+ {0.108333333333332,0.496111333333333,0.112777999999999,0.490555333333334},
+ {0.104444666666666,0.5,0.108333333333332,0.496111333333333},
+ {0.101666666666667,0.502778,0.104444666666666,0.5},
+ {0.0994446666666657,0.504444666666667,0.101666666666667,0.502778},
+ {0.0972226666666648,0.505555333333334,0.0994446666666657,0.504444666666667},
+ {0.0911113333333328,0.505,0.0927780000000003,0.505555333333334},
+ {0.0894446666666653,0.503888666666667,0.0911113333333328,0.505},
+ {0.0877780000000001,0.503333333333333,0.0894446666666653,0.503888666666667},
+ {0.0861113333333326,0.502222,0.0877780000000001,0.503333333333333},
+ {0.0849999999999985,0.501111333333334,0.0861113333333326,0.502222},
+ {0.0844446666666651,0.500555333333333,0.0849999999999985,0.501111333333334},
+ {0.0838893333333317,0.5,0.0844446666666651,0.500555333333333},
+ {0.208333333333333,0.0416666666666667,0.208889333333332,0.0433333333333337},
+ {0.208889333333332,0.0433333333333337,0.209444666666665,0.0472220000000003},
+ {0.209444666666665,0.0472220000000003,0.209999999999998,0.0538886666666668},
+ {0.209999999999998,0.0538886666666668,0.211111333333333,0.0622220000000002},
+ {0.211111333333333,0.0622220000000002,0.212778,0.072222},
+ {0.212778,0.072222,0.213333333333334,0.082778},
+ {0.213333333333334,0.082778,0.213889333333332,0.0927779999999998},
+ {0.213889333333332,0.0927779999999998,0.213889333333332,0.102222},
+ {0.213889333333332,0.102222,0.212778,0.110555333333333},
+ {0.212778,0.110555333333333,0.211111333333333,0.117778},
+ {0.211111333333333,0.117778,0.208333333333333,0.125},
+ {0.208333333333333,0.125,0.204999999999998,0.131111333333333},
+ {0.204999999999998,0.131111333333333,0.200555999999999,0.136666666666667},
+ {0.200555999999999,0.136666666666667,0.195,0.142778},
+ {0.195,0.142778,0.187777999999999,0.148888666666667},
+ {0.187777999999999,0.148888666666667,0.180555999999998,0.155},
+ {0.180555999999998,0.155,0.172222666666665,0.160555333333334},
+ {0.172222666666665,0.160555333333334,0.163889333333332,0.166666666666667},
+ {0.163889333333332,0.166666666666667,0.155556,0.172778},
+ {0.155556,0.172778,0.147222666666667,0.178333333333333},
+ {0.147222666666667,0.178333333333333,0.139999999999998,0.184444666666667},
+ {0.139999999999998,0.184444666666667,0.134444666666667,0.190555333333334},
+ {0.134444666666667,0.190555333333334,0.129444666666667,0.196666666666667},
+ {0.129444666666667,0.196666666666667,0.126666666666665,0.202222},
+ {0.126666666666665,0.202222,0.125,0.208333333333333},
+ {0.125,0.208333333333333,0.125,0.215555333333333},
+ {0.125,0.215555333333333,0.127222666666666,0.222778},
+ {0.127222666666666,0.222778,0.131666666666665,0.23},
+ {0.131666666666665,0.23,0.137222666666666,0.237778},
+ {0.137222666666666,0.237778,0.143889333333332,0.246111333333333},
+ {0.143889333333332,0.246111333333333,0.151666666666666,0.253888666666667},
+ {0.151666666666666,0.253888666666667,0.159444666666666,0.261666666666667},
+ {0.159444666666666,0.261666666666667,0.166666666666667,0.269444666666667},
+ {0.166666666666667,0.269444666666667,0.173333333333332,0.276111333333333},
+ {0.173333333333332,0.276111333333333,0.179444666666666,0.282222},
+ {0.179444666666666,0.282222,0.183889333333333,0.287778},
+ {0.183889333333333,0.287778,0.187777999999999,0.291666666666667},
+ {0.187777999999999,0.291666666666667,0.190555999999998,0.294444666666667},
+ {0.190555999999998,0.294444666666667,0.192777999999999,0.296111333333334},
+ {0.192777999999999,0.296111333333334,0.195,0.297222},
+ {0.199444666666665,0.297222,0.201111333333332,0.296666666666667},
+ {0.201111333333332,0.296666666666667,0.202778,0.295555333333333},
+ {0.202778,0.295555333333333,0.204444666666665,0.295},
+ {0.204444666666665,0.295,0.206111333333332,0.293888666666666},
+ {0.206111333333332,0.293888666666666,0.207222666666667,0.292778},
+ {0.207222666666667,0.292778,0.207778,0.292222},
+ {0.207778,0.292222,0.208333333333333,0.291666666666667},
+ {0.188889333333333,0.333888666666667,0.187777999999999,0.333333333333333},
+ {0.191111333333332,0.335555333333333,0.188889333333333,0.333888666666667},
+ {0.195555999999999,0.338888666666667,0.191111333333332,0.335555333333333},
+ {0.202222666666666,0.342778,0.195555999999999,0.338888666666667},
+ {0.210555999999999,0.348888666666667,0.202222666666666,0.342778},
+ {0.221111333333333,0.356666666666667,0.210555999999999,0.348888666666667},
+ {0.233889333333333,0.365555333333334,0.221111333333333,0.356666666666667},
+ {0.247222666666666,0.375555333333333,0.233889333333333,0.365555333333334},
+ {0.261666666666665,0.386111333333333,0.247222666666666,0.375555333333333},
+ {0.275555999999999,0.397222,0.261666666666665,0.386111333333333},
+ {0.289444666666666,0.408888666666667,0.275555999999999,0.397222},
+ {0.302777999999999,0.420555333333333,0.289444666666666,0.408888666666667},
+ {0.315,0.431666666666667,0.302777999999999,0.420555333333333},
+ {0.325555999999999,0.442778,0.315,0.431666666666667},
+ {0.334444666666665,0.453888666666667,0.325555999999999,0.442778},
+ {0.341666666666666,0.465,0.334444666666665,0.453888666666667},
+ {0.347777999999998,0.476111333333333,0.341666666666666,0.465},
+ {0.351666666666667,0.487778,0.347777999999998,0.476111333333333},
+ {0.354444666666666,0.5,0.351666666666667,0.487778},
+ {0.355556,0.510555333333333,0.354444666666666,0.5},
+ {0.356111333333333,0.522222,0.355556,0.510555333333333},
+ {0.355556,0.534444666666667,0.356111333333333,0.522222},
+ {0.354444666666666,0.547222,0.355556,0.534444666666667},
+ {0.352777999999998,0.561111333333334,0.354444666666666,0.547222},
+ {0.349999999999999,0.575555333333333,0.352777999999998,0.561111333333334},
+ {0.346666666666666,0.591111333333333,0.349999999999999,0.575555333333333},
+ {0.343333333333331,0.607222,0.346666666666666,0.591111333333333},
+ {0.338889333333332,0.623333333333333,0.343333333333331,0.607222},
+ {0.334444666666665,0.64,0.338889333333332,0.623333333333333},
+ {0.329444666666665,0.657222,0.334444666666665,0.64},
+ {0.324444666666665,0.674444666666667,0.329444666666665,0.657222},
+ {0.319444666666667,0.691666666666666,0.324444666666665,0.674444666666667},
+ {0.314444666666667,0.708333333333333,0.319444666666667,0.691666666666666},
+ {0.308889333333333,0.725,0.314444666666667,0.708333333333333},
+ {0.303889333333333,0.740555333333334,0.308889333333333,0.725},
+ {0.299444666666666,0.756111333333333,0.303889333333333,0.740555333333334},
+ {0.294444666666666,0.77,0.299444666666666,0.756111333333333},
+ {0.289999999999999,0.783888666666667,0.294444666666666,0.77},
+ {0.286111333333333,0.796111333333334,0.289999999999999,0.783888666666667},
+ {0.281666666666666,0.807222,0.286111333333333,0.796111333333334},
+ {0.278333333333334,0.817222,0.281666666666666,0.807222},
+ {0.274444666666665,0.825555333333333,0.278333333333334,0.817222},
+ {0.271111333333332,0.833333333333333,0.274444666666665,0.825555333333333},
+ {0.266666666666666,0.841666666666667,0.271111333333332,0.833333333333333},
+ {0.261666666666665,0.847778,0.266666666666666,0.841666666666667},
+ {0.256666666666665,0.852222,0.261666666666665,0.847778},
+ {0.251111333333332,0.855,0.256666666666665,0.852222},
+ {0.245,0.856111333333333,0.251111333333332,0.855},
+ {0.232222666666665,0.855,0.238889333333333,0.856111333333333},
+ {0.224999999999999,0.852778,0.232222666666665,0.855},
+ {0.218333333333331,0.85,0.224999999999999,0.852778},
+ {0.211666666666666,0.846666666666666,0.218333333333331,0.85},
+ {0.205555999999999,0.843888666666667,0.211666666666666,0.846666666666666},
+ {0.199999999999998,0.840555333333333,0.205555999999999,0.843888666666667},
+ {0.195555999999999,0.837778,0.199999999999998,0.840555333333333},
+ {0.192222666666666,0.836111333333333,0.195555999999999,0.837778},
+ {0.189444666666667,0.834444666666667,0.192222666666666,0.836111333333333},
+ {0.188333333333333,0.833888666666667,0.189444666666667,0.834444666666667},
+ {0.187777999999999,0.833333333333333,0.188333333333333,0.833888666666667},
+ {0.209999999999998,0.0427780000000002,0.208333333333333,0.0416666666666667},
+ {0.212778,0.0449999999999999,0.209999999999998,0.0427780000000002},
+ {0.218333333333331,0.0483333333333332,0.212778,0.0449999999999999},
+ {0.226111333333333,0.0538886666666668,0.218333333333331,0.0483333333333332},
+ {0.234999999999999,0.0605553333333333,0.226111333333333,0.0538886666666668},
+ {0.245,0.0683333333333334,0.234999999999999,0.0605553333333333},
+ {0.255555999999999,0.0761113333333334,0.245,0.0683333333333334},
+ {0.264999999999998,0.0844446666666669,0.255555999999999,0.0761113333333334},
+ {0.273333333333333,0.0922220000000002,0.264999999999998,0.0844446666666669},
+ {0.280555999999999,0.100555333333334,0.273333333333333,0.0922220000000002},
+ {0.285556,0.108333333333333,0.280555999999999,0.100555333333334},
+ {0.289444666666666,0.116666666666667,0.285556,0.108333333333333},
+ {0.291666666666667,0.125,0.289444666666666,0.116666666666667},
+ {0.292222666666665,0.133333333333334,0.291666666666667,0.125},
+ {0.292222666666665,0.142222,0.292222666666665,0.133333333333334},
+ {0.291111333333333,0.152222,0.292222666666665,0.142222},
+ {0.289444666666666,0.162778,0.291111333333333,0.152222},
+ {0.287222666666665,0.174444666666667,0.289444666666666,0.162778},
+ {0.283889333333332,0.186666666666667,0.287222666666665,0.174444666666667},
+ {0.280555999999999,0.199444666666666,0.283889333333332,0.186666666666667},
+ {0.276666666666666,0.212222,0.280555999999999,0.199444666666666},
+ {0.272778,0.225,0.276666666666666,0.212222},
+ {0.268889333333332,0.237222,0.272778,0.225},
+ {0.264999999999998,0.249444666666667,0.268889333333332,0.237222},
+ {0.261666666666665,0.26,0.264999999999998,0.249444666666667},
+ {0.258333333333333,0.27,0.261666666666665,0.26},
+ {0.255555999999999,0.278333333333334,0.258333333333333,0.27},
+ {0.252777999999999,0.285555333333334,0.255555999999999,0.278333333333334},
+ {0.25,0.291666666666667,0.252777999999999,0.285555333333334},
+ {0.247222666666666,0.296666666666667,0.25,0.291666666666667},
+ {0.243889333333333,0.3,0.247222666666666,0.296666666666667},
+ {0.240556,0.302222,0.243889333333333,0.3},
+ {0.236666666666667,0.303333333333333,0.240556,0.302222},
+ {0.232222666666665,0.302778,0.236666666666667,0.303333333333333},
+ {0.228333333333332,0.301666666666667,0.232222666666665,0.302778},
+ {0.223333333333332,0.3,0.228333333333332,0.301666666666667},
+ {0.219444666666665,0.297778,0.223333333333332,0.3},
+ {0.215555999999999,0.296111333333334,0.219444666666665,0.297778},
+ {0.212222666666667,0.294444666666667,0.215555999999999,0.296111333333334},
+ {0.209999999999998,0.292778,0.212222666666667,0.294444666666667},
+ {0.208889333333332,0.292222,0.209999999999998,0.292778},
+ {0.208333333333333,0.291666666666667,0.208889333333332,0.292222},
+ {0,0,0,0}
+};
+
+double Icon29[][4] = {
+ {0,0.75,0,1},
+ {1,1,1,0.75},
+ {0.00333333333333267,0.750555333333333,0.00111133333333413,0.75},
+ {0.0072220000000011,0.751111333333334,0.00333333333333267,0.750555333333333},
+ {0.0127779999999997,0.751666666666667,0.0072220000000011,0.751111333333334},
+ {0.0194446666666674,0.752778,0.0127779999999997,0.751666666666667},
+ {0.0438886666666676,0.752222,0.0355553333333323,0.752778},
+ {0.0522220000000004,0.750555333333333,0.0438886666666676,0.752222},
+ {0.0599999999999999,0.747778,0.0522220000000004,0.750555333333333},
+ {0.0677779999999994,0.743333333333334,0.0599999999999999,0.747778},
+ {0.0755553333333339,0.737222,0.0677779999999994,0.743333333333334},
+ {0.0833333333333333,0.729444666666667,0.0755553333333339,0.737222},
+ {0.0888886666666669,0.723333333333333,0.0833333333333333,0.729444666666667},
+ {0.0944446666666678,0.716111333333333,0.0888886666666669,0.723333333333333},
+ {0.099999999999999,0.708333333333333,0.0944446666666678,0.716111333333333},
+ {0.106666666666667,0.698888666666667,0.099999999999999,0.708333333333333},
+ {0.112778000000001,0.688888666666667,0.106666666666667,0.698888666666667},
+ {0.119444666666666,0.678333333333333,0.112778000000001,0.688888666666667},
+ {0.126666666666668,0.666666666666667,0.119444666666666,0.678333333333333},
+ {0.133333333333333,0.653888666666666,0.126666666666668,0.666666666666667},
+ {0.140555333333334,0.641111333333334,0.133333333333333,0.653888666666666},
+ {0.147778,0.628333333333333,0.140555333333334,0.641111333333334},
+ {0.155555333333332,0.614444666666667,0.147778,0.628333333333333},
+ {0.162778000000001,0.601111333333333,0.155555333333332,0.614444666666667},
+ {0.169999999999999,0.588333333333334,0.162778000000001,0.601111333333333},
+ {0.177222,0.575555333333333,0.169999999999999,0.588333333333334},
+ {0.184444666666667,0.562778,0.177222,0.575555333333333},
+ {0.191666666666668,0.551111333333333,0.184444666666667,0.562778},
+ {0.198333333333333,0.540555333333333,0.191666666666668,0.551111333333333},
+ {0.205000000000001,0.530555333333333,0.198333333333333,0.540555333333333},
+ {0.211666666666666,0.521111333333333,0.205000000000001,0.530555333333333},
+ {0.217778,0.513333333333333,0.211666666666666,0.521111333333333},
+ {0.223888666666667,0.506111333333333,0.217778,0.513333333333333},
+ {0.229444666666666,0.5,0.223888666666667,0.506111333333333},
+ {0.239444666666666,0.491111333333333,0.229444666666666,0.5},
+ {0.249444666666667,0.484444666666667,0.239444666666666,0.491111333333333},
+ {0.258888666666666,0.480555333333333,0.249444666666667,0.484444666666667},
+ {0.267778,0.478333333333333,0.258888666666666,0.480555333333333},
+ {0.276666666666666,0.477222,0.267778,0.478333333333333},
+ {0.302222,0.477778,0.293888666666668,0.477222},
+ {0.310555333333333,0.478333333333333,0.302222,0.477778},
+ {0.318333333333333,0.478888666666667,0.310555333333333,0.478333333333333},
+ {0.333333333333333,0.479444666666667,0.326111333333332,0.478888666666667},
+ {0.341111333333333,0.481111333333333,0.333333333333333,0.479444666666667},
+ {0.349444666666666,0.484444666666667,0.341111333333333,0.481111333333333},
+ {0.357778000000001,0.489444666666667,0.349444666666666,0.484444666666667},
+ {0.366111333333334,0.495555333333333,0.357778000000001,0.489444666666667},
+ {0.375,0.502778,0.366111333333334,0.495555333333333},
+ {0.383333333333333,0.509444666666666,0.375,0.502778},
+ {0.390000000000001,0.515555333333333,0.383333333333333,0.509444666666666},
+ {0.393888666666667,0.518888666666667,0.390000000000001,0.515555333333333},
+ {0.395555333333334,0.521111333333333,0.393888666666667,0.518888666666667},
+ {0.393888666666667,0.520555333333334,0.395555333333334,0.521111333333333},
+ {0.388888666666666,0.519444666666667,0.393888666666667,0.520555333333334},
+ {0.381666666666668,0.518333333333333,0.388888666666666,0.519444666666667},
+ {0.373333333333332,0.516666666666667,0.381666666666668,0.518333333333333},
+ {0.363888666666665,0.515555333333333,0.373333333333332,0.516666666666667},
+ {0.346666666666666,0.516111333333334,0.354444666666666,0.515555333333333},
+ {0.339444666666668,0.517778,0.346666666666666,0.516111333333334},
+ {0.333333333333333,0.521111333333333,0.339444666666668,0.517778},
+ {0.328333333333333,0.525,0.333333333333333,0.521111333333333},
+ {0.322221999999999,0.53,0.328333333333333,0.525},
+ {0.316666666666668,0.536111333333333,0.322221999999999,0.53},
+ {0.31,0.542778,0.316666666666668,0.536111333333333},
+ {0.303333333333332,0.549444666666667,0.31,0.542778},
+ {0.296111333333333,0.556666666666667,0.303333333333332,0.549444666666667},
+ {0.289999999999999,0.564444666666667,0.296111333333333,0.556666666666667},
+ {0.283888666666667,0.572222,0.289999999999999,0.564444666666667},
+ {0.278333333333334,0.58,0.283888666666667,0.572222},
+ {0.274444666666668,0.587778,0.278333333333334,0.58},
+ {0.272221999999999,0.596111333333334,0.274444666666668,0.587778},
+ {0.271111333333332,0.604444666666667,0.272221999999999,0.596111333333334},
+ {0.271666666666666,0.612222,0.271111333333332,0.604444666666667},
+ {0.273333333333333,0.620555333333333,0.271666666666666,0.612222},
+ {0.276111333333333,0.629444666666667,0.273333333333333,0.620555333333333},
+ {0.278888666666667,0.638888666666666,0.276111333333333,0.629444666666667},
+ {0.282778,0.648888666666667,0.278888666666667,0.638888666666666},
+ {0.287222,0.659444666666667,0.282778,0.648888666666667},
+ {0.291666666666667,0.67,0.287222,0.659444666666667},
+ {0.296111333333333,0.680555333333333,0.291666666666667,0.67},
+ {0.301666666666667,0.690555333333334,0.296111333333333,0.680555333333333},
+ {0.306666666666667,0.7,0.301666666666667,0.690555333333334},
+ {0.312777999999999,0.708888666666667,0.306666666666667,0.7},
+ {0.318888666666666,0.716666666666667,0.312777999999999,0.708888666666667},
+ {0.325555333333334,0.723888666666667,0.318888666666666,0.716666666666667},
+ {0.333333333333333,0.729444666666667,0.325555333333334,0.723888666666667},
+ {0.341111333333333,0.733333333333333,0.333333333333333,0.729444666666667},
+ {0.349999999999999,0.737222,0.341111333333333,0.733333333333333},
+ {0.359999999999999,0.74,0.349999999999999,0.737222},
+ {0.372222000000001,0.742222,0.359999999999999,0.74},
+ {0.386111333333334,0.743888666666667,0.372222000000001,0.742222},
+ {0.401111333333333,0.745555333333333,0.386111333333334,0.743888666666667},
+ {0.417222,0.746666666666667,0.401111333333333,0.745555333333333},
+ {0.433888666666666,0.747778,0.417222,0.746666666666667},
+ {0.45,0.748333333333333,0.433888666666666,0.747778},
+ {0.464444666666668,0.748888666666667,0.45,0.748333333333333},
+ {0.477222,0.749444666666667,0.464444666666668,0.748888666666667},
+ {0.494444666666666,0.75,0.487222,0.749444666666667},
+ {0.503333333333333,0.750555333333333,0.501111333333334,0.75},
+ {0.507222000000001,0.751111333333334,0.503333333333333,0.750555333333333},
+ {0.512778,0.751666666666667,0.507222000000001,0.751111333333334},
+ {0.519444666666667,0.752778,0.512778,0.751666666666667},
+ {0.543888666666668,0.752222,0.535555333333332,0.752778},
+ {0.552222,0.750555333333333,0.543888666666668,0.752222},
+ {0.56,0.747778,0.552222,0.750555333333333},
+ {0.567777999999999,0.743333333333334,0.56,0.747778},
+ {0.575555333333334,0.737222,0.567777999999999,0.743333333333334},
+ {0.583333333333333,0.729444666666667,0.575555333333334,0.737222},
+ {0.588888666666667,0.723333333333333,0.583333333333333,0.729444666666667},
+ {0.594444666666668,0.716111333333333,0.588888666666667,0.723333333333333},
+ {0.599999999999999,0.708333333333333,0.594444666666668,0.716111333333333},
+ {0.606666666666667,0.698888666666667,0.599999999999999,0.708333333333333},
+ {0.612778000000001,0.688888666666667,0.606666666666667,0.698888666666667},
+ {0.619444666666666,0.678333333333333,0.612778000000001,0.688888666666667},
+ {0.626666666666667,0.666666666666667,0.619444666666666,0.678333333333333},
+ {0.633333333333333,0.653888666666666,0.626666666666667,0.666666666666667},
+ {0.640555333333334,0.641111333333334,0.633333333333333,0.653888666666666},
+ {0.647778,0.628333333333333,0.640555333333334,0.641111333333334},
+ {0.655555333333332,0.614444666666667,0.647778,0.628333333333333},
+ {0.662778000000001,0.601111333333333,0.655555333333332,0.614444666666667},
+ {0.669999999999999,0.588333333333334,0.662778000000001,0.601111333333333},
+ {0.677222,0.575555333333333,0.669999999999999,0.588333333333334},
+ {0.684444666666666,0.562778,0.677222,0.575555333333333},
+ {0.691666666666668,0.551111333333333,0.684444666666666,0.562778},
+ {0.698333333333333,0.540555333333333,0.691666666666668,0.551111333333333},
+ {0.705000000000001,0.530555333333333,0.698333333333333,0.540555333333333},
+ {0.711666666666666,0.521111333333333,0.705000000000001,0.530555333333333},
+ {0.717778,0.513333333333333,0.711666666666666,0.521111333333333},
+ {0.723888666666667,0.506111333333333,0.717778,0.513333333333333},
+ {0.729444666666666,0.5,0.723888666666667,0.506111333333333},
+ {0.739444666666666,0.491111333333333,0.729444666666666,0.5},
+ {0.749444666666667,0.484444666666667,0.739444666666666,0.491111333333333},
+ {0.758888666666666,0.480555333333333,0.749444666666667,0.484444666666667},
+ {0.767778,0.478333333333333,0.758888666666666,0.480555333333333},
+ {0.776666666666666,0.477222,0.767778,0.478333333333333},
+ {0.802222,0.477778,0.793888666666668,0.477222},
+ {0.810555333333333,0.478333333333333,0.802222,0.477778},
+ {0.818333333333333,0.478888666666667,0.810555333333333,0.478333333333333},
+ {0.833333333333333,0.479444666666667,0.826111333333332,0.478888666666667},
+ {0.841111333333333,0.481111333333333,0.833333333333333,0.479444666666667},
+ {0.849444666666666,0.484444666666667,0.841111333333333,0.481111333333333},
+ {0.857778000000001,0.489444666666667,0.849444666666666,0.484444666666667},
+ {0.866111333333334,0.495555333333333,0.857778000000001,0.489444666666667},
+ {0.875,0.502778,0.866111333333334,0.495555333333333},
+ {0.883333333333333,0.509444666666666,0.875,0.502778},
+ {0.890000000000001,0.515555333333333,0.883333333333333,0.509444666666666},
+ {0.893888666666667,0.518888666666667,0.890000000000001,0.515555333333333},
+ {0.895555333333334,0.521111333333333,0.893888666666667,0.518888666666667},
+ {0.893888666666667,0.520555333333334,0.895555333333334,0.521111333333333},
+ {0.888888666666666,0.519444666666667,0.893888666666667,0.520555333333334},
+ {0.881666666666668,0.518333333333333,0.888888666666666,0.519444666666667},
+ {0.873333333333332,0.516666666666667,0.881666666666668,0.518333333333333},
+ {0.863888666666665,0.515555333333333,0.873333333333332,0.516666666666667},
+ {0.846666666666666,0.516111333333334,0.854444666666666,0.515555333333333},
+ {0.839444666666668,0.517778,0.846666666666666,0.516111333333334},
+ {0.833333333333333,0.521111333333333,0.839444666666668,0.517778},
+ {0.828333333333333,0.525,0.833333333333333,0.521111333333333},
+ {0.822221999999999,0.53,0.828333333333333,0.525},
+ {0.816666666666668,0.536111333333333,0.822221999999999,0.53},
+ {0.81,0.542778,0.816666666666668,0.536111333333333},
+ {0.803333333333332,0.549444666666667,0.81,0.542778},
+ {0.796111333333333,0.556666666666667,0.803333333333332,0.549444666666667},
+ {0.789999999999999,0.564444666666667,0.796111333333333,0.556666666666667},
+ {0.783888666666667,0.572222,0.789999999999999,0.564444666666667},
+ {0.778333333333334,0.58,0.783888666666667,0.572222},
+ {0.774444666666668,0.587778,0.778333333333334,0.58},
+ {0.772221999999999,0.596111333333334,0.774444666666668,0.587778},
+ {0.771111333333332,0.604444666666667,0.772221999999999,0.596111333333334},
+ {0.771666666666666,0.612222,0.771111333333332,0.604444666666667},
+ {0.773333333333333,0.620555333333333,0.771666666666666,0.612222},
+ {0.776111333333333,0.629444666666667,0.773333333333333,0.620555333333333},
+ {0.778888666666667,0.638888666666666,0.776111333333333,0.629444666666667},
+ {0.782778,0.648888666666667,0.778888666666667,0.638888666666666},
+ {0.787222,0.659444666666667,0.782778,0.648888666666667},
+ {0.791666666666667,0.67,0.787222,0.659444666666667},
+ {0.796111333333333,0.680555333333333,0.791666666666667,0.67},
+ {0.801666666666667,0.690555333333334,0.796111333333333,0.680555333333333},
+ {0.806666666666667,0.7,0.801666666666667,0.690555333333334},
+ {0.812777999999999,0.708888666666667,0.806666666666667,0.7},
+ {0.818888666666666,0.716666666666667,0.812777999999999,0.708888666666667},
+ {0.825555333333334,0.723888666666667,0.818888666666666,0.716666666666667},
+ {0.833333333333333,0.729444666666667,0.825555333333334,0.723888666666667},
+ {0.841111333333333,0.733333333333333,0.833333333333333,0.729444666666667},
+ {0.849999999999999,0.737222,0.841111333333333,0.733333333333333},
+ {0.859999999999999,0.74,0.849999999999999,0.737222},
+ {0.872222000000001,0.742222,0.859999999999999,0.74},
+ {0.886111333333334,0.743888666666667,0.872222000000001,0.742222},
+ {0.901111333333333,0.745555333333333,0.886111333333334,0.743888666666667},
+ {0.917222,0.746666666666667,0.901111333333333,0.745555333333333},
+ {0.933888666666666,0.747778,0.917222,0.746666666666667},
+ {0.95,0.748333333333333,0.933888666666666,0.747778},
+ {0.964444666666668,0.748888666666667,0.95,0.748333333333333},
+ {0.977222,0.749444666666667,0.964444666666668,0.748888666666667},
+ {0.994444666666666,0.75,0.987222,0.749444666666667},
+ {0,0,0,0}
+};
+
+double Icon30[][4] = {
+ {0.103888666666667,0.687222,0,0.708333333333333},
+ {0.125,0.583333333333333,0.103888666666667,0.687222},
+ {0.145555333333334,0.687222,0.125,0.583333333333333},
+ {0.25,0.708333333333333,0.145555333333334,0.687222},
+ {0.145555333333334,0.728888666666667,0.25,0.708333333333333},
+ {0.125,0.833333333333333,0.145555333333334,0.728888666666667},
+ {0.103888666666667,0.728888666666667,0.125,0.833333333333333},
+ {0,0.708333333333333,0.103888666666667,0.728888666666667},
+ {0.291666666666667,0.458333333333333,0.0833333333333333,0.5},
+ {0.333333333333333,0.25,0.291666666666667,0.458333333333333},
+ {0.375,0.458333333333333,0.333333333333333,0.25},
+ {0.583333333333333,0.5,0.375,0.458333333333333},
+ {0.375,0.541666666666667,0.583333333333333,0.5},
+ {0.333333333333333,0.75,0.375,0.541666666666667},
+ {0.291666666666667,0.541666666666667,0.333333333333333,0.75},
+ {0.0833333333333333,0.5,0.291666666666667,0.541666666666667},
+ {0.520555333333334,0.270555333333334,0.416666666666667,0.291666666666667},
+ {0.541666666666667,0.166666666666667,0.520555333333334,0.270555333333334},
+ {0.562222000000001,0.270555333333334,0.541666666666667,0.166666666666667},
+ {0.666666666666667,0.291666666666667,0.562222000000001,0.270555333333334},
+ {0.562222000000001,0.312222,0.666666666666667,0.291666666666667},
+ {0.541666666666667,0.416666666666667,0.562222000000001,0.312222},
+ {0.520555333333334,0.312222,0.541666666666667,0.416666666666667},
+ {0.416666666666667,0.291666666666667,0.520555333333334,0.312222},
+ {0,0,0,0}
+};
+
+double Icon31[][4] = {
+ {0.208333333333333,0.458333333333333,0,0.5},
+ {0.25,0.25,0.208333333333333,0.458333333333333},
+ {0.291666666666667,0.458333333333333,0.25,0.25},
+ {0.5,0.5,0.291666666666667,0.458333333333333},
+ {0.291666666666667,0.541666666666667,0.5,0.5},
+ {0.25,0.75,0.291666666666667,0.541666666666667},
+ {0.208333333333333,0.541666666666667,0.25,0.75},
+ {0,0.5,0.208333333333333,0.541666666666667},
+ {0,0,0,0}
+};
+
+double Icon32[][4] = {
+ {0.25,0.25,0,0.5},
+ {0.5,0.5,0.25,0.25},
+ {0.25,0.75,0.5,0.5},
+ {0,0.5,0.25,0.75},
+ {0,0,0,0}
+};
+
+double Icon33[][4] = {
+ {0.166666666666667,0.25,0,0.333333333333333},
+ {0.166666666666667,0.291666666666667,0.166666666666667,0.25},
+ {0,0.333333333333333,0.166666666666667,0.416666666666667},
+ {0.166666666666667,0.416666666666667,0.166666666666667,0.375},
+ {0.208333333333333,0.458333333333333,0.291666666666667,0.625},
+ {0.25,0.375,0.25,0.458333333333333},
+ {0.291666666666667,0.0416666666666667,0.208333333333333,0.208333333333333},
+ {0.25,0.208333333333333,0.25,0.291666666666667},
+ {0.291666666666667,0.625,0.375,0.458333333333333},
+ {0.333333333333333,0.458333333333333,0.333333333333333,0.375},
+ {0.375,0.208333333333333,0.291666666666667,0.0416666666666667},
+ {0.333333333333333,0.291666666666667,0.333333333333333,0.208333333333333},
+ {0.416666666666667,0.416666666666667,0.583333333333333,0.333333333333333},
+ {0.416666666666667,0.375,0.416666666666667,0.416666666666667},
+ {0.583333333333333,0.333333333333333,0.416666666666667,0.25},
+ {0.416666666666667,0.25,0.416666666666667,0.291666666666667},
+ {0,0,0,0}
+};
+
+double Icon34[][4] = {
+ {0.125,0.497778,0.125,0.5},
+ {0.124444666666667,0.493888666666667,0.125,0.497778},
+ {0.123888666666668,0.486666666666667,0.124444666666667,0.493888666666667},
+ {0.122778000000001,0.476111333333333,0.123888666666668,0.486666666666667},
+ {0.121666666666665,0.462778,0.122778000000001,0.476111333333333},
+ {0.12,0.447222,0.121666666666665,0.462778},
+ {0.118888666666668,0.430555333333333,0.12,0.447222},
+ {0.117778000000001,0.413333333333333,0.118888666666668,0.430555333333333},
+ {0.116666666666665,0.396666666666667,0.117778000000001,0.413333333333333},
+ {0.116666666666665,0.381666666666667,0.116666666666665,0.396666666666667},
+ {0.116666666666665,0.367778,0.116666666666665,0.381666666666667},
+ {0.117221999999998,0.356666666666667,0.116666666666665,0.367778},
+ {0.118888666666668,0.346666666666666,0.117221999999998,0.356666666666667},
+ {0.121666666666665,0.339444666666667,0.118888666666668,0.346666666666666},
+ {0.125,0.333333333333333,0.121666666666665,0.339444666666667},
+ {0.13,0.328333333333333,0.125,0.333333333333333},
+ {0.136666666666666,0.325,0.13,0.328333333333333},
+ {0.145000000000001,0.324444666666666,0.136666666666666,0.325},
+ {0.153888666666665,0.325,0.145000000000001,0.324444666666666},
+ {0.164444666666668,0.327778,0.153888666666665,0.325},
+ {0.176111333333334,0.331111333333334,0.164444666666668,0.327778},
+ {0.187777999999999,0.335555333333333,0.176111333333334,0.331111333333334},
+ {0.198888666666666,0.339444666666667,0.187777999999999,0.335555333333333},
+ {0.210555333333332,0.342778,0.198888666666666,0.339444666666667},
+ {0.221111333333335,0.345,0.210555333333332,0.342778},
+ {0.229999999999999,0.345555333333333,0.221111333333335,0.345},
+ {0.238333333333334,0.343888666666667,0.229999999999999,0.345555333333333},
+ {0.245,0.339444666666667,0.238333333333334,0.343888666666667},
+ {0.25,0.333333333333333,0.245,0.339444666666667},
+ {0.253333333333335,0.326666666666667,0.25,0.333333333333333},
+ {0.255555333333334,0.318888666666667,0.253333333333335,0.326666666666667},
+ {0.256666666666665,0.309444666666667,0.255555333333334,0.318888666666667},
+ {0.257221999999999,0.298888666666667,0.256666666666665,0.309444666666667},
+ {0.257221999999999,0.286666666666667,0.257221999999999,0.298888666666667},
+ {0.256666666666665,0.273333333333333,0.257221999999999,0.286666666666667},
+ {0.255555333333334,0.258888666666667,0.256666666666665,0.273333333333333},
+ {0.253888666666668,0.244444666666666,0.255555333333334,0.258888666666667},
+ {0.252221999999999,0.228888666666667,0.253888666666668,0.244444666666666},
+ {0.25,0.213888666666667,0.252221999999999,0.228888666666667},
+ {0.248333333333335,0.199444666666666,0.25,0.213888666666667},
+ {0.247221999999998,0.185,0.248333333333335,0.199444666666666},
+ {0.246111333333332,0.171666666666667,0.247221999999998,0.185},
+ {0.245555333333333,0.159444666666667,0.246111333333332,0.171666666666667},
+ {0.245555333333333,0.148888666666667,0.245555333333333,0.159444666666667},
+ {0.246666666666665,0.139444666666667,0.245555333333333,0.148888666666667},
+ {0.247778000000001,0.131666666666667,0.246666666666665,0.139444666666667},
+ {0.25,0.125,0.247778000000001,0.131666666666667},
+ {0.252778000000002,0.12,0.25,0.125},
+ {0.255555333333334,0.115555333333334,0.252778000000002,0.12},
+ {0.259444666666667,0.112778,0.255555333333334,0.115555333333334},
+ {0.263888666666669,0.11,0.259444666666667,0.112778},
+ {0.268888666666669,0.108333333333333,0.263888666666669,0.11},
+ {0.273888666666664,0.107222,0.268888666666669,0.108333333333333},
+ {0.279444666666668,0.106111333333333,0.273888666666664,0.107222},
+ {0.285555333333335,0.105555333333333,0.279444666666668,0.106111333333333},
+ {0.303888666666666,0.106111333333333,0.297777999999999,0.105555333333333},
+ {0.309444666666669,0.107222,0.303888666666666,0.106111333333333},
+ {0.314444666666664,0.108333333333333,0.309444666666669,0.107222},
+ {0.319444666666664,0.11,0.314444666666664,0.108333333333333},
+ {0.323888666666666,0.112778,0.319444666666664,0.11},
+ {0.327778,0.115555333333334,0.323888666666666,0.112778},
+ {0.330555333333332,0.12,0.327778,0.115555333333334},
+ {0.333333333333333,0.125,0.330555333333332,0.12},
+ {0.335555333333332,0.131666666666667,0.333333333333333,0.125},
+ {0.336666666666668,0.139444666666667,0.335555333333332,0.131666666666667},
+ {0.337778,0.148888666666667,0.336666666666668,0.139444666666667},
+ {0.337778,0.159444666666667,0.337778,0.148888666666667},
+ {0.337222000000002,0.171666666666667,0.337778,0.159444666666667},
+ {0.336111333333335,0.185,0.337222000000002,0.171666666666667},
+ {0.334999999999998,0.199444666666666,0.336111333333335,0.185},
+ {0.333333333333333,0.213888666666667,0.334999999999998,0.199444666666666},
+ {0.331111333333335,0.229444666666667,0.333333333333333,0.213888666666667},
+ {0.329444666666665,0.244444666666666,0.331111333333335,0.229444666666667},
+ {0.327778,0.258888666666667,0.329444666666665,0.244444666666666},
+ {0.326666666666668,0.273333333333333,0.327778,0.258888666666667},
+ {0.326111333333335,0.286666666666667,0.326666666666668,0.273333333333333},
+ {0.326111333333335,0.298888666666667,0.326111333333335,0.286666666666667},
+ {0.326666666666668,0.309444666666667,0.326111333333335,0.298888666666667},
+ {0.327778,0.318888666666667,0.326666666666668,0.309444666666667},
+ {0.329999999999998,0.326666666666667,0.327778,0.318888666666667},
+ {0.333333333333333,0.333333333333333,0.329999999999998,0.326666666666667},
+ {0.338333333333333,0.339444666666667,0.333333333333333,0.333333333333333},
+ {0.344999999999999,0.343888666666667,0.338333333333333,0.339444666666667},
+ {0.353333333333334,0.345555333333333,0.344999999999999,0.343888666666667},
+ {0.362221999999998,0.345,0.353333333333334,0.345555333333333},
+ {0.372778000000001,0.342778,0.362221999999998,0.345},
+ {0.384444666666667,0.339444666666667,0.372778000000001,0.342778},
+ {0.396111333333332,0.335555333333333,0.384444666666667,0.339444666666667},
+ {0.407222,0.331111333333334,0.396111333333332,0.335555333333333},
+ {0.418888666666665,0.327778,0.407222,0.331111333333334},
+ {0.429444666666669,0.325,0.418888666666665,0.327778},
+ {0.438333333333333,0.324444666666666,0.429444666666669,0.325},
+ {0.446666666666668,0.325,0.438333333333333,0.324444666666666},
+ {0.453333333333333,0.328333333333333,0.446666666666668,0.325},
+ {0.458333333333333,0.333333333333333,0.453333333333333,0.328333333333333},
+ {0.461666666666668,0.339444666666667,0.458333333333333,0.333333333333333},
+ {0.464444666666665,0.346666666666666,0.461666666666668,0.339444666666667},
+ {0.466111333333335,0.356666666666667,0.464444666666665,0.346666666666666},
+ {0.466666666666669,0.367778,0.466111333333335,0.356666666666667},
+ {0.466666666666669,0.381666666666667,0.466666666666669,0.367778},
+ {0.466666666666669,0.396666666666667,0.466666666666669,0.381666666666667},
+ {0.465555333333332,0.413333333333333,0.466666666666669,0.396666666666667},
+ {0.464444666666665,0.430555333333333,0.465555333333332,0.413333333333333},
+ {0.463333333333333,0.447222,0.464444666666665,0.430555333333333},
+ {0.461666666666668,0.462778,0.463333333333333,0.447222},
+ {0.460555333333332,0.476111333333333,0.461666666666668,0.462778},
+ {0.459444666666665,0.486666666666667,0.460555333333332,0.476111333333333},
+ {0.458888666666667,0.493888666666667,0.459444666666665,0.486666666666667},
+ {0.458333333333333,0.497778,0.458888666666667,0.493888666666667},
+ {0.458333333333333,0.5,0.458333333333333,0.497778},
+ {0.125,0.541666666666667,0.125,0.542222},
+ {0.125,0.542222,0.125,0.543888666666666},
+ {0.125,0.543888666666666,0.124444666666667,0.547778},
+ {0.124444666666667,0.547778,0.123888666666668,0.554444666666667},
+ {0.123888666666668,0.554444666666667,0.123333333333335,0.563888666666667},
+ {0.123333333333335,0.563888666666667,0.122778000000001,0.574444666666666},
+ {0.122778000000001,0.574444666666666,0.122221999999998,0.585},
+ {0.122221999999998,0.585,0.122221999999998,0.595555333333333},
+ {0.122221999999998,0.595555333333333,0.122221999999998,0.605},
+ {0.122221999999998,0.605,0.122778000000001,0.612778},
+ {0.122778000000001,0.612778,0.123333333333335,0.619444666666666},
+ {0.123333333333335,0.619444666666666,0.125,0.625},
+ {0.125,0.625,0.127778000000002,0.631111333333333},
+ {0.127778000000002,0.631111333333333,0.131111333333332,0.636666666666667},
+ {0.131111333333332,0.636666666666667,0.136111333333332,0.642222},
+ {0.136111333333332,0.642222,0.142778000000002,0.647778},
+ {0.142778000000002,0.647778,0.149444666666668,0.653333333333334},
+ {0.149444666666668,0.653333333333334,0.156111333333333,0.658888666666667},
+ {0.156111333333333,0.658888666666667,0.161111333333333,0.662778},
+ {0.161111333333333,0.662778,0.165000000000002,0.665555333333333},
+ {0.165000000000002,0.665555333333333,0.166666666666667,0.666666666666667},
+ {0.458333333333333,0.542222,0.458333333333333,0.541666666666667},
+ {0.458333333333333,0.543888666666666,0.458333333333333,0.542222},
+ {0.457778,0.547778,0.458333333333333,0.543888666666666},
+ {0.457222000000002,0.554444666666667,0.457778,0.547778},
+ {0.456666666666668,0.563888666666667,0.457222000000002,0.554444666666667},
+ {0.456111333333335,0.574444666666666,0.456666666666668,0.563888666666667},
+ {0.455555333333332,0.585,0.456111333333335,0.574444666666666},
+ {0.455555333333332,0.595555333333333,0.455555333333332,0.585},
+ {0.455555333333332,0.605,0.455555333333332,0.595555333333333},
+ {0.456111333333335,0.612778,0.455555333333332,0.605},
+ {0.456666666666668,0.619444666666666,0.456111333333335,0.612778},
+ {0.458333333333333,0.625,0.456666666666668,0.619444666666666},
+ {0.461111333333335,0.631111333333333,0.458333333333333,0.625},
+ {0.464444666666665,0.636666666666667,0.461111333333335,0.631111333333333},
+ {0.469444666666665,0.642222,0.464444666666665,0.636666666666667},
+ {0.476111333333336,0.647778,0.469444666666665,0.642222},
+ {0.482778000000001,0.653333333333334,0.476111333333336,0.647778},
+ {0.489444666666666,0.658888666666667,0.482778000000001,0.653333333333334},
+ {0.494444666666666,0.662778,0.489444666666666,0.658888666666667},
+ {0.498333333333335,0.665555333333333,0.494444666666666,0.662778},
+ {0.5,0.666666666666667,0.498333333333335,0.665555333333333},
+ {0,0,0,0}
+};
+
+double Icon35[][4] = {
+ {0.583333333333333,0.75,0.583333333333333,0},
+ {0,0,0,0.75},
+ {0.125,0.5,0.125,0.497778},
+ {0.125,0.497778,0.124444666666667,0.493888666666667},
+ {0.124444666666667,0.493888666666667,0.123888666666668,0.486666666666667},
+ {0.123888666666668,0.486666666666667,0.122778000000001,0.476111333333333},
+ {0.122778000000001,0.476111333333333,0.121666666666665,0.462778},
+ {0.121666666666665,0.462778,0.12,0.447222},
+ {0.12,0.447222,0.118888666666668,0.430555333333333},
+ {0.118888666666668,0.430555333333333,0.117778000000001,0.413333333333333},
+ {0.117778000000001,0.413333333333333,0.116666666666665,0.396666666666667},
+ {0.116666666666665,0.396666666666667,0.116666666666665,0.381666666666667},
+ {0.116666666666665,0.381666666666667,0.116666666666665,0.367778},
+ {0.116666666666665,0.367778,0.117221999999998,0.356666666666667},
+ {0.117221999999998,0.356666666666667,0.118888666666668,0.346666666666666},
+ {0.118888666666668,0.346666666666666,0.121666666666665,0.339444666666667},
+ {0.121666666666665,0.339444666666667,0.125,0.333333333333333},
+ {0.125,0.333333333333333,0.13,0.328333333333333},
+ {0.13,0.328333333333333,0.136666666666666,0.325},
+ {0.136666666666666,0.325,0.145000000000001,0.324444666666666},
+ {0.145000000000001,0.324444666666666,0.153888666666665,0.325},
+ {0.153888666666665,0.325,0.164444666666668,0.327778},
+ {0.164444666666668,0.327778,0.176111333333334,0.331111333333334},
+ {0.176111333333334,0.331111333333334,0.187777999999999,0.335555333333333},
+ {0.187777999999999,0.335555333333333,0.198888666666666,0.339444666666667},
+ {0.198888666666666,0.339444666666667,0.210555333333332,0.342778},
+ {0.210555333333332,0.342778,0.221111333333335,0.345},
+ {0.221111333333335,0.345,0.229999999999999,0.345555333333333},
+ {0.229999999999999,0.345555333333333,0.238333333333334,0.343888666666667},
+ {0.238333333333334,0.343888666666667,0.245,0.339444666666667},
+ {0.245,0.339444666666667,0.25,0.333333333333333},
+ {0.25,0.333333333333333,0.253333333333335,0.326666666666667},
+ {0.253333333333335,0.326666666666667,0.255555333333334,0.318888666666667},
+ {0.255555333333334,0.318888666666667,0.256666666666665,0.309444666666667},
+ {0.256666666666665,0.309444666666667,0.257221999999999,0.298888666666667},
+ {0.257221999999999,0.298888666666667,0.257221999999999,0.286666666666667},
+ {0.257221999999999,0.286666666666667,0.256666666666665,0.273333333333333},
+ {0.256666666666665,0.273333333333333,0.255555333333334,0.258888666666667},
+ {0.255555333333334,0.258888666666667,0.253888666666668,0.244444666666666},
+ {0.253888666666668,0.244444666666666,0.252221999999999,0.228888666666667},
+ {0.252221999999999,0.228888666666667,0.25,0.213888666666667},
+ {0.25,0.213888666666667,0.248333333333335,0.199444666666666},
+ {0.248333333333335,0.199444666666666,0.247221999999998,0.185},
+ {0.247221999999998,0.185,0.246111333333332,0.171666666666667},
+ {0.246111333333332,0.171666666666667,0.245555333333333,0.159444666666667},
+ {0.245555333333333,0.159444666666667,0.245555333333333,0.148888666666667},
+ {0.245555333333333,0.148888666666667,0.246666666666665,0.139444666666667},
+ {0.246666666666665,0.139444666666667,0.247778000000001,0.131666666666667},
+ {0.247778000000001,0.131666666666667,0.25,0.125},
+ {0.25,0.125,0.252778000000002,0.12},
+ {0.252778000000002,0.12,0.255555333333334,0.115555333333334},
+ {0.255555333333334,0.115555333333334,0.259444666666667,0.112778},
+ {0.259444666666667,0.112778,0.263888666666669,0.11},
+ {0.263888666666669,0.11,0.268888666666669,0.108333333333333},
+ {0.268888666666669,0.108333333333333,0.273888666666664,0.107222},
+ {0.273888666666664,0.107222,0.279444666666668,0.106111333333333},
+ {0.279444666666668,0.106111333333333,0.285555333333335,0.105555333333333},
+ {0.297777999999999,0.105555333333333,0.303888666666666,0.106111333333333},
+ {0.303888666666666,0.106111333333333,0.309444666666669,0.107222},
+ {0.309444666666669,0.107222,0.314444666666664,0.108333333333333},
+ {0.314444666666664,0.108333333333333,0.319444666666664,0.11},
+ {0.319444666666664,0.11,0.323888666666666,0.112778},
+ {0.323888666666666,0.112778,0.327778,0.115555333333334},
+ {0.327778,0.115555333333334,0.330555333333332,0.12},
+ {0.330555333333332,0.12,0.333333333333333,0.125},
+ {0.333333333333333,0.125,0.335555333333332,0.131666666666667},
+ {0.335555333333332,0.131666666666667,0.336666666666668,0.139444666666667},
+ {0.336666666666668,0.139444666666667,0.337778,0.148888666666667},
+ {0.337778,0.148888666666667,0.337778,0.159444666666667},
+ {0.337778,0.159444666666667,0.337222000000002,0.171666666666667},
+ {0.337222000000002,0.171666666666667,0.336111333333335,0.185},
+ {0.336111333333335,0.185,0.334999999999998,0.199444666666666},
+ {0.334999999999998,0.199444666666666,0.333333333333333,0.213888666666667},
+ {0.333333333333333,0.213888666666667,0.331111333333335,0.229444666666667},
+ {0.331111333333335,0.229444666666667,0.329444666666665,0.244444666666666},
+ {0.329444666666665,0.244444666666666,0.327778,0.258888666666667},
+ {0.327778,0.258888666666667,0.326666666666668,0.273333333333333},
+ {0.326666666666668,0.273333333333333,0.326111333333335,0.286666666666667},
+ {0.326111333333335,0.286666666666667,0.326111333333335,0.298888666666667},
+ {0.326111333333335,0.298888666666667,0.326666666666668,0.309444666666667},
+ {0.326666666666668,0.309444666666667,0.327778,0.318888666666667},
+ {0.327778,0.318888666666667,0.329999999999998,0.326666666666667},
+ {0.329999999999998,0.326666666666667,0.333333333333333,0.333333333333333},
+ {0.333333333333333,0.333333333333333,0.338333333333333,0.339444666666667},
+ {0.338333333333333,0.339444666666667,0.344999999999999,0.343888666666667},
+ {0.344999999999999,0.343888666666667,0.353333333333334,0.345555333333333},
+ {0.353333333333334,0.345555333333333,0.362221999999998,0.345},
+ {0.362221999999998,0.345,0.372778000000001,0.342778},
+ {0.372778000000001,0.342778,0.384444666666667,0.339444666666667},
+ {0.384444666666667,0.339444666666667,0.396111333333332,0.335555333333333},
+ {0.396111333333332,0.335555333333333,0.407222,0.331111333333334},
+ {0.407222,0.331111333333334,0.418888666666665,0.327778},
+ {0.418888666666665,0.327778,0.429444666666669,0.325},
+ {0.429444666666669,0.325,0.438333333333333,0.324444666666666},
+ {0.438333333333333,0.324444666666666,0.446666666666668,0.325},
+ {0.446666666666668,0.325,0.453333333333333,0.328333333333333},
+ {0.453333333333333,0.328333333333333,0.458333333333333,0.333333333333333},
+ {0.458333333333333,0.333333333333333,0.461666666666668,0.339444666666667},
+ {0.461666666666668,0.339444666666667,0.464444666666665,0.346666666666666},
+ {0.464444666666665,0.346666666666666,0.466111333333335,0.356666666666667},
+ {0.466111333333335,0.356666666666667,0.466666666666669,0.367778},
+ {0.466666666666669,0.367778,0.466666666666669,0.381666666666667},
+ {0.466666666666669,0.381666666666667,0.466666666666669,0.396666666666667},
+ {0.466666666666669,0.396666666666667,0.465555333333332,0.413333333333333},
+ {0.465555333333332,0.413333333333333,0.464444666666665,0.430555333333333},
+ {0.464444666666665,0.430555333333333,0.463333333333333,0.447222},
+ {0.463333333333333,0.447222,0.461666666666668,0.462778},
+ {0.461666666666668,0.462778,0.460555333333332,0.476111333333333},
+ {0.460555333333332,0.476111333333333,0.459444666666665,0.486666666666667},
+ {0.459444666666665,0.486666666666667,0.458888666666667,0.493888666666667},
+ {0.458888666666667,0.493888666666667,0.458333333333333,0.497778},
+ {0.458333333333333,0.497778,0.458333333333333,0.5},
+ {0.125,0.542222,0.125,0.541666666666667},
+ {0.125,0.543888666666666,0.125,0.542222},
+ {0.124444666666667,0.547778,0.125,0.543888666666666},
+ {0.123888666666668,0.554444666666667,0.124444666666667,0.547778},
+ {0.123333333333335,0.563888666666667,0.123888666666668,0.554444666666667},
+ {0.122778000000001,0.574444666666666,0.123333333333335,0.563888666666667},
+ {0.122221999999998,0.585,0.122778000000001,0.574444666666666},
+ {0.122221999999998,0.595555333333333,0.122221999999998,0.585},
+ {0.122221999999998,0.605,0.122221999999998,0.595555333333333},
+ {0.122778000000001,0.612778,0.122221999999998,0.605},
+ {0.123333333333335,0.619444666666666,0.122778000000001,0.612778},
+ {0.125,0.625,0.123333333333335,0.619444666666666},
+ {0.127778000000002,0.631111333333333,0.125,0.625},
+ {0.131111333333332,0.636666666666667,0.127778000000002,0.631111333333333},
+ {0.136111333333332,0.642222,0.131111333333332,0.636666666666667},
+ {0.142778000000002,0.647778,0.136111333333332,0.642222},
+ {0.149444666666668,0.653333333333334,0.142778000000002,0.647778},
+ {0.156111333333333,0.658888666666667,0.149444666666668,0.653333333333334},
+ {0.161111333333333,0.662778,0.156111333333333,0.658888666666667},
+ {0.165000000000002,0.665555333333333,0.161111333333333,0.662778},
+ {0.166666666666667,0.666666666666667,0.165000000000002,0.665555333333333},
+ {0.458333333333333,0.541666666666667,0.458333333333333,0.542222},
+ {0.458333333333333,0.542222,0.458333333333333,0.543888666666666},
+ {0.458333333333333,0.543888666666666,0.457778,0.547778},
+ {0.457778,0.547778,0.457222000000002,0.554444666666667},
+ {0.457222000000002,0.554444666666667,0.456666666666668,0.563888666666667},
+ {0.456666666666668,0.563888666666667,0.456111333333335,0.574444666666666},
+ {0.456111333333335,0.574444666666666,0.455555333333332,0.585},
+ {0.455555333333332,0.585,0.455555333333332,0.595555333333333},
+ {0.455555333333332,0.595555333333333,0.455555333333332,0.605},
+ {0.455555333333332,0.605,0.456111333333335,0.612778},
+ {0.456111333333335,0.612778,0.456666666666668,0.619444666666666},
+ {0.456666666666668,0.619444666666666,0.458333333333333,0.625},
+ {0.458333333333333,0.625,0.461111333333335,0.631111333333333},
+ {0.461111333333335,0.631111333333333,0.464444666666665,0.636666666666667},
+ {0.464444666666665,0.636666666666667,0.469444666666665,0.642222},
+ {0.469444666666665,0.642222,0.476111333333336,0.647778},
+ {0.476111333333336,0.647778,0.482778000000001,0.653333333333334},
+ {0.482778000000001,0.653333333333334,0.489444666666666,0.658888666666667},
+ {0.489444666666666,0.658888666666667,0.494444666666666,0.662778},
+ {0.494444666666666,0.662778,0.498333333333335,0.665555333333333},
+ {0.498333333333335,0.665555333333333,0.5,0.666666666666667},
+ {0,0,0,0}
+};
+
+double Icon36[][4] = {
+ {0.0694446666666645,0.397778,0.0733333333333329,0.395555333333334},
+ {0.067222666666666,0.401111333333333,0.0694446666666645,0.397778},
+ {0.0649999999999977,0.405,0.067222666666666,0.401111333333333},
+ {0.0638893333333309,0.409444666666667,0.0649999999999977,0.405},
+ {0.0627779999999992,0.414444666666667,0.0638893333333309,0.409444666666667},
+ {0.0622226666666658,0.42,0.0627779999999992,0.414444666666667},
+ {0.0622226666666658,0.425555333333334,0.0622226666666658,0.42},
+ {0.0622226666666658,0.431111333333333,0.0622226666666658,0.425555333333334},
+ {0.0627779999999992,0.436666666666667,0.0622226666666658,0.431111333333333},
+ {0.0638893333333309,0.441666666666666,0.0627779999999992,0.436666666666667},
+ {0.0649999999999977,0.446111333333333,0.0638893333333309,0.441666666666666},
+ {0.067222666666666,0.45,0.0649999999999977,0.446111333333333},
+ {0.0694446666666645,0.453333333333333,0.067222666666666,0.45},
+ {0.0733333333333329,0.455555333333334,0.0694446666666645,0.453333333333333},
+ {0.0783333333333331,0.457222,0.0733333333333329,0.455555333333334},
+ {0.0844446666666651,0.458333333333333,0.0783333333333331,0.457222},
+ {0.101111333333331,0.457222,0.0922226666666669,0.458333333333333},
+ {0.111111333333331,0.455,0.101111333333331,0.457222},
+ {0.121666666666665,0.452778,0.111111333333331,0.455},
+ {0.132777999999997,0.45,0.121666666666665,0.452778},
+ {0.143889333333334,0.447222,0.132777999999997,0.45},
+ {0.154444666666668,0.445555333333333,0.143889333333334,0.447222},
+ {0.164444666666663,0.444444666666667,0.154444666666668,0.445555333333333},
+ {0.181111333333334,0.446666666666667,0.173333333333332,0.444444666666667},
+ {0.187222666666666,0.45,0.181111333333334,0.446666666666667},
+ {0.192222666666666,0.455555333333334,0.187222666666666,0.45},
+ {0.195556000000001,0.461666666666667,0.192222666666666,0.455555333333334},
+ {0.198333333333333,0.47,0.195556000000001,0.461666666666667},
+ {0.199999999999998,0.479444666666667,0.198333333333333,0.47},
+ {0.201666666666663,0.49,0.199999999999998,0.479444666666667},
+ {0.203333333333333,0.502778,0.201666666666663,0.49},
+ {0.204444666666665,0.516111333333334,0.203333333333333,0.502778},
+ {0.205555999999997,0.53,0.204444666666665,0.516111333333334},
+ {0.20611133333333,0.545,0.205555999999997,0.53},
+ {0.206666666666663,0.559444666666667,0.20611133333333,0.545},
+ {0.206666666666663,0.573333333333334,0.206666666666663,0.559444666666667},
+ {0.20611133333333,0.586666666666667,0.206666666666663,0.573333333333334},
+ {0.204999999999998,0.599444666666667,0.20611133333333,0.586666666666667},
+ {0.203333333333333,0.61,0.204999999999998,0.599444666666667},
+ {0.200555999999996,0.619444666666666,0.203333333333333,0.61},
+ {0.197222666666666,0.627778,0.200555999999996,0.619444666666666},
+ {0.192222666666666,0.633888666666667,0.197222666666666,0.627778},
+ {0.186111333333334,0.638888666666666,0.192222666666666,0.633888666666667},
+ {0.178333333333332,0.642222,0.186111333333334,0.638888666666666},
+ {0.16888933333333,0.645,0.178333333333332,0.642222},
+ {0.157777999999998,0.646111333333333,0.16888933333333,0.645},
+ {0.145555999999999,0.646666666666667,0.157777999999998,0.646111333333333},
+ {0.117777999999997,0.646111333333333,0.132222666666664,0.646666666666667},
+ {0.103333333333334,0.645,0.117777999999997,0.646111333333333},
+ {0.0888893333333319,0.643888666666667,0.103333333333334,0.645},
+ {0.0744446666666647,0.642222,0.0888893333333319,0.643888666666667},
+ {0.061111333333334,0.641111333333334,0.0744446666666647,0.642222},
+ {0.0488893333333304,0.639444666666667,0.061111333333334,0.641111333333334},
+ {0.0377779999999982,0.638333333333333,0.0488893333333304,0.639444666666667},
+ {0.0283333333333312,0.637222,0.0377779999999982,0.638333333333333},
+ {0.0205559999999991,0.635555333333333,0.0283333333333312,0.637222},
+ {0.0144446666666672,0.633888666666667,0.0205559999999991,0.635555333333333},
+ {0.00944466666666699,0.631666666666667,0.0144446666666672,0.633888666666667},
+ {0.00611133333333195,0.628888666666667,0.00944466666666699,0.631666666666667},
+ {0.0033333333333303,0.626111333333334,0.00611133333333195,0.628888666666667},
+ {0.00166666666666515,0.622222,0.0033333333333303,0.626111333333334},
+ {0.000555999999998373,0.618333333333334,0.00166666666666515,0.622222},
+ {0,0.613888666666667,0.000555999999998373,0.618333333333334},
+ {0,0.608888666666667,0,0.613888666666667},
+ {0.000555999999998373,0.604444666666667,0,0.608888666666667},
+ {0.00111133333333176,0.599444666666667,0.000555999999998373,0.604444666666667},
+ {0.00222266666666352,0.594444666666667,0.00111133333333176,0.599444666666667},
+ {0.0033333333333303,0.59,0.00222266666666352,0.594444666666667},
+ {0.00500000000000019,0.586111333333333,0.0033333333333303,0.59},
+ {0.00666666666666534,0.582222,0.00500000000000019,0.586111333333333},
+ {0.00833333333333049,0.579444666666667,0.00666666666666534,0.582222},
+ {0.0111113333333321,0.576666666666667,0.00833333333333049,0.579444666666667},
+ {0.0144446666666672,0.574444666666666,0.0111113333333321,0.576666666666667},
+ {0.0194446666666674,0.572778,0.0144446666666672,0.574444666666666},
+ {0.0255559999999993,0.571666666666667,0.0194446666666674,0.572778},
+ {0.0333333333333314,0.571111333333333,0.0255559999999993,0.571666666666667},
+ {0.0522226666666654,0.572222,0.042222666666665,0.571111333333333},
+ {0.0627779999999992,0.573333333333334,0.0522226666666654,0.572222},
+ {0.0738893333333313,0.574444666666666,0.0627779999999992,0.573333333333334},
+ {0.0849999999999985,0.575555333333333,0.0738893333333313,0.574444666666666},
+ {0.0955559999999972,0.576666666666667,0.0849999999999985,0.575555333333333},
+ {0.105555999999998,0.577778,0.0955559999999972,0.576666666666667},
+ {0.122222666666663,0.577222,0.114444666666666,0.577778},
+ {0.12833333333333,0.576111333333333,0.122222666666663,0.577222},
+ {0.13333333333333,0.574444666666666,0.12833333333333,0.576111333333333},
+ {0.137222666666664,0.572222,0.13333333333333,0.574444666666666},
+ {0.139444666666667,0.568888666666667,0.137222666666664,0.572222},
+ {0.141666666666666,0.565,0.139444666666667,0.568888666666667},
+ {0.142777999999997,0.560555333333333,0.141666666666666,0.565},
+ {0.143889333333334,0.555555333333333,0.142777999999997,0.560555333333333},
+ {0.144444666666667,0.55,0.143889333333334,0.555555333333333},
+ {0.144444666666667,0.544444666666667,0.144444666666667,0.55},
+ {0.144444666666667,0.539444666666667,0.144444666666667,0.544444666666667},
+ {0.143889333333334,0.533888666666667,0.144444666666667,0.539444666666667},
+ {0.142777999999997,0.528888666666666,0.143889333333334,0.533888666666667},
+ {0.141666666666666,0.524444666666666,0.142777999999997,0.528888666666666},
+ {0.139444666666667,0.520555333333334,0.141666666666666,0.524444666666666},
+ {0.137222666666664,0.517222,0.139444666666667,0.520555333333334},
+ {0.13333333333333,0.515,0.137222666666664,0.517222},
+ {0.12833333333333,0.513333333333333,0.13333333333333,0.515},
+ {0.122222666666663,0.512222,0.12833333333333,0.513333333333333},
+ {0.105555999999998,0.513333333333333,0.114444666666666,0.512222},
+ {0.0955559999999972,0.515555333333333,0.105555999999998,0.513333333333333},
+ {0.0849999999999985,0.517778,0.0955559999999972,0.515555333333333},
+ {0.0738893333333313,0.520555333333334,0.0849999999999985,0.517778},
+ {0.0627779999999992,0.523333333333333,0.0738893333333313,0.520555333333334},
+ {0.0522226666666654,0.525,0.0627779999999992,0.523333333333333},
+ {0.042222666666665,0.526111333333333,0.0522226666666654,0.525},
+ {0.0255559999999993,0.523888666666667,0.0333333333333314,0.526111333333333},
+ {0.0194446666666674,0.520555333333334,0.0255559999999993,0.523888666666667},
+ {0.0144446666666672,0.515,0.0194446666666674,0.520555333333334},
+ {0.0111113333333321,0.508888666666667,0.0144446666666672,0.515},
+ {0.00833333333333049,0.500555333333333,0.0111113333333321,0.508888666666667},
+ {0.00666666666666534,0.491111333333333,0.00833333333333049,0.500555333333333},
+ {0.00500000000000019,0.480555333333333,0.00666666666666534,0.491111333333333},
+ {0.0033333333333303,0.467778,0.00500000000000019,0.480555333333333},
+ {0.00222266666666352,0.454444666666667,0.0033333333333303,0.467778},
+ {0.00111133333333176,0.440555333333334,0.00222266666666352,0.454444666666667},
+ {0.000555999999998373,0.426111333333333,0.00111133333333176,0.440555333333334},
+ {0,0.411111333333333,0.000555999999998373,0.426111333333333},
+ {0,0.397222,0,0.411111333333333},
+ {0.000555999999998373,0.383888666666667,0,0.397222},
+ {0.00166666666666515,0.371111333333333,0.000555999999998373,0.383888666666667},
+ {0.0033333333333303,0.360555333333333,0.00166666666666515,0.371111333333333},
+ {0.00611133333333195,0.351111333333333,0.0033333333333303,0.360555333333333},
+ {0.00944466666666699,0.342778,0.00611133333333195,0.351111333333333},
+ {0.0144446666666672,0.336666666666667,0.00944466666666699,0.342778},
+ {0.0205559999999991,0.331666666666666,0.0144446666666672,0.336666666666667},
+ {0.0283333333333312,0.328333333333333,0.0205559999999991,0.331666666666666},
+ {0.0377779999999982,0.325555333333333,0.0283333333333312,0.328333333333333},
+ {0.0488893333333304,0.324444666666666,0.0377779999999982,0.325555333333333},
+ {0.061111333333334,0.323888666666667,0.0488893333333304,0.324444666666666},
+ {0.0888893333333319,0.324444666666666,0.0744446666666647,0.323888666666667},
+ {0.103333333333334,0.325555333333333,0.0888893333333319,0.324444666666666},
+ {0.117777999999997,0.326666666666667,0.103333333333334,0.325555333333333},
+ {0.132222666666664,0.328333333333333,0.117777999999997,0.326666666666667},
+ {0.145555999999999,0.329444666666667,0.132222666666664,0.328333333333333},
+ {0.157777999999998,0.331111333333334,0.145555999999999,0.329444666666667},
+ {0.16888933333333,0.332222,0.157777999999998,0.331111333333334},
+ {0.178333333333332,0.333333333333333,0.16888933333333,0.332222},
+ {0.186111333333334,0.335,0.178333333333332,0.333333333333333},
+ {0.192222666666666,0.336666666666667,0.186111333333334,0.335},
+ {0.197222666666666,0.338888666666667,0.192222666666666,0.336666666666667},
+ {0.200555999999996,0.341111333333333,0.197222666666666,0.338888666666667},
+ {0.203333333333333,0.344444666666667,0.200555999999996,0.341111333333333},
+ {0.204999999999998,0.348333333333333,0.203333333333333,0.344444666666667},
+ {0.20611133333333,0.352222,0.204999999999998,0.348333333333333},
+ {0.206666666666663,0.356666666666667,0.20611133333333,0.352222},
+ {0.206666666666663,0.361111333333334,0.206666666666663,0.356666666666667},
+ {0.20611133333333,0.366111333333333,0.206666666666663,0.361111333333334},
+ {0.205555999999997,0.371111333333333,0.20611133333333,0.366111333333333},
+ {0.204444666666665,0.375555333333333,0.205555999999997,0.371111333333333},
+ {0.203333333333333,0.38,0.204444666666665,0.375555333333333},
+ {0.201666666666663,0.383888666666667,0.203333333333333,0.38},
+ {0.199999999999998,0.387778,0.201666666666663,0.383888666666667},
+ {0.198333333333333,0.391111333333334,0.199999999999998,0.387778},
+ {0.195556000000001,0.393333333333333,0.198333333333333,0.391111333333334},
+ {0.192222666666666,0.395555333333334,0.195556000000001,0.393333333333333},
+ {0.187222666666666,0.397222,0.192222666666666,0.395555333333334},
+ {0.181111333333334,0.398333333333333,0.187222666666666,0.397222},
+ {0.173333333333332,0.398888666666667,0.181111333333334,0.398333333333333},
+ {0.154444666666668,0.397778,0.164444666666663,0.398888666666667},
+ {0.143889333333334,0.396666666666667,0.154444666666668,0.397778},
+ {0.132777999999997,0.395555333333334,0.143889333333334,0.396666666666667},
+ {0.121666666666665,0.394444666666667,0.132777999999997,0.395555333333334},
+ {0.111111333333331,0.393333333333333,0.121666666666665,0.394444666666667},
+ {0.101111333333331,0.392222,0.111111333333331,0.393333333333333},
+ {0.0844446666666651,0.392778,0.0922226666666669,0.392222},
+ {0.0783333333333331,0.393888666666667,0.0844446666666651,0.392778},
+ {0.0733333333333329,0.395555333333334,0.0783333333333331,0.393888666666667},
+ {0.317777999999999,0.334444666666667,0.311666666666667,0.336666666666667},
+ {0.323333333333333,0.332778,0.317777999999999,0.334444666666667},
+ {0.329444666666665,0.331666666666666,0.323333333333333,0.332778},
+ {0.335555999999997,0.331111333333334,0.329444666666665,0.331666666666666},
+ {0.353333333333334,0.331666666666666,0.347222666666667,0.331111333333334},
+ {0.359444666666666,0.332778,0.353333333333334,0.331666666666666},
+ {0.365,0.334444666666667,0.359444666666666,0.332778},
+ {0.371111333333332,0.336666666666667,0.365,0.334444666666667},
+ {0.375555999999998,0.338888666666667,0.371111333333332,0.336666666666667},
+ {0.38,0.341666666666667,0.375555999999998,0.338888666666667},
+ {0.384444666666667,0.344444666666667,0.38,0.341666666666667},
+ {0.388889333333334,0.347222,0.384444666666667,0.344444666666667},
+ {0.393889333333334,0.349444666666667,0.388889333333334,0.347222},
+ {0.398889333333334,0.352222,0.393889333333334,0.349444666666667},
+ {0.403889333333334,0.355,0.398889333333334,0.352222},
+ {0.408333333333331,0.357778,0.403889333333334,0.355},
+ {0.413333333333332,0.361666666666667,0.408333333333331,0.357778},
+ {0.417777999999998,0.366111333333333,0.413333333333332,0.361666666666667},
+ {0.421666666666667,0.371111333333333,0.417777999999998,0.366111333333333},
+ {0.424999999999997,0.377778,0.421666666666667,0.371111333333333},
+ {0.428333333333332,0.385555333333333,0.424999999999997,0.377778},
+ {0.430556,0.395555333333334,0.428333333333332,0.385555333333333},
+ {0.431666666666667,0.403333333333334,0.430556,0.395555333333334},
+ {0.432777999999999,0.412222,0.431666666666667,0.403333333333334},
+ {0.433889333333331,0.422222,0.432777999999999,0.412222},
+ {0.434444666666664,0.433333333333334,0.433889333333331,0.422222},
+ {0.434999999999997,0.445555333333333,0.434444666666664,0.433333333333334},
+ {0.435556000000001,0.458888666666667,0.434999999999997,0.445555333333333},
+ {0.435556000000001,0.472778,0.435556000000001,0.458888666666667},
+ {0.436111333333334,0.487222,0.435556000000001,0.472778},
+ {0.436111333333334,0.502222,0.436111333333334,0.487222},
+ {0.436111333333334,0.517222,0.436111333333334,0.502222},
+ {0.436111333333334,0.532778,0.436111333333334,0.517222},
+ {0.436111333333334,0.547222,0.436111333333334,0.532778},
+ {0.435556000000001,0.561666666666667,0.436111333333334,0.547222},
+ {0.435556000000001,0.575555333333333,0.435556000000001,0.561666666666667},
+ {0.434999999999997,0.588333333333334,0.435556000000001,0.575555333333333},
+ {0.434444666666664,0.6,0.434999999999997,0.588333333333334},
+ {0.433889333333331,0.610555333333333,0.434444666666664,0.6},
+ {0.432777999999999,0.619444666666666,0.433889333333331,0.610555333333333},
+ {0.431666666666667,0.627222,0.432777999999999,0.619444666666666},
+ {0.430556,0.633888666666667,0.431666666666667,0.627222},
+ {0.428889333333331,0.64,0.430556,0.633888666666667},
+ {0.426666666666667,0.644444666666667,0.428889333333331,0.64},
+ {0.42388933333333,0.647778,0.426666666666667,0.644444666666667},
+ {0.420556,0.65,0.42388933333333,0.647778},
+ {0.417222666666665,0.651666666666667,0.420556,0.65},
+ {0.413333333333332,0.652222,0.417222666666665,0.651666666666667},
+ {0.405000000000001,0.651666666666667,0.409444666666663,0.652222},
+ {0.400555999999999,0.650555333333333,0.405000000000001,0.651666666666667},
+ {0.396666666666666,0.649444666666666,0.400555999999999,0.650555333333333},
+ {0.392222666666664,0.648333333333333,0.396666666666666,0.649444666666666},
+ {0.388333333333331,0.646666666666667,0.392222666666664,0.648333333333333},
+ {0.384444666666667,0.645,0.388333333333331,0.646666666666667},
+ {0.381111333333332,0.643333333333333,0.384444666666667,0.645},
+ {0.377777999999997,0.641666666666667,0.381111333333332,0.643333333333333},
+ {0.375,0.639444666666667,0.377777999999997,0.641666666666667},
+ {0.372777999999997,0.636666666666667,0.375,0.639444666666667},
+ {0.371111333333332,0.633888666666667,0.372777999999997,0.636666666666667},
+ {0.369444666666666,0.628888666666667,0.371111333333332,0.633888666666667},
+ {0.36833333333333,0.622778,0.369444666666666,0.628888666666667},
+ {0.367777999999996,0.615,0.36833333333333,0.622778},
+ {0.367777999999996,0.606111333333333,0.367777999999996,0.615},
+ {0.368889333333333,0.596111333333334,0.367777999999996,0.606111333333333},
+ {0.37,0.585555333333333,0.368889333333333,0.596111333333334},
+ {0.371111333333332,0.574444666666666,0.37,0.585555333333333},
+ {0.372222666666663,0.563333333333333,0.371111333333332,0.574444666666666},
+ {0.37333333333333,0.552778,0.372222666666663,0.563333333333333},
+ {0.374444666666667,0.542778,0.37333333333333,0.552778},
+ {0.374444666666667,0.533888666666667,0.374444666666667,0.542778},
+ {0.373889333333333,0.526111333333333,0.374444666666667,0.533888666666667},
+ {0.372777999999997,0.52,0.373889333333333,0.526111333333333},
+ {0.371111333333332,0.515,0.372777999999997,0.52},
+ {0.368889333333333,0.511111333333333,0.371111333333332,0.515},
+ {0.365555999999998,0.508888666666667,0.368889333333333,0.511111333333333},
+ {0.361666666666665,0.506666666666667,0.365555999999998,0.508888666666667},
+ {0.357222666666667,0.505555333333334,0.361666666666665,0.506666666666667},
+ {0.352222666666667,0.504444666666667,0.357222666666667,0.505555333333334},
+ {0.346666666666664,0.503888666666667,0.352222666666667,0.504444666666667},
+ {0.330555999999997,0.504444666666667,0.33611133333333,0.503888666666667},
+ {0.325555999999996,0.505555333333334,0.330555999999997,0.504444666666667},
+ {0.321111333333334,0.506666666666667,0.325555999999996,0.505555333333334},
+ {0.317222666666666,0.508888666666667,0.321111333333334,0.506666666666667},
+ {0.313889333333331,0.511111333333333,0.317222666666666,0.508888666666667},
+ {0.311666666666667,0.515,0.313889333333331,0.511111333333333},
+ {0.309999999999997,0.52,0.311666666666667,0.515},
+ {0.308889333333331,0.526111333333333,0.309999999999997,0.52},
+ {0.308333333333332,0.533888666666667,0.308889333333331,0.526111333333333},
+ {0.308333333333332,0.542778,0.308333333333332,0.533888666666667},
+ {0.309444666666664,0.552778,0.308333333333332,0.542778},
+ {0.310556000000001,0.563333333333333,0.309444666666664,0.552778},
+ {0.311666666666667,0.574444666666666,0.310556000000001,0.563333333333333},
+ {0.312777999999999,0.585555333333333,0.311666666666667,0.574444666666666},
+ {0.313889333333331,0.596111333333334,0.312777999999999,0.585555333333333},
+ {0.314999999999998,0.606111333333333,0.313889333333331,0.596111333333334},
+ {0.314999999999998,0.615,0.314999999999998,0.606111333333333},
+ {0.314444666666664,0.622778,0.314999999999998,0.615},
+ {0.313333333333333,0.628888666666667,0.314444666666664,0.622778},
+ {0.311666666666667,0.633888666666667,0.313333333333333,0.628888666666667},
+ {0.309999999999997,0.636666666666667,0.311666666666667,0.633888666666667},
+ {0.307777999999999,0.639444666666667,0.309999999999997,0.636666666666667},
+ {0.304999999999997,0.641666666666667,0.307777999999999,0.639444666666667},
+ {0.301666666666667,0.643333333333333,0.304999999999997,0.641666666666667},
+ {0.298333333333332,0.645,0.301666666666667,0.643333333333333},
+ {0.294444666666664,0.646666666666667,0.298333333333332,0.645},
+ {0.290556,0.648333333333333,0.294444666666664,0.646666666666667},
+ {0.286111333333333,0.649444666666666,0.290556,0.648333333333333},
+ {0.281666666666666,0.650555333333333,0.286111333333333,0.649444666666666},
+ {0.277777999999998,0.651666666666667,0.281666666666666,0.650555333333333},
+ {0.273333333333331,0.652222,0.277777999999998,0.651666666666667},
+ {0.265555999999999,0.651666666666667,0.269444666666667,0.652222},
+ {0.262222666666664,0.65,0.265555999999999,0.651666666666667},
+ {0.258889333333334,0.647778,0.262222666666664,0.65},
+ {0.256111333333332,0.644444666666667,0.258889333333334,0.647778},
+ {0.253889333333333,0.64,0.256111333333332,0.644444666666667},
+ {0.252222666666663,0.633888666666667,0.253889333333333,0.64},
+ {0.251111333333332,0.627222,0.252222666666663,0.633888666666667},
+ {0.25,0.619444666666666,0.251111333333332,0.627222},
+ {0.248889333333333,0.610555333333333,0.25,0.619444666666666},
+ {0.24833333333333,0.6,0.248889333333333,0.610555333333333},
+ {0.247777999999997,0.588333333333334,0.24833333333333,0.6},
+ {0.247222666666663,0.575555333333333,0.247777999999997,0.588333333333334},
+ {0.247222666666663,0.561666666666667,0.247222666666663,0.575555333333333},
+ {0.246666666666665,0.547222,0.247222666666663,0.561666666666667},
+ {0.246666666666665,0.532778,0.246666666666665,0.547222},
+ {0.246666666666665,0.517222,0.246666666666665,0.532778},
+ {0.246666666666665,0.502222,0.246666666666665,0.517222},
+ {0.246666666666665,0.487222,0.246666666666665,0.502222},
+ {0.247222666666663,0.472778,0.246666666666665,0.487222},
+ {0.247222666666663,0.458888666666667,0.247222666666663,0.472778},
+ {0.247777999999997,0.445555333333333,0.247222666666663,0.458888666666667},
+ {0.24833333333333,0.433333333333334,0.247777999999997,0.445555333333333},
+ {0.248889333333333,0.422222,0.24833333333333,0.433333333333334},
+ {0.25,0.412222,0.248889333333333,0.422222},
+ {0.251111333333332,0.403333333333334,0.25,0.412222},
+ {0.252222666666663,0.395555333333334,0.251111333333332,0.403333333333334},
+ {0.254444666666667,0.385555333333333,0.252222666666663,0.395555333333334},
+ {0.257777999999997,0.377778,0.254444666666667,0.385555333333333},
+ {0.261111333333332,0.371111333333333,0.257777999999997,0.377778},
+ {0.265000000000001,0.366111333333333,0.261111333333332,0.371111333333333},
+ {0.269444666666667,0.361666666666667,0.265000000000001,0.366111333333333},
+ {0.274444666666668,0.357778,0.269444666666667,0.361666666666667},
+ {0.278889333333334,0.355,0.274444666666668,0.357778},
+ {0.28388933333333,0.352222,0.278889333333334,0.355},
+ {0.28888933333333,0.349444666666667,0.28388933333333,0.352222},
+ {0.29388933333333,0.347222,0.28888933333333,0.349444666666667},
+ {0.298333333333332,0.344444666666667,0.29388933333333,0.347222},
+ {0.302777999999999,0.341666666666667,0.298333333333332,0.344444666666667},
+ {0.307222666666666,0.338888666666667,0.302777999999999,0.341666666666667},
+ {0.311666666666667,0.336666666666667,0.307222666666666,0.338888666666667},
+ {0.371111333333332,0.455555333333334,0.367222666666663,0.457778},
+ {0.367222666666663,0.457778,0.362778000000001,0.459444666666667},
+ {0.362778000000001,0.459444666666667,0.356111333333331,0.460555333333333},
+ {0.356111333333331,0.460555333333333,0.348889333333332,0.461111333333333},
+ {0.333889333333332,0.461111333333333,0.326666666666663,0.460555333333333},
+ {0.326666666666663,0.460555333333333,0.319999999999998,0.459444666666667},
+ {0.319999999999998,0.459444666666667,0.315556000000001,0.457778},
+ {0.315556000000001,0.457778,0.311666666666667,0.455555333333334},
+ {0.311666666666667,0.455555333333334,0.309444666666664,0.451666666666667},
+ {0.309444666666664,0.451666666666667,0.307777999999999,0.446666666666667},
+ {0.307777999999999,0.446666666666667,0.306666666666667,0.440555333333334},
+ {0.306666666666667,0.440555333333334,0.306111333333334,0.433333333333334},
+ {0.306111333333334,0.433333333333334,0.306111333333334,0.425555333333334},
+ {0.306111333333334,0.425555333333334,0.306111333333334,0.417778},
+ {0.306111333333334,0.417778,0.306666666666667,0.410555333333334},
+ {0.306666666666667,0.410555333333334,0.307777999999999,0.404444666666667},
+ {0.307777999999999,0.404444666666667,0.309444666666664,0.399444666666666},
+ {0.309444666666664,0.399444666666666,0.311666666666667,0.395555333333334},
+ {0.311666666666667,0.395555333333334,0.315556000000001,0.393333333333333},
+ {0.315556000000001,0.393333333333333,0.319999999999998,0.391666666666667},
+ {0.319999999999998,0.391666666666667,0.326666666666663,0.390555333333333},
+ {0.326666666666663,0.390555333333333,0.333889333333332,0.39},
+ {0.348889333333332,0.39,0.356111333333331,0.390555333333333},
+ {0.356111333333331,0.390555333333333,0.362778000000001,0.391666666666667},
+ {0.362778000000001,0.391666666666667,0.367222666666663,0.393333333333333},
+ {0.367222666666663,0.393333333333333,0.371111333333332,0.395555333333334},
+ {0.371111333333332,0.395555333333334,0.37333333333333,0.399444666666666},
+ {0.37333333333333,0.399444666666666,0.375,0.404444666666667},
+ {0.375,0.404444666666667,0.376111333333332,0.410555333333334},
+ {0.376111333333332,0.410555333333334,0.376666666666665,0.417778},
+ {0.376666666666665,0.417778,0.376666666666665,0.425555333333334},
+ {0.376666666666665,0.425555333333334,0.376666666666665,0.433333333333334},
+ {0.376666666666665,0.433333333333334,0.376111333333332,0.440555333333334},
+ {0.376111333333332,0.440555333333334,0.375,0.446666666666667},
+ {0.375,0.446666666666667,0.37333333333333,0.451666666666667},
+ {0.37333333333333,0.451666666666667,0.371111333333332,0.455555333333334},
+ {0.549444666666664,0.633888666666667,0.553889333333331,0.637778},
+ {0.553889333333331,0.637778,0.557777999999999,0.64},
+ {0.557777999999999,0.64,0.562222666666666,0.642222},
+ {0.562222666666666,0.642222,0.566666666666668,0.643333333333333},
+ {0.566666666666668,0.643333333333333,0.570556000000001,0.644444666666667},
+ {0.570556000000001,0.644444666666667,0.574999999999998,0.645},
+ {0.583333333333333,0.645,0.587778,0.644444666666667},
+ {0.587778,0.644444666666667,0.591666666666664,0.643333333333333},
+ {0.591666666666664,0.643333333333333,0.596111333333331,0.642222},
+ {0.596111333333331,0.642222,0.600555999999997,0.64},
+ {0.600555999999997,0.64,0.604444666666666,0.637778},
+ {0.604444666666666,0.637778,0.608889333333333,0.633888666666667},
+ {0.608889333333333,0.633888666666667,0.613333333333334,0.628888666666667},
+ {0.613333333333334,0.628888666666667,0.617777999999996,0.623333333333333},
+ {0.617777999999996,0.623333333333333,0.622222666666663,0.616111333333333},
+ {0.622222666666663,0.616111333333333,0.626666666666665,0.608888666666667},
+ {0.626666666666665,0.608888666666667,0.631666666666665,0.600555333333334},
+ {0.631666666666665,0.600555333333334,0.636666666666665,0.591666666666667},
+ {0.636666666666665,0.591666666666667,0.641666666666666,0.582778},
+ {0.641666666666666,0.582778,0.646111333333332,0.573333333333334},
+ {0.646111333333332,0.573333333333334,0.651111333333333,0.563888666666667},
+ {0.651111333333333,0.563888666666667,0.655555999999999,0.554444666666667},
+ {0.655555999999999,0.554444666666667,0.659444666666663,0.545},
+ {0.659444666666663,0.545,0.662777999999998,0.535555333333334},
+ {0.662777999999998,0.535555333333334,0.666111333333333,0.525555333333333},
+ {0.666111333333333,0.525555333333333,0.668333333333332,0.515},
+ {0.668333333333332,0.515,0.669999999999997,0.505555333333334},
+ {0.669999999999997,0.505555333333334,0.671111333333333,0.495},
+ {0.671111333333333,0.495,0.672222666666665,0.484444666666667},
+ {0.672222666666665,0.484444666666667,0.672777999999999,0.472778},
+ {0.672777999999999,0.472778,0.673333333333332,0.46},
+ {0.673333333333332,0.46,0.67388933333333,0.447222},
+ {0.67388933333333,0.447222,0.67388933333333,0.433888666666667},
+ {0.67388933333333,0.433888666666667,0.67388933333333,0.42},
+ {0.67388933333333,0.42,0.67388933333333,0.406666666666667},
+ {0.67388933333333,0.406666666666667,0.67388933333333,0.393888666666667},
+ {0.67388933333333,0.393888666666667,0.673333333333332,0.381666666666667},
+ {0.673333333333332,0.381666666666667,0.672777999999999,0.37},
+ {0.672777999999999,0.37,0.672222666666665,0.36},
+ {0.672222666666665,0.36,0.671111333333333,0.350555333333334},
+ {0.671111333333333,0.350555333333334,0.669999999999997,0.342778},
+ {0.669999999999997,0.342778,0.668333333333332,0.336666666666667},
+ {0.668333333333332,0.336666666666667,0.666666666666667,0.332222},
+ {0.666666666666667,0.332222,0.664444666666663,0.328888666666667},
+ {0.664444666666663,0.328888666666667,0.661666666666666,0.326111333333333},
+ {0.661666666666666,0.326111333333333,0.658333333333331,0.323888666666667},
+ {0.658333333333331,0.323888666666667,0.655000000000001,0.322222},
+ {0.655000000000001,0.322222,0.651111333333333,0.321111333333333},
+ {0.651111333333333,0.321111333333333,0.647222666666664,0.320555333333333},
+ {0.647222666666664,0.320555333333333,0.642777999999997,0.32},
+ {0.634444666666667,0.32,0.63,0.320555333333333},
+ {0.63,0.320555333333333,0.626111333333332,0.321111333333333},
+ {0.626111333333332,0.321111333333333,0.622222666666663,0.322222},
+ {0.622222666666663,0.322222,0.618889333333333,0.323888666666667},
+ {0.618889333333333,0.323888666666667,0.615555999999998,0.326111333333333},
+ {0.615555999999998,0.326111333333333,0.612778000000001,0.328888666666667},
+ {0.612778000000001,0.328888666666667,0.610555999999998,0.332222},
+ {0.610555999999998,0.332222,0.608889333333333,0.336666666666667},
+ {0.608889333333333,0.336666666666667,0.607222666666667,0.342778},
+ {0.607222666666667,0.342778,0.606111333333331,0.351111333333333},
+ {0.606111333333331,0.351111333333333,0.605555999999998,0.360555333333333},
+ {0.605555999999998,0.360555333333333,0.605555999999998,0.371111333333333},
+ {0.605555999999998,0.371111333333333,0.606111333333331,0.383888666666667},
+ {0.606111333333331,0.383888666666667,0.606666666666664,0.397222},
+ {0.606666666666664,0.397222,0.607778000000001,0.411111333333333},
+ {0.607778000000001,0.411111333333333,0.608889333333333,0.426111333333333},
+ {0.608889333333333,0.426111333333333,0.609999999999999,0.440555333333334},
+ {0.609999999999999,0.440555333333334,0.611111333333331,0.454444666666667},
+ {0.611111333333331,0.454444666666667,0.611666666666665,0.467778},
+ {0.611666666666665,0.467778,0.612222666666668,0.480555333333333},
+ {0.612222666666668,0.480555333333333,0.612222666666668,0.491111333333333},
+ {0.612222666666668,0.491111333333333,0.611666666666665,0.500555333333333},
+ {0.611666666666665,0.500555333333333,0.610555999999998,0.508888666666667},
+ {0.610555999999998,0.508888666666667,0.608889333333333,0.515},
+ {0.608889333333333,0.515,0.607222666666667,0.519444666666667},
+ {0.607222666666667,0.519444666666667,0.604999999999999,0.522778},
+ {0.604999999999999,0.522778,0.602222666666667,0.525555333333333},
+ {0.602222666666667,0.525555333333333,0.598889333333332,0.527778},
+ {0.598889333333332,0.527778,0.595555999999997,0.529444666666667},
+ {0.595555999999997,0.529444666666667,0.591666666666664,0.530555333333333},
+ {0.591666666666664,0.530555333333333,0.587778,0.531111333333333},
+ {0.587778,0.531111333333333,0.583333333333333,0.531666666666667},
+ {0.574999999999998,0.531666666666667,0.570556000000001,0.531111333333333},
+ {0.570556000000001,0.531111333333333,0.566666666666668,0.530555333333333},
+ {0.566666666666668,0.530555333333333,0.562777999999999,0.529444666666667},
+ {0.562777999999999,0.529444666666667,0.559444666666664,0.527778},
+ {0.559444666666664,0.527778,0.556111333333334,0.525555333333333},
+ {0.556111333333334,0.525555333333333,0.553333333333332,0.522778},
+ {0.553333333333332,0.522778,0.551111333333334,0.519444666666667},
+ {0.551111333333334,0.519444666666667,0.549444666666664,0.515},
+ {0.549444666666664,0.515,0.547777999999999,0.508888666666667},
+ {0.547777999999999,0.508888666666667,0.546666666666667,0.500555333333333},
+ {0.546666666666667,0.500555333333333,0.546111333333333,0.491111333333333},
+ {0.546111333333333,0.491111333333333,0.546111333333333,0.480555333333333},
+ {0.546111333333333,0.480555333333333,0.546666666666667,0.467778},
+ {0.546666666666667,0.467778,0.547222666666665,0.454444666666667},
+ {0.547222666666665,0.454444666666667,0.548333333333332,0.440555333333334},
+ {0.548333333333332,0.440555333333334,0.549444666666664,0.426111333333333},
+ {0.549444666666664,0.426111333333333,0.550556,0.411111333333333},
+ {0.550556,0.411111333333333,0.551666666666667,0.397222},
+ {0.551666666666667,0.397222,0.552222666666665,0.383888666666667},
+ {0.552222666666665,0.383888666666667,0.552777999999999,0.371111333333333},
+ {0.552777999999999,0.371111333333333,0.552777999999999,0.360555333333333},
+ {0.552777999999999,0.360555333333333,0.552222666666665,0.351111333333333},
+ {0.552222666666665,0.351111333333333,0.551111333333334,0.342778},
+ {0.551111333333334,0.342778,0.549444666666664,0.336666666666667},
+ {0.549444666666664,0.336666666666667,0.547777999999999,0.332222},
+ {0.547777999999999,0.332222,0.545556,0.328888666666667},
+ {0.545556,0.328888666666667,0.542777999999998,0.326111333333333},
+ {0.542777999999998,0.326111333333333,0.539444666666663,0.323888666666667},
+ {0.539444666666663,0.323888666666667,0.536111333333333,0.322222},
+ {0.536111333333333,0.322222,0.532222666666665,0.321111333333333},
+ {0.532222666666665,0.321111333333333,0.528333333333331,0.320555333333333},
+ {0.528333333333331,0.320555333333333,0.523889333333334,0.32},
+ {0.515555999999999,0.32,0.511111333333332,0.320555333333333},
+ {0.511111333333332,0.320555333333333,0.507222666666664,0.321111333333333},
+ {0.507222666666664,0.321111333333333,0.50333333333333,0.322222},
+ {0.50333333333333,0.322222,0.5,0.323888666666667},
+ {0.5,0.323888666666667,0.496666666666665,0.326111333333333},
+ {0.496666666666665,0.326111333333333,0.493889333333333,0.328888666666667},
+ {0.493889333333333,0.328888666666667,0.491666666666665,0.332222},
+ {0.491666666666665,0.332222,0.49,0.336666666666667},
+ {0.49,0.336666666666667,0.488333333333334,0.342778},
+ {0.488333333333334,0.342778,0.487222666666668,0.350555333333334},
+ {0.487222666666668,0.350555333333334,0.486111333333331,0.36},
+ {0.486111333333331,0.36,0.485555999999998,0.37},
+ {0.485555999999998,0.37,0.484999999999999,0.381666666666667},
+ {0.484999999999999,0.381666666666667,0.484444666666666,0.393888666666667},
+ {0.484444666666666,0.393888666666667,0.484444666666666,0.406666666666667},
+ {0.484444666666666,0.406666666666667,0.484444666666666,0.42},
+ {0.484444666666666,0.42,0.484444666666666,0.433888666666667},
+ {0.484444666666666,0.433888666666667,0.484444666666666,0.447222},
+ {0.484444666666666,0.447222,0.484999999999999,0.46},
+ {0.484999999999999,0.46,0.485555999999998,0.472778},
+ {0.485555999999998,0.472778,0.486111333333331,0.484444666666667},
+ {0.486111333333331,0.484444666666667,0.487222666666668,0.495},
+ {0.487222666666668,0.495,0.488333333333334,0.505555333333334},
+ {0.488333333333334,0.505555333333334,0.49,0.515},
+ {0.49,0.515,0.492222666666663,0.525555333333333},
+ {0.492222666666663,0.525555333333333,0.495555999999998,0.535555333333334},
+ {0.495555999999998,0.535555333333334,0.498889333333333,0.545},
+ {0.498889333333333,0.545,0.502777999999997,0.554444666666667},
+ {0.502777999999997,0.554444666666667,0.507222666666664,0.563888666666667},
+ {0.507222666666664,0.563888666666667,0.512222666666664,0.573333333333334},
+ {0.512222666666664,0.573333333333334,0.516666666666666,0.582778},
+ {0.516666666666666,0.582778,0.521666666666666,0.591666666666667},
+ {0.521666666666666,0.591666666666667,0.526666666666666,0.600555333333334},
+ {0.526666666666666,0.600555333333334,0.531666666666666,0.608888666666667},
+ {0.531666666666666,0.608888666666667,0.536111333333333,0.616111333333333},
+ {0.536111333333333,0.616111333333333,0.540556,0.623333333333333},
+ {0.540556,0.623333333333333,0.544999999999997,0.628888666666667},
+ {0.544999999999997,0.628888666666667,0.549444666666664,0.633888666666667},
+ {0.728333333333334,0.633888666666667,0.734444666666666,0.642222},
+ {0.734444666666666,0.642222,0.742222666666663,0.647778},
+ {0.742222666666663,0.647778,0.751666666666665,0.651666666666667},
+ {0.751666666666665,0.651666666666667,0.762777999999997,0.653888666666666},
+ {0.762777999999997,0.653888666666666,0.775000000000001,0.655},
+ {0.775000000000001,0.655,0.788333333333332,0.654444666666667},
+ {0.788333333333332,0.654444666666667,0.802777999999999,0.652778},
+ {0.802777999999999,0.652778,0.817222666666666,0.650555333333333},
+ {0.817222666666666,0.650555333333333,0.831666666666663,0.648333333333333},
+ {0.831666666666663,0.648333333333333,0.846111333333331,0.645555333333334},
+ {0.846111333333331,0.645555333333334,0.859444666666666,0.643333333333333},
+ {0.859444666666666,0.643333333333333,0.871666666666665,0.641111333333334},
+ {0.871666666666665,0.641111333333334,0.882777999999997,0.638888666666666},
+ {0.882777999999997,0.638888666666666,0.892222666666664,0.637222},
+ {0.892222666666664,0.637222,0.900000000000001,0.635555333333333},
+ {0.900000000000001,0.635555333333333,0.906111333333333,0.633888666666667},
+ {0.906111333333333,0.633888666666667,0.911111333333333,0.631666666666667},
+ {0.911111333333333,0.631666666666667,0.914444666666663,0.628888666666667},
+ {0.914444666666663,0.628888666666667,0.917222666666665,0.626111333333334},
+ {0.917222666666665,0.626111333333334,0.91888933333333,0.622222},
+ {0.91888933333333,0.622222,0.919999999999997,0.618333333333334},
+ {0.919999999999997,0.618333333333334,0.920556,0.613888666666667},
+ {0.920556,0.613888666666667,0.920556,0.608888666666667},
+ {0.920556,0.608888666666667,0.919999999999997,0.604444666666667},
+ {0.919999999999997,0.604444666666667,0.919444666666664,0.599444666666667},
+ {0.919444666666664,0.599444666666667,0.918333333333332,0.594444666666667},
+ {0.918333333333332,0.594444666666667,0.917222666666665,0.59},
+ {0.917222666666665,0.59,0.915556,0.586111333333333},
+ {0.915556,0.586111333333333,0.91388933333333,0.582222},
+ {0.91388933333333,0.582222,0.912222666666665,0.579444666666667},
+ {0.912222666666665,0.579444666666667,0.909444666666663,0.576666666666667},
+ {0.909444666666663,0.576666666666667,0.906111333333333,0.574444666666666},
+ {0.906111333333333,0.574444666666666,0.901111333333333,0.572778},
+ {0.901111333333333,0.572778,0.895000000000001,0.571666666666667},
+ {0.895000000000001,0.571666666666667,0.887222666666664,0.571111333333333},
+ {0.87833333333333,0.571111333333333,0.86833333333333,0.572222},
+ {0.86833333333333,0.572222,0.857778000000001,0.573333333333334},
+ {0.857778000000001,0.573333333333334,0.846666666666664,0.574444666666666},
+ {0.846666666666664,0.574444666666666,0.835555999999997,0.575555333333333},
+ {0.835555999999997,0.575555333333333,0.824999999999998,0.576666666666667},
+ {0.824999999999998,0.576666666666667,0.814999999999998,0.577778},
+ {0.806111333333334,0.577778,0.798333333333332,0.577222},
+ {0.798333333333332,0.577222,0.792222666666665,0.576111333333333},
+ {0.792222666666665,0.576111333333333,0.787222666666665,0.574444666666666},
+ {0.787222666666665,0.574444666666666,0.783333333333331,0.571666666666667},
+ {0.783333333333331,0.571666666666667,0.780555999999999,0.567778},
+ {0.780555999999999,0.567778,0.778889333333334,0.562778},
+ {0.778889333333334,0.562778,0.778333333333331,0.557222},
+ {0.778333333333331,0.557222,0.778333333333331,0.551111333333333},
+ {0.778333333333331,0.551111333333333,0.778889333333334,0.544444666666667},
+ {0.778889333333334,0.544444666666667,0.780000000000001,0.538333333333333},
+ {0.780000000000001,0.538333333333333,0.780555999999999,0.532222},
+ {0.780555999999999,0.532222,0.782222666666665,0.526666666666667},
+ {0.782222666666665,0.526666666666667,0.783333333333331,0.521666666666667},
+ {0.783333333333331,0.521666666666667,0.784999999999997,0.517778},
+ {0.784999999999997,0.517778,0.787222666666665,0.515},
+ {0.787222666666665,0.515,0.791111333333333,0.512778},
+ {0.791111333333333,0.512778,0.796111333333333,0.511666666666667},
+ {0.796111333333333,0.511666666666667,0.802222666666665,0.512222},
+ {0.802222666666665,0.512222,0.809444666666664,0.513333333333333},
+ {0.809444666666664,0.513333333333333,0.817222666666666,0.515},
+ {0.817222666666666,0.515,0.824999999999998,0.516666666666667},
+ {0.824999999999998,0.516666666666667,0.832222666666667,0.517778},
+ {0.832222666666667,0.517778,0.838333333333333,0.518333333333333},
+ {0.838333333333333,0.518333333333333,0.843333333333334,0.517222},
+ {0.843333333333334,0.517222,0.847222666666667,0.515},
+ {0.847222666666667,0.515,0.849444666666666,0.511111333333333},
+ {0.849444666666666,0.511111333333333,0.851111333333331,0.506666666666667},
+ {0.851111333333331,0.506666666666667,0.852222666666667,0.5},
+ {0.852222666666667,0.5,0.852778000000001,0.492778},
+ {0.852778000000001,0.492778,0.852778000000001,0.485},
+ {0.852778000000001,0.485,0.852778000000001,0.477778},
+ {0.852778000000001,0.477778,0.852222666666667,0.470555333333333},
+ {0.852222666666667,0.470555333333333,0.851111333333331,0.463888666666667},
+ {0.851111333333331,0.463888666666667,0.849444666666666,0.459444666666667},
+ {0.849444666666666,0.459444666666667,0.847222666666667,0.455555333333334},
+ {0.847222666666667,0.455555333333334,0.843333333333334,0.453333333333333},
+ {0.843333333333334,0.453333333333333,0.838333333333333,0.452222},
+ {0.838333333333333,0.452222,0.832222666666667,0.452778},
+ {0.832222666666667,0.452778,0.824999999999998,0.453888666666667},
+ {0.824999999999998,0.453888666666667,0.817222666666666,0.455555333333334},
+ {0.817222666666666,0.455555333333334,0.809444666666664,0.457222},
+ {0.809444666666664,0.457222,0.802222666666665,0.458888666666667},
+ {0.796111333333333,0.458888666666667,0.791111333333333,0.457778},
+ {0.791111333333333,0.457778,0.787222666666665,0.455555333333334},
+ {0.787222666666665,0.455555333333334,0.784999999999997,0.452778},
+ {0.784999999999997,0.452778,0.783333333333331,0.448888666666667},
+ {0.783333333333331,0.448888666666667,0.782222666666665,0.443888666666667},
+ {0.782222666666665,0.443888666666667,0.780555999999999,0.438333333333333},
+ {0.780555999999999,0.438333333333333,0.780000000000001,0.432222},
+ {0.780000000000001,0.432222,0.778889333333334,0.425555333333334},
+ {0.778889333333334,0.425555333333334,0.778333333333331,0.418888666666666},
+ {0.778333333333331,0.418888666666666,0.778333333333331,0.412778},
+ {0.778333333333331,0.412778,0.778889333333334,0.407222},
+ {0.778889333333334,0.407222,0.780555999999999,0.402222},
+ {0.780555999999999,0.402222,0.783333333333331,0.398333333333333},
+ {0.783333333333331,0.398333333333333,0.787222666666665,0.395555333333334},
+ {0.787222666666665,0.395555333333334,0.792222666666665,0.393888666666667},
+ {0.792222666666665,0.393888666666667,0.798333333333332,0.392778},
+ {0.798333333333332,0.392778,0.806111333333334,0.392222},
+ {0.814999999999998,0.392222,0.824999999999998,0.393333333333333},
+ {0.824999999999998,0.393333333333333,0.835555999999997,0.394444666666667},
+ {0.835555999999997,0.394444666666667,0.846666666666664,0.395555333333334},
+ {0.846666666666664,0.395555333333334,0.857778000000001,0.396666666666667},
+ {0.857778000000001,0.396666666666667,0.86833333333333,0.397778},
+ {0.86833333333333,0.397778,0.87833333333333,0.398888666666667},
+ {0.887222666666664,0.398888666666667,0.895000000000001,0.398333333333333},
+ {0.895000000000001,0.398333333333333,0.901111333333333,0.397222},
+ {0.901111333333333,0.397222,0.906111333333333,0.395555333333334},
+ {0.906111333333333,0.395555333333334,0.909444666666663,0.393333333333333},
+ {0.909444666666663,0.393333333333333,0.912222666666665,0.391111333333334},
+ {0.912222666666665,0.391111333333334,0.91388933333333,0.387778},
+ {0.91388933333333,0.387778,0.915556,0.383888666666667},
+ {0.915556,0.383888666666667,0.917222666666665,0.38},
+ {0.917222666666665,0.38,0.918333333333332,0.375555333333333},
+ {0.918333333333332,0.375555333333333,0.919444666666664,0.371111333333333},
+ {0.919444666666664,0.371111333333333,0.919999999999997,0.366111333333333},
+ {0.919999999999997,0.366111333333333,0.920556,0.361111333333334},
+ {0.920556,0.361111333333334,0.920556,0.356666666666667},
+ {0.920556,0.356666666666667,0.919999999999997,0.352222},
+ {0.919999999999997,0.352222,0.91888933333333,0.348333333333333},
+ {0.91888933333333,0.348333333333333,0.917222666666665,0.344444666666667},
+ {0.917222666666665,0.344444666666667,0.914444666666663,0.341111333333333},
+ {0.914444666666663,0.341111333333333,0.911111333333333,0.338888666666667},
+ {0.911111333333333,0.338888666666667,0.906111333333333,0.336666666666667},
+ {0.906111333333333,0.336666666666667,0.900000000000001,0.335},
+ {0.900000000000001,0.335,0.892222666666664,0.333333333333333},
+ {0.892222666666664,0.333333333333333,0.882777999999997,0.331666666666666},
+ {0.882777999999997,0.331666666666666,0.871666666666665,0.33},
+ {0.871666666666665,0.33,0.859444666666666,0.327222},
+ {0.859444666666666,0.327222,0.846111333333331,0.325},
+ {0.846111333333331,0.325,0.831666666666663,0.322222},
+ {0.831666666666663,0.322222,0.817222666666666,0.32},
+ {0.817222666666666,0.32,0.802777999999999,0.317778},
+ {0.802777999999999,0.317778,0.788333333333332,0.316111333333333},
+ {0.788333333333332,0.316111333333333,0.775000000000001,0.315555333333334},
+ {0.775000000000001,0.315555333333334,0.762777999999997,0.316666666666666},
+ {0.762777999999997,0.316666666666666,0.751666666666665,0.318888666666667},
+ {0.751666666666665,0.318888666666667,0.742222666666663,0.322778},
+ {0.742222666666663,0.322778,0.734444666666666,0.328333333333333},
+ {0.734444666666666,0.328333333333333,0.728333333333334,0.336666666666667},
+ {0.728333333333334,0.336666666666667,0.724444666666666,0.343888666666667},
+ {0.724444666666666,0.343888666666667,0.721666666666664,0.352778},
+ {0.721666666666664,0.352778,0.718889333333332,0.362778},
+ {0.718889333333332,0.362778,0.717222666666667,0.374444666666667},
+ {0.717222666666667,0.374444666666667,0.715555999999997,0.387222},
+ {0.715555999999997,0.387222,0.714444666666665,0.401666666666667},
+ {0.714444666666665,0.401666666666667,0.713333333333333,0.417222},
+ {0.713333333333333,0.417222,0.712778,0.433333333333334},
+ {0.712778,0.433333333333334,0.712222666666667,0.45},
+ {0.712222666666667,0.45,0.711666666666664,0.467778},
+ {0.711666666666664,0.467778,0.711666666666664,0.485555333333333},
+ {0.711666666666664,0.485555333333333,0.711666666666664,0.502778},
+ {0.711666666666664,0.502778,0.712222666666667,0.520555333333334},
+ {0.712222666666667,0.520555333333334,0.712778,0.537222},
+ {0.712778,0.537222,0.713333333333333,0.553333333333333},
+ {0.713333333333333,0.553333333333333,0.714444666666665,0.568888666666667},
+ {0.714444666666665,0.568888666666667,0.715555999999997,0.583333333333333},
+ {0.715555999999997,0.583333333333333,0.717222666666667,0.596111333333334},
+ {0.717222666666667,0.596111333333334,0.718889333333332,0.607778},
+ {0.718889333333332,0.607778,0.721666666666664,0.617778},
+ {0.721666666666664,0.617778,0.724444666666666,0.626666666666667},
+ {0.724444666666666,0.626666666666667,0.728333333333334,0.633888666666667},
+ {0,0,0,0}
+};
+
+double Icon37[][4] = {
+ {0.140555333333334,0.338888666666667,0.133333333333335,0.336111333333333},
+ {0.147221999999999,0.342778,0.140555333333334,0.338888666666667},
+ {0.153333333333336,0.346666666666666,0.147221999999999,0.342778},
+ {0.159444000000003,0.351666666666667,0.153333333333336,0.346666666666666},
+ {0.165000000000002,0.356666666666667,0.159444000000003,0.351666666666667},
+ {0.170000000000002,0.362222,0.165000000000002,0.356666666666667},
+ {0.175555333333335,0.367778,0.170000000000002,0.362222},
+ {0.180000000000002,0.373333333333333,0.175555333333335,0.367778},
+ {0.185000000000002,0.378888666666667,0.180000000000002,0.373333333333333},
+ {0.188888666666666,0.384444666666666,0.185000000000002,0.378888666666667},
+ {0.192777333333334,0.39,0.188888666666666,0.384444666666666},
+ {0.195555333333336,0.395555333333334,0.192777333333334,0.39},
+ {0.198333333333333,0.402222,0.195555333333336,0.395555333333334},
+ {0.200000000000003,0.409444666666667,0.198333333333333,0.402222},
+ {0.200555333333336,0.417222,0.200000000000003,0.409444666666667},
+ {0.20111066666667,0.425555333333334,0.200555333333336,0.417222},
+ {0.201666666666668,0.433333333333334,0.20111066666667,0.425555333333334},
+ {0.20111066666667,0.441666666666666,0.201666666666668,0.433333333333334},
+ {0.200555333333336,0.449444666666666,0.20111066666667,0.441666666666666},
+ {0.200000000000003,0.456666666666666,0.200555333333336,0.449444666666666},
+ {0.198333333333333,0.463888666666667,0.200000000000003,0.456666666666666},
+ {0.195555333333336,0.47,0.198333333333333,0.463888666666667},
+ {0.191666666666668,0.475555333333334,0.195555333333336,0.47},
+ {0.186110666666669,0.480555333333333,0.191666666666668,0.475555333333334},
+ {0.17888866666667,0.483888666666667,0.186110666666669,0.480555333333333},
+ {0.170555333333335,0.487222,0.17888866666667,0.483888666666667},
+ {0.161666666666666,0.49,0.170555333333335,0.487222},
+ {0.152777333333333,0.492778,0.161666666666666,0.49},
+ {0.144444000000002,0.496666666666667,0.152777333333333,0.492778},
+ {0.138333333333335,0.501111333333334,0.144444000000002,0.496666666666667},
+ {0.134444000000002,0.507222,0.138333333333335,0.501111333333334},
+ {0.133333333333335,0.514444666666667,0.134444000000002,0.507222},
+ {0.133888666666669,0.520555333333334,0.133333333333335,0.514444666666667},
+ {0.136110666666667,0.527778,0.133888666666669,0.520555333333334},
+ {0.139444000000002,0.536111333333333,0.136110666666667,0.527778},
+ {0.144444000000002,0.545,0.139444000000002,0.536111333333333},
+ {0.150555333333334,0.555,0.144444000000002,0.545},
+ {0.157222,0.565555333333334,0.150555333333334,0.555},
+ {0.164444000000003,0.576111333333333,0.157222,0.565555333333334},
+ {0.171666666666667,0.586666666666667,0.164444000000003,0.576111333333333},
+ {0.178333333333337,0.597222,0.171666666666667,0.586666666666667},
+ {0.184443999999999,0.606666666666667,0.178333333333337,0.597222},
+ {0.189443999999999,0.615555333333334,0.184443999999999,0.606666666666667},
+ {0.192777333333334,0.622778,0.189443999999999,0.615555333333334},
+ {0.195000000000003,0.628888666666667,0.192777333333334,0.622778},
+ {0.195555333333336,0.633888666666667,0.195000000000003,0.628888666666667},
+ {0.195000000000003,0.637778,0.195555333333336,0.633888666666667},
+ {0.193333333333333,0.640555333333333,0.195000000000003,0.637778},
+ {0.190000000000002,0.642222,0.193333333333333,0.640555333333333},
+ {0.186110666666669,0.643333333333333,0.190000000000002,0.642222},
+ {0.181110666666669,0.644444666666667,0.186110666666669,0.643333333333333},
+ {0.176110666666669,0.645,0.181110666666669,0.644444666666667},
+ {0.158333333333336,0.644444666666667,0.164444000000003,0.645},
+ {0.152777333333333,0.643333333333333,0.158333333333336,0.644444666666667},
+ {0.147777333333333,0.642222,0.152777333333333,0.643333333333333},
+ {0.142777333333332,0.640555333333333,0.147777333333333,0.642222},
+ {0.137777333333337,0.637778,0.142777333333332,0.640555333333333},
+ {0.133333333333335,0.633888666666667,0.137777333333337,0.637778},
+ {0.128888666666668,0.628888666666667,0.133333333333335,0.633888666666667},
+ {0.124444000000002,0.622222,0.128888666666668,0.628888666666667},
+ {0.119444000000001,0.614444666666667,0.124444000000002,0.622222},
+ {0.114444000000001,0.604444666666667,0.119444000000001,0.614444666666667},
+ {0.109444000000001,0.593333333333333,0.114444000000001,0.604444666666667},
+ {0.104444000000001,0.581111333333334,0.109444000000001,0.593333333333333},
+ {0.0994440000000007,0.568333333333333,0.104444000000001,0.581111333333334},
+ {0.0944440000000005,0.556111333333333,0.0994440000000007,0.568333333333333},
+ {0.0894440000000003,0.544444666666667,0.0944440000000005,0.556111333333333},
+ {0.0850000000000032,0.534444666666667,0.0894440000000003,0.544444666666667},
+ {0.0805553333333364,0.525555333333333,0.0850000000000032,0.534444666666667},
+ {0.076666666666668,0.519444666666667,0.0805553333333364,0.525555333333333},
+ {0.0738886666666663,0.515555333333333,0.076666666666668,0.519444666666667},
+ {0.0711106666666694,0.514444666666667,0.0738886666666663,0.515555333333333},
+ {0.0694439999999995,0.515555333333333,0.0711106666666694,0.514444666666667},
+ {0.0677773333333344,0.519444666666667,0.0694439999999995,0.515555333333333},
+ {0.0677773333333344,0.525555333333333,0.0677773333333344,0.519444666666667},
+ {0.0677773333333344,0.534444666666667,0.0677773333333344,0.525555333333333},
+ {0.0683333333333328,0.544444666666667,0.0677773333333344,0.534444666666667},
+ {0.0700000000000026,0.556111333333333,0.0683333333333328,0.544444666666667},
+ {0.0711106666666694,0.568333333333333,0.0700000000000026,0.556111333333333},
+ {0.0722220000000012,0.581111333333334,0.0711106666666694,0.568333333333333},
+ {0.0733333333333329,0.593333333333333,0.0722220000000012,0.581111333333334},
+ {0.0744439999999997,0.604444666666667,0.0733333333333329,0.593333333333333},
+ {0.0744439999999997,0.614444666666667,0.0744439999999997,0.604444666666667},
+ {0.0738886666666663,0.622222,0.0744439999999997,0.614444666666667},
+ {0.0727773333333346,0.628888666666667,0.0738886666666663,0.622222},
+ {0.0711106666666694,0.633888666666667,0.0727773333333346,0.628888666666667},
+ {0.0694439999999995,0.636666666666667,0.0711106666666694,0.633888666666667},
+ {0.067222000000001,0.638888666666666,0.0694439999999995,0.636666666666667},
+ {0.0650000000000025,0.641111333333334,0.067222000000001,0.638888666666666},
+ {0.0622220000000008,0.642778,0.0650000000000025,0.641111333333334},
+ {0.0588886666666658,0.645,0.0622220000000008,0.642778},
+ {0.0555553333333355,0.646666666666667,0.0588886666666658,0.645},
+ {0.0522220000000004,0.648333333333333,0.0555553333333355,0.646666666666667},
+ {0.0483333333333367,0.65,0.0522220000000004,0.648333333333333},
+ {0.0444440000000033,0.651666666666667,0.0483333333333367,0.65},
+ {0.0400000000000015,0.653333333333334,0.0444440000000033,0.651666666666667},
+ {0.0361106666666681,0.654444666666667,0.0400000000000015,0.653333333333334},
+ {0.0322219999999997,0.655555333333333,0.0361106666666681,0.654444666666667},
+ {0.028333333333336,0.656111333333333,0.0322219999999997,0.655555333333333},
+ {0.0250000000000009,0.655555333333333,0.028333333333336,0.656111333333333},
+ {0.0216666666666659,0.655,0.0250000000000009,0.655555333333333},
+ {0.0183333333333356,0.652778,0.0216666666666659,0.655},
+ {0.015555333333334,0.65,0.0183333333333356,0.652778},
+ {0.0133333333333354,0.646111333333333,0.015555333333334,0.65},
+ {0.0111106666666672,0.640555333333333,0.0133333333333354,0.646111333333333},
+ {0.00944400000000201,0.633888666666667,0.0111106666666672,0.640555333333333},
+ {0.00833333333333523,0.626666666666667,0.00944400000000201,0.633888666666667},
+ {0.00722200000000347,0.617778,0.00833333333333523,0.626666666666667},
+ {0.00611066666666697,0.607778,0.00722200000000347,0.617778},
+ {0.00500000000000019,0.596111333333334,0.00611066666666697,0.607778},
+ {0.00444400000000182,0.582778,0.00500000000000019,0.596111333333334},
+ {0.00388866666666843,0.568888666666667,0.00444400000000182,0.582778},
+ {0.00333333333333504,0.553333333333333,0.00388866666666843,0.568888666666667},
+ {0.00222200000000328,0.537222,0.00333333333333504,0.553333333333333},
+ {0.00166666666666989,0.52,0.00222200000000328,0.537222},
+ {0.00111066666666678,0.502778,0.00166666666666989,0.52},
+ {0.000555333333333389,0.485,0.00111066666666678,0.502778},
+ {0.000555333333333389,0.467222,0.000555333333333389,0.485},
+ {0,0.45,0.000555333333333389,0.467222},
+ {0,0.432778,0,0.45},
+ {0,0.416666666666667,0,0.432778},
+ {0.000555333333333389,0.401111333333333,0,0.416666666666667},
+ {0.00111066666666678,0.387222,0.000555333333333389,0.401111333333333},
+ {0.00166666666666989,0.373888666666667,0.00111066666666678,0.387222},
+ {0.00333333333333504,0.362222,0.00166666666666989,0.373888666666667},
+ {0.00500000000000019,0.352222,0.00333333333333504,0.362222},
+ {0.00666666666667008,0.343333333333333,0.00500000000000019,0.352222},
+ {0.00944400000000201,0.336111333333333,0.00666666666667008,0.343333333333333},
+ {0.0138886666666688,0.327778,0.00944400000000201,0.336111333333333},
+ {0.0194440000000024,0.322222,0.0138886666666688,0.327778},
+ {0.0255553333333343,0.317778,0.0194440000000024,0.322222},
+ {0.0327773333333331,0.316111333333333,0.0255553333333343,0.317778},
+ {0.0411106666666683,0.315,0.0327773333333331,0.316111333333333},
+ {0.0500000000000019,0.315555333333334,0.0411106666666683,0.315},
+ {0.0588886666666658,0.317222,0.0500000000000019,0.315555333333334},
+ {0.0683333333333328,0.319444666666667,0.0588886666666658,0.317222},
+ {0.0777773333333348,0.321666666666667,0.0683333333333328,0.319444666666667},
+ {0.0872220000000018,0.324444666666666,0.0777773333333348,0.321666666666667},
+ {0.0966666666666687,0.326666666666667,0.0872220000000018,0.324444666666666},
+ {0.104999999999999,0.328888666666667,0.0966666666666687,0.326666666666667},
+ {0.113333333333334,0.331111333333334,0.104999999999999,0.328888666666667},
+ {0.120555333333333,0.332778,0.113333333333334,0.331111333333334},
+ {0.127222000000003,0.334444666666667,0.120555333333333,0.332778},
+ {0.133333333333335,0.336111333333333,0.127222000000003,0.334444666666667},
+ {0.136110666666667,0.451666666666667,0.133333333333335,0.455555333333334},
+ {0.137777333333337,0.446666666666667,0.136110666666667,0.451666666666667},
+ {0.138333333333335,0.440555333333334,0.137777333333337,0.446666666666667},
+ {0.138888666666669,0.433333333333334,0.138333333333335,0.440555333333334},
+ {0.139444000000002,0.425555333333334,0.138888666666669,0.433333333333334},
+ {0.138888666666669,0.417778,0.139444000000002,0.425555333333334},
+ {0.138333333333335,0.410555333333334,0.138888666666669,0.417778},
+ {0.137777333333337,0.404444666666667,0.138333333333335,0.410555333333334},
+ {0.136110666666667,0.399444666666666,0.137777333333337,0.404444666666667},
+ {0.133333333333335,0.395555333333334,0.136110666666667,0.399444666666666},
+ {0.129444000000002,0.393333333333333,0.133333333333335,0.395555333333334},
+ {0.124444000000002,0.391666666666667,0.129444000000002,0.393333333333333},
+ {0.117777333333336,0.390555333333333,0.124444000000002,0.391666666666667},
+ {0.110555333333333,0.39,0.117777333333336,0.390555333333333},
+ {0.0866666666666684,0.390555333333333,0.0938886666666671,0.39},
+ {0.080000000000003,0.391666666666667,0.0866666666666684,0.390555333333333},
+ {0.0750000000000028,0.393333333333333,0.080000000000003,0.391666666666667},
+ {0.0711106666666694,0.395555333333334,0.0750000000000028,0.393333333333333},
+ {0.0683333333333328,0.399444666666666,0.0711106666666694,0.395555333333334},
+ {0.0666666666666676,0.404444666666667,0.0683333333333328,0.399444666666666},
+ {0.0661106666666692,0.410555333333334,0.0666666666666676,0.404444666666667},
+ {0.0655553333333359,0.417778,0.0661106666666692,0.410555333333334},
+ {0.0655553333333359,0.425555333333334,0.0655553333333359,0.417778},
+ {0.0655553333333359,0.433333333333334,0.0655553333333359,0.425555333333334},
+ {0.0661106666666692,0.440555333333334,0.0655553333333359,0.433333333333334},
+ {0.0666666666666676,0.446666666666667,0.0661106666666692,0.440555333333334},
+ {0.0683333333333328,0.451666666666667,0.0666666666666676,0.446666666666667},
+ {0.0711106666666694,0.455555333333334,0.0683333333333328,0.451666666666667},
+ {0.0750000000000028,0.457778,0.0711106666666694,0.455555333333334},
+ {0.080000000000003,0.459444666666667,0.0750000000000028,0.457778},
+ {0.0866666666666684,0.460555333333333,0.080000000000003,0.459444666666667},
+ {0.0938886666666671,0.461111333333333,0.0866666666666684,0.460555333333333},
+ {0.117777333333336,0.460555333333333,0.110555333333333,0.461111333333333},
+ {0.124444000000002,0.459444666666667,0.117777333333336,0.460555333333333},
+ {0.129444000000002,0.457778,0.124444000000002,0.459444666666667},
+ {0.133333333333335,0.455555333333334,0.129444000000002,0.457778},
+ {0.257222000000003,0.633888666666667,0.262777333333337,0.641111333333334},
+ {0.262777333333337,0.641111333333334,0.270000000000001,0.646666666666667},
+ {0.270000000000001,0.646666666666667,0.278333333333336,0.651111333333333},
+ {0.278333333333336,0.651111333333333,0.288333333333336,0.653333333333334},
+ {0.288333333333336,0.653333333333334,0.29888866666667,0.654444666666667},
+ {0.29888866666667,0.654444666666667,0.311110666666669,0.655},
+ {0.311110666666669,0.655,0.323333333333333,0.653888666666666},
+ {0.323333333333333,0.653888666666666,0.336666666666668,0.652778},
+ {0.336666666666668,0.652778,0.350555333333332,0.650555333333333},
+ {0.350555333333332,0.650555333333333,0.363888666666668,0.648333333333333},
+ {0.363888666666668,0.648333333333333,0.377222000000003,0.646111333333333},
+ {0.377222000000003,0.646111333333333,0.389444000000002,0.643888666666667},
+ {0.389444000000002,0.643888666666667,0.401666666666666,0.641666666666667},
+ {0.401666666666666,0.641666666666667,0.412222,0.64},
+ {0.412222,0.64,0.422222,0.638333333333333},
+ {0.422222,0.638333333333333,0.430555333333335,0.636666666666667},
+ {0.430555333333335,0.636666666666667,0.437777333333334,0.635555333333333},
+ {0.437777333333334,0.635555333333333,0.443333333333333,0.633888666666667},
+ {0.443333333333333,0.633888666666667,0.448333333333333,0.631666666666667},
+ {0.448333333333333,0.631666666666667,0.452222000000001,0.628888666666667},
+ {0.452222000000001,0.628888666666667,0.455000000000003,0.626111333333334},
+ {0.455000000000003,0.626111333333334,0.456666666666668,0.622222},
+ {0.456666666666668,0.622222,0.457777333333335,0.618333333333334},
+ {0.457777333333335,0.618333333333334,0.458333333333333,0.613333333333333},
+ {0.458333333333333,0.613333333333333,0.458333333333333,0.608888666666667},
+ {0.458333333333333,0.608888666666667,0.457777333333335,0.603888666666667},
+ {0.457777333333335,0.603888666666667,0.457222000000002,0.598888666666667},
+ {0.457222000000002,0.598888666666667,0.45611066666667,0.594444666666667},
+ {0.45611066666667,0.594444666666667,0.455000000000003,0.589444666666667},
+ {0.455000000000003,0.589444666666667,0.453333333333333,0.585555333333333},
+ {0.453333333333333,0.585555333333333,0.451666666666668,0.581666666666666},
+ {0.451666666666668,0.581666666666666,0.449444,0.578888666666667},
+ {0.449444,0.578888666666667,0.446666666666668,0.576111333333333},
+ {0.446666666666668,0.576111333333333,0.443333333333333,0.573888666666667},
+ {0.443333333333333,0.573888666666667,0.438333333333333,0.572222},
+ {0.438333333333333,0.572222,0.431666666666667,0.571111333333333},
+ {0.431666666666667,0.571111333333333,0.42388866666667,0.570555333333333},
+ {0.414444000000003,0.570555333333333,0.403888666666669,0.571666666666667},
+ {0.403888666666669,0.571666666666667,0.392777333333332,0.572778},
+ {0.392777333333332,0.572778,0.381110666666667,0.573888666666667},
+ {0.381110666666667,0.573888666666667,0.37,0.575},
+ {0.37,0.575,0.358888666666668,0.576111333333333},
+ {0.358888666666668,0.576111333333333,0.348333333333334,0.577222},
+ {0.338888666666667,0.577222,0.33111066666667,0.576666666666667},
+ {0.33111066666667,0.576666666666667,0.324444,0.575555333333333},
+ {0.324444,0.575555333333333,0.319444,0.573888666666667},
+ {0.319444,0.573888666666667,0.315000000000002,0.571111333333333},
+ {0.315000000000002,0.571111333333333,0.312222000000001,0.567222},
+ {0.312222000000001,0.567222,0.310555333333336,0.562222},
+ {0.310555333333336,0.562222,0.310000000000002,0.556666666666667},
+ {0.310000000000002,0.556666666666667,0.310000000000002,0.550555333333334},
+ {0.310000000000002,0.550555333333334,0.310555333333336,0.543888666666666},
+ {0.310555333333336,0.543888666666666,0.311666666666667,0.537778},
+ {0.311666666666667,0.537778,0.312777333333334,0.531666666666667},
+ {0.312777333333334,0.531666666666667,0.313888666666666,0.526111333333333},
+ {0.313888666666666,0.526111333333333,0.315555333333336,0.521111333333333},
+ {0.315555333333336,0.521111333333333,0.317222000000001,0.517222},
+ {0.317222000000001,0.517222,0.319444,0.514444666666667},
+ {0.319444,0.514444666666667,0.323333333333333,0.512222},
+ {0.323333333333333,0.512222,0.328333333333333,0.511111333333333},
+ {0.328333333333333,0.511111333333333,0.335000000000003,0.511666666666667},
+ {0.335000000000003,0.511666666666667,0.342222000000002,0.512778},
+ {0.342222000000002,0.512778,0.350555333333332,0.514444666666667},
+ {0.350555333333332,0.514444666666667,0.358333333333334,0.516111333333334},
+ {0.358333333333334,0.516111333333334,0.365555333333333,0.517222},
+ {0.365555333333333,0.517222,0.372222000000003,0.517778},
+ {0.372222000000003,0.517778,0.377222000000003,0.516666666666667},
+ {0.377222000000003,0.516666666666667,0.381110666666667,0.514444666666667},
+ {0.381110666666667,0.514444666666667,0.383888666666669,0.511111333333333},
+ {0.383888666666669,0.511111333333333,0.385,0.506111333333333},
+ {0.385,0.506111333333333,0.386110666666667,0.5},
+ {0.386110666666667,0.5,0.38666666666667,0.492778},
+ {0.38666666666667,0.492778,0.38666666666667,0.485},
+ {0.38666666666667,0.485,0.38666666666667,0.477222},
+ {0.38666666666667,0.477222,0.386110666666667,0.47},
+ {0.386110666666667,0.47,0.385,0.463888666666667},
+ {0.385,0.463888666666667,0.383888666666669,0.458888666666667},
+ {0.383888666666669,0.458888666666667,0.381110666666667,0.455555333333334},
+ {0.381110666666667,0.455555333333334,0.377222000000003,0.453333333333333},
+ {0.377222000000003,0.453333333333333,0.372222000000003,0.452222},
+ {0.372222000000003,0.452222,0.365555333333333,0.452778},
+ {0.365555333333333,0.452778,0.358333333333334,0.453888666666667},
+ {0.358333333333334,0.453888666666667,0.349999999999999,0.455555333333334},
+ {0.349999999999999,0.455555333333334,0.342222000000002,0.457222},
+ {0.342222000000002,0.457222,0.335000000000003,0.458888666666667},
+ {0.328333333333333,0.458888666666667,0.323333333333333,0.457778},
+ {0.323333333333333,0.457778,0.319444,0.455555333333334},
+ {0.319444,0.455555333333334,0.317222000000001,0.452778},
+ {0.317222000000001,0.452778,0.315555333333336,0.448888666666667},
+ {0.315555333333336,0.448888666666667,0.313888666666666,0.443888666666667},
+ {0.313888666666666,0.443888666666667,0.312777333333334,0.438333333333333},
+ {0.312777333333334,0.438333333333333,0.311666666666667,0.432222},
+ {0.311666666666667,0.432222,0.310555333333336,0.425555333333334},
+ {0.310555333333336,0.425555333333334,0.310000000000002,0.418888666666666},
+ {0.310000000000002,0.418888666666666,0.310000000000002,0.412778},
+ {0.310000000000002,0.412778,0.310555333333336,0.407222},
+ {0.310555333333336,0.407222,0.312222000000001,0.402222},
+ {0.312222000000001,0.402222,0.315000000000002,0.398333333333333},
+ {0.315000000000002,0.398333333333333,0.319444,0.395555333333334},
+ {0.319444,0.395555333333334,0.324444,0.393888666666667},
+ {0.324444,0.393888666666667,0.33111066666667,0.392778},
+ {0.33111066666667,0.392778,0.338888666666667,0.392222},
+ {0.348333333333334,0.392222,0.358888666666668,0.393333333333333},
+ {0.358888666666668,0.393333333333333,0.37,0.394444666666667},
+ {0.37,0.394444666666667,0.38166666666667,0.395555333333334},
+ {0.38166666666667,0.395555333333334,0.392777333333332,0.396666666666667},
+ {0.392777333333332,0.396666666666667,0.403888666666669,0.397778},
+ {0.403888666666669,0.397778,0.414444000000003,0.398888666666667},
+ {0.42388866666667,0.398888666666667,0.431666666666667,0.398333333333333},
+ {0.431666666666667,0.398333333333333,0.438333333333333,0.397222},
+ {0.438333333333333,0.397222,0.443333333333333,0.395555333333334},
+ {0.443333333333333,0.395555333333334,0.446666666666668,0.393333333333333},
+ {0.446666666666668,0.393333333333333,0.449444,0.390555333333333},
+ {0.449444,0.390555333333333,0.451666666666668,0.387778},
+ {0.451666666666668,0.387778,0.453333333333333,0.383888666666667},
+ {0.453333333333333,0.383888666666667,0.455000000000003,0.38},
+ {0.455000000000003,0.38,0.45611066666667,0.375555333333333},
+ {0.45611066666667,0.375555333333333,0.457222000000002,0.370555333333333},
+ {0.457222000000002,0.370555333333333,0.457777333333335,0.366111333333333},
+ {0.457777333333335,0.366111333333333,0.458333333333333,0.361111333333334},
+ {0.458333333333333,0.361111333333334,0.458333333333333,0.356111333333333},
+ {0.458333333333333,0.356111333333333,0.457777333333335,0.351666666666667},
+ {0.457777333333335,0.351666666666667,0.456666666666668,0.347778},
+ {0.456666666666668,0.347778,0.455000000000003,0.343888666666667},
+ {0.455000000000003,0.343888666666667,0.452222000000001,0.341111333333333},
+ {0.452222000000001,0.341111333333333,0.448333333333333,0.338333333333334},
+ {0.448333333333333,0.338333333333334,0.443333333333333,0.336111333333333},
+ {0.443333333333333,0.336111333333333,0.437777333333334,0.334444666666667},
+ {0.437777333333334,0.334444666666667,0.430555333333335,0.333333333333333},
+ {0.430555333333335,0.333333333333333,0.422222,0.331666666666666},
+ {0.422222,0.331666666666666,0.412222,0.33},
+ {0.412222,0.33,0.401666666666666,0.328333333333333},
+ {0.401666666666666,0.328333333333333,0.389444000000002,0.326111333333333},
+ {0.389444000000002,0.326111333333333,0.377222000000003,0.323888666666667},
+ {0.377222000000003,0.323888666666667,0.363888666666668,0.321666666666667},
+ {0.363888666666668,0.321666666666667,0.349999999999999,0.319444666666667},
+ {0.349999999999999,0.319444666666667,0.336666666666668,0.317222},
+ {0.336666666666668,0.317222,0.323333333333333,0.316111333333333},
+ {0.323333333333333,0.316111333333333,0.311110666666669,0.315555333333334},
+ {0.29888866666667,0.315555333333334,0.288333333333336,0.316666666666666},
+ {0.288333333333336,0.316666666666666,0.278333333333336,0.318888666666667},
+ {0.278333333333336,0.318888666666667,0.270000000000001,0.323333333333334},
+ {0.270000000000001,0.323333333333334,0.262777333333337,0.328888666666667},
+ {0.262777333333337,0.328888666666667,0.257222000000003,0.336111333333333},
+ {0.257222000000003,0.336111333333333,0.253333333333335,0.343333333333333},
+ {0.253333333333335,0.343333333333333,0.25,0.352222},
+ {0.25,0.352222,0.247777333333336,0.362222},
+ {0.247777333333336,0.362222,0.245555333333333,0.373888666666667},
+ {0.245555333333333,0.373888666666667,0.243888666666668,0.387222},
+ {0.243888666666668,0.387222,0.242222000000003,0.401111333333333},
+ {0.242222000000003,0.401111333333333,0.241666666666669,0.416666666666667},
+ {0.241666666666669,0.416666666666667,0.240555333333333,0.432778},
+ {0.240555333333333,0.432778,0.24,0.45},
+ {0.24,0.45,0.24,0.467222},
+ {0.24,0.467222,0.24,0.485},
+ {0.24,0.485,0.24,0.502778},
+ {0.24,0.502778,0.24,0.52},
+ {0.24,0.52,0.240555333333333,0.537222},
+ {0.240555333333333,0.537222,0.241666666666669,0.553333333333333},
+ {0.241666666666669,0.553333333333333,0.242222000000003,0.568888666666667},
+ {0.242222000000003,0.568888666666667,0.243888666666668,0.582778},
+ {0.243888666666668,0.582778,0.245555333333333,0.596111333333334},
+ {0.245555333333333,0.596111333333334,0.247777333333336,0.607778},
+ {0.247777333333336,0.607778,0.25,0.617778},
+ {0.25,0.617778,0.253333333333335,0.626666666666667},
+ {0.253333333333335,0.626666666666667,0.257222000000003,0.633888666666667},
+ {0.505,0.514444666666667,0.51,0.52},
+ {0.51,0.52,0.516666666666666,0.523333333333333},
+ {0.516666666666666,0.523333333333333,0.524444000000003,0.525555333333333},
+ {0.53388866666667,0.525555333333333,0.544444000000003,0.524444666666666},
+ {0.544444000000003,0.524444666666666,0.555555333333335,0.522778},
+ {0.555555333333335,0.522778,0.567222000000001,0.52},
+ {0.567222000000001,0.52,0.578333333333333,0.517222},
+ {0.578333333333333,0.517222,0.589444,0.515},
+ {0.589444,0.515,0.599999999999999,0.512778},
+ {0.599999999999999,0.512778,0.609444000000001,0.511666666666667},
+ {0.617222000000003,0.511666666666667,0.623888666666668,0.512778},
+ {0.623888666666668,0.512778,0.628888666666668,0.514444666666667},
+ {0.628888666666668,0.514444666666667,0.632777333333337,0.516666666666667},
+ {0.632777333333337,0.516666666666667,0.635555333333334,0.52},
+ {0.635555333333334,0.52,0.637777333333337,0.523888666666667},
+ {0.637777333333337,0.523888666666667,0.638888666666669,0.528333333333334},
+ {0.638888666666669,0.528333333333334,0.640000000000001,0.533333333333333},
+ {0.640000000000001,0.533333333333333,0.640555333333334,0.538888666666667},
+ {0.640555333333334,0.538888666666667,0.640555333333334,0.544444666666667},
+ {0.640555333333334,0.544444666666667,0.640555333333334,0.549444666666667},
+ {0.640555333333334,0.549444666666667,0.640000000000001,0.555},
+ {0.640000000000001,0.555,0.638888666666669,0.56},
+ {0.638888666666669,0.56,0.637777333333337,0.564444666666667},
+ {0.637777333333337,0.564444666666667,0.635555333333334,0.568333333333333},
+ {0.635555333333334,0.568333333333333,0.632777333333337,0.571666666666667},
+ {0.632777333333337,0.571666666666667,0.628888666666668,0.573888666666667},
+ {0.628888666666668,0.573888666666667,0.623888666666668,0.575555333333333},
+ {0.623888666666668,0.575555333333333,0.617222000000003,0.576666666666667},
+ {0.617222000000003,0.576666666666667,0.609444000000001,0.577222},
+ {0.599999999999999,0.577222,0.589444,0.576111333333333},
+ {0.589444,0.576111333333333,0.578333333333333,0.575},
+ {0.578333333333333,0.575,0.566666666666668,0.573888666666667},
+ {0.566666666666668,0.573888666666667,0.555555333333335,0.572778},
+ {0.555555333333335,0.572778,0.544444000000003,0.571666666666667},
+ {0.544444000000003,0.571666666666667,0.53388866666667,0.570555333333333},
+ {0.524444000000003,0.570555333333333,0.516666666666666,0.571111333333333},
+ {0.516666666666666,0.571111333333333,0.51,0.572222},
+ {0.51,0.572222,0.505,0.573888666666667},
+ {0.505,0.573888666666667,0.50166666666667,0.576111333333333},
+ {0.50166666666667,0.576111333333333,0.498888666666668,0.578888666666667},
+ {0.498888666666668,0.578888666666667,0.49666666666667,0.581666666666666},
+ {0.49666666666667,0.581666666666666,0.495,0.585555333333333},
+ {0.495,0.585555333333333,0.493333333333335,0.589444666666667},
+ {0.493333333333335,0.589444666666667,0.492222000000003,0.594444666666667},
+ {0.492222000000003,0.594444666666667,0.491110666666666,0.598888666666667},
+ {0.491110666666666,0.598888666666667,0.490555333333333,0.603888666666667},
+ {0.490555333333333,0.603888666666667,0.49,0.608888666666667},
+ {0.49,0.608888666666667,0.49,0.613333333333333},
+ {0.49,0.613333333333333,0.490555333333333,0.618333333333334},
+ {0.490555333333333,0.618333333333334,0.491666666666669,0.622222},
+ {0.491666666666669,0.622222,0.493333333333335,0.626111333333334},
+ {0.493333333333335,0.626111333333334,0.496110666666667,0.628888666666667},
+ {0.496110666666667,0.628888666666667,0.5,0.631666666666667},
+ {0.5,0.631666666666667,0.505,0.633888666666667},
+ {0.505,0.633888666666667,0.510555333333334,0.635555333333333},
+ {0.510555333333334,0.635555333333333,0.517777333333332,0.636666666666667},
+ {0.517777333333332,0.636666666666667,0.526110666666668,0.637778},
+ {0.526110666666668,0.637778,0.536110666666668,0.638888666666666},
+ {0.536110666666668,0.638888666666666,0.546666666666667,0.64},
+ {0.546666666666667,0.64,0.558888666666666,0.641666666666667},
+ {0.558888666666666,0.641666666666667,0.571110666666669,0.642778},
+ {0.571110666666669,0.642778,0.584444,0.643888666666667},
+ {0.584444,0.643888666666667,0.598333333333334,0.645},
+ {0.598333333333334,0.645,0.611666666666669,0.646111333333333},
+ {0.611666666666669,0.646111333333333,0.625,0.646666666666667},
+ {0.649444000000003,0.646666666666667,0.660000000000001,0.645555333333334},
+ {0.660000000000001,0.645555333333334,0.670000000000002,0.643888666666667},
+ {0.670000000000002,0.643888666666667,0.678333333333337,0.641666666666667},
+ {0.678333333333337,0.641666666666667,0.685555333333336,0.638333333333333},
+ {0.685555333333336,0.638333333333333,0.691110666666669,0.633888666666667},
+ {0.691110666666669,0.633888666666667,0.696110666666669,0.627778},
+ {0.696110666666669,0.627778,0.700000000000003,0.619444666666666},
+ {0.700000000000003,0.619444666666666,0.702777333333335,0.61},
+ {0.702777333333335,0.61,0.704444,0.599444666666667},
+ {0.704444,0.599444666666667,0.705555333333336,0.586666666666667},
+ {0.705555333333336,0.586666666666667,0.70611066666667,0.573333333333334},
+ {0.70611066666667,0.573333333333334,0.70611066666667,0.559444666666667},
+ {0.70611066666667,0.559444666666667,0.705555333333336,0.545},
+ {0.705555333333336,0.545,0.705000000000003,0.53},
+ {0.705000000000003,0.53,0.703888666666666,0.516111333333334},
+ {0.703888666666666,0.516111333333334,0.702777333333335,0.502778},
+ {0.702777333333335,0.502778,0.70111066666667,0.49},
+ {0.70111066666667,0.49,0.699444,0.479444666666667},
+ {0.699444,0.479444666666667,0.697222000000001,0.47},
+ {0.697222000000001,0.47,0.694444,0.461666666666667},
+ {0.694444,0.461666666666667,0.691110666666669,0.455555333333334},
+ {0.691110666666669,0.455555333333334,0.686110666666669,0.45},
+ {0.686110666666669,0.45,0.679444000000004,0.446666666666667},
+ {0.679444000000004,0.446666666666667,0.671666666666667,0.444444666666667},
+ {0.662222,0.444444666666667,0.651666666666666,0.445555333333333},
+ {0.651666666666666,0.445555333333333,0.640555333333334,0.447222},
+ {0.640555333333334,0.447222,0.628888666666668,0.45},
+ {0.628888666666668,0.45,0.617777333333336,0.452778},
+ {0.617777333333336,0.452778,0.606666666666669,0.455},
+ {0.606666666666669,0.455,0.59611066666667,0.457222},
+ {0.59611066666667,0.457222,0.586666666666668,0.458333333333333},
+ {0.578888666666666,0.458333333333333,0.572222000000001,0.457222},
+ {0.572222000000001,0.457222,0.567222000000001,0.455555333333334},
+ {0.567222000000001,0.455555333333334,0.563333333333333,0.453333333333333},
+ {0.563333333333333,0.453333333333333,0.560555333333336,0.45},
+ {0.560555333333336,0.45,0.558333333333332,0.446111333333333},
+ {0.558333333333332,0.446111333333333,0.557222000000001,0.441666666666666},
+ {0.557222000000001,0.441666666666666,0.556110666666669,0.436666666666667},
+ {0.556110666666669,0.436666666666667,0.555555333333335,0.431111333333333},
+ {0.555555333333335,0.431111333333333,0.555555333333335,0.425555333333334},
+ {0.555555333333335,0.425555333333334,0.555555333333335,0.42},
+ {0.555555333333335,0.42,0.556110666666669,0.414444666666667},
+ {0.556110666666669,0.414444666666667,0.557222000000001,0.409444666666667},
+ {0.557222000000001,0.409444666666667,0.558333333333332,0.405},
+ {0.558333333333332,0.405,0.560555333333336,0.401111333333333},
+ {0.560555333333336,0.401111333333333,0.563333333333333,0.397778},
+ {0.563333333333333,0.397778,0.567222000000001,0.395555333333334},
+ {0.567222000000001,0.395555333333334,0.572222000000001,0.393888666666667},
+ {0.572222000000001,0.393888666666667,0.578888666666666,0.392778},
+ {0.578888666666666,0.392778,0.586666666666668,0.392222},
+ {0.59611066666667,0.392222,0.606666666666669,0.393333333333333},
+ {0.606666666666669,0.393333333333333,0.617777333333336,0.394444666666667},
+ {0.617777333333336,0.394444666666667,0.629444000000002,0.395555333333334},
+ {0.629444000000002,0.395555333333334,0.640555333333334,0.396666666666667},
+ {0.640555333333334,0.396666666666667,0.651666666666666,0.397778},
+ {0.651666666666666,0.397778,0.662222,0.398888666666667},
+ {0.671666666666667,0.398888666666667,0.679444000000004,0.398333333333333},
+ {0.679444000000004,0.398333333333333,0.686110666666669,0.397222},
+ {0.686110666666669,0.397222,0.691110666666669,0.395555333333334},
+ {0.691110666666669,0.395555333333334,0.694444,0.393333333333333},
+ {0.694444,0.393333333333333,0.697222000000001,0.390555333333333},
+ {0.697222000000001,0.390555333333333,0.699444,0.387778},
+ {0.699444,0.387778,0.70111066666667,0.383888666666667},
+ {0.70111066666667,0.383888666666667,0.702777333333335,0.38},
+ {0.702777333333335,0.38,0.703888666666666,0.375555333333333},
+ {0.703888666666666,0.375555333333333,0.705000000000003,0.370555333333333},
+ {0.705000000000003,0.370555333333333,0.705555333333336,0.366111333333333},
+ {0.705555333333336,0.366111333333333,0.70611066666667,0.361111333333334},
+ {0.70611066666667,0.361111333333334,0.70611066666667,0.356111333333333},
+ {0.70611066666667,0.356111333333333,0.705555333333336,0.351666666666667},
+ {0.705555333333336,0.351666666666667,0.704444,0.347778},
+ {0.704444,0.347778,0.702777333333335,0.343888666666667},
+ {0.702777333333335,0.343888666666667,0.700000000000003,0.341111333333333},
+ {0.700000000000003,0.341111333333333,0.696110666666669,0.338333333333334},
+ {0.696110666666669,0.338333333333334,0.691110666666669,0.336111333333333},
+ {0.691110666666669,0.336111333333333,0.685555333333336,0.334444666666667},
+ {0.685555333333336,0.334444666666667,0.678333333333337,0.333333333333333},
+ {0.678333333333337,0.333333333333333,0.670000000000002,0.332222},
+ {0.670000000000002,0.332222,0.660000000000001,0.331111333333334},
+ {0.660000000000001,0.331111333333334,0.649444000000003,0.33},
+ {0.649444000000003,0.33,0.637222000000004,0.328333333333333},
+ {0.637222000000004,0.328333333333333,0.625,0.327222},
+ {0.625,0.327222,0.611666666666669,0.326111333333333},
+ {0.611666666666669,0.326111333333333,0.597777333333335,0.325},
+ {0.597777333333335,0.325,0.584444,0.323888666666667},
+ {0.584444,0.323888666666667,0.571110666666669,0.323333333333334},
+ {0.546666666666667,0.323333333333334,0.536110666666668,0.324444666666666},
+ {0.536110666666668,0.324444666666666,0.526110666666668,0.326111333333333},
+ {0.526110666666668,0.326111333333333,0.517777333333332,0.328333333333333},
+ {0.517777333333332,0.328333333333333,0.510555333333334,0.331666666666666},
+ {0.510555333333334,0.331666666666666,0.505,0.336111333333333},
+ {0.505,0.336111333333333,0.5,0.342222},
+ {0.5,0.342222,0.496110666666667,0.350555333333334},
+ {0.496110666666667,0.350555333333334,0.493333333333335,0.36},
+ {0.493333333333335,0.36,0.491666666666669,0.370555333333333},
+ {0.491666666666669,0.370555333333333,0.490555333333333,0.383333333333334},
+ {0.490555333333333,0.383333333333334,0.49,0.396666666666667},
+ {0.49,0.396666666666667,0.49,0.410555333333334},
+ {0.49,0.410555333333334,0.490555333333333,0.425555333333334},
+ {0.490555333333333,0.425555333333334,0.491110666666666,0.44},
+ {0.491110666666666,0.44,0.492222000000003,0.453888666666667},
+ {0.492222000000003,0.453888666666667,0.493333333333335,0.467222},
+ {0.493333333333335,0.467222,0.495,0.48},
+ {0.495,0.48,0.49666666666667,0.490555333333334},
+ {0.49666666666667,0.490555333333334,0.498888666666668,0.5},
+ {0.498888666666668,0.5,0.50166666666667,0.508333333333334},
+ {0.50166666666667,0.508333333333334,0.505,0.514444666666667},
+ {0.752777333333337,0.633888666666667,0.758333333333335,0.641111333333334},
+ {0.758333333333335,0.641111333333334,0.765555333333334,0.646666666666667},
+ {0.765555333333334,0.646666666666667,0.773888666666669,0.651111333333333},
+ {0.773888666666669,0.651111333333333,0.78388866666667,0.653333333333334},
+ {0.78388866666667,0.653333333333334,0.794444000000003,0.654444666666667},
+ {0.794444000000003,0.654444666666667,0.806666666666667,0.655},
+ {0.806666666666667,0.655,0.818888666666666,0.653888666666666},
+ {0.818888666666666,0.653888666666666,0.832222000000002,0.652778},
+ {0.832222000000002,0.652778,0.84611066666667,0.650555333333333},
+ {0.84611066666667,0.650555333333333,0.859444000000001,0.648333333333333},
+ {0.859444000000001,0.648333333333333,0.872777333333336,0.646111333333333},
+ {0.872777333333336,0.646111333333333,0.885,0.643888666666667},
+ {0.885,0.643888666666667,0.897221999999999,0.641666666666667},
+ {0.897221999999999,0.641666666666667,0.907777333333333,0.64},
+ {0.907777333333333,0.64,0.917777333333333,0.638333333333333},
+ {0.917777333333333,0.638333333333333,0.926110666666669,0.636666666666667},
+ {0.926110666666669,0.636666666666667,0.933333333333332,0.635555333333333},
+ {0.933333333333332,0.635555333333333,0.938888666666666,0.633888666666667},
+ {0.938888666666666,0.633888666666667,0.943888666666666,0.631666666666667},
+ {0.943888666666666,0.631666666666667,0.947777333333335,0.628888666666667},
+ {0.947777333333335,0.628888666666667,0.950555333333336,0.626111333333334},
+ {0.950555333333336,0.626111333333334,0.952222000000001,0.622222},
+ {0.952222000000001,0.622222,0.953333333333333,0.618333333333334},
+ {0.953333333333333,0.618333333333334,0.953888666666666,0.613333333333333},
+ {0.953888666666666,0.613333333333333,0.953888666666666,0.608888666666667},
+ {0.953888666666666,0.608888666666667,0.953333333333333,0.603888666666667},
+ {0.953333333333333,0.603888666666667,0.952777333333335,0.598888666666667},
+ {0.952777333333335,0.598888666666667,0.951666666666668,0.594444666666667},
+ {0.951666666666668,0.594444666666667,0.950555333333336,0.589444666666667},
+ {0.950555333333336,0.589444666666667,0.948888666666666,0.585555333333333},
+ {0.948888666666666,0.585555333333333,0.947222000000001,0.581666666666666},
+ {0.947222000000001,0.581666666666666,0.945000000000003,0.578888666666667},
+ {0.945000000000003,0.578888666666667,0.942222000000001,0.576111333333333},
+ {0.942222000000001,0.576111333333333,0.938888666666666,0.573888666666667},
+ {0.938888666666666,0.573888666666667,0.933888666666666,0.572222},
+ {0.933888666666666,0.572222,0.927222,0.571111333333333},
+ {0.927222,0.571111333333333,0.919444000000003,0.570555333333333},
+ {0.910000000000001,0.570555333333333,0.899444000000003,0.571666666666667},
+ {0.899444000000003,0.571666666666667,0.888333333333335,0.572778},
+ {0.888333333333335,0.572778,0.87666666666667,0.573888666666667},
+ {0.87666666666667,0.573888666666667,0.865555333333333,0.575},
+ {0.865555333333333,0.575,0.854444000000001,0.576111333333333},
+ {0.854444000000001,0.576111333333333,0.843888666666667,0.577222},
+ {0.834444,0.577222,0.826666666666668,0.576666666666667},
+ {0.826666666666668,0.576666666666667,0.820000000000003,0.575555333333333},
+ {0.820000000000003,0.575555333333333,0.815000000000002,0.573888666666667},
+ {0.815000000000002,0.573888666666667,0.810555333333336,0.571111333333333},
+ {0.810555333333336,0.571111333333333,0.807777333333334,0.567222},
+ {0.807777333333334,0.567222,0.806110666666669,0.562222},
+ {0.806110666666669,0.562222,0.805555333333335,0.556666666666667},
+ {0.805555333333335,0.556666666666667,0.805555333333335,0.550555333333334},
+ {0.805555333333335,0.550555333333334,0.806110666666669,0.543888666666666},
+ {0.806110666666669,0.543888666666666,0.807222000000001,0.537778},
+ {0.807222000000001,0.537778,0.808333333333332,0.531666666666667},
+ {0.808333333333332,0.531666666666667,0.809443999999999,0.526111333333333},
+ {0.809443999999999,0.526111333333333,0.811110666666669,0.521111333333333},
+ {0.811110666666669,0.521111333333333,0.812777333333334,0.517222},
+ {0.812777333333334,0.517222,0.815000000000002,0.514444666666667},
+ {0.815000000000002,0.514444666666667,0.818888666666666,0.512222},
+ {0.818888666666666,0.512222,0.823888666666666,0.511111333333333},
+ {0.823888666666666,0.511111333333333,0.830555333333336,0.511666666666667},
+ {0.830555333333336,0.511666666666667,0.837777333333335,0.512778},
+ {0.837777333333335,0.512778,0.84611066666667,0.514444666666667},
+ {0.84611066666667,0.514444666666667,0.853888666666667,0.516111333333334},
+ {0.853888666666667,0.516111333333334,0.861110666666666,0.517222},
+ {0.861110666666666,0.517222,0.867777333333336,0.517778},
+ {0.867777333333336,0.517778,0.872777333333336,0.516666666666667},
+ {0.872777333333336,0.516666666666667,0.87666666666667,0.514444666666667},
+ {0.87666666666667,0.514444666666667,0.879444000000002,0.511111333333333},
+ {0.879444000000002,0.511111333333333,0.880555333333334,0.506111333333333},
+ {0.880555333333334,0.506111333333333,0.88166666666667,0.5},
+ {0.88166666666667,0.5,0.882222000000003,0.492778},
+ {0.882222000000003,0.492778,0.882222000000003,0.485},
+ {0.882222000000003,0.485,0.882222000000003,0.477222},
+ {0.882222000000003,0.477222,0.88166666666667,0.47},
+ {0.88166666666667,0.47,0.880555333333334,0.463888666666667},
+ {0.880555333333334,0.463888666666667,0.879444000000002,0.458888666666667},
+ {0.879444000000002,0.458888666666667,0.87666666666667,0.455555333333334},
+ {0.87666666666667,0.455555333333334,0.872777333333336,0.453333333333333},
+ {0.872777333333336,0.453333333333333,0.867777333333336,0.452222},
+ {0.867777333333336,0.452222,0.861110666666666,0.452778},
+ {0.861110666666666,0.452778,0.853888666666667,0.453888666666667},
+ {0.853888666666667,0.453888666666667,0.845555333333337,0.455555333333334},
+ {0.845555333333337,0.455555333333334,0.837777333333335,0.457222},
+ {0.837777333333335,0.457222,0.830555333333336,0.458888666666667},
+ {0.823888666666666,0.458888666666667,0.818888666666666,0.457778},
+ {0.818888666666666,0.457778,0.815000000000002,0.455555333333334},
+ {0.815000000000002,0.455555333333334,0.812777333333334,0.452778},
+ {0.812777333333334,0.452778,0.811110666666669,0.448888666666667},
+ {0.811110666666669,0.448888666666667,0.809443999999999,0.443888666666667},
+ {0.809443999999999,0.443888666666667,0.808333333333332,0.438333333333333},
+ {0.808333333333332,0.438333333333333,0.807222000000001,0.432222},
+ {0.807222000000001,0.432222,0.806110666666669,0.425555333333334},
+ {0.806110666666669,0.425555333333334,0.805555333333335,0.418888666666666},
+ {0.805555333333335,0.418888666666666,0.805555333333335,0.412778},
+ {0.805555333333335,0.412778,0.806110666666669,0.407222},
+ {0.806110666666669,0.407222,0.807777333333334,0.402222},
+ {0.807777333333334,0.402222,0.810555333333336,0.398333333333333},
+ {0.810555333333336,0.398333333333333,0.815000000000002,0.395555333333334},
+ {0.815000000000002,0.395555333333334,0.820000000000003,0.393888666666667},
+ {0.820000000000003,0.393888666666667,0.826666666666668,0.392778},
+ {0.826666666666668,0.392778,0.834444,0.392222},
+ {0.843888666666667,0.392222,0.854444000000001,0.393333333333333},
+ {0.854444000000001,0.393333333333333,0.865555333333333,0.394444666666667},
+ {0.865555333333333,0.394444666666667,0.877222000000003,0.395555333333334},
+ {0.877222000000003,0.395555333333334,0.888333333333335,0.396666666666667},
+ {0.888333333333335,0.396666666666667,0.899444000000003,0.397778},
+ {0.899444000000003,0.397778,0.910000000000001,0.398888666666667},
+ {0.919444000000003,0.398888666666667,0.927222,0.398333333333333},
+ {0.927222,0.398333333333333,0.933888666666666,0.397222},
+ {0.933888666666666,0.397222,0.938888666666666,0.395555333333334},
+ {0.938888666666666,0.395555333333334,0.942222000000001,0.393333333333333},
+ {0.942222000000001,0.393333333333333,0.945000000000003,0.390555333333333},
+ {0.945000000000003,0.390555333333333,0.947222000000001,0.387778},
+ {0.947222000000001,0.387778,0.948888666666666,0.383888666666667},
+ {0.948888666666666,0.383888666666667,0.950555333333336,0.38},
+ {0.950555333333336,0.38,0.951666666666668,0.375555333333333},
+ {0.951666666666668,0.375555333333333,0.952777333333335,0.370555333333333},
+ {0.952777333333335,0.370555333333333,0.953333333333333,0.366111333333333},
+ {0.953333333333333,0.366111333333333,0.953888666666666,0.361111333333334},
+ {0.953888666666666,0.361111333333334,0.953888666666666,0.356111333333333},
+ {0.953888666666666,0.356111333333333,0.953333333333333,0.351666666666667},
+ {0.953333333333333,0.351666666666667,0.952222000000001,0.347778},
+ {0.952222000000001,0.347778,0.950555333333336,0.343888666666667},
+ {0.950555333333336,0.343888666666667,0.947777333333335,0.341111333333333},
+ {0.947777333333335,0.341111333333333,0.943888666666666,0.338333333333334},
+ {0.943888666666666,0.338333333333334,0.938888666666666,0.336111333333333},
+ {0.938888666666666,0.336111333333333,0.933333333333332,0.334444666666667},
+ {0.933333333333332,0.334444666666667,0.926110666666669,0.333333333333333},
+ {0.926110666666669,0.333333333333333,0.917777333333333,0.331666666666666},
+ {0.917777333333333,0.331666666666666,0.907777333333333,0.33},
+ {0.907777333333333,0.33,0.897221999999999,0.328333333333333},
+ {0.897221999999999,0.328333333333333,0.885,0.326111333333333},
+ {0.885,0.326111333333333,0.872777333333336,0.323888666666667},
+ {0.872777333333336,0.323888666666667,0.859444000000001,0.321666666666667},
+ {0.859444000000001,0.321666666666667,0.845555333333337,0.319444666666667},
+ {0.845555333333337,0.319444666666667,0.832222000000002,0.317222},
+ {0.832222000000002,0.317222,0.818888666666666,0.316111333333333},
+ {0.818888666666666,0.316111333333333,0.806666666666667,0.315555333333334},
+ {0.794444000000003,0.315555333333334,0.78388866666667,0.316666666666666},
+ {0.78388866666667,0.316666666666666,0.773888666666669,0.318888666666667},
+ {0.773888666666669,0.318888666666667,0.765555333333334,0.323333333333334},
+ {0.765555333333334,0.323333333333334,0.758333333333335,0.328888666666667},
+ {0.758333333333335,0.328888666666667,0.752777333333337,0.336111333333333},
+ {0.752777333333337,0.336111333333333,0.748888666666668,0.343333333333333},
+ {0.748888666666668,0.343333333333333,0.745555333333333,0.352222},
+ {0.745555333333333,0.352222,0.743333333333335,0.362222},
+ {0.743333333333335,0.362222,0.741110666666666,0.373888666666667},
+ {0.741110666666666,0.373888666666667,0.739444000000001,0.387222},
+ {0.739444000000001,0.387222,0.737777333333336,0.401111333333333},
+ {0.737777333333336,0.401111333333333,0.737222000000003,0.416666666666667},
+ {0.737222000000003,0.416666666666667,0.736110666666666,0.432778},
+ {0.736110666666666,0.432778,0.735555333333333,0.45},
+ {0.735555333333333,0.45,0.735555333333333,0.467222},
+ {0.735555333333333,0.467222,0.735555333333333,0.485},
+ {0.735555333333333,0.485,0.735555333333333,0.502778},
+ {0.735555333333333,0.502778,0.735555333333333,0.52},
+ {0.735555333333333,0.52,0.736110666666666,0.537222},
+ {0.736110666666666,0.537222,0.737222000000003,0.553333333333333},
+ {0.737222000000003,0.553333333333333,0.737777333333336,0.568888666666667},
+ {0.737777333333336,0.568888666666667,0.739444000000001,0.582778},
+ {0.739444000000001,0.582778,0.741110666666666,0.596111333333334},
+ {0.741110666666666,0.596111333333334,0.743333333333335,0.607778},
+ {0.743333333333335,0.607778,0.745555333333333,0.617778},
+ {0.745555333333333,0.617778,0.748888666666668,0.626666666666667},
+ {0.748888666666668,0.626666666666667,0.752777333333337,0.633888666666667},
+ {1.18388866666667,0.397778,1.18666666666667,0.395555333333334},
+ {1.179444,0.398333333333333,1.18388866666667,0.397778},
+ {1.174444,0.397222,1.179444,0.398333333333333},
+ {1.16888866666667,0.394444666666667,1.174444,0.397222},
+ {1.16277733333333,0.391111333333334,1.16888866666667,0.394444666666667},
+ {1.15555533333333,0.387222,1.16277733333333,0.391111333333334},
+ {1.14888866666667,0.383333333333334,1.15555533333333,0.387222},
+ {1.14277733333333,0.381111333333333,1.14888866666667,0.383333333333334},
+ {1.137222,0.380555333333334,1.14277733333333,0.381111333333333},
+ {1.132222,0.382222,1.137222,0.380555333333334},
+ {1.12777733333334,0.387222,1.132222,0.382222},
+ {1.125,0.395555333333334,1.12777733333334,0.387222},
+ {1.12388866666667,0.402222,1.125,0.395555333333334},
+ {1.12277733333334,0.41,1.12388866666667,0.402222},
+ {1.12166666666667,0.419444666666667,1.12277733333334,0.41},
+ {1.12166666666667,0.43,1.12166666666667,0.419444666666667},
+ {1.12166666666667,0.441666666666666,1.12166666666667,0.43},
+ {1.12166666666667,0.455,1.12166666666667,0.441666666666666},
+ {1.122222,0.468888666666667,1.12166666666667,0.455},
+ {1.12333333333333,0.483888666666667,1.122222,0.468888666666667},
+ {1.12388866666667,0.498888666666667,1.12333333333333,0.483888666666667},
+ {1.125,0.515,1.12388866666667,0.498888666666667},
+ {1.12611066666667,0.530555333333333,1.125,0.515},
+ {1.12666666666667,0.545555333333333,1.12611066666667,0.530555333333333},
+ {1.12777733333334,0.560555333333333,1.12666666666667,0.545555333333333},
+ {1.12833333333333,0.574444666666666,1.12777733333334,0.560555333333333},
+ {1.12833333333333,0.587778,1.12833333333333,0.574444666666666},
+ {1.12833333333333,0.599444666666667,1.12833333333333,0.587778},
+ {1.12833333333333,0.61,1.12833333333333,0.599444666666667},
+ {1.127222,0.619444666666666,1.12833333333333,0.61},
+ {1.12666666666667,0.627222,1.127222,0.619444666666666},
+ {1.125,0.633888666666667,1.12666666666667,0.627222},
+ {1.12333333333333,0.638888666666666,1.125,0.633888666666667},
+ {1.12166666666667,0.642778,1.12333333333333,0.638888666666666},
+ {1.119444,0.646111333333333,1.12166666666667,0.642778},
+ {1.117222,0.648888666666667,1.119444,0.646111333333333},
+ {1.114444,0.651111333333333,1.117222,0.648888666666667},
+ {1.11166666666667,0.652778,1.114444,0.651111333333333},
+ {1.10833333333333,0.653888666666666,1.11166666666667,0.652778},
+ {1.105,0.655,1.10833333333333,0.653888666666666},
+ {1.10111066666667,0.655555333333333,1.105,0.655},
+ {1.09777733333334,0.656111333333333,1.10111066666667,0.655555333333333},
+ {1.08666666666667,0.655555333333333,1.09,0.656111333333333},
+ {1.08277733333333,0.655,1.08666666666667,0.655555333333333},
+ {1.079444,0.653888666666666,1.08277733333333,0.655},
+ {1.07611066666667,0.652778,1.079444,0.653888666666666},
+ {1.07333333333333,0.651111333333333,1.07611066666667,0.652778},
+ {1.07055533333334,0.648888666666667,1.07333333333333,0.651111333333333},
+ {1.06833333333333,0.646111333333333,1.07055533333334,0.648888666666667},
+ {1.06611066666667,0.642778,1.06833333333333,0.646111333333333},
+ {1.064444,0.638888666666666,1.06611066666667,0.642778},
+ {1.06277733333333,0.633888666666667,1.064444,0.638888666666666},
+ {1.06111066666667,0.627222,1.06277733333333,0.633888666666667},
+ {1.06055533333334,0.619444666666666,1.06111066666667,0.627222},
+ {1.059444,0.61,1.06055533333334,0.619444666666666},
+ {1.059444,0.599444666666667,1.059444,0.61},
+ {1.059444,0.587778,1.059444,0.599444666666667},
+ {1.059444,0.574444666666666,1.059444,0.587778},
+ {1.06,0.560555333333333,1.059444,0.574444666666666},
+ {1.06111066666667,0.545555333333333,1.06,0.560555333333333},
+ {1.06166666666667,0.530555333333333,1.06111066666667,0.545555333333333},
+ {1.06277733333333,0.514444666666667,1.06166666666667,0.530555333333333},
+ {1.06388866666667,0.498888666666667,1.06277733333333,0.514444666666667},
+ {1.064444,0.483888666666667,1.06388866666667,0.498888666666667},
+ {1.06555533333334,0.468888666666667,1.064444,0.483888666666667},
+ {1.06611066666667,0.455,1.06555533333334,0.468888666666667},
+ {1.06611066666667,0.441666666666666,1.06611066666667,0.455},
+ {1.06611066666667,0.43,1.06611066666667,0.441666666666666},
+ {1.06611066666667,0.419444666666667,1.06611066666667,0.43},
+ {1.065,0.41,1.06611066666667,0.419444666666667},
+ {1.064444,0.402222,1.065,0.41},
+ {1.06277733333333,0.395555333333334,1.064444,0.402222},
+ {1.06,0.387222,1.06277733333333,0.395555333333334},
+ {1.05555533333334,0.382222,1.06,0.387222},
+ {1.05055533333334,0.380555333333334,1.05555533333334,0.382222},
+ {1.045,0.381111333333333,1.05055533333334,0.380555333333334},
+ {1.03833333333334,0.383333333333334,1.045,0.381111333333333},
+ {1.03166666666667,0.387222,1.03833333333334,0.383333333333334},
+ {1.025,0.391111333333334,1.03166666666667,0.387222},
+ {1.01833333333334,0.394444666666667,1.025,0.391111333333334},
+ {1.01277733333334,0.397222,1.01833333333334,0.394444666666667},
+ {1.00777733333334,0.398333333333333,1.01277733333334,0.397222},
+ {1.00333333333333,0.397778,1.00777733333334,0.398333333333333},
+ {1.00055533333333,0.395555333333334,1.00333333333333,0.397778},
+ {0.998333333333335,0.393333333333333,1.00055533333333,0.395555333333334},
+ {0.99666666666667,0.39,0.998333333333335,0.393333333333333},
+ {0.995555333333333,0.386111333333333,0.99666666666667,0.39},
+ {0.993888666666668,0.381666666666667,0.995555333333333,0.386111333333333},
+ {0.992222000000003,0.376666666666667,0.993888666666668,0.381666666666667},
+ {0.990555333333333,0.371111333333333,0.992222000000003,0.376666666666667},
+ {0.988888666666668,0.365555333333334,0.990555333333333,0.371111333333333},
+ {0.987777333333336,0.360555333333333,0.988888666666668,0.365555333333334},
+ {0.987222000000003,0.355,0.987777333333336,0.360555333333333},
+ {0.987222000000003,0.35,0.987222000000003,0.355},
+ {0.988333333333334,0.345555333333333,0.987222000000003,0.35},
+ {0.991110666666666,0.341666666666667,0.988333333333334,0.345555333333333},
+ {0.995,0.338333333333334,0.991110666666666,0.341666666666667},
+ {1.00055533333333,0.336111333333333,0.995,0.338333333333334},
+ {1.00611066666667,0.334444666666667,1.00055533333333,0.336111333333333},
+ {1.01333333333334,0.333333333333333,1.00611066666667,0.334444666666667},
+ {1.02166666666667,0.332778,1.01333333333334,0.333333333333333},
+ {1.03166666666667,0.331666666666666,1.02166666666667,0.332778},
+ {1.042222,0.331111333333334,1.03166666666667,0.331666666666666},
+ {1.06666666666667,0.330555333333334,1.054444,0.331111333333334},
+ {1.13277733333334,0.331111333333334,1.12055533333333,0.330555333333334},
+ {1.15555533333333,0.331666666666666,1.145,0.331111333333334},
+ {1.16555533333333,0.332778,1.15555533333333,0.331666666666666},
+ {1.17388866666667,0.333333333333333,1.16555533333333,0.332778},
+ {1.18111066666667,0.334444666666667,1.17388866666667,0.333333333333333},
+ {1.18666666666667,0.336111333333333,1.18111066666667,0.334444666666667},
+ {1.192222,0.338333333333334,1.18666666666667,0.336111333333333},
+ {1.19611066666667,0.341666666666667,1.192222,0.338333333333334},
+ {1.19888866666667,0.345555333333333,1.19611066666667,0.341666666666667},
+ {1.2,0.35,1.19888866666667,0.345555333333333},
+ {1.2,0.355,1.2,0.35},
+ {1.199444,0.360555333333333,1.2,0.355},
+ {1.19833333333333,0.366111333333333,1.199444,0.360555333333333},
+ {1.19666666666667,0.371111333333333,1.19833333333333,0.366111333333333},
+ {1.195,0.376666666666667,1.19666666666667,0.371111333333333},
+ {1.19333333333333,0.381666666666667,1.195,0.376666666666667},
+ {1.19166666666667,0.386111333333333,1.19333333333333,0.381666666666667},
+ {1.19,0.39,1.19166666666667,0.386111333333333},
+ {1.18888866666667,0.393333333333333,1.19,0.39},
+ {1.18666666666667,0.395555333333334,1.18888866666667,0.393333333333333},
+ {0,0,0,0}
+};
+
+double Icon38[][4] = {
+ {0.166666666666667,0,0,1},
+ {0.166666666666667,1,0.333333333333333,0},
+ {0,0,0,0}
+};
+
+typedef double LineType[4];
+typedef LineType *IconType;
+IconType Icons[] = {
+ Icon0,
+ Icon1,
+ Icon2,
+ Icon3,
+ Icon4,
+ Icon5,
+ Icon6,
+ Icon7,
+ Icon8,
+ Icon9,
+ Icon10,
+ Icon11,
+ Icon12,
+ Icon13,
+ Icon14,
+ Icon15,
+ Icon16,
+ Icon17,
+ Icon18,
+ Icon19,
+ Icon20,
+ Icon21,
+ Icon22,
+ Icon23,
+ Icon24,
+ Icon25,
+ Icon26,
+ Icon27,
+ Icon28,
+ Icon29,
+ Icon30,
+ Icon31,
+ Icon32,
+ Icon33,
+ Icon34,
+ Icon35,
+ Icon36,
+ Icon37,
+ Icon38,
+};
+
+double IconWidths[] = {
+ 0.5,
+ 0.5,
+ 0.333333333333333,
+ 0.5,
+ 0.5,
+ 0.541666666666667,
+ 0.541666666666667,
+ 0.166666666666667,
+ 0.5,
+ 0.5,
+ 0.707221999999999,
+ 0.75,
+ 0.318888666666666,
+ 0.106111333333333,
+ 0.312222,
+ 0.315555333333333,
+ 0.291666666666667,
+ 0.312777333333333,
+ 0.316111333333333,
+ 0.296666666666667,
+ 0.273333333333333,
+ 0.31,
+ 0.166666666666667,
+ 0.166666666666667,
+ 0.375,
+ 0.333333333333333,
+ 0.939999999999998,
+ 1,
+ 0.356111333333333,
+ 1,
+ 0.666666666666667,
+ 0.5,
+ 0.5,
+ 0.583333333333333,
+ 0.583333333333333,
+ 0.583333333333333,
+ 0.920556,
+ 1.2,
+ 0.333333333333333,
+};
diff --git a/noatun-plugins/tippercanoe/main.cpp b/noatun-plugins/tippercanoe/main.cpp
new file mode 100644
index 0000000..28a60ec
--- /dev/null
+++ b/noatun-plugins/tippercanoe/main.cpp
@@ -0,0 +1,170 @@
+/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia)
+ Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au>
+ 2001 Charles Samuels <charles@kde.org>
+ Copyright (C) 2001 Neil Stevens <multivac@fcmail.com>
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <time.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <pwd.h>
+#include <string.h>
+#include "syna.h"
+#include <math.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+void Core::allocOutput(int w,int h)
+{
+#if 0
+ delete[] output;
+ delete[] lastOutput;
+ delete[] lastLastOutput;
+ output = new unsigned char[w*h*2];
+ lastOutput = new unsigned char[w*h*2];
+ lastLastOutput = new unsigned char[w*h*2];
+ memset(output,32,w*h*2);
+ memset(lastOutput,32,w*h*2);
+ outWidth = w;
+ outHeight = h;
+#endif
+
+ outputBmp.size(w,h);
+ lastOutputBmp.size(w,h);
+ lastLastOutputBmp.size(w,h);
+ polygonEngine.size(w,h);
+ outWidth = w;
+ outHeight = h;
+}
+
+void Core::toDefaults()
+{
+ fadeMode = Stars;
+ pointsAreDiamonds = true;
+
+ brightnessTwiddler = 0.33; //0.125;
+ starSize = 0.125;
+
+ fgRedSlider=0.0;
+ fgGreenSlider=0.5;
+ bgRedSlider=1.0;
+ bgGreenSlider=0.2;
+}
+
+Core::Core()
+{
+ core=this;
+ int i;
+
+ data=new sampleType[NumSamples*2+16];
+ windY=windX=1;
+ windWidth=320;
+ windHeight=240;
+ for(i=0;i<NumSamples;i++)
+ {
+ negSinTable[i] = -sin(3.141592*2.0/NumSamples*i);
+ cosTable[i] = cos(3.141592*2.0/NumSamples*i);
+ bitReverse[i] = bitReverser(i);
+ }
+
+ screen = new SdlScreen;
+ if (!screen->init(windX,windY,windWidth,windHeight,false))
+ {
+ delete screen;
+ screen = 0;
+ return;
+ }
+
+ allocOutput(outWidth,outHeight);
+
+ setStarSize(starSize);
+
+ interface=new Interface;
+}
+
+Core::~Core()
+{
+ delete interface;
+
+ screen->end();
+ delete screen;
+}
+
+bool Core::go()
+{
+ time_t timer = time(NULL);
+
+ printf("%u\n", static_cast<SdlScreen *>(screen)->winID());
+ fflush(stdout);
+
+ int frames = 0;
+ while (1)
+ {
+ fade();
+
+ if (!calculate())
+ break;
+
+ if (!interface->go()) break;
+
+ screen->show();
+ frames++;
+ }
+
+ timer = time(0) - timer;
+/* if (timer > 10)
+ printf("Frames per second: %f\n", double(frames) / timer);*/
+ return true;
+}
+
+bool start()
+{
+return true;
+}
+
+
+void error(const char *, bool)
+{
+
+/* fprintf(stderr, "synaescope: Error %s\n",str);
+ if (syscall)
+ fprintf(stderr,"(reason for error: %s)\n",strerror(errno));*/
+ exit(1);
+}
+void warning(const char *, bool)
+{
+/* fprintf(stderr, "synaescope: Possible error %s\n",str);
+ if (syscall)
+ fprintf(stderr,"(reason for error: %s)\n",strerror(errno));*/
+}
+
+#include <kinstance.h>
+int main()
+{
+ fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL) & ~O_NONBLOCK);
+ KInstance in("noatunsynaescope");
+ core=new Core;
+ core->go();
+ delete core;
+ exit(0);
+}
+
+
diff --git a/noatun-plugins/tippercanoe/polygon.h b/noatun-plugins/tippercanoe/polygon.h
new file mode 100644
index 0000000..f711c03
--- /dev/null
+++ b/noatun-plugins/tippercanoe/polygon.h
@@ -0,0 +1,98 @@
+#include <string.h>
+
+template<class Pixel>
+struct Bitmap {
+ int width, height, extra;
+ Pixel *data;
+
+ Bitmap(int e=0) : extra(e), data(0) { };
+ ~Bitmap() { delete[] data; };
+
+ void size(int w,int h) {
+ delete[] data;
+ width = w;
+ height = h;
+ data = new Pixel[w*h+extra];
+ clear();
+ }
+
+ void clear() {
+ memset(data,0,sizeof(Pixel)*(width*height+extra));
+ }
+};
+
+template<class Pixel, class Combiner, int superSampleShift>
+struct PolygonEngine : public Bitmap<Pixel> {
+ PolygonEngine() : Bitmap<Pixel>(1) { }
+
+#define super (1<<superSampleShift)
+ void apply(Pixel *dest) {
+ Pixel sum=0;
+ int count = this->width*this->height;
+ Pixel *src = this->data;
+ while(count--) {
+ sum += *(src++);
+ if (sum)
+ *dest = Combiner::combine(sum,*dest);
+ dest++;
+ }
+ }
+
+ void add(Pixel color,int x,int y) {
+ if (y < 0) return;
+ if (y >= this->height) return;
+ if (x < 0) x = 0;
+ if (x > this->width) x = this->width;
+ this->data[x+y*this->width] += color;
+ }
+
+ /* Color is char[layers] */
+
+ // zwoosh, yknow, it goes... zwoosh an all these bars and lines and
+ // crap intersect.
+ Pixel colorTable[2][super+1];
+ void pen(Pixel color) {
+ for(int i=0;i<super+1;i++) {
+ colorTable[0][i] = color*i;
+ colorTable[1][i] = -(color*i);
+ }
+ }
+
+ void line(int x1,int y1,int x2,int y2) {
+ Pixel *colors;
+ if (y2 < y1) {
+ int temp;
+ temp = x2; x2 = x1; x1 = temp;
+ temp = y2; y2 = y1; y1 = temp;
+ colors = colorTable[1];
+ } else {
+ if (y1 == y2) return;
+
+ colors= colorTable[0];
+ }
+
+ int slope = (x1-x2 << 16)/(y1-y2);
+ int x = x1<<16, y = y1;
+ while(y < y2) {
+ add(colors[super-((x>>16)&(super-1))],
+ x>>(16+superSampleShift),y>>superSampleShift);
+ add(colors[(x>>16)&(super-1)],
+ 1+(x>>(16+superSampleShift)),y>>superSampleShift);
+ x += slope;
+ y++;
+ }
+ }
+
+ void icon(double icon[][4],Pixel color,double x,double y,
+ double scaleX, double scaleY) {
+ pen(color);
+ x *= super;
+ y *= super;
+ scaleX *= super;
+ scaleY *= super;
+ for(int i=0;icon[i][1] != icon[i][3];i++)
+ line(int(icon[i][0]*scaleX+x),int(icon[i][1]*scaleY+y),
+ int(icon[i][2]*scaleX+x),int(icon[i][3]*scaleY+y));
+ }
+#undef super
+};
diff --git a/noatun-plugins/tippercanoe/sdlwrap.cpp b/noatun-plugins/tippercanoe/sdlwrap.cpp
new file mode 100644
index 0000000..7449aec
--- /dev/null
+++ b/noatun-plugins/tippercanoe/sdlwrap.cpp
@@ -0,0 +1,197 @@
+/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia)
+ Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au>
+ 2001 Charles Samuels <charles@kde.org>
+ Copyright (C) 2001 Neil Stevens <multivac@fcmail.com>
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <string.h>
+#include "syna.h"
+#include <iostream>
+#include <SDL_syswm.h>
+#include "SDL.h"
+
+static SDL_Surface *surface;
+
+SDL_Surface *CreateScreen(Uint16 w, Uint16 h, Uint8 bpp, Uint32 flags)
+{
+ SDL_Surface *screen;
+
+ /* Set the video mode */
+ screen = SDL_SetVideoMode(w, h, bpp, flags);
+
+ return screen;
+}
+
+void SdlScreen::setPalette(unsigned char *palette)
+{
+ SDL_Color sdlPalette[256];
+
+ for(int i=0;i<256;i++) {
+ sdlPalette[i].r = palette[i*3+0];
+ sdlPalette[i].g = palette[i*3+1];
+ sdlPalette[i].b = palette[i*3+2];
+ }
+
+ SDL_SetColors(surface, sdlPalette, 0, 256);
+}
+
+bool SdlScreen::init(int,int,int width,int height,bool fullscreen)
+{
+ Uint32 videoflags;
+
+ /* Initialize SDL */
+ if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
+ //char str[1000];
+ //printf(str, "Could not initialize SDL library: %s\n",SDL_GetError());
+ return false;
+ }
+
+ SDL_WM_SetCaption("Synaescope","synaescope");
+
+ /* See if we try to get a hardware colormap */
+ videoflags = SDL_SWSURFACE | (fullscreen?SDL_FULLSCREEN:0);
+
+ surface = CreateScreen(width, height, 8, videoflags);
+ if (!surface)
+ {
+ error("requesting screen dimensions");
+ }
+
+ core->outWidth = width;
+ core->outHeight = height;
+
+ SDL_EnableUNICODE(1);
+ SDL_ShowCursor(0);
+
+ return true;
+}
+
+void SdlScreen::end(void)
+{
+ SDL_Quit();
+}
+
+bool SdlScreen::inputUpdate(int &mouseX,int &mouseY,int &mouseButtons,char &keyHit)
+{
+ SDL_Event event;
+
+ keyHit = 0;
+
+ while ( SDL_PollEvent(&event) > 0 ) {
+ switch (event.type) {
+ case SDL_MOUSEBUTTONUP:
+ case SDL_MOUSEBUTTONDOWN:
+ if ( event.button.state == SDL_PRESSED )
+ mouseButtons |= 1 << event.button.button;
+ else
+ mouseButtons &= ~( 1 << event.button.button );
+ mouseX = event.button.x;
+ mouseY = event.button.y;
+ break;
+ case SDL_MOUSEMOTION :
+ mouseX = event.motion.x;
+ mouseY = event.motion.y;
+ break;
+ case SDL_KEYDOWN:
+ /* Ignore key releases */
+ if ( event.key.state == SDL_RELEASED ) {
+ break;
+ }
+
+ if(event.key.keysym.sym == SDLK_SPACE)
+ {
+ SDL_WM_ToggleFullScreen(surface);
+ mouseButtons = 0;
+ }
+
+ if (event.key.keysym.unicode > 255)
+ break;
+
+ keyHit = event.key.keysym.unicode;
+ return true;
+ case SDL_QUIT:
+ //keyHit = 'q';
+ //return false;
+ break;
+ default:
+ break;
+ }
+ }
+ return true;
+}
+
+int SdlScreen::sizeUpdate(void) { return 0; }
+
+void SdlScreen::show(void) {
+ SDL_LockSurface(surface);
+
+ register unsigned long *ptr2 = (unsigned long*)core->output();
+ unsigned long *ptr1 = (unsigned long*)( surface->pixels );
+ int i = core->outWidth*core->outHeight/4;
+
+ do {
+ // Asger Alstrup Nielsen's (alstrup@diku.dk)
+ // optimized 32 bit screen loop
+ register unsigned int const r1 = *(ptr2++);
+ register unsigned int const r2 = *(ptr2++);
+
+ //if (r1 || r2) {
+#ifdef LITTLEENDIAN
+ register unsigned int const v =
+ ((r1 & 0x000000f0ul) >> 4)
+ | ((r1 & 0x0000f000ul) >> 8)
+ | ((r1 & 0x00f00000ul) >> 12)
+ | ((r1 & 0xf0000000ul) >> 16);
+ *(ptr1++) = v |
+ ( ((r2 & 0x000000f0ul) << 12)
+ | ((r2 & 0x0000f000ul) << 8)
+ | ((r2 & 0x00f00000ul) << 4)
+ | ((r2 & 0xf0000000ul)));
+#else
+ register unsigned int const v =
+ ((r2 & 0x000000f0ul) >> 4)
+ | ((r2 & 0x0000f000ul) >> 8)
+ | ((r2 & 0x00f00000ul) >> 12)
+ | ((r2 & 0xf0000000ul) >> 16);
+ *(ptr1++) = v |
+ ( ((r1 & 0x000000f0ul) << 12)
+ | ((r1 & 0x0000f000ul) << 8)
+ | ((r1 & 0x00f00000ul) << 4)
+ | ((r1 & 0xf0000000ul)));
+#endif
+ //} else ptr1++;
+ } while (--i);
+
+ SDL_UnlockSurface(surface);
+ SDL_UpdateRect(surface, 0, 0, 0, 0);
+}
+
+int SdlScreen::winID(void)
+{
+ SDL_SysWMinfo info;
+ info.version.major = SDL_MAJOR_VERSION;
+ info.version.minor = SDL_MINOR_VERSION;
+ info.version.patch = SDL_PATCHLEVEL;
+ info.subsystem = SDL_SYSWM_X11;
+
+ info.info.x11.wmwindow = 0xdeadbeef;
+ SDL_GetWMInfo(&info);
+ return info.info.x11.wmwindow;
+}
diff --git a/noatun-plugins/tippercanoe/symbol.h b/noatun-plugins/tippercanoe/symbol.h
new file mode 100644
index 0000000..53137c0
--- /dev/null
+++ b/noatun-plugins/tippercanoe/symbol.h
@@ -0,0 +1,1021 @@
+#define SYMBOLSWIDTH 586
+#define SYMBOLSHEIGHT 50
+unsigned char Symbols[586*50] = {
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,241,72,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,13,30,37,31,24,5,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,132,254,237,72,0,0,0,0,0,0,0,0,0,0,0,1,7,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,46,0,0,0,0,0,0,0,0,0,0,0,0,0,10,87,
+ 176,225,244,246,244,238,206,135,39,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,254,
+ 254,236,73,0,0,0,0,0,0,0,0,0,0,3,154,138,58,9,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,36,211,80,0,0,0,0,0,0,0,0,0,0,0,2,77,204,252,254,254,254,
+ 254,254,254,254,254,239,145,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,254,255,245,
+ 215,72,0,0,0,0,0,0,0,0,0,0,115,254,249,213,138,58,8,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,36,212,253,80,0,0,0,0,0,0,0,0,0,0,7,136,247,254,254,254,254,
+ 254,254,254,254,254,254,254,254,208,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,254,
+ 255,225,66,210,72,0,0,0,0,0,0,0,0,0,40,244,254,254,254,249,214,137,57,8,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,37,212,254,254,80,0,0,0,0,0,0,0,0,0,4,150,253,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,227,50,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,132,254,255,225,10,55,217,71,0,0,0,0,0,0,0,0,4,194,254,255,255,
+ 255,255,254,250,214,137,57,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,211,254,254,254,80,0,0,
+ 0,0,0,0,0,0,0,100,250,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,203,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,254,255,225,10,1,196,187,1,
+ 0,0,0,0,0,0,0,0,115,254,255,255,255,255,255,254,254,254,249,212,137,57,
+ 10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,36,211,254,254,254,254,80,0,0,0,0,0,0,0,0,29,230,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,255,255,254,130,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,41,244,255,255,
+ 255,255,255,255,255,255,254,254,254,249,212,137,58,8,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,212,254,254,254,
+ 254,254,80,0,0,0,0,0,0,0,0,134,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,255,255,255,232,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,254,255,
+ 225,10,1,196,190,1,0,0,0,0,0,0,0,0,4,196,254,255,255,255,255,255,255,255,
+ 255,255,255,255,254,254,249,212,137,57,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,212,254,254,254,254,254,254,80,0,0,
+ 0,0,0,0,0,16,225,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,255,255,255,254,112,0,0,0,0,0,0,0,3,12,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,
+ 0,0,0,0,0,0,7,9,0,0,0,0,0,0,0,0,0,0,0,0,111,155,155,111,0,0,0,16,148,155,
+ 155,58,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,132,254,
+ 255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,115,253,254,255,255,255,255,255,
+ 255,255,255,255,255,255,255,254,254,254,250,194,15,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,7,147,99,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,38,179,
+ 38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,211,254,254,254,254,254,
+ 254,254,80,0,0,0,0,0,0,0,62,251,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,255,255,255,254,182,1,0,0,0,0,0,0,18,171,19,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,1,162,44,0,0,0,0,0,37,159,11,0,0,0,0,0,0,0,0,0,0,1,182,254,
+ 254,182,1,0,0,27,243,254,254,96,0,0,0,0,0,0,0,0,0,0,0,23,136,1,0,0,0,0,
+ 0,68,92,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,
+ 40,244,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,
+ 232,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,151,253,245,99,1,0,0,
+ 6,50,106,155,166,174,166,162,115,52,11,0,0,0,38,213,254,213,39,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,210,254,254,254,254,254,254,254,254,80,
+ 0,0,0,0,0,0,0,108,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,255,255,255,254,223,9,0,0,0,0,0,0,18,239,185,19,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,197,219,45,0,0,0,0,38,246,166,11,0,0,0,0,0,0,0,0,0,1,182,254,254,
+ 182,1,0,0,27,243,254,254,96,0,0,0,0,0,0,0,0,0,0,23,192,196,1,0,0,0,0,68,
+ 233,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,
+ 4,196,254,255,255,255,255,255,255,255,255,255,255,255,255,255,254,232,65,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,180,252,255,254,244,95,10,97,
+ 197,248,254,254,255,255,255,254,254,248,210,118,20,36,212,254,255,254,213,
+ 39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,211,254,254,254,254,254,254,254,
+ 254,254,80,0,0,0,0,0,0,0,117,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,255,255,255,255,228,11,0,0,0,0,0,0,18,240,254,185,
+ 19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,
+ 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+ 1,1,0,0,0,0,0,0,0,1,197,254,218,44,0,0,0,38,247,253,165,11,0,0,0,0,0,0,
+ 0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,0,0,0,0,0,0,0,0,23,192,
+ 254,196,1,0,0,0,67,234,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,
+ 1,0,0,0,0,0,0,0,0,0,0,116,254,255,255,255,255,255,255,255,255,255,255,255,
+ 255,254,233,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,186,254,255,
+ 254,254,225,74,34,220,254,254,255,255,255,255,255,255,255,254,254,248,95,
+ 44,205,254,254,255,254,213,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,211,254,
+ 254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,122,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,255,255,255,255,228,
+ 11,0,0,0,0,0,0,18,240,254,254,186,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 17,187,197,197,197,197,197,195,46,0,0,0,0,0,0,0,142,197,197,197,197,197,
+ 197,107,0,0,0,0,0,0,0,81,196,197,197,197,197,197,197,197,197,197,197,197,
+ 197,197,197,197,197,197,197,197,197,194,37,0,0,0,0,0,0,1,197,254,254,219,
+ 44,0,0,38,247,254,253,165,11,0,0,0,0,0,0,0,1,182,254,254,182,1,0,0,27,243,
+ 254,254,96,0,0,0,0,0,0,0,0,22,192,254,254,196,1,0,0,66,235,254,254,111,
+ 0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,39,246,
+ 254,255,255,255,255,255,255,255,255,255,255,254,234,64,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,17,187,254,255,254,254,204,34,0,0,47,222,254,254,
+ 255,255,255,255,255,255,254,248,113,2,0,18,175,254,254,255,254,214,36,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,36,211,254,254,254,254,254,254,254,254,254,254,
+ 254,80,0,0,0,0,0,0,0,114,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,255,255,255,254,227,11,0,0,0,0,0,0,18,240,255,254,254,
+ 185,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,
+ 0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,251,47,0,0,0,0,0,0,1,197,254,254,254,220,43,0,38,247,254,254,253,166,
+ 11,0,0,0,0,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,0,0,0,0,0,0,
+ 22,193,254,254,254,196,1,0,67,234,254,255,254,111,0,0,0,0,0,0,0,132,254,
+ 255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,3,196,254,255,255,255,255,255,
+ 255,255,255,255,255,236,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,
+ 211,254,255,254,204,30,0,0,0,0,47,221,254,255,255,255,255,255,254,243,112,
+ 2,0,0,0,14,175,253,255,254,231,54,0,0,0,0,0,0,1,5,5,5,5,5,5,5,5,5,5,5,5,
+ 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,5,5,5,1,
+ 0,0,0,0,0,0,0,0,0,0,0,5,5,5,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,210,254,255,
+ 254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,74,253,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,255,255,255,254,
+ 194,2,0,0,0,0,0,0,18,240,255,255,255,254,184,19,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,23,242,255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,
+ 254,254,138,0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,
+ 254,254,219,44,38,247,254,254,254,253,166,11,0,0,0,0,0,1,182,254,254,182,
+ 1,0,0,27,243,254,254,96,0,0,0,0,0,0,23,192,254,254,254,254,196,1,68,233,
+ 254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,
+ 0,0,0,0,0,0,0,0,116,254,255,255,255,255,255,255,255,255,255,255,231,53,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,210,254,225,33,0,0,0,0,0,
+ 0,48,221,254,254,255,255,254,237,78,1,0,0,0,0,0,15,198,254,231,61,0,0,0,
+ 0,0,0,0,73,213,214,214,214,214,214,214,214,213,214,214,214,214,214,214,
+ 214,214,214,214,214,214,214,214,213,214,214,214,214,214,214,214,214,214,
+ 156,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,8,145,213,214,213,133,5,0,0,0,0,0,0,0,0,0,88,211,213,
+ 214,181,24,0,0,0,0,3,11,11,11,11,11,11,11,40,210,254,255,255,254,254,254,
+ 254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,26,235,254,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,255,255,255,254,131,0,0,0,0,
+ 0,0,0,18,240,255,255,255,254,254,184,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,
+ 242,255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,
+ 138,0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,
+ 254,218,83,247,254,254,254,254,253,165,11,0,0,0,0,1,182,254,254,182,1,0,
+ 0,27,243,254,254,96,0,0,0,0,0,23,191,254,254,254,254,254,197,69,233,254,
+ 254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,
+ 0,0,0,0,0,0,0,0,40,245,255,255,255,255,255,255,255,255,255,255,254,226,
+ 52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,205,79,0,0,0,0,0,0,0,
+ 0,47,222,254,254,254,238,76,0,0,0,0,0,0,0,0,45,212,62,0,0,0,0,0,0,0,0,87,
+ 253,185,168,168,168,168,168,171,243,249,175,168,204,254,255,254,220,168,
+ 170,239,243,171,168,220,254,195,168,168,168,168,168,169,236,185,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,11,11,11,5,
+ 0,0,0,0,0,0,0,0,0,0,7,11,11,11,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,11,11,11,11,4,0,0,0,0,0,0,0,0,0,0,8,11,11,11,8,0,0,0,0,0,
+ 0,0,0,0,0,4,11,11,11,11,1,0,0,0,0,0,0,0,0,0,1,11,11,11,11,4,0,0,0,0,0,0,
+ 0,0,0,0,8,11,11,11,7,0,0,0,0,0,0,0,0,0,0,5,11,11,11,10,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,151,252,254,254,254,251,136,2,0,
+ 0,0,0,0,0,0,88,242,254,224,246,254,194,22,0,0,0,64,228,229,229,229,229,
+ 229,229,239,254,254,254,254,254,254,254,254,254,254,254,254,254,254,80,
+ 0,0,0,0,0,0,0,1,163,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,255,255,255,244,45,0,0,0,0,0,0,0,18,240,255,255,255,255,254,
+ 254,185,18,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,
+ 0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,237,253,254,254,254,
+ 254,254,253,165,11,0,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,0,
+ 0,0,22,191,254,254,254,254,254,254,233,235,254,254,254,255,255,254,111,
+ 0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,4,196,
+ 255,255,255,255,255,255,255,255,255,255,255,254,225,52,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,4,0,0,0,0,0,0,0,0,0,48,222,254,239,77,0,
+ 0,0,0,0,0,0,0,0,1,24,0,0,0,0,0,0,0,0,0,87,251,50,0,0,0,0,0,10,223,251,67,
+ 0,53,246,255,253,99,0,31,241,222,9,0,153,253,80,0,0,0,0,0,2,200,185,1,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,224,229,
+ 229,229,179,18,0,0,0,0,0,0,0,0,37,203,229,229,229,214,55,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,98,226,229,229,229,170,14,0,0,0,0,0,0,
+ 0,0,45,208,229,229,229,209,47,0,0,0,0,0,0,0,0,13,167,229,229,229,227,101,
+ 1,0,0,0,0,0,0,0,1,109,227,229,229,229,161,11,0,0,0,0,0,0,0,0,52,213,229,
+ 229,229,205,39,0,0,0,0,0,0,0,0,16,177,229,229,229,225,90,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,251,254,255,255,255,255,238,15,
+ 0,0,0,0,0,0,11,225,254,207,34,104,247,253,80,0,0,0,71,253,255,255,255,255,
+ 254,254,254,255,255,255,255,254,254,254,254,254,254,254,254,254,254,80,
+ 0,0,0,0,0,0,0,0,49,243,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,255,255,254,161,1,0,0,0,0,0,0,0,18,240,255,255,255,255,254,
+ 254,254,185,18,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,
+ 0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,253,165,11,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,
+ 0,0,22,192,254,254,254,254,254,254,254,254,254,254,254,254,255,255,254,
+ 111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,
+ 0,116,253,254,255,255,255,254,235,219,254,255,255,255,254,226,53,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,21,21,21,21,21,21,21,21,21,
+ 21,21,21,21,21,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,114,2,0,0,0,0,0,
+ 0,0,0,0,47,207,76,0,0,0,0,0,0,0,0,0,0,80,130,0,0,0,0,0,0,0,0,0,87,251,50,
+ 0,0,0,0,0,9,223,254,161,0,5,193,254,235,28,0,116,254,222,9,0,153,254,79,
+ 0,0,0,0,0,1,200,185,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,88,242,254,254,255,255,254,185,18,0,0,0,0,0,0,37,214,254,254,
+ 255,255,254,228,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,98,246,254,
+ 254,255,255,254,175,14,0,0,0,0,0,0,44,220,254,254,255,255,254,222,47,0,
+ 0,0,0,0,0,13,172,254,254,255,255,254,246,101,1,0,0,0,0,0,1,109,248,254,
+ 254,255,255,253,165,11,0,0,0,0,0,0,53,226,254,254,255,255,254,216,39,0,
+ 0,0,0,0,0,17,182,254,254,255,255,254,243,91,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,69,253,254,255,255,255,255,239,16,0,0,0,0,0,0,12,
+ 230,212,32,0,1,113,253,81,0,0,0,71,253,254,255,255,255,254,255,255,255,
+ 255,254,255,254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,0,
+ 2,141,253,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 229,36,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255,254,254,184,19,0,
+ 0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,
+ 254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,251,47,0,0,0,0,
+ 0,0,1,197,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,253,
+ 165,11,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,0,22,192,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,255,255,254,111,0,0,0,0,0,0,0,132,
+ 254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,41,244,254,255,255,254,
+ 233,66,37,212,254,255,255,255,254,226,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,108,240,241,241,241,241,241,241,241,241,241,241,241,241,
+ 241,224,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,199,249,115,2,0,0,0,0,0,0,0,
+ 29,99,119,113,55,4,0,0,0,0,0,0,0,80,240,230,22,0,0,0,0,0,0,0,0,87,251,50,
+ 0,0,0,0,0,9,223,255,228,18,0,97,253,165,1,4,196,254,222,9,0,153,254,79,
+ 0,0,0,0,0,1,200,185,1,0,0,0,0,0,0,0,0,0,0,0,0,0,8,53,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,6,176,254,255,255,255,255,254,242,110,18,0,0,0,0,0,106,250,255,
+ 255,255,255,254,252,154,44,0,0,0,0,10,51,0,0,0,0,0,0,0,3,56,2,0,0,0,1,64,
+ 193,254,255,255,255,255,254,237,57,0,0,0,0,0,39,143,251,255,255,255,255,
+ 254,251,123,0,0,0,0,0,0,54,236,254,255,255,255,254,254,196,66,1,0,0,0,2,
+ 69,202,254,255,255,255,255,254,234,98,11,0,0,0,0,43,151,252,255,255,255,
+ 255,254,251,137,35,0,0,0,0,17,108,241,254,255,255,255,254,254,187,61,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,253,255,255,255,255,255,
+ 239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,253,254,255,255,
+ 255,254,255,255,254,255,254,255,254,254,254,254,254,254,254,254,254,254,
+ 80,0,0,0,0,0,0,0,0,0,13,192,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,244,84,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255,
+ 255,254,254,184,19,0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,
+ 0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,253,165,11,1,182,254,254,182,1,0,0,27,243,254,254,96,
+ 0,23,191,254,254,254,254,254,254,254,254,254,254,254,254,254,254,255,255,
+ 254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,4,196,254,255,254,233,66,0,0,37,211,254,255,255,255,254,225,34,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,219,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,254,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53,
+ 248,254,248,115,2,0,0,0,0,3,112,186,152,158,153,173,163,23,0,0,0,0,0,80,
+ 240,254,253,85,0,0,0,0,0,0,0,0,87,251,50,0,5,36,37,37,45,228,255,252,79,
+ 0,20,226,73,0,40,244,254,222,9,0,153,253,105,37,15,0,1,32,38,208,185,1,
+ 0,0,0,0,0,0,0,0,0,0,0,0,8,150,240,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,186,
+ 253,253,253,253,242,144,228,183,19,0,0,0,0,3,126,249,253,253,253,251,170,
+ 192,227,55,0,0,10,161,237,76,0,0,0,0,0,3,123,243,112,2,0,1,98,241,163,201,
+ 253,253,253,253,238,78,0,0,0,0,0,45,219,201,162,250,253,253,253,250,140,
+ 6,0,0,0,0,0,0,0,75,237,253,253,253,253,203,161,242,102,1,0,2,109,243,157,
+ 207,253,253,253,253,234,143,236,164,11,0,0,52,225,194,169,251,253,253,253,
+ 250,158,206,214,40,0,0,17,181,229,143,241,253,253,253,253,196,167,240,91,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,253,255,255,255,255,255,
+ 239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,253,254,255,255,
+ 255,254,254,255,254,255,254,254,254,254,254,254,254,254,254,254,254,254,
+ 80,0,0,0,0,0,0,0,0,0,0,24,188,253,254,254,254,254,254,254,254,254,254,254,
+ 254,254,237,97,1,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255,255,254,
+ 254,254,184,18,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,0,0,
+ 0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,253,164,12,182,254,254,182,1,0,0,27,243,254,254,96,
+ 22,191,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,255,
+ 255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,116,254,254,233,66,0,0,0,0,37,212,254,255,254,253,161,9,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,253,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,234,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,
+ 254,254,254,248,115,2,0,0,0,113,161,193,249,253,252,224,149,171,14,0,0,
+ 0,80,239,254,255,254,154,0,0,0,0,0,0,0,0,87,251,50,0,38,240,247,247,247,
+ 253,255,254,165,1,0,115,12,0,121,254,255,222,9,0,153,254,249,247,102,0,
+ 8,214,247,253,185,1,0,0,0,0,0,0,0,0,0,0,0,2,145,252,254,241,58,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,17,67,68,68,68,93,228,254,254,171,2,0,0,0,0,3,59,68,
+ 68,68,73,190,254,254,226,27,3,156,253,254,237,48,0,0,0,0,115,250,254,247,
+ 86,0,87,245,254,251,135,67,68,68,68,46,0,0,0,0,0,34,219,254,254,192,67,
+ 68,68,68,62,6,0,0,0,0,0,0,0,0,0,45,68,68,68,68,149,251,254,245,74,0,99,
+ 247,254,250,126,67,68,68,68,105,237,254,253,146,0,41,225,254,254,182,66,
+ 68,68,68,78,205,254,254,211,15,7,179,254,254,229,78,68,68,68,68,158,252,
+ 254,243,63,0,0,0,0,0,0,0,0,0,0,1,3,0,0,0,0,0,0,0,0,0,0,69,253,254,254,254,
+ 254,254,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,253,254,
+ 255,255,255,254,255,255,255,255,255,255,254,254,254,254,254,254,254,254,
+ 254,254,80,0,0,0,0,0,0,0,0,0,0,0,11,133,239,254,254,254,254,254,254,254,
+ 254,254,252,200,55,0,0,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255,
+ 255,255,255,254,254,185,17,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,
+ 60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,254,253,165,193,254,254,182,1,0,0,27,243,254,
+ 254,118,191,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,41,244,234,65,0,0,0,0,0,0,36,213,254,253,161,10,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,219,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,254,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 159,254,255,255,254,248,115,2,0,31,186,194,254,255,255,254,254,238,162,
+ 105,0,0,80,239,254,255,255,255,201,3,0,0,0,0,0,0,0,87,251,50,0,16,102,116,
+ 246,254,255,255,255,236,26,0,10,0,7,208,254,255,222,9,0,153,255,255,254,
+ 106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,5,213,254,255,254,88,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,91,254,255,255,211,4,0,0,0,0,0,0,0,
+ 0,0,23,241,254,255,250,46,9,223,254,255,253,75,0,0,0,1,184,254,255,254,
+ 122,0,152,254,255,255,154,0,0,0,0,0,0,0,0,0,0,73,253,254,255,224,10,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,197,254,255,254,108,0,166,254,255,254,
+ 140,0,0,0,0,118,254,255,255,187,1,87,254,255,255,214,6,0,0,0,43,249,254,
+ 255,243,26,20,240,254,255,252,49,0,0,0,3,208,254,255,254,95,0,0,0,0,0,0,
+ 0,0,0,68,189,198,107,5,0,0,0,0,0,0,0,0,69,252,144,104,105,104,183,239,16,
+ 0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,253,254,255,255,255,254,
+ 255,255,255,255,255,255,254,254,254,254,254,254,254,254,254,254,80,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,37,147,225,249,254,254,253,252,242,193,87,8,0,0,0,
+ 0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255,255,255,255,255,254,254,
+ 184,18,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,
+ 254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,251,47,0,0,0,0,
+ 0,0,1,197,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,252,254,254,182,1,0,0,27,243,254,254,242,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,255,255,254,111,0,0,
+ 0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,4,176,
+ 65,0,0,0,0,0,0,0,0,36,211,160,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,109,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 255,255,233,29,0,0,0,0,0,0,0,0,0,0,0,0,0,170,255,255,255,255,255,249,115,
+ 2,103,151,250,255,255,255,255,255,254,169,172,3,80,240,254,255,255,255,
+ 255,211,5,0,0,0,0,0,0,0,87,251,50,0,0,0,19,240,255,255,255,255,253,94,0,
+ 0,0,53,248,255,255,222,9,0,153,255,255,254,106,0,8,220,255,255,185,1,0,
+ 0,0,0,0,0,0,0,0,0,0,5,213,255,255,254,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,91,254,255,255,211,4,0,0,0,0,0,0,0,0,0,23,242,255,255,250,46,9,
+ 223,255,255,253,75,0,0,0,1,184,255,255,254,122,0,153,255,255,255,154,0,
+ 0,0,0,0,0,0,0,0,0,74,253,255,255,224,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,1,197,255,255,254,108,0,166,255,255,254,140,0,0,0,0,118,254,255,255,
+ 187,1,87,254,255,255,214,6,0,0,0,43,249,255,255,243,26,20,240,255,255,252,
+ 49,0,0,0,3,209,255,255,254,95,0,0,0,0,0,0,0,0,34,233,254,254,251,82,0,0,
+ 0,0,0,0,0,0,69,252,67,0,0,0,133,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,
+ 252,81,0,0,0,71,253,254,255,255,254,254,254,255,254,255,254,254,254,254,
+ 254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,52,
+ 83,84,84,73,32,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,
+ 255,255,255,255,255,254,254,254,156,2,0,0,0,0,0,0,23,242,255,255,255,255,
+ 255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,
+ 104,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,182,1,0,0,27,
+ 243,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,
+ 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,26,10,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,218,254,255,255,255,255,255,255,255,
+ 255,255,255,255,255,255,255,255,255,255,254,135,0,0,0,0,0,0,0,0,0,0,0,0,
+ 1,178,255,255,255,255,255,255,249,112,123,158,254,255,255,255,255,255,254,
+ 187,177,81,240,254,255,255,255,255,255,211,5,0,0,0,0,0,0,0,87,251,50,0,
+ 0,0,19,240,255,255,255,255,254,161,0,0,0,116,254,255,255,222,9,0,153,255,
+ 255,254,106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,5,213,255,255,254,
+ 88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,91,254,255,255,211,4,0,0,0,0,0,
+ 0,0,0,0,23,242,255,255,250,46,9,223,255,255,253,75,0,0,0,1,184,255,255,
+ 254,122,0,153,255,255,255,154,0,0,0,0,0,0,0,0,0,0,74,253,255,255,224,10,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,197,255,255,254,108,0,166,255,255,
+ 254,140,0,0,0,0,118,254,255,255,187,1,87,254,255,255,214,6,0,0,0,43,249,
+ 255,255,243,26,20,240,255,255,252,49,0,0,0,3,209,255,255,254,95,0,0,0,0,
+ 0,0,0,0,72,253,255,254,254,136,0,0,0,0,0,0,0,0,69,252,121,73,73,73,168,
+ 239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,253,255,255,255,
+ 255,254,255,255,255,255,255,255,254,254,254,254,254,254,254,254,254,254,
+ 80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,18,240,255,255,255,255,255,255,255,255,255,255,255,254,218,43,0,0,
+ 0,0,0,0,0,23,242,255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,
+ 254,254,254,138,0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,182,1,0,0,27,243,254,254,252,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,255,255,254,111,0,0,0,0,0,0,0,132,
+ 254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,251,253,253,253,
+ 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,230,29,
+ 0,0,0,0,0,0,0,0,0,0,0,0,170,255,255,255,255,255,254,248,112,120,153,253,
+ 255,255,255,255,255,254,181,176,81,240,254,255,255,255,255,255,211,5,0,
+ 0,0,0,0,0,0,87,251,50,0,0,0,19,240,255,255,255,255,254,113,0,0,0,69,251,
+ 255,255,222,9,0,153,255,255,254,106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,
+ 0,0,0,0,5,211,254,255,254,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,89,254,
+ 255,255,211,4,0,0,0,0,0,0,1,1,1,23,240,255,255,250,45,9,221,254,255,253,
+ 75,1,1,1,2,181,254,255,254,122,0,150,254,255,254,154,1,1,1,1,0,0,0,0,0,
+ 0,71,253,255,255,224,10,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,194,254,255,
+ 254,108,0,163,254,255,254,140,1,1,1,1,116,254,255,254,187,1,84,253,255,
+ 255,214,7,1,1,1,42,248,255,255,242,26,19,238,255,255,252,49,0,0,0,3,206,
+ 254,255,254,94,0,0,0,0,0,0,0,0,47,244,254,254,253,104,0,0,0,0,0,0,0,0,69,
+ 253,252,252,252,252,253,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,
+ 0,0,71,253,254,255,255,255,254,255,255,255,255,255,255,254,254,254,254,
+ 254,254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,3,81,94,94,94,94,94,
+ 94,94,94,94,93,19,0,0,0,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255,
+ 255,255,255,255,254,219,43,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,
+ 60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,205,208,254,254,182,1,0,0,27,243,254,
+ 254,145,224,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,11,134,158,158,158,158,158,158,158,158,158,158,158,158,
+ 158,158,158,158,158,158,158,158,158,66,0,0,0,0,0,0,0,0,0,0,0,0,167,254,
+ 255,255,255,254,248,115,2,62,170,229,254,254,255,255,255,251,159,145,1,
+ 80,240,254,255,255,255,255,208,4,0,0,0,0,0,0,0,87,251,50,0,14,91,106,245,
+ 254,255,255,255,243,39,0,2,0,14,222,255,255,222,9,0,153,255,255,254,106,
+ 0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,0,90,243,254,214,32,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,54,184,190,190,190,155,195,254,250,124,1,0,0,0,0,17,
+ 161,190,190,190,176,157,250,254,187,14,1,101,246,254,210,142,190,190,190,
+ 188,140,235,254,229,52,0,46,222,254,240,136,187,190,190,190,127,4,0,0,0,
+ 0,14,174,254,252,162,169,190,190,190,167,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 75,239,254,224,43,0,54,227,254,236,135,187,190,190,190,148,208,254,247,
+ 100,0,17,184,254,251,156,173,190,190,190,169,168,253,253,167,7,2,123,250,
+ 254,190,15,0,0,0,0,85,242,254,218,35,0,0,0,0,0,0,0,0,1,115,233,237,163,
+ 14,0,0,0,0,0,0,0,0,69,252,114,63,63,63,164,239,16,0,0,0,0,0,0,12,230,146,
+ 0,0,0,55,252,81,0,0,0,71,253,254,255,255,255,254,255,255,254,255,254,255,
+ 254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,8,217,
+ 250,250,250,250,250,250,250,250,250,248,51,0,0,0,0,0,0,0,0,0,0,0,0,18,240,
+ 255,255,255,255,255,255,255,255,255,254,218,43,0,0,0,0,0,0,0,0,0,23,242,
+ 255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,
+ 0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,204,31,182,254,254,
+ 182,1,0,0,27,243,254,254,96,49,223,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,
+ 1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,245,252,250,250,250,250,250,250,
+ 250,250,250,250,250,250,250,250,250,250,250,250,250,254,127,0,0,0,0,0,0,
+ 0,0,0,0,0,0,121,254,255,255,254,248,115,2,0,5,170,149,242,254,254,254,252,
+ 181,184,44,0,0,80,239,254,254,255,254,166,0,0,0,0,0,0,0,0,87,251,50,0,38,
+ 243,250,250,250,254,254,254,187,4,0,82,6,0,144,254,254,222,9,0,153,255,
+ 255,254,106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,0,0,90,204,37,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,55,227,254,254,255,255,253,168,191,126,3,0,0,
+ 0,0,17,184,254,254,255,255,254,207,157,184,19,0,0,1,101,203,155,250,254,
+ 254,255,254,238,141,211,57,0,0,0,47,207,142,233,254,254,255,255,252,137,
+ 5,0,0,0,0,14,173,164,199,254,254,255,255,254,195,24,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,76,208,49,0,0,0,55,210,141,237,254,254,255,254,250,157,202,104,
+ 1,0,0,17,182,159,205,254,254,255,255,254,194,168,166,12,0,0,3,123,186,21,
+ 0,0,0,0,0,0,86,205,41,0,0,0,0,0,0,0,0,0,0,0,15,16,1,0,0,0,0,0,0,0,0,0,69,
+ 252,67,0,0,0,133,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,
+ 253,254,255,254,254,254,254,254,254,255,254,254,254,254,254,254,254,254,
+ 254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,1,38,44,44,44,44,44,44,44,44,
+ 44,44,9,0,0,0,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,255,255,255,
+ 254,218,44,0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,0,0,0,
+ 0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,251,
+ 47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,204,30,1,182,254,254,182,1,0,0,27,243,254,254,96,0,49,223,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,255,255,254,111,
+ 0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,
+ 245,137,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,44,62,243,127,
+ 0,0,0,0,0,0,0,0,0,0,0,0,65,251,254,254,248,115,2,0,0,0,27,177,159,174,192,
+ 185,159,183,80,0,0,0,0,80,239,254,254,254,99,0,0,0,0,0,0,0,0,87,251,50,
+ 0,6,43,44,44,52,229,254,253,98,0,11,209,53,0,56,249,254,222,9,0,153,255,
+ 255,254,106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,0,0,3,37,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,31,192,254,255,255,255,255,254,248,85,3,0,0,0,0,0,
+ 118,253,255,255,255,255,254,254,159,31,0,0,0,0,1,63,241,254,255,255,255,
+ 254,254,215,54,0,0,0,0,0,24,201,254,255,255,255,255,254,245,85,5,0,0,0,
+ 0,26,146,253,255,255,255,255,254,253,144,18,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
+ 38,0,0,0,0,0,53,212,254,255,255,255,255,254,242,89,5,0,0,0,0,11,148,254,
+ 255,255,255,255,254,253,139,24,0,0,0,0,9,31,0,0,0,0,0,0,0,2,37,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,252,67,0,0,0,133,239,16,0,0,
+ 0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,71,253,254,255,255,255,254,255,
+ 255,255,255,255,255,254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,240,
+ 255,255,255,255,255,255,255,254,218,44,0,0,0,0,0,0,0,0,0,0,0,23,242,255,
+ 255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,
+ 0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,204,30,0,1,182,254,254,182,
+ 1,0,0,27,243,254,254,96,0,0,49,223,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,
+ 190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,245,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,21,241,127,0,0,0,0,0,0,0,0,0,0,0,0,14,216,254,248,115,2,0,0,0,0,0,
+ 18,115,175,181,180,148,47,0,0,0,0,0,0,80,239,254,239,36,0,0,0,0,0,0,0,0,
+ 87,251,50,0,0,0,0,0,9,223,255,238,28,0,75,252,146,0,8,212,254,222,9,0,153,
+ 255,255,254,106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,0,2,111,220,
+ 52,0,0,0,0,0,0,0,0,0,0,0,0,54,220,151,217,254,254,254,254,250,127,3,0,0,
+ 0,0,0,0,11,165,253,254,254,254,254,194,168,201,29,0,0,0,0,1,102,245,254,
+ 254,254,254,230,143,225,75,0,0,0,0,0,47,221,254,254,254,254,248,153,210,
+ 137,5,0,0,23,191,177,186,254,254,254,254,254,188,175,194,24,0,0,0,0,0,0,
+ 0,0,0,0,0,1,96,223,66,0,0,0,72,224,144,228,254,254,254,254,246,149,215,
+ 126,3,0,0,0,0,19,184,254,254,254,254,253,181,181,185,20,0,0,6,144,203,32,
+ 0,0,0,0,0,2,106,221,57,0,0,0,0,0,0,0,0,0,0,2,34,41,5,0,0,0,0,0,0,0,0,0,
+ 69,252,67,0,0,0,133,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,
+ 71,253,254,255,255,255,254,255,255,255,255,255,255,254,254,254,254,254,
+ 254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,4,118,137,137,137,137,137,
+ 137,137,137,137,135,28,0,0,0,0,0,0,0,0,0,0,0,0,18,240,255,255,255,255,255,
+ 255,254,219,43,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,255,255,255,253,60,
+ 0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,0,0,0,0,104,254,254,
+ 254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,204,31,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,
+ 0,0,50,224,254,254,254,254,254,254,254,254,254,254,254,254,255,255,254,
+ 111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,31,245,112,0,44,136,137,137,137,137,137,137,137,137,137,137,137,137,137,
+ 120,6,20,241,127,0,0,0,0,0,0,0,0,0,0,0,0,0,126,248,115,2,0,0,0,0,0,0,0,
+ 0,5,43,9,0,0,0,0,0,0,0,0,0,80,240,169,2,0,0,0,0,0,0,0,0,87,251,50,0,0,0,
+ 0,0,9,223,254,179,2,2,172,254,222,17,0,135,254,222,9,0,153,255,255,254,
+ 106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,1,109,247,254,225,41,0,
+ 0,0,0,0,0,0,0,0,0,51,226,254,247,138,115,116,116,116,90,3,0,0,0,0,0,0,0,
+ 0,11,105,116,116,116,116,167,252,254,202,18,0,0,0,0,1,78,116,116,116,116,
+ 134,241,254,237,64,0,0,0,0,0,43,116,116,116,116,118,214,254,251,129,0,20,
+ 191,254,253,172,111,116,116,116,116,174,253,254,193,14,0,0,0,0,0,0,0,0,
+ 0,0,93,244,254,233,54,0,69,236,254,242,127,116,116,116,116,120,219,254,
+ 250,117,0,0,0,0,0,19,110,116,116,116,116,181,254,254,184,10,4,143,252,254,
+ 205,20,0,0,0,0,104,246,254,228,45,0,0,0,0,0,0,0,0,3,136,242,246,185,20,
+ 0,0,0,0,0,0,0,0,69,252,168,137,137,137,198,239,16,0,0,0,0,0,0,12,230,146,
+ 0,0,0,55,252,81,0,0,0,66,236,237,237,237,237,237,237,247,254,255,254,254,
+ 254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,8,206,
+ 237,237,237,237,237,237,237,237,237,235,49,0,0,0,0,0,0,0,0,0,0,0,0,18,240,
+ 255,255,255,255,255,254,219,43,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,
+ 255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,0,0,
+ 0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,254,
+ 251,254,254,254,254,254,254,254,205,31,0,0,0,1,182,254,254,182,1,0,0,27,
+ 243,254,254,96,0,0,0,0,50,224,254,254,254,254,254,254,245,249,254,254,254,
+ 255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,29,228,104,2,170,254,254,254,254,253,252,251,249,251,252,
+ 254,254,254,254,250,76,19,224,118,0,0,0,0,0,0,0,0,0,0,0,0,0,22,76,2,0,0,
+ 0,0,0,0,0,0,0,78,233,114,2,0,0,0,0,0,0,0,0,0,57,43,0,0,0,0,0,0,0,0,0,87,
+ 251,50,0,0,0,0,0,9,223,253,89,0,36,240,254,252,80,0,48,247,222,9,0,153,
+ 254,255,254,106,0,8,220,255,255,185,1,0,0,0,0,0,0,0,0,0,0,0,5,212,254,255,
+ 254,88,0,0,0,0,0,0,0,0,0,0,138,254,255,254,167,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,23,241,254,255,250,46,0,0,0,0,0,0,0,0,0,1,183,254,255,254,
+ 122,0,0,0,0,0,0,0,0,0,0,104,254,255,255,200,1,73,253,254,255,224,10,0,0,
+ 0,32,245,254,255,247,36,0,0,0,0,0,0,0,0,0,1,196,254,255,254,108,0,165,254,
+ 255,254,140,0,0,0,0,117,254,255,254,187,1,0,0,0,0,0,0,0,0,0,42,249,254,
+ 255,243,26,19,239,254,255,252,49,0,0,0,3,207,254,255,254,94,0,0,0,0,0,0,
+ 0,0,53,248,255,254,254,112,0,0,0,0,0,0,0,0,69,253,241,237,237,237,246,239,
+ 16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,4,14,14,14,14,14,14,14,
+ 72,235,254,254,254,254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,12,14,14,14,14,14,14,14,14,14,14,2,0,0,0,0,0,0,0,0,0,0,
+ 0,0,18,240,255,255,255,255,254,218,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242,
+ 255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,
+ 0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,254,
+ 240,119,248,254,254,254,254,254,204,30,0,0,0,0,1,182,254,254,182,1,0,0,
+ 27,243,254,254,96,0,0,0,0,0,50,223,254,254,254,254,254,198,112,247,254,
+ 254,255,255,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,1,14,6,54,246,255,253,219,141,82,49,48,42,49,55,102,172,
+ 241,254,254,194,7,14,7,0,0,0,0,0,0,0,0,0,0,0,0,0,59,43,0,0,0,0,0,0,0,0,
+ 0,79,240,254,249,114,2,0,0,0,0,0,0,0,0,23,78,1,0,0,0,0,0,0,0,0,87,253,177,
+ 158,158,158,158,158,161,242,251,170,158,189,254,254,254,206,158,162,242,
+ 242,161,158,216,254,255,254,198,158,161,241,255,255,185,1,0,0,0,0,0,0,0,
+ 0,0,0,0,5,213,255,255,254,88,0,0,0,0,0,0,0,0,0,0,139,254,255,255,167,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,250,46,0,0,0,0,0,0,0,
+ 0,0,1,184,255,255,254,122,0,0,0,0,0,0,0,0,0,0,105,254,255,255,201,1,74,
+ 253,255,255,224,10,0,0,0,33,246,255,255,247,36,0,0,0,0,0,0,0,0,0,1,197,
+ 255,255,254,108,0,166,255,255,254,140,0,0,0,0,118,254,255,255,187,1,0,0,
+ 0,0,0,0,0,0,0,43,249,255,255,243,26,20,240,255,255,252,49,0,0,0,3,209,255,
+ 255,254,95,0,0,0,0,0,0,0,0,72,253,255,254,254,136,0,0,0,0,0,0,0,0,69,252,
+ 78,14,14,14,140,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,0,0,
+ 0,0,0,0,0,0,0,70,235,254,255,254,254,254,254,254,254,254,254,254,254,80,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,18,240,255,255,255,254,218,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242,255,
+ 255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,0,
+ 0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,254,240,
+ 81,38,247,254,254,254,254,205,30,0,0,0,0,0,1,182,254,254,182,1,0,0,27,243,
+ 254,254,96,0,0,0,0,0,0,50,223,254,254,254,254,196,4,111,247,254,255,255,
+ 254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,2,171,254,254,177,18,0,0,0,0,0,0,0,0,1,59,238,255,251,76,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,64,232,199,14,0,0,0,0,0,0,0,78,239,254,255,255,
+ 248,113,2,0,0,0,0,0,0,4,163,244,96,1,0,0,0,0,0,0,0,75,221,221,221,221,221,
+ 221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,
+ 221,221,221,221,221,221,221,221,221,221,161,1,0,0,0,0,0,0,0,0,0,0,0,5,213,
+ 255,255,254,88,0,0,0,0,0,0,0,0,0,0,139,254,255,255,167,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,23,242,255,255,250,46,0,0,0,0,0,0,0,0,0,1,184,255,
+ 255,254,122,0,0,0,0,0,0,0,0,0,0,105,254,255,255,201,1,74,253,255,255,224,
+ 10,0,0,0,33,246,255,255,247,36,0,0,0,0,0,0,0,0,0,1,197,255,255,254,108,
+ 0,166,255,255,254,140,0,0,0,0,118,254,255,255,187,1,0,0,0,0,0,0,0,0,0,43,
+ 249,255,255,243,26,20,240,255,255,252,49,0,0,0,3,209,255,255,254,95,0,0,
+ 0,0,0,0,0,0,27,224,254,254,248,71,0,0,0,0,0,0,0,0,69,252,68,0,0,0,134,239,
+ 16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,0,0,0,0,0,0,0,0,0,0,70,
+ 235,254,254,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,
+ 0,0,5,155,179,179,179,179,179,179,179,179,179,177,36,0,0,0,0,0,0,0,0,0,
+ 0,0,0,18,240,255,255,254,219,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,242,
+ 255,255,255,255,255,253,60,0,0,0,0,0,0,1,183,254,254,254,254,254,254,138,
+ 0,0,0,0,0,0,0,104,254,254,254,254,254,254,254,254,254,254,254,254,254,254,
+ 254,254,254,254,254,254,254,251,47,0,0,0,0,0,0,1,197,254,254,254,241,81,
+ 0,38,247,254,254,254,204,31,0,0,0,0,0,0,1,182,254,254,182,1,0,0,27,243,
+ 254,254,96,0,0,0,0,0,0,0,50,224,254,254,254,196,1,2,111,248,254,255,254,
+ 111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,54,246,254,254,129,1,0,0,0,0,0,0,0,0,0,15,223,255,254,193,6,0,0,0,
+ 0,0,0,0,0,0,0,0,0,64,232,254,253,165,11,0,0,0,0,0,78,239,254,255,255,255,
+ 254,248,113,2,0,0,0,0,4,129,251,254,244,96,1,0,0,0,0,0,0,2,8,8,8,8,8,8,
+ 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,6,0,0,0,0,0,0,0,0,
+ 0,0,0,0,5,213,255,255,254,88,0,0,0,0,0,0,0,0,0,0,139,254,255,255,167,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,241,255,255,250,46,0,0,0,0,0,0,0,
+ 0,0,1,183,254,255,254,122,0,0,0,0,0,0,0,0,0,0,104,254,255,255,201,1,73,
+ 253,255,255,224,10,0,0,0,33,245,255,255,247,36,0,0,0,0,0,0,0,0,0,1,197,
+ 255,255,254,108,0,166,254,255,254,140,0,0,0,0,118,254,255,255,187,1,0,0,
+ 0,0,0,0,0,0,0,43,249,255,255,243,26,20,240,255,255,252,49,0,0,0,3,208,255,
+ 255,254,95,0,0,0,0,0,0,0,0,0,51,162,167,84,2,0,0,0,0,0,0,0,0,69,253,199,
+ 179,179,179,218,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,70,236,254,254,254,254,254,254,254,254,254,254,80,0,0,
+ 0,0,0,0,0,0,0,0,0,0,6,179,206,206,206,206,206,206,206,206,206,204,42,0,
+ 0,0,0,0,0,0,0,0,0,0,0,18,240,255,254,220,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,18,196,206,206,206,206,206,204,48,0,0,0,0,0,0,0,148,206,206,206,206,
+ 206,206,112,0,0,0,0,0,0,0,84,206,206,206,206,206,206,206,206,206,206,206,
+ 206,206,206,206,206,206,206,206,206,206,203,38,0,0,0,0,0,0,1,197,254,254,
+ 241,82,0,0,38,247,254,254,205,31,0,0,0,0,0,0,0,1,182,254,254,182,1,0,0,
+ 27,243,254,254,96,0,0,0,0,0,0,0,0,50,224,254,254,196,1,0,2,111,248,254,
+ 254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,2,170,254,255,255,242,137,48,10,1,1,1,1,3,19,76,187,253,255,255,
+ 250,75,0,0,0,0,0,0,0,0,0,0,0,39,231,254,254,254,253,164,11,0,0,0,78,238,
+ 254,255,255,255,255,255,254,248,113,2,0,0,4,129,250,255,255,254,244,72,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,127,251,254,234,49,0,0,0,0,0,0,0,0,
+ 0,0,63,236,254,250,143,136,142,142,141,91,1,0,0,0,0,0,0,0,0,6,113,142,142,
+ 142,131,178,253,254,215,23,0,0,0,0,0,0,0,0,0,0,98,246,254,243,75,0,0,0,
+ 0,0,34,138,142,142,141,126,224,254,253,145,0,26,206,254,254,182,123,142,
+ 142,142,130,185,254,254,207,17,0,0,0,0,0,0,0,0,0,0,109,249,254,240,64,0,
+ 84,242,254,247,130,139,142,142,141,128,229,254,252,132,0,0,0,0,0,0,0,0,
+ 0,0,13,185,254,254,198,12,5,161,253,254,220,114,141,142,142,137,152,250,
+ 254,237,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,253,255,255,255,
+ 255,255,239,16,0,0,0,0,0,0,12,230,146,0,0,0,55,252,81,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,70,236,254,254,254,254,254,254,254,254,254,80,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,2,3,3,3,3,3,3,3,3,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,18,240,254,
+ 219,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,3,3,3,3,2,0,0,0,0,0,0,
+ 0,0,2,3,3,3,3,3,2,1,0,0,0,0,0,0,0,1,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
+ 3,3,3,2,0,0,0,0,0,0,0,1,197,254,240,82,0,0,0,38,247,254,205,30,0,0,0,0,
+ 0,0,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,0,0,0,0,0,0,0,0,50,
+ 224,254,196,1,0,0,1,111,248,254,111,0,0,0,0,0,0,0,132,254,255,225,10,1,
+ 196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,245,255,255,255,254,254,247,225,
+ 200,199,199,199,204,237,252,254,255,255,255,254,192,6,0,0,0,0,0,0,0,0,0,
+ 0,7,151,252,254,255,254,253,188,37,0,75,239,254,255,255,255,255,255,255,
+ 255,254,248,113,2,22,160,251,254,255,255,254,185,17,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,4,130,231,66,0,0,0,0,0,0,0,0,0,0,0,0,68,232,158,207,254,
+ 254,254,254,248,108,1,0,0,0,0,0,0,6,147,252,254,254,254,254,183,179,215,
+ 40,0,0,0,0,0,0,0,0,0,0,0,1,102,236,92,1,0,0,0,0,35,211,254,254,254,254,
+ 245,146,222,155,8,0,0,31,206,188,174,253,254,254,254,253,176,186,208,33,
+ 0,0,0,0,0,0,0,0,0,0,0,2,113,234,81,0,0,0,88,235,148,220,254,254,254,254,
+ 242,144,227,144,6,0,0,0,0,0,0,0,0,0,0,0,18,186,200,28,0,0,10,162,219,148,
+ 247,254,254,254,254,209,156,232,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,69,253,255,255,255,255,255,239,16,0,0,0,0,0,0,12,230,146,0,0,
+ 0,55,252,81,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,235,254,254,254,254,254,
+ 254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,6,6,6,6,6,6,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,18,240,218,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,197,240,82,0,0,0,0,38,
+ 247,205,30,0,0,0,0,0,0,0,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,
+ 0,0,0,0,0,0,0,0,0,0,50,224,196,1,0,0,0,2,111,247,111,0,0,0,0,0,0,0,132,
+ 254,255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,117,193,193,193,193,
+ 193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,193,189,44,
+ 0,0,0,0,0,0,0,0,0,0,0,7,151,252,254,255,255,254,223,38,128,235,254,254,
+ 255,255,255,255,255,254,254,241,169,19,178,254,254,255,255,254,190,18,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 43,190,254,255,255,255,255,254,246,72,0,0,0,0,0,0,114,252,255,255,255,255,
+ 254,253,155,30,0,0,0,0,0,0,0,0,0,0,0,0,0,1,37,0,0,0,0,0,10,196,254,255,
+ 255,255,255,254,243,93,8,0,0,0,0,25,142,253,255,255,255,255,254,253,145,
+ 26,0,0,0,0,0,0,0,0,0,0,0,0,0,2,37,0,0,0,0,0,51,209,254,255,255,255,255,
+ 254,240,85,6,0,0,0,0,0,0,0,0,0,0,0,0,0,17,23,0,0,0,0,10,99,245,255,255,
+ 255,255,254,254,193,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 69,253,255,255,255,255,255,239,16,0,0,0,0,0,0,12,230,147,0,0,0,55,252,81,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,235,254,254,254,254,254,254,254,80,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,205,216,216,216,215,147,7,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,18,204,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,183,82,0,0,0,0,0,38,198,31,
+ 0,0,0,0,0,0,0,0,0,0,1,182,254,254,182,1,0,0,27,243,254,254,96,0,0,0,0,0,
+ 0,0,0,0,0,0,50,167,1,0,0,0,0,2,112,104,0,0,0,0,0,0,0,132,254,255,225,10,
+ 1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,209,217,217,217,217,217,217,217,
+ 217,217,217,217,217,217,217,217,217,217,217,217,217,217,108,0,0,0,0,0,0,
+ 0,0,0,0,0,0,8,151,252,254,254,245,99,1,1,28,104,164,209,218,218,218,214,
+ 173,106,40,2,0,38,212,254,254,254,213,37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,234,254,255,255,255,253,
+ 166,11,0,0,0,0,0,0,26,198,254,255,255,255,254,215,41,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,79,239,254,255,255,255,253,155,9,0,0,0,0,0,0,
+ 32,206,254,255,255,255,254,208,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,89,243,254,255,255,255,252,144,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,10,162,253,255,255,255,254,236,73,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,69,253,255,255,255,255,255,239,16,0,0,0,0,0,0,12,
+ 230,222,45,0,3,131,253,81,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,236,254,
+ 254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,86,165,166,166,147,
+ 20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,0,0,
+ 0,0,15,27,0,0,0,0,0,0,0,0,0,0,0,0,119,166,166,118,0,0,0,17,158,166,165,
+ 62,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,2,17,0,0,0,0,0,0,0,132,254,255,
+ 225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,159,166,166,166,166,166,
+ 166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,82,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,8,151,252,245,99,1,0,0,0,0,0,6,7,7,7,7,1,0,0,0,0,
+ 0,38,213,254,213,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,67,164,166,166,166,137,11,0,0,0,0,0,0,0,0,26,
+ 153,166,166,166,160,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 75,165,166,166,166,130,9,0,0,0,0,0,0,0,0,32,156,166,166,166,157,34,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,84,165,166,166,166,123,7,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,135,166,166,166,165,70,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,250,255,255,255,255,
+ 255,237,15,0,0,0,0,0,0,10,221,254,219,49,124,250,253,79,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,70,237,254,254,254,254,254,80,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,254,255,225,
+ 10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,147,99,1,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,38,179,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,131,251,
+ 254,254,254,249,116,1,0,0,0,0,0,0,0,69,237,254,236,250,254,178,15,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,236,254,254,254,254,80,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,254,
+ 255,225,10,1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,105,144,
+ 145,144,96,2,0,0,0,0,0,0,0,0,0,64,144,145,145,129,14,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,71,235,254,254,254,80,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,254,255,225,10,
+ 1,196,190,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,
+ 236,254,253,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,132,254,255,225,10,12,209,141,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,237,254,80,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,254,255,
+ 224,21,163,155,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,71,236,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,132,254,255,233,173,155,8,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,71,63,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,254,255,
+ 252,155,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,132,254,253,155,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132,253,156,9,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 132,160,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};
diff --git a/noatun-plugins/tippercanoe/syna.h b/noatun-plugins/tippercanoe/syna.h
new file mode 100644
index 0000000..d4ea60e
--- /dev/null
+++ b/noatun-plugins/tippercanoe/syna.h
@@ -0,0 +1,247 @@
+/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia)
+ Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au>
+ 2001 Charles Samuels <charles@kde.org>
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2 of the License, or (at your
+ option) any later version.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+
+#ifndef SYNA_H
+#define SYNA_H
+
+#include "config.h"
+#include <qptrlist.h>
+#include "polygon.h"
+
+//**************************************
+// For the incurably fiddle prone:
+
+// log2 of sample size
+#define LogSize 9
+
+// overlap amount between samples. Set to 1 or 2 if you have a fast computer
+#define Overlap 1
+
+// Brightness
+#define Brightness 150
+
+// Sample frequency
+#define Frequency 22050
+
+//***************************************
+
+#define DefaultWidth 260
+#define DefaultHeight 260
+
+#define NumSamples (1<<LogSize)
+#define RecSize (1<<LogSize-Overlap)
+
+#ifndef __linux__
+#warning This target has not been tested!
+#endif
+
+#ifdef __FreeBSD__
+#include <machine/endian.h>
+typedef unsigned short sampleType;
+#else
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_ENDIAN_H
+#include <endian.h>
+#elif defined(_BIG_ENDIAN)
+#define BIG_ENDIAN 1
+#define BYTE_ORDER BIG_ENDIAN
+#endif
+typedef short sampleType;
+#endif
+
+#if BYTE_ORDER == BIG_ENDIAN
+#define BIGENDIAN
+#else
+#define LITTLEENDIAN
+#endif
+
+void error(const char *str, bool syscall=false);
+void warning(const char *str, bool syscall=false);
+
+enum SymbolID
+{
+ Speaker, Bulb,
+ Play, Pause, Stop, SkipFwd, SkipBack,
+ Handle, Pointer, Open, NoCD, Exit,
+ Zero, One, Two, Three, Four,
+ Five, Six, Seven, Eight, Nine,
+ Slider, Selector, Plug, Loop, Box, Bar,
+ Flame, Wave, Stars, Star, Diamond, Size, FgColor, BgColor,
+ Save, Reset, TrackSelect,
+ NotASymbol
+};
+
+// wrap
+struct BaseScreen
+{
+ virtual bool init(int xHint, int yHint, int widthHint, int heightHint, bool fullscreen) = 0;
+ virtual void setPalette(unsigned char *palette) = 0;
+ virtual void end() = 0;
+ virtual int sizeUpdate() = 0;
+ virtual bool inputUpdate(int &mouseX,int &mouseY,int &mouseButtons,char &keyHit) = 0;
+ virtual void show() = 0;
+};
+
+struct SdlScreen : public BaseScreen
+{
+ bool init(int xHint, int yHint, int widthHint, int heightHint, bool fullscreen);
+ void setPalette(unsigned char *palette);
+ void end();
+ int sizeUpdate();
+ bool inputUpdate(int &mouseX,int &mouseY,int &mouseButtons,char &keyHit);
+ void show();
+ int winID();
+};
+
+// core
+class Combiner
+{
+public:
+ static unsigned short combine(unsigned short a,unsigned short b)
+ {
+ //Not that i want to give the compiler a hint or anything...
+ unsigned char ah = a>>8, al = a&255, bh = b>>8, bl = b&255;
+ if (ah < 64) ah *= 4; else ah = 255;
+ if (al < 64) al *= 4; else al = 255;
+ if (bh > ah) ah = bh;
+ if (bl > al) al = bl;
+ return ah*256+al;
+ }
+};
+
+class Interface;
+
+class Core
+{
+public:
+ Core();
+ ~Core();
+
+ inline unsigned char *output() { return (unsigned char*)outputBmp.data; }
+ inline unsigned char *lastOutput() { return (unsigned char*)lastOutputBmp.data; }
+ inline unsigned char *lastLastOutput() { return (unsigned char*)lastLastOutputBmp.data; }
+
+ void allocOutput(int w,int h);
+ void interfaceInit();
+ //void coreInit();
+ void setStarSize(double size);
+ void setupPalette(double);
+
+ bool go();
+ bool calculate();
+
+ void toDefaults();
+ void fade();
+ void fadeFade();
+ inline void fadePixelWave(int x, int y, int where, int step);
+ void fadeWave();
+ inline void fadePixelHeat(int x,int y,int where,int step);
+ void fadeHeat();
+
+ void fft(double*, double*);
+
+ inline void addPixel(int x, int y, int br1, int br2);
+ inline void addPixelFast(unsigned char *p, int br1, int br2);
+ inline unsigned char getPixel(int x, int y, int where);
+
+ static int bitReverser(int);
+
+
+public:
+ BaseScreen *screen;
+ Interface *interface;
+ sampleType *data;
+ Bitmap<unsigned short> outputBmp, lastOutputBmp, lastLastOutputBmp;
+ PolygonEngine<unsigned short,Combiner,2> polygonEngine;
+
+ double cosTable[NumSamples], negSinTable[NumSamples];
+ int bitReverse[NumSamples];
+ int scaleDown[256];
+ int maxStarRadius;
+
+
+public:
+ int outWidth, outHeight;
+ SymbolID fadeMode;
+ bool pointsAreDiamonds;
+
+ double brightnessTwiddler;
+ double starSize;
+
+ double fgRedSlider, fgGreenSlider, bgRedSlider, bgGreenSlider;
+ SymbolID state;
+
+ int windX, windY, windWidth, windHeight;
+};
+
+extern Core *core;
+
+inline unsigned char Core::getPixel(int x,int y,int where)
+{
+ if (x < 0 || y < 0 || x >= outWidth || y >= outHeight) return 0;
+ return lastOutput()[where];
+}
+
+
+struct Button;
+
+struct UIObject
+{
+ int visibleMask, activeMask;
+ double x,y,width,height;
+ bool active;
+
+ virtual int go(bool mouseDown,bool mouseClick,bool mouseOver,
+ double x, double y, double scale, char &hotKey, int &action)
+ = 0;
+
+ virtual void handleKey(char key, int &action) = 0;
+ void changed();
+};
+
+class Interface
+{
+public:
+ Interface();
+ ~Interface();
+ bool go();
+ void syncToState();
+ void setupPalette();
+
+ void putString(char *string,int x,int y,int red,int blue);
+
+protected:
+ void addUI(UIObject *obj);
+ void changeState(int transitionSymbol);
+
+private:
+ QPtrList<UIObject> uiObjects;
+ Button *stateButton, *starsButton, *waveButton, *flameButton, *starButton, *diamondButton;
+ int mouseButtons;
+
+ int visibleMask;
+ int mouseX, mouseY, lastX, lastY, countDown;
+
+};
+
+
+#endif
+
diff --git a/noatun-plugins/tippercanoe/synaescope.cpp b/noatun-plugins/tippercanoe/synaescope.cpp
new file mode 100644
index 0000000..8ccf6c3
--- /dev/null
+++ b/noatun-plugins/tippercanoe/synaescope.cpp
@@ -0,0 +1,103 @@
+/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia)
+ Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au>
+ 2001 Charles Samuels <charles@kde.org>
+ Copyright (C) 2001 Neil Stevens <multivac@fcmail.com>
+
+ this file is X11 source
+ */
+
+#include <noatun/conversion.h>
+#include <kdebug.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kprocess.h>
+#include <kstandarddirs.h>
+#include <qframe.h>
+#include <qregexp.h>
+#include <noatun/app.h>
+#include "syna.h"
+#include "synaescope.h"
+
+extern "C" Plugin *create_plugin()
+{
+ KGlobal::locale()->insertCatalogue("tippecanoe");
+ return new SynaeScope();
+}
+
+SynaeScope::SynaeScope()
+ : QWidget(0, 0, WType_TopLevel | WStyle_DialogBorder | WRepaintNoErase | WMouseNoMask)
+ , StereoScope(50)
+ , Plugin()
+{
+ setSamples(bufferSize);
+ mBuffer = new char[bufferSize * 16 * 2];
+ setFixedSize(320, 240);
+ setCaption(i18n("Tippecanoe - Noatun"));
+ setIcon(SmallIcon("noatun"));
+ show();
+ embed = new QXEmbed(this);
+ embed->move(0,0);
+ embed->resize(320, 240);
+ embed->show();
+ embed->setFocus();
+}
+
+SynaeScope::~SynaeScope()
+{
+ connect(&process, SIGNAL(processExited(KProcess *)), this, SLOT(processExited(KProcess *)));
+ napp->pluginMenuRemove(pluginMenuItem);
+}
+
+void SynaeScope::init()
+{
+ connect(&process, SIGNAL(receivedStdout(KProcess *, char *, int)), this, SLOT(read(KProcess *, char *, int)));
+ pluginMenuItem = napp->pluginMenuAdd(i18n("Toggle Tippecanoe"), this, SLOT(toggle(void)));
+
+ process << KStandardDirs::findExe("noatuntippecanoe.bin");
+
+ // Note that process.start() will fail if findExe fails, so there's no real need
+ // for two separate checks.
+ if(!process.start(KProcess::NotifyOnExit, (KProcess::Communication)(KProcess::Stdin | KProcess::Stdout)))
+ {
+ KMessageBox::error(0, i18n("Unable to start noatuntippecanoe.bin. Check your installation."));
+ unload();
+ }
+ else
+ start();
+
+}
+
+void SynaeScope::scopeEvent(float *left, float *right, int size)
+{
+ if(!isHidden() && process.isRunning())
+ {
+ Conversion::convertStereo2FloatToI16le((unsigned long)size, left,
+ right, (unsigned char*)mBuffer);
+
+ process.writeStdin((char *)mBuffer, bufferSize*2);
+ }
+}
+
+void SynaeScope::read(KProcess *, char *buf, int)
+{
+ QString num = QString::fromLatin1(buf);
+ num = num.left(num.find(QRegExp("\\s")));
+ id = num.toInt();
+ embed->embed(id);
+}
+
+void SynaeScope::processExited(KProcess *)
+{
+ unload();
+}
+
+void SynaeScope::toggle(void)
+{
+ if(isHidden())
+ show();
+ else
+ hide();
+}
+
+#include "synaescope.moc"
diff --git a/noatun-plugins/tippercanoe/synaescope.h b/noatun-plugins/tippercanoe/synaescope.h
new file mode 100644
index 0000000..da6855b
--- /dev/null
+++ b/noatun-plugins/tippercanoe/synaescope.h
@@ -0,0 +1,46 @@
+/* Synaescope - a pretty noatun visualization (based on P. Harrison's Synaesthesia)
+ Copyright (C) 1997 Paul Francis Harrison <pfh@yoyo.cc.monash.edu.au>
+ 2001 Charles Samuels <charles@kde.org>
+ Copyright (C) 2001 Neil Stevens<multivac@fcmail.com>
+
+ this file is X11 source
+ */
+
+#ifndef SYNAESCOPE_H
+#define SYNAESCOPE_H
+
+#include <noatun/conversion.h>
+#include "syna.h"
+#include <noatun/plugin.h>
+#include <kprocess.h>
+#include <qwidget.h>
+#include <qxembed.h>
+
+class SynaeScope : public QWidget, public StereoScope, public Plugin
+{
+Q_OBJECT
+
+public:
+ SynaeScope();
+ virtual ~SynaeScope();
+
+ void init();
+
+private slots:
+ void processExited(KProcess *);
+ void toggle(void);
+ void read(KProcess *, char *, int);
+
+protected:
+ virtual void scopeEvent(float *left, float *right, int bands);
+
+private:
+ char *mBuffer;
+ static const int bufferSize=512;
+ KProcess process;
+ int pluginMenuItem;
+ QXEmbed *embed;
+ WId id;
+};
+
+#endif
diff --git a/noatun-plugins/tippercanoe/tippecanoe.plugin b/noatun-plugins/tippercanoe/tippecanoe.plugin
new file mode 100644
index 0000000..a7fb06d
--- /dev/null
+++ b/noatun-plugins/tippercanoe/tippecanoe.plugin
@@ -0,0 +1,72 @@
+Filename=noatuntippecanoe.la
+Author=Neil Stevens, Charles Samuels, Paul Francis Harrison
+Site=http://noatun.kde.org/
+Email=multivac@fcmail.com
+Type=visualization
+License=GPL
+Name=Tippecanoe
+Name[af]= tippecanoe
+Name[hi]=टिपर-केनॉय
+Name[it]=Tippercanoe
+Name[ne]=टिपेकोन
+Name[ru]=Каноэ
+Name[ta]=டிப்கானோ
+Name[tg]=Каноэ
+Comment=A visualization you can play with for hours.
+Comment[af]='n visualiseering jy kan speel met vir ure.
+Comment[ar]=مرئية يمكنك اللعب بها لساعات.
+Comment[az]=Saatlarca oynaya biləvəyiniz əyani efekt
+Comment[bg]=Забавна приставка за визуализация за Noatun
+Comment[bs]=Vizualizacija sa kojom se možete igrati satima.
+Comment[ca]=Un visualitzador que pot reproduir durant hores.
+Comment[cs]=Vizualizace, se kterou si vyhrajete
+Comment[cy]=Dychmygydd y gallwch chwarae efo fo am oriau
+Comment[da]=En visualisering som du kan bruge timer på.
+Comment[de]=Eine Visualisierung, mit der Sie viele Stunden spielen können.
+Comment[el]=Μια οπτικοποίηση με την οποία μπορεί να παίζεις για ώρες.
+Comment[en_GB]=A visualisation you can play with for hours.
+Comment[eo]=Vidadilo kun kiu vi povas ludi horlonge.
+Comment[es]=Una forma de visualización en la que puede reproducir durante horas.
+Comment[et]=Ostsilloskoop, millega võib jännata tundide kaupa.
+Comment[eu]=Hainbat ordutaz ibil daitekeen bisualizazioa.
+Comment[fa]=تجسمی که می‌توانید ساعتها اجرا کنید.
+Comment[fi]=Visuaalisaatio, jota voit soittaa tunteja
+Comment[fr]=Un affichage avec lequel vous pouvez jouer pendant des heures
+Comment[fy]=In fisualisaasje om oeren mei te boartsjen.
+Comment[ga]=Amharcléiriú ar féidir súgradh leis ar feadh uaireanta an chloig.
+Comment[gl]=Unha visualización que o usuário pode reproducir durante horas.
+Comment[he]=המחשה שאפשר לשחק איתה שעות
+Comment[hi]=एक विज़ुअलाइज़ेशन जिसके साथ आप घंटों खेल सकते हैं
+Comment[hr]=Vizualizacija koju možete gledati satima
+Comment[hu]=Egy sokoldalú vizualizációs modul
+Comment[is]=Sjónræn brella sem hægt er að leika sér með lengi.
+Comment[it]=Una visualizzazione con cui puoi giocare per ore
+Comment[ja]=何時間でも遊べる視覚効果
+Comment[ka]=ვიზუალიზაცია, რომლითაც საათობით შეგიძლიათ თამაში
+Comment[kk]=Арбайтың көрініс.
+Comment[km]= រូបភាព​មើល​ឃើញ​មួយ ដែល​​អ្នក​អាច​ចាក់​​បាន​ច្រើន​ម៉ោង ។
+Comment[lt]=Vizualizacija, su kuria Jūs galite žaisti ištisas valandas.
+Comment[mk]=Визуелизација што може да ја гледате со часови.
+Comment[ms]=Visualisasi yang anda boleh main berjam-jam..
+Comment[nb]=En visualisering du kan leke med i timer.
+Comment[nds]=En Filmmaker, mit den Du över Stünnen spelen kannst.
+Comment[ne]=तपाईँले एक घण्टासम्म प्ले गर्न सक्ने दृष्टीकरण ।
+Comment[nl]=Een visualisatie waarmee u uren kunt spelen.
+Comment[nn]=Ei visualisering du kan leika med i fleire timar.
+Comment[pl]=Wizualizacja, którą można się bawić godzinami.
+Comment[pt]=Uma visualização que o utilizador pode reproduzir durante horas.
+Comment[pt_BR]=Uma visualização que você pode reproduzir.
+Comment[ro]=Un modul de vizualizare cu care vă puteţi juca ore întregi
+Comment[ru]=Зрительный образ, который вы можете рассматривать часами
+Comment[sk]=Vizualizácia s ktorou sa môžete hrať celé hodiny.
+Comment[sl]=Vizualizacija, s katero se lahko igrate ure in ure.
+Comment[sr]=Визуелизација којом се можете играти сатима.
+Comment[sr@Latn]=Vizuelizacija kojom se možete igrati satima.
+Comment[sv]=Visualisering man kan leka med i flera timmar
+Comment[ta]=நீங்கள் பலநேரம் வாசிக்கக்கூடிய காட்சியமைப்பு.
+Comment[tg]=Намуди тамошобин, ки метавонед ӯро соатҳо тамошо кунед.
+Comment[tr]=Saatlerce oynayabileceğiniz bir görselleştirme.
+Comment[uk]=Втулок візуалізації, з яким ви зможете гратись годинами.
+Comment[vi]=Ô xem chơi dễ dàng.
+Comment[xh]=Umboniso wengqondo onokuwudlala ngawo iiyure.
+Comment[zh_CN]=可以长时间播放的视觉化显示
diff --git a/noatun-plugins/tippercanoe/ui.cpp b/noatun-plugins/tippercanoe/ui.cpp
new file mode 100644
index 0000000..e260d18
--- /dev/null
+++ b/noatun-plugins/tippercanoe/ui.cpp
@@ -0,0 +1,507 @@
+#include "font.h"
+#include "icons.h"
+#include "syna.h"
+#include <math.h>
+#include <stdlib.h>
+#include <kconfig.h>
+
+#define output core->output()
+
+static void putChar(unsigned char character,int x,int y,int red,int blue)
+{
+ unsigned short *ptr = ((unsigned short *)output) + x + y*core->outWidth;
+ unsigned short put = (blue<<8)+red;
+ int i,j;
+ for(i=0;i<8;i++,ptr += core->outWidth-8)
+ for(j=0;j<8;j++,ptr++)
+ if (font[character*8+i] & (128>>j))
+ *ptr = put;
+}
+
+void Interface::putString(char *string,int x,int y,int red,int blue)
+{
+ if (x < 0 || y < 0 || y >= core->outHeight-8)
+ return;
+ for(;*string && x <= core->outWidth-8;string++,x+=8)
+ putChar((unsigned char)(*string),x,y,red,blue);
+}
+
+void UIObject::changed()
+{
+}
+
+struct Button : public UIObject
+{
+ int icon;
+ char hotKey;
+
+ bool passive, bright;
+
+ Button(int _am,int _vm,double _x,double _y,
+ double _size,int _icon,char _key = 0,
+ bool _passive = false, bool _bright = false)
+ {
+ activeMask = _am; visibleMask = _vm;
+ x = _x; y = _y; width = height = _size;
+ icon = _icon; hotKey = _key; passive = _passive; bright = _bright;
+ }
+
+ int go(bool mouseDown,bool mouseClick,bool mouseOver,
+ double _x, double _y, double scale, char &_hotKey, int &action)
+ {
+ (void)mouseDown;
+ (void)_x;
+ (void)_y;
+ core->polygonEngine.icon(
+ Icons[icon],
+ (bright ? 0x0202 : 0x0100),
+ x*scale,y*scale,width*scale,height*scale);
+
+ if (mouseOver && !passive)
+ core->polygonEngine.icon(
+ Icons[icon],
+ 0x0002,
+ (x-IconWidths[icon]*width/2)*scale,
+ (y-height/2)*scale,width*scale*2,height*scale*2);
+
+ if (mouseOver && mouseClick && !passive)
+ action = icon;
+
+ if (mouseOver && !passive && hotKey)
+ _hotKey = hotKey;
+
+ return 0;
+ }
+
+ void handleKey(char key, int &action)
+ {
+ if (key == hotKey && !passive)
+ action = icon;
+ }
+};
+#define BarWidth 0.1
+struct SliderBar : public UIObject
+{
+ double *value;
+ char leftKey, rightKey;
+
+ typedef void (Core::*Callback)(double v);
+ Callback callback;
+
+ SliderBar(int _am,int _vm,double _x,double _y,
+ double _width,double _height, double *_value,
+ Callback _callback, char _leftKey, char _rightKey)
+ {
+ activeMask = _am; visibleMask = _vm;
+ x = _x; y = _y; width = _width; height = _height;
+ value = _value; callback = _callback;
+ leftKey = _leftKey; rightKey = _rightKey;
+ }
+
+ int go(bool mouseDown,bool mouseClick,bool mouseOver,
+ double _x, double _y, double scale, char &_hotKey, int &action)
+ {
+ (void)mouseClick;
+ (void)_y;
+ (void)action;
+ core->polygonEngine.icon(
+ Icons[Bar],
+ 0x0100,
+ x*scale,y*scale,width*scale,height*scale);
+ core->polygonEngine.icon(
+ Icons[Slider],
+ 0x0200,
+ (x+*value*width-IconWidths[Slider]*height/2)*scale,
+ y*scale,height*scale,height*scale);
+
+ if (mouseOver)
+ {
+ double newValue = (_x)/(width);
+ if (newValue < 0.0) newValue = 0.0;
+ if (newValue > 1.0) newValue = 1.0;
+
+ core->polygonEngine.icon(
+ Icons[Selector],
+ 0x0002,
+ (x+newValue*width-IconWidths[Selector]*height/2)*scale,
+ y*scale,height*scale,height*scale);
+
+ if (mouseDown)
+ {
+ *value = newValue;
+
+ if (callback)
+ (core->*callback)(*value);
+ changed();
+ }
+
+ if (mouseOver)
+ _hotKey = (newValue < *value ? leftKey : rightKey);
+ }
+
+ return 0;
+ }
+ void handleKey(char key, int &action)
+ {
+ (void)action;
+ if (key == leftKey || key == rightKey)
+ {
+ if (key == leftKey)
+ {
+ if (*value == 0.0) return;
+ *value -= 0.05;
+ if (*value < 0.0) *value = 0.0;
+ }
+ else
+ {
+ if (*value == 1.0) return;
+ *value += 0.05;
+ if (*value > 1.0) *value = 1.0;
+ }
+
+ if (callback)
+ (core->*callback)(*value);
+ changed();
+ }
+ }
+};
+#undef BarWidth
+
+
+struct PopperUpper : public UIObject
+{
+ int maskAdd;
+
+ PopperUpper(int _am,int _vm,double _x,double _y,
+ double _width,double _height, int _maskAdd)
+ {
+ activeMask = _am; visibleMask = _vm;
+ x = _x; y = _y; width = _width; height = _height;
+ maskAdd = _maskAdd;
+ }
+
+ int go(bool mouseDown,bool mouseClick, bool mouseOver,
+ double _x, double _y, double scale, char &_hotKey, int &action)
+ {
+ (void)mouseDown;
+ (void)mouseClick;
+ (void)_x;
+ (void)_y;
+ (void)_hotKey;
+ (void)action;
+
+ core->polygonEngine.icon(
+ Icons[Box],
+ 0x0200,
+ x*scale,y*scale,width*scale,height*scale);
+
+ return mouseOver ? maskAdd : 0;
+ }
+
+ void handleKey(char key, int &action)
+ {
+ (void)key;
+ (void)action;
+ }
+};
+
+void Interface::setupPalette()
+{
+#define BOUND(x) ((x) > 255 ? 255 : (x))
+#define PEAKIFY(x) int(BOUND((x) - (x)*(255-(x))/255/2))
+#define MAX(x,y) ((x) > (y) ? (x) : (y))
+ int i;
+ unsigned char palette[768];
+
+ double scale, fgRed, fgGreen, fgBlue, bgRed, bgGreen, bgBlue;
+ fgRed = core->fgRedSlider;
+ fgGreen = core->fgGreenSlider;
+ fgBlue = 1.0 - MAX(core->fgRedSlider,core->fgGreenSlider);
+ scale = MAX(MAX(fgRed,fgGreen),fgBlue);
+ fgRed /= scale;
+ fgGreen /= scale;
+ fgBlue /= scale;
+
+ bgRed = core->bgRedSlider;
+ bgGreen = core->bgGreenSlider;
+ bgBlue = 1.0 - MAX(core->bgRedSlider, core->bgGreenSlider);
+ scale = MAX(MAX(bgRed, bgGreen), bgBlue);
+ bgRed /= scale;
+ bgGreen /= scale;
+ bgBlue /= scale;
+
+ for(i=0;i<256;i++)
+ {
+ int f = i&15, b = i/16;
+ palette[i*3+0] = PEAKIFY(b*bgRed*16+f*fgRed*16);
+ palette[i*3+1] = PEAKIFY(b*bgGreen*16+f*fgGreen*16);
+ palette[i*3+2] = PEAKIFY(b*bgBlue*16+f*fgBlue*16);
+ }
+ core->screen->setPalette(palette);
+#undef BOUND
+#undef PEAKIFY
+#undef MAX
+}
+
+//Visible mask
+#define ALL 1
+#define BUTTONBAR 2
+#define TRACKBAR 4
+#define DIALBAR 8
+#define VOLUMEBAR 16
+
+//Active mask
+//#define ALL 1
+#define PLAYING 2
+#define PAUSED 4
+#define STOPPED 8
+#define NOCD 32
+#define OPEN 64
+
+
+// TODO Lay things out with parents and a stack, like QT
+Interface::Interface()
+{
+ static const float IconSize=0.2;
+ static const float SliderSize=0.125;
+
+ {
+ KConfig config("noatun/synaescope", false, false, "data");
+ core->fadeMode=(SymbolID)config.readNumEntry("mode", (int)Stars);
+ core->pointsAreDiamonds=config.readBoolEntry("diamonds", false);
+ core->brightnessTwiddler=config.readDoubleNumEntry("brightness", .4);
+ core->starSize=config.readDoubleNumEntry("starsize", .1);
+ core->fgRedSlider=config.readDoubleNumEntry("FGRed", 0.0);
+ core->fgGreenSlider=config.readDoubleNumEntry("FGgreen", 1.0);
+ core->bgRedSlider=config.readDoubleNumEntry("BGRed", 0.0);
+ core->bgGreenSlider=config.readDoubleNumEntry("BGGreen", 0.0);
+ }
+
+ uiObjects.setAutoDelete(true);
+
+ double x,y;
+
+ //addUI(new Button(ALL,0.025,0.525,IconSize, 0, 'x'));
+// addUI(new PopperUpper(ALL,ALL,0,0,0.25,0.25, BUTTONBAR));
+// addUI(stateButton = new Button(ALL,ALL,0.05,0.025,IconSize, 0, 0, true, false));
+
+ addUI(new PopperUpper(ALL,BUTTONBAR,x=0.25,y=0,1.375,0.25, BUTTONBAR));
+// x += 0.1; y += 0.025;
+
+// addUI(new PopperUpper(PLAYING|PAUSED|STOPPED, ALL,0,0.25,0.25,0.25, TRACKBAR));
+// addUI(new PopperUpper(PLAYING|PAUSED|STOPPED, TRACKBAR,x=0.25,y=0.25,1.0,0.625, TRACKBAR));
+// x += 0.1; y += 0.1;
+
+ addUI(new PopperUpper(ALL,ALL,0,0.0,0.25,0.25, DIALBAR));
+ addUI(new Button(ALL,ALL,0.075,0.05,IconSize, Bulb, 0, true, false));
+
+ addUI(new PopperUpper(ALL,DIALBAR,x=0.25,y=0.0,1.25,1.0, DIALBAR));
+ x += 0.05; y += 0.025;
+
+ addUI(starsButton = new Button(ALL,DIALBAR,x,y,IconSize, Stars, 'd'));
+ addUI(waveButton = new Button(ALL,DIALBAR,x+IconSize,y,IconSize, Wave, 'f'));
+ addUI(flameButton = new Button(ALL,DIALBAR,x+IconSize*2.5,y,IconSize, Flame, 'g'));
+
+ addUI(starButton = new Button(ALL,DIALBAR,x+IconSize*3.5,y,IconSize, Star, 'h'));
+ addUI(diamondButton = new Button(ALL,DIALBAR,x+IconSize*4.5,y,IconSize, Diamond, 'j'));
+
+ y += IconSize*1.3;
+
+ addUI(new Button(ALL,DIALBAR,x,y-0.05,IconSize, Bulb, 0, true));
+ addUI(new SliderBar(ALL,DIALBAR,
+ x+IconSize,y, 0.75, SliderSize, &core->brightnessTwiddler, /*&Core::setBrightness,*/0, 'z', 'x'));
+
+ addUI(new Button(ALL,DIALBAR,x,y+SliderSize*1,IconSize, Size, 'x', true));
+ addUI(new SliderBar(ALL,DIALBAR,
+ x+IconSize,y+SliderSize, 0.75, SliderSize, &core->starSize, &Core::setStarSize, 'c','v'));
+
+ addUI(new Button(ALL,DIALBAR,x+0.5,y+SliderSize*2-0.025,IconSize, FgColor, 0, true));
+ addUI(new SliderBar(ALL,DIALBAR,
+ x,y+SliderSize*2, 0.45, SliderSize, &(core->fgRedSlider), &Core::setupPalette, 'b','n'));
+ addUI(new SliderBar(ALL,DIALBAR,
+ x+0.5+SliderSize,y+SliderSize*2, 0.45, SliderSize, &core->fgGreenSlider, &Core::setupPalette, 'm',','));
+
+ addUI(new Button(ALL,DIALBAR,x+0.5,y+SliderSize*3,IconSize, BgColor, 0, true));
+ addUI(new SliderBar(ALL,DIALBAR,
+ x,y+SliderSize*3, 0.45, SliderSize, &core->bgRedSlider, &Core::setupPalette, 'B','N'));
+ addUI(new SliderBar(ALL,DIALBAR,
+ x+0.5+SliderSize,y+SliderSize*3, 0.45, SliderSize, &core->bgGreenSlider, &Core::setupPalette, 'M','<'));
+
+ x += 0.1;// y += 0.0625;
+ //static double value = 0.5;
+ //addUI(new SliderBar(ALL,0,0.75,1.0,0.25,&value));
+
+ //addUI(new Button(BUTTONBAR,x,y,IconSize, 1, 'x'));
+ //addUI(new Button(BUTTONBAR,x += IconSize,y,IconSize, 2, 'x'));
+ //addUI(new Button(BUTTONBAR,x += IconSize,y,IconSize, 3, 'x'));
+
+ visibleMask = ALL;
+ mouseX = -1;
+ mouseY = -1;
+ lastY = -1;
+ lastY = -1;
+ countDown = 0;
+ mouseButtons = 0;
+
+ syncToState();
+
+}
+
+Interface::~Interface()
+{
+ KConfig config("noatun/synaescope", false, false, "data");
+ config.writeEntry("mode",core->fadeMode);
+ config.writeEntry("diamonds", core->pointsAreDiamonds);
+ config.writeEntry("brightness", core->brightnessTwiddler);
+ config.writeEntry("starsize", core->starSize);
+ config.writeEntry("FGRed", core->fgRedSlider);
+ config.writeEntry("FGgreen", core->fgGreenSlider);
+ config.writeEntry("BGRed", core->bgRedSlider);
+ config.writeEntry("BGGreen", core->bgGreenSlider);
+}
+
+void Interface::addUI(UIObject *obj)
+{
+ uiObjects.append(obj);
+}
+
+void Interface::syncToState()
+{
+ starsButton->bright = (core->fadeMode == Stars);
+ flameButton->bright = (core->fadeMode == Flame);
+ waveButton->bright = (core->fadeMode == Wave);
+
+ starButton->bright = !core->pointsAreDiamonds;
+ diamondButton->bright = core->pointsAreDiamonds;
+
+ setupPalette();
+}
+
+void Interface::changeState(int transitionSymbol)
+{
+ if (transitionSymbol < 0)
+ {
+ return ;
+ }
+
+ int retVal = 0;
+ switch(transitionSymbol)
+ {
+ case Flame :
+ starsButton->bright = false;
+ flameButton->bright = true;
+ waveButton->bright = false;
+ core->fadeMode = Flame;
+ core->setStarSize(core->starSize);
+ break;
+ case Wave :
+ starsButton->bright = false;
+ flameButton->bright = false;
+ waveButton->bright = true;
+ core->fadeMode = Wave;
+ core->setStarSize(core->starSize);
+ break;
+ case Stars :
+ starsButton->bright = true;
+ flameButton->bright = false;
+ waveButton->bright = false;
+ core->fadeMode = Stars;
+ core->setStarSize(core->starSize);
+ break;
+
+ case Star :
+ core->pointsAreDiamonds = false;
+ starButton->bright = true;
+ diamondButton->bright = false;
+ break;
+ case Diamond :
+ core->pointsAreDiamonds = true;
+ starButton->bright = false;
+ diamondButton->bright = true;
+ break;
+
+ case Exit :
+ retVal = 1; break;
+ }
+// return retVal;
+}
+
+bool Interface::go()
+{
+ int newVisibleMask = ALL;
+ char keyHit;
+ int action = NotASymbol;
+ int oldButtons = mouseButtons;
+
+ core->screen->sizeUpdate();
+ if (!core->screen->inputUpdate(mouseX,mouseY,mouseButtons,keyHit))
+ return false;
+
+ bool mouseClick = (mouseButtons && !oldButtons);
+
+ if ((mouseX != lastX || mouseY != lastY) &&
+ lastX > 0 && lastY > 0 &&
+ lastX < core->outWidth && lastY < core->outHeight)
+ countDown = 40;
+
+ int activeMask = ALL;
+
+ if (countDown)
+ {
+ countDown--;
+
+ double scale =
+ (core->outWidth*0.625 < core->outHeight ? core->outWidth*0.625 : core->outHeight);
+ double scaledX = mouseX / scale;
+ double scaledY = mouseY / scale;
+
+ char hotKey = 0;
+
+ core->polygonEngine.clear();
+
+// stateButton->icon = core->state;
+
+
+ for (UIObject *i=uiObjects.first(); i!=0; i = uiObjects.next())
+ {
+ if ((i->visibleMask & visibleMask) && (i->activeMask & activeMask))
+ newVisibleMask |= i->go(mouseButtons,mouseClick,
+ (scaledX >= i->x &&
+ scaledY >= i->y &&
+ scaledX < i->x+i->width &&
+ scaledY < i->y+i->height),
+ scaledX - i->x,
+ scaledY - i->y,
+ scale,
+ hotKey,
+ action);
+ }
+
+ visibleMask = newVisibleMask;
+ if (visibleMask != 1)
+ countDown = 20;
+
+ core->polygonEngine.icon(Icons[Pointer],0x0303,mouseX,mouseY,50,50);
+
+ core->polygonEngine.apply(core->outputBmp.data);
+
+ char hint[2] = " ";
+ hint[0] = hotKey;
+ putString(hint,mouseX+6,mouseY+7,0,0);
+ }
+
+ if (keyHit)
+ for(UIObject *i=uiObjects.first(); i!=0; i = uiObjects.next())
+ if (i->activeMask & activeMask)
+ i->handleKey(keyHit,action);
+
+
+ lastX = mouseX;
+ lastY = mouseY;
+
+ changeState(action);
+
+ return true;
+}
+
+#undef output
diff --git a/noatun-plugins/tyler/AUTHORS b/noatun-plugins/tyler/AUTHORS
new file mode 100644
index 0000000..be639e7
--- /dev/null
+++ b/noatun-plugins/tyler/AUTHORS
@@ -0,0 +1,8 @@
+Noatun conversion
+Neil Stevens <multivac@fcmail.com>
+
+Original XMMS plugin "Infinity"
+Julien Carme <julien.carme@acm.org>
+
+with optimisations by
+Mitja Horvat <Mitja.Horvat@hermes.si>
diff --git a/noatun-plugins/tyler/COPYING b/noatun-plugins/tyler/COPYING
new file mode 100644
index 0000000..623b625
--- /dev/null
+++ b/noatun-plugins/tyler/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/noatun-plugins/tyler/Makefile.am b/noatun-plugins/tyler/Makefile.am
new file mode 100644
index 0000000..b42b7a0
--- /dev/null
+++ b/noatun-plugins/tyler/Makefile.am
@@ -0,0 +1,21 @@
+INCLUDES= $(all_includes) $(SDL_CFLAGS)
+
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = noatuntyler.la
+
+noatuntyler_la_SOURCES = tyler.cpp
+noatuntyler_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+noatuntyler_la_LIBADD = $(LIB_KFILE) -lnoatun -lm
+
+bin_PROGRAMS = noatuntyler.bin
+
+noatuntyler_bin_SOURCES = main.cpp file.cpp compute.c display.c renderer.c
+noatuntyler_bin_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+noatuntyler_bin_LDADD = $(LIB_KDECORE) -lm $(SDL_LIBS)
+
+noatun_DATA = tyler.plugin tylerstates
+noatundir = $(kde_datadir)/noatun
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/tyler.pot
diff --git a/noatun-plugins/tyler/README b/noatun-plugins/tyler/README
new file mode 100644
index 0000000..246a966
--- /dev/null
+++ b/noatun-plugins/tyler/README
@@ -0,0 +1,89 @@
+Infinity -- An XMMS Visualization Plug-in
+------------------------------------
+
+version 0.2
+
+by Julien Carme Copyright(C) 2000
+
+Infinity is a XMMS plug-in which generate full-screen interactive light effects
+according to a music.
+
+The installation can be done by a very standard ./configure && make && make install
+
+To run the plug-in,
+-run xmms
+-enter the visualization plug-ins menu (Ctrl-V),
+-choose Infinity.
+-choose Configure, and your resolution.
+-choose Enable, and press Tab to enter Full-Screen mode.
+-to stop it, press Tab again and disable it.
+
+You can change the resolution in the configuration menu. In full-screen mode,SDL
+should choose the best possible resolution according to the resolution you asked
+for. For example, 640x300 will display a letter-box screen in 640x480.
+See SDL section for more information about the scale factor.
+
+You don't need to be root to enter the full-screen mode.
+
+There is two different modes in this plug-in, the default mode is non-interactive:
+
+-Non-Interactive Mode:
+
+States and palettes are selected randomly, and change sometimes.
+
+ Keys:
+ - Space: change effect.
+ - F12: change palette.
+ - Tab: toggle full-screen.
+ - Enter: switch to interactive mode.
+ - F11: screenshot
+
+
+-Interactive Mode:
+
+You can control the effect:
+
+ Keys:
+
+ - F12: change palette.
+ - Tab: toggle full-screen.
+ - Enter: switch to non-interactive mode.
+ - F1-F10: choose transformation vector field
+ - a,z: change curve 1 lighting
+ - q,s: change curve 2 lighting
+ - e,r: change curve 1 amplitude
+ - d,f: change curve 2 amplitude
+ - w: change curve 2 type
+ - mouse: change curve 2 position
+ - F11: screensh
+.
+
+Speed:
+------
+Infinity need a smooth animation to be interesting.
+To increase speed, you can:
+-compile with pgcc and full (-O6) optimisations.
+-use low resolutions and letter box effect.
+In 320x160, it should run on a small pentiums.
+
+SDL:
+----
+You must have installed a recent version of SDL(>=1.0.6) to run this program.
+If you experience problems with SDL, refer to their documentation first.
+If you cannot obtain low resolutions, you should add them to the
+screen section of your /etc/XF86Config (you can use your X configurator
+instead of editing it yourself). If and only if you cannot change your
+XF86Config, you can change the scale factor in the preference menu. But
+the program will be much slower.
+
+Known Bugs:
+-----------
+Your X has to be at least in 16 bpp to make this program work. If you have more
+than 16 bpp, it should work but may be very slow. If you still use a 8 bpp X,
+mail me, I would really like to know if an implementation of it could interest
+somebody.
+Preferences cannot be saved, and cannot be changed while the plug-in is enabled.
+
+
+Please send questions, comments, suggestions, bug reports or anything else to:
+julien.carme@acm.org
diff --git a/noatun-plugins/tyler/README.Infinity b/noatun-plugins/tyler/README.Infinity
new file mode 100644
index 0000000..246a966
--- /dev/null
+++ b/noatun-plugins/tyler/README.Infinity
@@ -0,0 +1,89 @@
+Infinity -- An XMMS Visualization Plug-in
+------------------------------------
+
+version 0.2
+
+by Julien Carme Copyright(C) 2000
+
+Infinity is a XMMS plug-in which generate full-screen interactive light effects
+according to a music.
+
+The installation can be done by a very standard ./configure && make && make install
+
+To run the plug-in,
+-run xmms
+-enter the visualization plug-ins menu (Ctrl-V),
+-choose Infinity.
+-choose Configure, and your resolution.
+-choose Enable, and press Tab to enter Full-Screen mode.
+-to stop it, press Tab again and disable it.
+
+You can change the resolution in the configuration menu. In full-screen mode,SDL
+should choose the best possible resolution according to the resolution you asked
+for. For example, 640x300 will display a letter-box screen in 640x480.
+See SDL section for more information about the scale factor.
+
+You don't need to be root to enter the full-screen mode.
+
+There is two different modes in this plug-in, the default mode is non-interactive:
+
+-Non-Interactive Mode:
+
+States and palettes are selected randomly, and change sometimes.
+
+ Keys:
+ - Space: change effect.
+ - F12: change palette.
+ - Tab: toggle full-screen.
+ - Enter: switch to interactive mode.
+ - F11: screenshot
+
+
+-Interactive Mode:
+
+You can control the effect:
+
+ Keys:
+
+ - F12: change palette.
+ - Tab: toggle full-screen.
+ - Enter: switch to non-interactive mode.
+ - F1-F10: choose transformation vector field
+ - a,z: change curve 1 lighting
+ - q,s: change curve 2 lighting
+ - e,r: change curve 1 amplitude
+ - d,f: change curve 2 amplitude
+ - w: change curve 2 type
+ - mouse: change curve 2 position
+ - F11: screensh
+.
+
+Speed:
+------
+Infinity need a smooth animation to be interesting.
+To increase speed, you can:
+-compile with pgcc and full (-O6) optimisations.
+-use low resolutions and letter box effect.
+In 320x160, it should run on a small pentiums.
+
+SDL:
+----
+You must have installed a recent version of SDL(>=1.0.6) to run this program.
+If you experience problems with SDL, refer to their documentation first.
+If you cannot obtain low resolutions, you should add them to the
+screen section of your /etc/XF86Config (you can use your X configurator
+instead of editing it yourself). If and only if you cannot change your
+XF86Config, you can change the scale factor in the preference menu. But
+the program will be much slower.
+
+Known Bugs:
+-----------
+Your X has to be at least in 16 bpp to make this program work. If you have more
+than 16 bpp, it should work but may be very slow. If you still use a 8 bpp X,
+mail me, I would really like to know if an implementation of it could interest
+somebody.
+Preferences cannot be saved, and cannot be changed while the plug-in is enabled.
+
+
+Please send questions, comments, suggestions, bug reports or anything else to:
+julien.carme@acm.org
diff --git a/noatun-plugins/tyler/compute.c b/noatun-plugins/tyler/compute.c
new file mode 100644
index 0000000..78d6f90
--- /dev/null
+++ b/noatun-plugins/tyler/compute.c
@@ -0,0 +1,188 @@
+/*
+// Copyright (C) 2000 Julien Carme
+// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2, as
+// published by the Free Software Foundation.
+//
+// This program 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 the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#include <math.h>
+#include "renderer.h"
+#include "compute.h"
+
+#define PI 3.14159
+
+t_complex fct(t_complex a,int n,int p1,int p2) /*p1 et p2:0-4 */
+{
+ t_complex b;
+ float fact;
+ float an;
+ float circle_size;
+ float speed;
+ float co,si;
+
+ a.x-=scr_par.width/2;
+ a.y-=scr_par.height/2;
+
+ switch (n) {
+
+ case 0:
+ an=0.025*(p1-2)+0.002;
+ co=cos(an);
+ si=sin(an);
+ circle_size=scr_par.height*0.25;
+ speed=2000+p2*500;
+ b.x=(co*a.x-si*a.y);
+ b.y=(si*a.x+co*a.y);
+ fact=-(sqrt(b.x*b.x+b.y*b.y)-circle_size)/speed+1;
+ b.x=(b.x*fact);
+ b.y=(b.y*fact);
+ break;
+
+ case 1:
+ an=0.015*(p1-2)+0.002;
+ co=cos(an);
+ si=sin(an);
+ circle_size=scr_par.height*0.45;
+ speed=4000+p2*1000;
+ b.x=(co*a.x-si*a.y);
+ b.y=(si*a.x+co*a.y);
+ fact=(sqrt(b.x*b.x+b.y*b.y)-circle_size)/speed+1;
+ b.x=(b.x*fact);
+ b.y=(b.y*fact);
+ break;
+
+ case 2:
+ an=0.002;
+ co=cos(an);
+ si=sin(an);
+ circle_size=scr_par.height*0.25;
+ speed=400+p2*100;
+ b.x=(co*a.x-si*a.y);
+ b.y=(si*a.x+co*a.y);
+ fact=-(sqrt(b.x*b.x+b.y*b.y)-circle_size)/speed+1;
+ b.x=(b.x*fact);
+ b.y=(b.y*fact);
+ break;
+
+ case 3:
+ an=(sin(sqrt(a.x*a.x+a.y*a.y)/20)/20)+0.002;
+ co=cos(an);
+ si=sin(an);
+ circle_size=scr_par.height*0.25;
+ speed=4000;
+ b.x=(co*a.x-si*a.y);
+ b.y=(si*a.x+co*a.y);
+ fact=-(sqrt(b.x*b.x+b.y*b.y)-circle_size)/speed+1;
+ b.x=(b.x*fact);
+ b.y=(b.y*fact);
+ break;
+
+ case 4:
+ an=0.002;
+ co=cos(an);
+ si=sin(an);
+ circle_size=scr_par.height*0.25;
+ speed=sin(sqrt(a.x*a.x+a.y*a.y)/5)*3000+4000;
+ b.x=(co*a.x-si*a.y);
+ b.y=(si*a.x+co*a.y);
+ fact=-(sqrt(b.x*b.x+b.y*b.y)-circle_size)/speed+1;
+ b.x=(b.x*fact);
+ b.y=(b.y*fact);
+ break;
+
+ case 5:
+ b.x=a.x*1.02;
+ b.y=a.y*1.02;
+ break;
+
+ case 6:
+ an=0.002;
+ co=cos(an);
+ si=sin(an);
+ circle_size=scr_par.height*0.25;
+ fact=1+cos(atan(a.x/(a.y+0.00001))*6)*0.02;
+ b.x=(co*a.x-si*a.y);
+ b.y=(si*a.x+co*a.y);
+ b.x=(b.x*fact);
+ b.y=(b.y*fact);
+ break;
+
+ }
+
+ b.x+=scr_par.width/2;
+ b.y+=scr_par.height/2;
+ if (b.x<0)
+ b.x=0;
+ if (b.y<0)
+ b.y=0;
+ if (b.x>scr_par.width-1)
+ b.x=scr_par.width-1;
+ if (b.y>scr_par.height-1)
+ b.y=scr_par.height-1;
+
+ return b;
+}
+
+
+void generate_sector(int g,int f,int p1,int p2,int debut,int step,t_interpol* vector_field);
+
+void generate_sector(int g,int f,int p1,int p2,int debut,int step,t_interpol* vector_field)
+{
+ int fin=debut+step;
+ const int prop_transmitted=249;
+ const int b_add=g*scr_par.width*scr_par.height;
+ t_coord c;
+
+
+ if (fin>scr_par.height)
+ fin=scr_par.height;
+ for (c.y=debut;c.y<fin;c.y++)
+ for (c.x=0;c.x<scr_par.width;c.x++) {
+ t_complex a;
+ float fpy;
+ int rw,lw,add;
+ unsigned int w1,w2,w3,w4;
+ unsigned int x,y;
+
+ a.x=(float)c.x;
+ a.y=(float)c.y;
+ a=fct(a,f,p1,p2);
+ add=c.x+c.y*scr_par.width;
+ x=(int)(a.x);
+ y=(int)(a.y);
+ vector_field[b_add+add].coord=(x<<16)|y;
+
+ fpy=a.y-floor(a.y);
+ rw=(int)((a.x-floor(a.x))*prop_transmitted);
+ lw=prop_transmitted-rw;
+ w4=(int)(fpy*rw);
+ w2=rw-w4;
+ w3=(int)(fpy*lw);
+ w1=lw-w3;
+ vector_field[b_add+add].weight=(w1<<24)|(w2<<16)|(w3<<8)|w4;
+ }
+}
+
+void generate_vector_field(t_interpol* vector_field)
+{
+ int f;
+ int i,p1,p2;
+
+ for (f=0;f<NB_FCT;f++) {
+ p1=2;
+ p2=2;
+ for (i=0;i<scr_par.height;i+=10)
+ generate_sector(f,f,p1,p2,i,10,vector_field);
+ }
+}
diff --git a/noatun-plugins/tyler/compute.h b/noatun-plugins/tyler/compute.h
new file mode 100644
index 0000000..5025360
--- /dev/null
+++ b/noatun-plugins/tyler/compute.h
@@ -0,0 +1,23 @@
+/*
+// Copyright (C) 2000 Julien Carme
+// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2, as
+// published by the Free Software Foundation.
+//
+// This program 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 the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#define NB_FCT 7
+
+t_complex fct(t_complex a,int n,int p1,int p2);
+void generate_vector_field(t_interpol* vector_field);
+
diff --git a/noatun-plugins/tyler/display.c b/noatun-plugins/tyler/display.c
new file mode 100644
index 0000000..6b4f295
--- /dev/null
+++ b/noatun-plugins/tyler/display.c
@@ -0,0 +1,481 @@
+/*
+// Copyright (C) 2000 Julien Carme
+// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2, as
+// published by the Free Software Foundation.
+//
+// This program 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 the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#include "renderer.h"
+#include "main.h"
+#include "display.h"
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include <SDL.h>
+
+
+SDL_Color color_table[NB_PALETTES][256];
+short current_colors[256];
+
+byte* surface1;
+byte* surface2;
+
+void generate_colors(void)
+{
+ int i,k;
+ float colors[NB_PALETTES][2][3]={{{1,1,1},{1,1,1}},
+ {{2,1.5,0},{0,0.5,2}},
+ {{0,1,2},{0,1,0}},
+ {{0,2,1},{0,0,1}},
+ {{2,0,0},{0,1,1}}};
+
+ for (k=0;k<NB_PALETTES;k++)
+ {
+ for ( i=0; i<128; i++ )
+ {
+ color_table[k][i].r = colors[k][0][0]*i;
+ color_table[k][i].g = colors[k][0][1]*i;
+ color_table[k][i].b = colors[k][0][2]*i;
+ }
+
+ for ( i=0; i<128; i++ )
+ {
+ color_table[k][i+128].r = colors[k][0][0]*127+colors[k][1][0]*i;
+ color_table[k][i+128].g = colors[k][0][1]*127+colors[k][1][1]*i;
+ color_table[k][i+128].b = colors[k][0][2]*127+colors[k][1][2]*i;
+ }
+ }
+}
+
+void change_color(int t2,int t1,int w)
+{
+ unsigned int i;
+
+ for (i=0;i<255;i++)
+ {
+ int r,g,b;
+ r = (color_table[t1][i].r*w+color_table[t2][i].r*(256-w) )>>11;
+ g = (color_table[t1][i].g*w+color_table[t2][i].g*(256-w) )>>10;
+ b = (color_table[t1][i].b*w+color_table[t2][i].b*(256-w) )>>11;
+ current_colors[i]=(r<<11)+(g<<5)+b;
+ }
+}
+
+void compute_surface(t_interpol* vector_field)
+{
+ int i,j;
+ int add_dest=0;
+ int add_src;
+ t_interpol *interpol;
+ register byte* ptr_pix;
+ int color;
+ byte* ptr_swap;
+
+ for (j=0;j<scr_par.height;j++)
+ {
+ for (i=0;i<scr_par.width;i++)
+ {
+ interpol=&vector_field[add_dest];
+ add_src=(interpol->coord & 0xFFFF)*scr_par.width+(interpol->coord>>16);
+ ptr_pix=&((byte*)surface1)[add_src];
+ color=(*(ptr_pix)*(interpol->weight>>24)
+ +*(ptr_pix+1)*((interpol->weight & 0xFFFFFF)>>16)
+ +*(ptr_pix+scr_par.width)*((interpol->weight & 0xFFFF)>>8)
+ +*(ptr_pix+scr_par.width+1)*(interpol->weight & 0xFF))>>8;
+
+ if (color>255)
+ surface2[add_dest]=255;
+ else
+ surface2[add_dest]=color;
+ add_dest++;
+ }
+ }
+
+ ptr_swap=surface1;
+ surface1=surface2;
+ surface2=ptr_swap;
+}
+
+void display_surface(void)
+{
+ int i,j;
+
+ if (scr_par.scale>1)
+ {
+ for (i=0;i<scr_par.height;i++)
+ {
+ short* pdest=(short*)(screen->pixels+i*screen->pitch*scr_par.scale);
+ byte* psrc=surface1+i*scr_par.width;
+
+ if (scr_par.scale==2)
+ {
+ for (j=1; j<scr_par.width; j++)
+ {
+ *pdest = current_colors[*psrc++];
+ pdest++;
+ *pdest = *(pdest-1);
+ pdest++;
+ }
+
+ memcpy(screen->pixels+i*screen->pitch*2+screen->pitch,
+ screen->pixels+i*screen->pitch*2,screen->pitch);
+ }
+/* else
+ {
+ for (j=1;j<scr_par.width;j++) {
+ *(pdest++)=current_colors[*psrc++];
+ *(pdest++)=*(pdest-1);
+ *(pdest++)=*(pdest-1);
+ }
+ memcpy(screen->pixels+i*screen->pitch*3+screen->pitch,
+ screen->pixels+i*screen->pitch*3,screen->pitch);
+ memcpy(screen->pixels+i*screen->pitch*3+screen->pitch*2,
+ screen->pixels+i*screen->pitch*3,screen->pitch);
+
+ }
+*/
+ }
+ }
+ else
+ {
+ byte* psrc=surface1;
+ for (i=0;i<scr_par.height;i++)
+ {
+ short* pdest=(short*)(screen->pixels+i*screen->pitch);
+ for (j=0;j<scr_par.width;j++)
+ *pdest++=current_colors[*psrc++];
+ }
+ }
+ SDL_UpdateRect(screen, 0, 0, 0, 0);
+}
+
+void blur(t_interpol* vector_field)
+{
+ compute_surface(vector_field);
+ display_surface();
+}
+
+void plot1(int x,int y,int c);
+void plot1(int x,int y,int c)
+{
+ if (x>0 && x<scr_par.width-3 && y>0 && y<scr_par.height-3)
+ assign_max(&(surface1)[x+y*scr_par.width],c);
+}
+
+void plot2(int x,int y,int c);
+void plot2(int x,int y,int c)
+{
+ int ty;
+
+ if (x>0 && x<scr_par.width-3 && y>0 && y<scr_par.height-3) {
+ ty = y*scr_par.width;
+ assign_max(&(surface1)[x+ty],c);
+ assign_max(&(surface1)[x+1+ty],c);
+ assign_max(&(surface1)[x+ty+scr_par.width],c);
+ assign_max(&(surface1)[x+1+ty+scr_par.width],c);
+ }
+}
+
+
+void plot3(int x,int y,int c);
+void plot3(int x,int y,int c)
+{
+ int ty;
+
+ if (x>0 && x<scr_par.width-3 && y>0 && y<scr_par.height-3) {
+ ty = y*scr_par.width;
+ assign_max(&(surface1)[x+ty],c/3);
+ assign_max(&(surface1)[x+1+ty],c>>1);
+ assign_max(&(surface1)[x+ty+scr_par.width],c>>1);
+ assign_max(&(surface1)[x+1+ty+scr_par.width],c);
+ assign_max(&(surface1)[x+ty+(scr_par.width<<1)],c/3);
+ assign_max(&(surface1)[x+2+ty+(scr_par.width<<1)],c/3);
+ assign_max(&(surface1)[x+1+ty+(scr_par.width<<1)],c>>1);
+ assign_max(&(surface1)[x+2+ty+scr_par.width],c>>1);
+ assign_max(&(surface1)[x+2+ty+scr_par.width],c/3);
+ }
+}
+
+#if 0
+void line(int x1,int y1,int x2,int y2,int c)
+{
+ int i,j;
+ float x,y,vx,vy,d;
+ const float step=1;
+
+ if (x1==x2 && y1==y2)
+ plot3(x1,y1,255);
+ else {
+ x=x1;
+ y=y1;
+ d=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
+ vx=step*(x2-x1)/d;
+ vy=step*(y2-y1)/d;
+ for (i=0;i<(int)(d/step)+1;i++) {
+ plot1(x,y,c);
+ x+=vx;
+ y+=vy;
+ }
+ }
+}
+#endif
+
+#define SWAP(x,y) \
+ x = x + y; \
+ y = x - y; \
+ x = x - y;
+
+void line(int _x1, int _y1, int _x2, int _y2, int _c)
+{
+ int dx, dy, cxy, dxy;
+ /* calculate the distances */
+ dx = abs(_x1 - _x2);
+ dy = abs(_y1 - _y2);
+
+ cxy = 0;
+ if (dy > dx)
+ {
+ /* Follow Y axis */
+ if (_y1 > _y2)
+ {
+ SWAP(_y1, _y2);
+ SWAP(_x1, _x2);
+ }
+
+ if (_x1 > _x2)
+ dxy = -1;
+ else
+ dxy = 1;
+
+ for (_y1=_y1; _y1<_y2; _y1++)
+ {
+ cxy += dx;
+ if (cxy >= dy)
+ {
+ _x1+= dxy;
+ cxy -= dy;
+ }
+ plot1(_x1, _y1, _c);
+ }
+ }
+ else
+ {
+ /* Follow X axis */
+ if (_x1 > _x2)
+ {
+ SWAP(_x1, _x2);
+ SWAP(_y1, _y2);
+ }
+
+ if (_y1 > _y2)
+ dxy = -1;
+ else
+ dxy = 1;
+
+ for (_x1=_x1; _x1<_x2; _x1++)
+ {
+ cxy += dy;
+ if (cxy >= dx)
+ {
+ _y1+=dxy;
+ cxy -= dx;
+ }
+ plot1(_x1, _y1, _c);
+ }
+ }
+}
+
+struct sincos
+{
+ int i;
+ float *f;
+};
+
+/* Little optimization for cos/sin functions */
+static struct sincos cosw = { 0, NULL };
+static struct sincos sinw = { 0, NULL };
+
+void spectral(t_effect* current_effect,short data[2][512])
+{
+ int i, halfheight, halfwidth;
+ float old_y1,old_y2;
+ float _y1=(((data[0][0]+data[1][0])>>9)*current_effect->spectral_amplitude*scr_par.height)>>12;
+ float _y2=(((data[0][0]+data[1][0])>>9)*current_effect->spectral_amplitude*scr_par.height)>>12;
+ const int density_lines=5;
+ const int step=4;
+ const int shift=(current_effect->spectral_shift*scr_par.height)>>8;
+
+ if (cosw.i != scr_par.width || sinw.i != scr_par.width)
+ {
+ free(cosw.f);
+ free(sinw.f);
+ sinw.f = cosw.f = NULL;
+ sinw.i = cosw.i = 0;
+ }
+
+ if (cosw.i == 0 || cosw.f == NULL)
+ {
+ float halfPI = (float)PI/2;
+ cosw.i = scr_par.width;
+ cosw.f = malloc(sizeof(float)*scr_par.width);
+ for (i=0; i<scr_par.width;i+=step)
+ cosw.f[i] = cos((float)i/scr_par.width*PI+halfPI);
+ }
+
+ if (sinw.i == 0 || sinw.f == NULL)
+ {
+ float halfPI = (float)PI/2;
+ sinw.i = scr_par.width;
+ sinw.f = malloc(sizeof(float)*scr_par.width);
+ for (i=0; i<scr_par.width;i+=step)
+ sinw.f[i] = sin((float)i/scr_par.width*PI+halfPI);
+ }
+
+ if (current_effect->mode_spectre==3)
+ {
+ if (_y1<0)
+ _y1=0;
+
+ if (_y2<0)
+ _y2=0;
+ }
+
+ halfheight = scr_par.height >> 1;
+ halfwidth = scr_par.width >> 1;
+ for (i=step;i<scr_par.width;i+=step)
+ {
+ old_y1=_y1;
+ old_y2=_y2;
+ _y1=((data[1][(i<<9)/scr_par.width/density_lines]>>8)*
+ current_effect->spectral_amplitude*scr_par.height)>>12;
+ _y2=((data[0][(i<<9)/scr_par.width/density_lines]>>8)*
+ current_effect->spectral_amplitude*scr_par.height)>>12;
+
+ switch (current_effect->mode_spectre)
+ {
+ case 0:
+ line(i-step,halfheight+shift+old_y2,
+ i,halfheight+shift+_y2,
+ current_effect->spectral_color);
+ break;
+ case 1:
+ line(i-step,halfheight+shift+old_y1,
+ i,halfheight+shift+_y1,
+ current_effect->spectral_color);
+ line(i-step,halfheight-shift+old_y2,
+ i,halfheight-shift+_y2,
+ current_effect->spectral_color);
+ break;
+ case 2:
+ line(i-step,halfheight+shift+old_y1,
+ i,halfheight+shift+_y1,
+ current_effect->spectral_color);
+ line(i-step,halfheight-shift+old_y1,
+ i,halfheight-shift+_y1,
+ current_effect->spectral_color);
+ line(halfwidth+shift+old_y2,i-step,
+ halfwidth+shift+_y2,i,
+ current_effect->spectral_color);
+ line(halfwidth-shift+old_y2,i-step,
+ halfwidth-shift+_y2,i,
+ current_effect->spectral_color);
+ break;
+ case 3:
+ if (_y1<0)
+ _y1=0;
+ if (_y2<0)
+ _y2=0;
+ case 4:
+ line(halfwidth + cosw.f[i-step] * (shift+old_y1),
+ halfheight + sinw.f[i-step] * (shift+old_y1),
+ halfwidth + cosw.f[i] * (shift+_y1),
+ halfheight + sinw.f[i] * (shift+_y1),
+ current_effect->spectral_color);
+ line(halfwidth - cosw.f[i-step] * (shift+old_y2),
+ halfheight + sinw.f[i-step] * (shift+old_y2),
+ halfwidth - cosw.f[i] * (shift+_y2),
+ halfheight + sinw.f[i] * (shift+_y2),
+ current_effect->spectral_color);
+ break;
+ }
+ }
+
+ if (current_effect->mode_spectre==3 || current_effect->mode_spectre==4)
+ line(halfwidth + cosw.f[scr_par.width - step] * (shift+_y1),
+ halfheight + sinw.f[scr_par.width - step] * (shift+_y1),
+ halfwidth - cosw.f[scr_par.width - step] * (shift+_y2),
+ halfheight + sinw.f[scr_par.width - step] * (shift+_y2),
+ current_effect->spectral_color);
+}
+
+void curve(t_effect* current_effect)
+{
+ int i,j,k;
+ float v,vr;
+ float x,y;
+ float amplitude=(float)current_effect->curve_amplitude/256;
+
+ for (j=0;j<2;j++)
+ {
+ v=80;
+ vr=0.001;
+ k=current_effect->x_curve;
+ for (i=0;i<64;i++)
+ {
+ x=cos((float)(k)/(v+v*j*1.34))*scr_par.height*amplitude;
+ y=sin((float)(k)/(1.756*(v+v*j*0.93)))*scr_par.height*amplitude;
+ plot2(x*cos((float)k*vr)+y*sin((float)k*vr)+scr_par.width/2,
+ x*sin((float)k*vr)-y*cos((float)k*vr)+scr_par.height/2,
+ current_effect->curve_color);
+ k++;
+ }
+ }
+ current_effect->x_curve=k;
+}
+
+
+void init_sdl(void)
+{
+ surface1=(byte*)malloc(scr_par.width*scr_par.height);
+ surface2=(byte*)malloc(scr_par.width*scr_par.height);
+
+ if ( SDL_Init(SDL_INIT_VIDEO) < 0 )
+ {
+ fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
+ exit(1);
+ }
+
+ SDL_WM_SetCaption("Tyler", 0L);
+ screen = SDL_SetVideoMode(scr_par.width * scr_par.scale,
+ scr_par.height * scr_par.scale, 16, VIDEO_FLAGS);
+
+ if ( screen == NULL )
+ {
+ fprintf(stderr, "Couldn't init video mode: %s\n", SDL_GetError());
+ exit(1);
+ }
+ SDL_ShowCursor(0);
+ SDL_EnableKeyRepeat(0,0);
+}
+
+void toggle_fullscreen(void)
+{
+ SDL_WM_ToggleFullScreen(screen);
+}
+
+void close_sdl(void)
+{
+ SDL_Quit();
+}
diff --git a/noatun-plugins/tyler/display.h b/noatun-plugins/tyler/display.h
new file mode 100644
index 0000000..d71b6c6
--- /dev/null
+++ b/noatun-plugins/tyler/display.h
@@ -0,0 +1,40 @@
+/*
+// Copyright (C) 2000 Julien Carme
+// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2, as
+// published by the Free Software Foundation.
+//
+// This program 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 the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#ifndef _DISPLAY_H_
+#define _DISPLAY_H_
+
+#define NB_PALETTES 5
+#define wrap(a) ( a < 0 ? 0 : ( a > 255 ? 255 : a ))
+#define assign_max(p,a) ( *p = ( *p > a ? *p : a ))
+#define PI 3.14159
+
+#define VIDEO_FLAGS (SDL_HWSURFACE|SDL_HWPALETTE)
+
+void generate_colors(void);
+void change_color(int old_p,int p,int w);
+void compute_surface(t_interpol* vector_field);
+void display_surface(void);
+void blur(t_interpol* vector_field);
+void spectral(t_effect* current_effect,short data[2][512]);
+void line(int _x1, int _y1, int _x2, int _y2, int _c);
+void curve(t_effect* current_effect);
+void init_sdl(void);
+void toggle_fullscreen(void);
+void close_sdl(void);
+#endif
diff --git a/noatun-plugins/tyler/file.cpp b/noatun-plugins/tyler/file.cpp
new file mode 100644
index 0000000..58ddd79
--- /dev/null
+++ b/noatun-plugins/tyler/file.cpp
@@ -0,0 +1,81 @@
+/*
+// Copyright (C) 2000 Julien Carme
+// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2, as
+// published by the Free Software Foundation.
+//
+// This program 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 the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+extern "C"
+{
+#include "renderer.h"
+#include <stdlib.h>
+}
+
+#include <qfile.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+
+static QString getDataPath(void)
+{
+ KStandardDirs &dirs = *KGlobal::dirs();
+
+ return dirs.findResource("data", "noatun/tylerstates");
+}
+
+static QString getSavePath(void)
+{
+ KStandardDirs &dirs = *KGlobal::dirs();
+ return dirs.saveLocation("data", "noatun/") + "tylerstates";
+}
+
+extern "C" void save_effect(t_effect *effect)
+{
+ QFile file(getSavePath());
+ if(!file.open(IO_WriteOnly))
+ return;
+
+ for(unsigned i = 0; i < sizeof(t_effect); i++)
+ file.putch( *((byte *)effect + i) );
+}
+
+t_effect effects[100];
+int nb_effects=0;
+
+extern "C" void load_effects()
+{
+ QFile file(getDataPath());
+ if(!file.open(IO_ReadOnly))
+ exit(1);
+
+ unsigned int i;
+ nb_effects = 0;
+ while(!file.atEnd())
+ {
+ byte* ptr_effect = (byte *)&effects[nb_effects++];
+ for(i = 0; i < sizeof(t_effect); i++)
+ ptr_effect[i] = file.getch();
+ }
+}
+
+extern "C" void load_random_effect(t_effect *effect)
+{
+ if(nb_effects > 0)
+ {
+ int num_effect = rand() % nb_effects;
+ unsigned int i;
+
+ for(i = 0; i < sizeof(t_effect) ; i++)
+ *((byte*)effect+i)=*((byte*)(&effects[num_effect])+i);
+ }
+}
diff --git a/noatun-plugins/tyler/file.h b/noatun-plugins/tyler/file.h
new file mode 100644
index 0000000..270bbea
--- /dev/null
+++ b/noatun-plugins/tyler/file.h
@@ -0,0 +1,31 @@
+/*
+// Copyright (C) 2000 Julien Carme
+// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2, as
+// published by the Free Software Foundation.
+//
+// This program 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 the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#ifndef FILE_H
+#define FILE_H
+
+#include <stdio.h>
+#include "renderer.h"
+#include <stdlib.h>
+
+extern void save_effect(t_effect *_effect);
+extern void load_effects(void);
+void load_random_effect(t_effect *effect);
+
+#endif // FILE_H
+
diff --git a/noatun-plugins/tyler/main.cpp b/noatun-plugins/tyler/main.cpp
new file mode 100644
index 0000000..219c6ed
--- /dev/null
+++ b/noatun-plugins/tyler/main.cpp
@@ -0,0 +1,100 @@
+// Copyright (C) 2000 Julien Carme
+// Copyright (C) 2001 Charles Samuels <charles@kde.org>
+// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2, as
+// published by the Free Software Foundation.
+//
+// This program 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 the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+#include <kinstance.h>
+
+extern "C"
+{
+#include <SDL.h>
+#include <SDL_syswm.h>
+#include <SDL_thread.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/time.h>
+#include <sys/types.h>
+
+#include "renderer.h"
+#include "display.h"
+}
+
+// stuff in main.h
+extern "C"
+{
+typedef struct t_config {
+ int xres,yres,sres;
+ int teff,tcol;
+} t_config;
+
+t_config config = {512, 352, 1, 100, 100};
+//t_config config = {640, 480, 1, 100, 100};
+
+bool finished;
+SDL_Thread *thread;
+SDL_mutex *synchro_mutex, *access_mutex;
+short pcm_data[2][512];
+SDL_Surface *screen;
+}
+
+int winID(void)
+{
+ SDL_SysWMinfo info;
+ info.version.major = SDL_MAJOR_VERSION;
+ info.subsystem = SDL_SYSWM_X11;
+
+ SDL_GetWMInfo(&info);
+ return info.info.x11.wmwindow;
+}
+
+int main(int, char **)
+{
+ fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL) & ~O_NONBLOCK);
+
+ atexit(SDL_Quit);
+
+ KInstance in("noatuntyler");
+
+ finished = false;
+ access_mutex = SDL_CreateMutex();
+
+ init_renderer1();
+ printf("%u\n", winID());
+ fflush(stdout);
+ init_renderer2();
+ thread = SDL_CreateThread((int (*)(void *))renderer, NULL);
+
+ fd_set set;
+ struct timeval tv;
+ while(check_finished() != 1)
+ {
+ FD_ZERO(&set);
+ FD_SET(STDIN_FILENO, &set);
+ tv.tv_sec = 0;
+ tv.tv_usec = 250;
+ if(0 < select(STDIN_FILENO + 1, &set, 0, 0, &tv))
+ {
+ SDL_mutexP(access_mutex);
+ read(STDIN_FILENO, (void *)pcm_data, sizeof(short) * 2 * 512);
+ SDL_mutexV(access_mutex);
+ }
+ usleep(5);
+ }
+ /*fprintf(stderr,"exiting main()\n");*/
+ SDL_WaitThread(thread, NULL);
+}
diff --git a/noatun-plugins/tyler/main.h b/noatun-plugins/tyler/main.h
new file mode 100644
index 0000000..9b500b0
--- /dev/null
+++ b/noatun-plugins/tyler/main.h
@@ -0,0 +1,30 @@
+/*
+// Copyright (C) 2000 Julien Carme
+// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2, as
+// published by the Free Software Foundation.
+//
+// This program 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 the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#include <SDL.h>
+
+typedef struct t_config {
+ int xres,yres,sres;
+ int teff,tcol;
+} t_config;
+
+extern int finished;
+extern SDL_mutex *synchro_mutex,*access_mutex;
+extern short pcm_data[2][512];
+extern t_config config;
+extern SDL_Surface *screen;
diff --git a/noatun-plugins/tyler/renderer.c b/noatun-plugins/tyler/renderer.c
new file mode 100644
index 0000000..cd32959
--- /dev/null
+++ b/noatun-plugins/tyler/renderer.c
@@ -0,0 +1,195 @@
+/*
+// Copyright (C) 2000 Julien Carme
+// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2, as
+// published by the Free Software Foundation.
+//
+// This program 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 the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#include "file.h"
+#include "main.h"
+#include "renderer.h"
+#include "compute.h"
+#include "display.h"
+
+#include <SDL.h>
+#include <SDL_keysym.h>
+#include <stdlib.h>
+
+#define wrap(a) ( a < 0 ? 0 : ( a > 255 ? 255 : a ))
+
+t_interpol* vector_field;
+t_effect current_effect;
+t_screen_parametres scr_par;
+t_general_parametres gen_par;
+int old_color=0,color=0;
+int t_last_color,t_last_effect;
+int mode_interactif=0;
+
+void check_events(void)
+{
+ SDL_Event event;
+ byte* keystate;
+ int i;
+ int sx,sy;
+ if (mode_interactif)
+ {
+ SDL_GetMouseState(&sx,&sy);
+ current_effect.spectral_shift=sx;
+ }
+
+ SDL_PollEvent(&event);
+
+ if (event.type == SDL_KEYDOWN)
+ {
+ switch(event.key.keysym.sym)
+ {
+ case SDLK_RETURN:
+ mode_interactif=!mode_interactif;
+ break;
+ case SDLK_SPACE:
+ toggle_fullscreen();
+ break;
+ case SDLK_TAB:
+ load_random_effect(&current_effect);
+ t_last_effect=0;
+ break;
+ case SDLK_F12:
+ if (t_last_color>32)
+ {
+ t_last_color=0;
+ old_color=color;
+ color=(color+1)%NB_PALETTES;
+ }
+ break;
+ case SDLK_m:
+ if (mode_interactif) save_effect(&current_effect);
+ break;
+ case SDLK_w:
+ if (mode_interactif) current_effect.mode_spectre=(current_effect.mode_spectre+1)%5;
+ break;
+ default:
+ break;
+ }
+ }
+ else if (event.type == SDL_QUIT)
+ {
+ finished = 1;
+ return;
+ }
+
+ keystate = SDL_GetKeyState(NULL);
+ if (mode_interactif)
+ {
+ if ( keystate[SDLK_a])
+ current_effect.curve_color=wrap(current_effect.curve_color-32);
+ if ( keystate[SDLK_z])
+ current_effect.curve_color=wrap(current_effect.curve_color+32);
+ if ( keystate[SDLK_q])
+ current_effect.spectral_color=wrap(current_effect.spectral_color-32);
+ if ( keystate[SDLK_s])
+ current_effect.spectral_color=wrap(current_effect.spectral_color+32);
+
+ for (i=0;i<10;i++)
+ {
+ if ( keystate[SDLK_F1+i])
+ current_effect.num_effect=i%NB_FCT;
+ }
+
+ if (keystate[SDLK_d]) {
+ current_effect.spectral_amplitude=(current_effect.spectral_amplitude-1);
+ }
+ if (keystate[SDLK_f]) {
+ current_effect.spectral_amplitude=(current_effect.spectral_amplitude+1);
+ }
+ if (keystate[SDLK_e]) {
+ current_effect.curve_amplitude=(current_effect.curve_amplitude-1);
+ }
+ if (keystate[SDLK_r]) {
+ current_effect.curve_amplitude=(current_effect.curve_amplitude+1);
+ }
+ }
+}
+
+
+int check_finished(void)
+{
+ return finished;
+}
+
+
+void init_renderer1(void)
+{
+ scr_par.width=config.xres;
+ scr_par.height=config.yres;
+ scr_par.scale=config.sres;
+
+ gen_par.t_between_effects=config.teff;
+ gen_par.t_between_colors=config.tcol;
+
+ init_sdl();
+}
+
+void init_renderer2(void)
+{
+ generate_colors();
+ load_effects();
+ load_random_effect(&current_effect);
+
+ vector_field=(t_interpol*)malloc(scr_par.width*scr_par.height*NB_FCT*sizeof(t_interpol));
+ generate_vector_field(vector_field);
+}
+
+
+void renderer(void)
+{
+ while (check_finished() != 1)
+ {
+ check_events();
+ blur(&vector_field[scr_par.width*scr_par.height*current_effect.num_effect]);
+ spectral(&current_effect,pcm_data);
+ curve(&current_effect);
+ if (t_last_color<=32)
+ {
+ change_color(old_color,
+ color,
+ t_last_color*8);
+ }
+ t_last_color+=1;
+ t_last_effect+=1;
+ if (t_last_effect%gen_par.t_between_effects==0)
+ {
+ if (!mode_interactif) {
+ load_random_effect(&current_effect);
+ t_last_effect=0;
+ }
+ }
+ if (t_last_color%gen_par.t_between_colors==0)
+ {
+ if (!mode_interactif) {
+ old_color=color;
+ color=rand()%NB_PALETTES;
+ t_last_color=0;
+ }
+ }
+ }
+ /*fprintf(stderr,"exiting thread\n");*/
+ close_renderer();
+}
+
+void close_renderer(void)
+{
+ free(vector_field);
+ close_sdl();
+ SDL_mutexV(synchro_mutex);
+}
diff --git a/noatun-plugins/tyler/renderer.h b/noatun-plugins/tyler/renderer.h
new file mode 100644
index 0000000..06aa326
--- /dev/null
+++ b/noatun-plugins/tyler/renderer.h
@@ -0,0 +1,69 @@
+/*
+// Copyright (C) 2000 Julien Carme
+// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2, as
+// published by the Free Software Foundation.
+//
+// This program 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 the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#ifndef RENDERER_H
+#define RENDERER_H
+
+void check_events(void);
+int check_finished(void);
+void init_renderer1(void);
+void init_renderer2(void);
+void renderer(void);
+void close_renderer(void);
+
+typedef unsigned char byte;
+
+typedef struct t_coord {
+ int x,y;
+} t_coord;
+
+typedef struct t_complex {
+ float x,y;
+} t_complex;
+
+typedef struct t_interpol {
+ unsigned int coord ; /* coordinates of the top left pixel.*/
+ unsigned int weight; /*32 bits = 4*8= weights of the four corners */
+} t_interpol;
+
+typedef struct t_effect {
+ int num_effect;
+ int x_curve;
+ int curve_color;
+ int curve_amplitude;
+ int spectral_amplitude;
+ int spectral_color;
+ int mode_spectre;
+ int spectral_shift;
+} t_effect;
+
+typedef struct t_screen_parametres {
+ int width;
+ int height;
+ int scale;
+ int bpp; /*bytes per pixels. */
+} t_screen_parametres;
+
+typedef struct t_general_parametres {
+ int t_between_effects;
+ int t_between_colors;
+} t_general_parametres;
+
+extern t_screen_parametres scr_par;
+
+#endif
diff --git a/noatun-plugins/tyler/tyler.cpp b/noatun-plugins/tyler/tyler.cpp
new file mode 100644
index 0000000..7990ae2
--- /dev/null
+++ b/noatun-plugins/tyler/tyler.cpp
@@ -0,0 +1,72 @@
+// Copyright (C) 2001 Charles Samuels <charles@kde.org>
+// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com>
+
+#include "tyler.h"
+
+#include <noatun/conversion.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kprocess.h>
+#include <kstandarddirs.h>
+#include <noatun/app.h>
+#include <kdebug.h>
+
+extern "C" Plugin *create_plugin()
+{
+ KGlobal::locale()->insertCatalogue("tyler");
+ return new Tyler();
+}
+
+const int Tyler::bufferSize = 512;
+
+Tyler::Tyler()
+ : QObject()
+ , StereoScope(25)
+ , Plugin()
+{
+ setSamples(bufferSize*2);
+ mBuffer = new char[bufferSize * 16 * 2];
+}
+
+Tyler::~Tyler()
+{
+ delete [] mBuffer;
+}
+
+void Tyler::init()
+{
+ process << KStandardDirs::findExe("noatuntyler.bin");
+ connect(&process, SIGNAL(processExited(KProcess *)), this, SLOT(processExited(KProcess *)));
+
+ // Note that process.start() will fail if findExe fails, so there's no real need
+ // for two separate checks.
+ if(!process.start(KProcess::NotifyOnExit, (KProcess::Communication)(KProcess::Stdin | KProcess::Stdout)))
+ {
+ KMessageBox::error(0, i18n("Unable to start noatuntyler.bin. Check your installation."));
+ unload();
+ }
+ else
+ start();
+
+}
+
+void Tyler::scopeEvent(float *left, float *right, int size)
+{
+ if(process.isRunning())
+ {
+ Conversion::convertMonoFloatTo16le((unsigned long)size, right,
+ (unsigned char*)mBuffer);
+
+ Conversion::convertMonoFloatTo16le((unsigned long)size, left,
+ ((unsigned char*)mBuffer)+bufferSize*2);
+ process.writeStdin((char *)mBuffer, bufferSize*2*2);
+ }
+}
+
+void Tyler::processExited(KProcess *)
+{
+ unload();
+}
+
+#include "tyler.moc"
diff --git a/noatun-plugins/tyler/tyler.h b/noatun-plugins/tyler/tyler.h
new file mode 100644
index 0000000..ff72a80
--- /dev/null
+++ b/noatun-plugins/tyler/tyler.h
@@ -0,0 +1,34 @@
+// Copyright (C) 2001 Charles Samuels <charles@kde.org>
+// Copyright (C) 2001 Neil Stevens <neil@qualityassistant.com>
+
+#ifndef TYLER_H
+#define TYLER_H
+
+#include <noatun/conversion.h>
+#include <noatun/plugin.h>
+#include <kprocess.h>
+#include <qwidget.h>
+
+class Tyler : public QObject, public StereoScope, public Plugin
+{
+Q_OBJECT
+
+public:
+ Tyler();
+ virtual ~Tyler();
+
+ void init();
+
+private slots:
+ void processExited(KProcess *);
+
+protected:
+ virtual void scopeEvent(float *left, float *right, int bands);
+
+private:
+ char *mBuffer;
+ static const int bufferSize;
+ KProcess process;
+};
+
+#endif
diff --git a/noatun-plugins/tyler/tyler.plugin b/noatun-plugins/tyler/tyler.plugin
new file mode 100644
index 0000000..4eb0412
--- /dev/null
+++ b/noatun-plugins/tyler/tyler.plugin
@@ -0,0 +1,70 @@
+Filename=noatuntyler.la
+Author=Neil Stevens, Julien Carme
+Site=http://noatun.kde.org/
+Email=neil@qualityassistant.com
+Type=visualization
+License=GPL
+Name=Tyler
+Name[hi]=टायलर
+Name[hr]=Slagač
+Name[it]=Tessuto
+Name[ne]=टाइलर
+Name[ru]=Тайлер
+Name[ta]=டைலர்
+Name[tg]=Тайлер
+Comment=Ported from Infinity from XMMS
+Comment[ar]=منقولة من XMMS Infinity
+Comment[az]=Infinity-dən XMMS-ə port edilmişdir
+Comment[bg]=Приставка, която наподобява темата Infinity от плеъра XMMS
+Comment[br]=Porzhed eus Infinity ouzh XMMS
+Comment[bs]=Portovano sa Infinity dodatka za XMMS
+Comment[ca]=Portat des de l'Infinity de l'XMMS
+Comment[cs]=Přenesený modul Infinity z XMMS
+Comment[cy]=Troswyd o Infinity oddiwrth XMMS
+Comment[da]=Porteret fra Infinity fra XMMS
+Comment[de]=Portiert aus Infinity von XMMS
+Comment[el]=Προσαρμογή από το Infinity για το XMMS
+Comment[eo]=Portita el Infinity el XMMS
+Comment[es]=Portado a partir de Infinity desde XMMS
+Comment[et]=XMMSi Infinity port
+Comment[eu]=XMMSren Infinity-tik etorria
+Comment[fi]=Käännetty XMMS Infinitystä
+Comment[fr]=Portage d'Infinity de XMMS
+Comment[fy]=Oerdroegen fanút Infinity fan XMMS
+Comment[gl]=Portado a partir de Infinity de XMMS
+Comment[he]=הוסב מ־Infinity מ־XMMS
+Comment[hi]=इनफिनिटी से एक्सएमएमएस पर पोर्टेड
+Comment[hr]=Prebačeno iz Infinity-a, iz XMMS-a
+Comment[hu]=Az XMMS Infinity átirata
+Comment[is]=Flutt úr Infinity frá XMMS
+Comment[it]=Preso da Infinity di XMMS
+Comment[ja]=XMMS の Infinity から移植
+Comment[ka]=XMMS-იდან გადმოტანილი უსასრულობის გამოსახულება
+Comment[kk]=XMMS Infinity-ден көшірілген көрініс
+Comment[km]=បាន​ការពារ​ពី​អនន្តរភាព​ពី XMMS
+Comment[lt]=Perkeltas iš Infinity iš XMMS
+Comment[mk]=Пренесена од Infinity од XMMS
+Comment[ms]=Diangkut dari Infiniti dari XMMS
+Comment[nb]=Overført fra XMMS til Infinity
+Comment[nds]=Vun Infinity vun XMMS porteert
+Comment[ne]=एक्सएमएमएसबाट अनन्तसम्म पोर्टेट गरिएको
+Comment[nl]=Overgedragen vanuit Infinity van XMMS
+Comment[nn]=Overført frå Infinity frå XMMS
+Comment[pl]=Przeniesiona wtyczka Infinity z XMMS
+Comment[pt]=Transposto a partir do Infinity do XMMS
+Comment[pt_BR]=Portado do Infinity e do XMMS
+Comment[ro]=Portat din Infinity din XMMS
+Comment[ru]=Зрительный образ, портированный с образа Infinity из XMMS
+Comment[sk]=Portované z Infinity z XMMS
+Comment[sl]=Prenos iz Infinity iz XMMS
+Comment[sr]=Пребачено са Infinity-ја са XMMS-а
+Comment[sr@Latn]=Prebačeno sa Infinity-ja sa XMMS-a
+Comment[sv]=Överförd från Infinity i XMMS
+Comment[ta]=XMMS-ல் இருந்து முடிவில்லாத்து நுழைக்கப்பட்டது
+Comment[tg]=Намуди тамошобин, ки бо намуди Infinity аз XMMS интиқол шудааст
+Comment[tr]=XMMS'deki Infinity'den taşındı
+Comment[uk]=Запозичене з Infinity від XMMS
+Comment[vi]=Chuyển từ Infinity từ XMML
+Comment[xh]=Iphathe okusuka kokungenasiphelo ukusuka kwi XMMS
+Comment[zh_CN]=从 XMMS 的 Infinity 处移植来的
+Comment[zh_TW]=移自 XMMS 與 Infinity
diff --git a/noatun-plugins/tyler/tylerstates b/noatun-plugins/tyler/tylerstates
new file mode 100644
index 0000000..d784758
--- /dev/null
+++ b/noatun-plugins/tyler/tylerstates
Binary files differ
diff --git a/noatun-plugins/wavecapture/Makefile.am b/noatun-plugins/wavecapture/Makefile.am
new file mode 100644
index 0000000..0ffa449
--- /dev/null
+++ b/noatun-plugins/wavecapture/Makefile.am
@@ -0,0 +1,18 @@
+# $Id$
+
+INCLUDES = -I$(kde_includes)/arts $(all_includes)
+kde_module_LTLIBRARIES = noatunwavecapture.la
+
+
+noatunwavecapture_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+noatunwavecapture_la_LIBADD = $(LIB_KFILE) -lnoatun -lm -lartsmodules
+
+noatunwavecapture_la_SOURCES = wavecapture.cpp
+noatunwavecapture_la_METASOURCES = AUTO
+noinst_HEADERS = wavecapture.h
+
+noatun_DATA = wavecapture.plugin
+noatundir = $(kde_datadir)/noatun
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp *.h -o $(podir)/wavecapture.pot
diff --git a/noatun-plugins/wavecapture/wavecapture.cpp b/noatun-plugins/wavecapture/wavecapture.cpp
new file mode 100644
index 0000000..b95d3ce
--- /dev/null
+++ b/noatun-plugins/wavecapture/wavecapture.cpp
@@ -0,0 +1,197 @@
+/*
+ Copyright (C) 2001 Matthias Kretz <kretz@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+/* $Id$ */
+#include "wavecapture.h"
+
+#include <noatun/player.h>
+#include <noatun/app.h>
+#include <noatun/engine.h>
+#include <noatun/noatunarts.h>
+
+#include <arts/soundserver.h>
+#include <arts/mcoputils.h>
+
+#include <klocale.h>
+#include <kpopupmenu.h>
+#include <kfiledialog.h>
+#include <kurl.h>
+#include <krecentdocument.h>
+#include <kio/job.h>
+#include <kio/jobclasses.h>
+
+#include <qfile.h>
+#include <qstring.h>
+#include <qtimer.h>
+
+#include <string>
+
+extern "C"
+{
+ Plugin *create_plugin()
+ {
+ KGlobal::locale()->insertCatalogue("wavecapture");
+ return new WaveCapture();
+ }
+}
+
+WaveCapture::WaveCapture() : QObject(0,0), Plugin(),
+ _enabled( false ),
+ _status( STOPPED ),
+ _capture( Arts::DynamicCast( napp->player()->engine()->server()->createObject( "Arts::Effect_WAVECAPTURE" ) ) ),
+ _count( 0 ),
+ _id( 0 ),
+ _filename( "" ),
+ _timer( new QTimer( this ) ),
+ m_job( 0 )
+{
+ NOATUNPLUGINC(WaveCapture);
+
+ if( napp->player()->isPlaying() )
+ _status = PLAYING;
+ else if( napp->player()->isPaused() )
+ _status = PAUSED;
+
+ newSong();
+
+ connect( _timer, SIGNAL( timeout() ), SLOT( saveAs() ) );
+
+ connect(napp->player(), SIGNAL(changed()), SLOT(newSong()));
+ connect(napp->player(), SIGNAL(stopped()), SLOT(stopped()));
+ connect(napp->player(), SIGNAL(playing()), SLOT(playing()));
+ connect(napp->player(), SIGNAL( paused()), SLOT( paused()));
+}
+
+WaveCapture::~WaveCapture()
+{
+ napp->pluginMenuRemove(pluginMenuItem);
+ if( _enabled )
+ {
+ if( PLAYING == _status )
+ stop();
+ QString filename = QFile::decodeName( (Arts::MCOPUtils::createFilePath( _filename ) + ".wav").c_str() );
+ QFile::remove( filename );
+ }
+ delete m_job;
+}
+
+void WaveCapture::init()
+{
+ pluginMenuItem = napp->pluginMenuAdd( i18n( "Wave Capture" ), this, SLOT( toggle() ) );
+ napp->pluginMenu()->setCheckable( true );
+}
+
+void WaveCapture::toggle()
+{
+ _enabled = ! _enabled;
+ if( PLAYING == _status )
+ {
+ if( _enabled )
+ start();
+ else
+ {
+ stop();
+ QString filename = QFile::decodeName( (Arts::MCOPUtils::createFilePath( _filename ) + ".wav").c_str() );
+ QFile::remove( filename );
+ }
+ }
+ napp->pluginMenu()->setItemChecked( pluginMenuItem, _enabled );
+}
+
+void WaveCapture::newSong()
+{
+ if( napp->player()->current() )
+ {
+ QString title = napp->player()->current().title();
+ _capture.filename( std::string( QFile::encodeName( title ) ) );
+ }
+ _timer->start( 0, true );
+}
+
+void WaveCapture::saveAs()
+{
+ // this could be a candidate for a race condition - but unlikely and harmless
+ std::string filename = _filename;
+ _filename = _capture.filename().c_str();
+ if( _enabled && ( !filename.empty() ) )
+ {
+ KFileDialog dlg( ":savedir", "*.wav", 0, "filedialog", true );
+ dlg.setCaption( i18n( "Save Last Wave File As" ) );
+ dlg.setOperationMode( KFileDialog::Saving );
+ dlg.setSelection( QFile::decodeName( filename.c_str() ) + ".wav" );
+
+ QString filename2 = QFile::decodeName( (Arts::MCOPUtils::createFilePath( filename ) + ".wav").c_str() );
+ if( dlg.exec() )
+ {
+ KURL url = dlg.selectedURL();
+ if (url.isValid())
+ KRecentDocument::add( url );
+
+ m_job = KIO::file_move( KURL( filename2 ), url, -1, true );
+ connect( m_job, SIGNAL( result( KIO::Job* ) ), SLOT( copyFinished( KIO::Job* ) ) );
+ }
+ else
+ {
+ QFile::remove( filename2 );
+ }
+ }
+}
+
+void WaveCapture::stopped()
+{
+ if( _enabled && PLAYING == _status )
+ stop();
+ _status = STOPPED;
+ _capture.filename( std::string( "" ) );
+}
+
+void WaveCapture::playing()
+{
+ if( _enabled && PLAYING != _status )
+ start();
+ _status = PLAYING;
+}
+
+void WaveCapture::paused()
+{
+ if( _enabled && PLAYING == _status )
+ stop();
+ _status = PAUSED;
+}
+
+void WaveCapture::start()
+{
+ _capture.start();
+ _id = napp->player()->engine()->globalEffectStack()->insertBottom( _capture, "capture too wave" );
+}
+
+void WaveCapture::stop()
+{
+ napp->player()->engine()->globalEffectStack()->remove( _id );
+ _capture.stop();
+ _timer->start( 0, true );
+}
+
+void WaveCapture::copyFinished( KIO::Job* job )
+{
+ if( job == m_job )
+ m_job = 0;
+}
+
+#include "wavecapture.moc"
+
+// vim:ts=4:sw=4
diff --git a/noatun-plugins/wavecapture/wavecapture.h b/noatun-plugins/wavecapture/wavecapture.h
new file mode 100644
index 0000000..f5d894f
--- /dev/null
+++ b/noatun-plugins/wavecapture/wavecapture.h
@@ -0,0 +1,72 @@
+/*
+ Copyright (C) 2001 Matthias Kretz <kretz@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+/* $Id$ */
+
+#ifndef WAVECAPTURE_H
+#define WAVECAPTURE_H
+
+#include <noatun/plugin.h>
+#include <artsmodules.h>
+
+#include <string>
+
+class QTimer;
+namespace KIO { class Job; }
+
+class WaveCapture : public QObject, public Plugin
+{
+Q_OBJECT
+NOATUNPLUGIND
+
+public:
+ WaveCapture();
+ virtual ~WaveCapture();
+
+ void init();
+
+protected slots:
+ void toggle();
+ void newSong();
+ void stopped();
+ void playing();
+ void paused();
+ void saveAs();
+ void copyFinished( KIO::Job* );
+
+private:
+ void start();
+ void stop();
+
+ int pluginMenuItem;
+
+ bool _enabled;
+ enum Status { PAUSED, STOPPED, PLAYING };
+ Status _status;
+
+ Arts::Effect_WAVECAPTURE _capture;
+ int _count;
+ long _id;
+ std::string _filename;
+
+ QTimer* _timer;
+ KIO::Job* m_job;
+};
+
+#endif
+
+// vim:ts=4:sw=4
diff --git a/noatun-plugins/wavecapture/wavecapture.plugin b/noatun-plugins/wavecapture/wavecapture.plugin
new file mode 100644
index 0000000..50d7dcc
--- /dev/null
+++ b/noatun-plugins/wavecapture/wavecapture.plugin
@@ -0,0 +1,112 @@
+Filename=noatunwavecapture.la
+Author=Matthias Kretz
+Site=http://noatun.kde.org/
+Email=kretz@kde.org
+Type=no idea
+License=GPL
+Name=Wave Capture
+Name[af]=Golf Vang
+Name[az]=Səs Yaxalama
+Name[ca]=Captura wave
+Name[cs]=Zachycení do WAV
+Name[cy]=Dal Tonnau
+Name[da]=Wave-indfanger
+Name[de]=wav-Rekorder
+Name[el]=Σύλληψη wave
+Name[eo]=Onda kaptado
+Name[es]=Captura de onda
+Name[et]=Wave-faili salvestaja
+Name[eu]=Uhin harrapatzailea
+Name[fa]=گیراندازی Wave
+Name[fi]=Äänen kaappaus
+Name[fr]=Capture wave
+Name[fy]=Weach-heiner
+Name[gl]=Captura como WAVE
+Name[he]=לכידת Wave
+Name[hi]=वेव केप्चर
+Name[hr]=Wave snimanje
+Name[hu]=Hangfelvétel
+Name[it]=Cattura in wav
+Name[ja]=Wave キャプチャ
+Name[ka]=ტალღათა ჩამწერი
+Name[km]=ចាប់​យក wave
+Name[lt]=Wave įrašymas
+Name[mk]=Снимање звук
+Name[nb]=Wave-opptak
+Name[nds]=Wave-Datei opnehmen
+Name[ne]=वेभ ग्रहण
+Name[nl]=Wave-vanger
+Name[nn]=Wave-opptak
+Name[nso]=Tshwaro ya Lephoto
+Name[pa]=ਤਰੰਗ ਪ੍ਰਾਪਤੀ
+Name[pl]=Zgrywanie do pliku WAV
+Name[pt]=Captura para WAVE
+Name[ro]=Captură WAV
+Name[ru]=Сохранение в wav
+Name[sk]=Uložiť wave
+Name[sl]=Zajem WAV
+Name[sv]=Vågformslagring
+Name[ta]=அலை கவர்தல்
+Name[tg]=Захира кардан дар wav
+Name[tr]=Dalga Yakalayıcı
+Name[uk]=Збереження у Wave
+Name[vi]=Bắt WAV
+Name[xh]=Ubamba Amaza
+Name[zh_CN]=声波抓取
+Comment=Capture to wave file
+Comment[af]=Vang na golf lêer
+Comment[az]=Yaxala və wave faylına qeyd et
+Comment[bg]=Аудио запис във файл във формат wave
+Comment[bs]=Hvata melodiju u wave datoteku
+Comment[ca]=Captura a un fitxer wave
+Comment[cs]=Zachycení do WAV souboru
+Comment[cy]=Dal i ffeil wave
+Comment[da]=Indfang til wave-fil
+Comment[de]=Aufnehmen als wav-Datei
+Comment[el]=Σύλληψη σε αρχείο wave
+Comment[eo]=Kaptu al onda dosiero
+Comment[es]=Crea un archivo de ondas
+Comment[et]=Salvestab wave-failiks
+Comment[eu]=Uhin fitxategira harrapatzen du
+Comment[fa]=گیراندازی پروندۀ wave
+Comment[fi]=Kaappaa äänitiedosto
+Comment[fr]=Capturer vers un fichier wave
+Comment[fy]=Opnimme as weach-triem
+Comment[ga]=Gabháil i gcomhad toinne
+Comment[gl]=Capturar a un ficheiro WAVE
+Comment[he]=לכידה לקובץ wave
+Comment[hi]=वेव फ़ाइल में केप्चर करता है
+Comment[hr]=Snimanje u wav datoteku
+Comment[hu]=Mentés WAV fájlba
+Comment[is]=Vista hljóð í wave skrár
+Comment[it]=Cattura su di file wave
+Comment[ja]=wave ファイルに保存
+Comment[ka]=ტალღის ფაილში ჩაწერა
+Comment[kk]=Дыбысты қағып алып сақтау
+Comment[km]=ចាប់​យក​​​​​ឯកសារ wave​
+Comment[lt]=Užfiksuoti wave byloje
+Comment[mk]=Снимање во wave-датотека
+Comment[ms]=Cekup ke fail wave
+Comment[nb]=Opptak til wav-file
+Comment[nds]=Wave-Datei opnehmen
+Comment[ne]=वेभ फाइलमा अभिग्रहण गर्नुहोस्
+Comment[nl]=Opnemen als wave-bestand
+Comment[nn]=Opptak til wave-file
+Comment[pl]=Zgrywanie do pliku WAV
+Comment[pt]=Capturar para um ficheiro WAVE
+Comment[pt_BR]=captura e transforma para arquivos wave
+Comment[ro]=Capturează sunetul într-un fişier WAV
+Comment[ru]=Сохранение произведения в формате wav
+Comment[sk]=Uložiť wave do súboru
+Comment[sl]=Zajem v datoteko WAV
+Comment[sr]=Зароби у wave фајл
+Comment[sr@Latn]=Zarobi u wave fajl
+Comment[sv]=Lagra till vågformsfil
+Comment[ta]= அலைக்கோப்புக்கு கவர்தல்
+Comment[tg]=Захирашавии баромад дар формати wav
+Comment[tr]=Bir dalga dosyasına yakala
+Comment[uk]=Збереження в файл wave
+Comment[vi]=Bắt vào tập tin WAV
+Comment[xh]=Ibanjwe kwifayile yamaza
+Comment[zh_CN]=抓取到声波文件
+Comment[zh_TW]=抓取 wave 檔
diff --git a/renamedlgplugins/Makefile.am b/renamedlgplugins/Makefile.am
new file mode 100644
index 0000000..d78920c
--- /dev/null
+++ b/renamedlgplugins/Makefile.am
@@ -0,0 +1,3 @@
+SUBDIRS = images audio
+
+
diff --git a/renamedlgplugins/README b/renamedlgplugins/README
new file mode 100644
index 0000000..2b2ea6b
--- /dev/null
+++ b/renamedlgplugins/README
@@ -0,0 +1,7 @@
+Here you willl find plugins for the RenameDlg
+
+images This module will show the two different pictures/images
+ to let you better decide what you want to do
+
+audio This module will show you some information on the audio
+ files to make it easier to decide what to do.
diff --git a/renamedlgplugins/audio/Makefile.am b/renamedlgplugins/audio/Makefile.am
new file mode 100644
index 0000000..d9a228f
--- /dev/null
+++ b/renamedlgplugins/audio/Makefile.am
@@ -0,0 +1,16 @@
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = librenaudioplugin.la
+
+librenaudioplugin_la_SOURCES = audiopreview.cpp audio_plugin.cpp
+librenaudioplugin_la_LIBADD = $(LIB_KIO) -lkmediaplayer
+librenaudioplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+pluginsdir = $(kde_servicesdir)
+plugins_DATA = renaudiodlg.desktop
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/audiorename_plugin.pot
diff --git a/renamedlgplugins/audio/TODO b/renamedlgplugins/audio/TODO
new file mode 100644
index 0000000..453c700
--- /dev/null
+++ b/renamedlgplugins/audio/TODO
@@ -0,0 +1,9 @@
+Some ideas on what would be nice if implemented...
+
+* Start playing the audio file when icon is hovered.
+* Colorize differences in file information
+* On remote files: load file when label is clicked
+* Tell if source or destination file is broken
+* Tell if they're different or the same, not taking e.g. the IDtag into
+ account, only the actual audio data.
+* ...
diff --git a/renamedlgplugins/audio/audio_plugin.cpp b/renamedlgplugins/audio/audio_plugin.cpp
new file mode 100644
index 0000000..f8114bd
--- /dev/null
+++ b/renamedlgplugins/audio/audio_plugin.cpp
@@ -0,0 +1,104 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003 Fabian Wolf <fabianw@gmx.net>
+
+ image_plugin.cpp (also Part of the KDE Project) used as template
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; version 2
+ of the License.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kgenericfactory.h>
+#include <renamedlgplugin.h>
+#include <kio/renamedlg.h>
+#include <qlabel.h>
+#include <qdialog.h>
+#include <qwidget.h>
+#include <qstringlist.h>
+#include <kio/global.h>
+#include <qlayout.h>
+
+#include <sys/types.h>
+
+#include "audiopreview.h"
+
+class AudioPlugin : public RenameDlgPlugin{
+public:
+ AudioPlugin( QDialog *dialog, const char *name, const QStringList & );
+ ~AudioPlugin();
+ virtual bool initialize( KIO::RenameDlg_Mode /*mod*/, const QString &/*_src*/, const QString &/*_dest*/,
+ const QString &/*mimeSrc*/,
+ const QString &/*mimeDest*/,
+ KIO::filesize_t /*sizeSrc*/,
+ KIO::filesize_t /*sizeDest*/,
+ time_t /*ctimeSrc*/,
+ time_t /*ctimeDest*/,
+ time_t /*mtimeSrc*/,
+ time_t /*mtimeDest*/ );
+};
+
+AudioPlugin::AudioPlugin( QDialog *dialog, const char *name, const QStringList &list ) : RenameDlgPlugin( dialog, name, list) {
+ qWarning("loaded" );
+}
+AudioPlugin::~AudioPlugin()
+{
+}
+bool AudioPlugin::initialize( KIO::RenameDlg_Mode mode, const QString &_src, const QString &_dest,
+ const QString &mimeSrc,
+ const QString &mimeDest,
+ KIO::filesize_t /*sizeSrc*/,
+ KIO::filesize_t /*sizeDest*/,
+ time_t /*ctimeSrc*/,
+ time_t /*ctimeDest*/,
+ time_t mtimeSrc,
+ time_t mtimeDest ) {
+ QGridLayout *lay = new QGridLayout(this, 4, 3, 5);
+ if( mode & KIO::M_OVERWRITE ){
+ QLabel *label_head = new QLabel(this);
+ QLabel *label_src = new QLabel(this);
+ QLabel *label_dst = new QLabel(this);
+ QLabel *label_ask = new QLabel(this);
+
+ QString sentence1;
+ QString dest = KURL::fromPathOrURL(_dest).pathOrURL();
+ if (mtimeDest < mtimeSrc)
+ sentence1 = i18n("An older file named '%1' already exists.\n").arg(dest);
+ else if (mtimeDest == mtimeSrc)
+ sentence1 = i18n("A similar file named '%1' already exists.\n").arg(dest);
+ else
+ sentence1 = i18n("A newer file named '%1' already exists.\n").arg(dest);
+ label_head->setText(sentence1);
+ label_src->setText(i18n("Source File"));
+ label_dst->setText(i18n("Existing File"));
+ label_ask->setText(i18n("Would you like to replace the existing file with the one on the right?") );
+ label_head->adjustSize();
+ label_src->adjustSize();
+ label_dst->adjustSize();
+ label_ask->adjustSize();
+ lay->addMultiCellWidget(label_head, 0, 0, 0, 2, Qt::AlignLeft);
+ lay->addWidget(label_dst, 1, 0, Qt::AlignLeft);
+ lay->addWidget(label_src, 1, 2, Qt::AlignLeft);
+ lay->addMultiCellWidget(label_ask, 3, 3, 0, 2, Qt::AlignLeft);
+ adjustSize();
+ }
+ AudioPreview *left= new AudioPreview(this, "Preview Left", _dest, mimeDest );
+ AudioPreview *right = new AudioPreview( this, "Preview Right", _src, mimeSrc);
+ lay->addWidget(left, 2, 0 );
+ lay->addWidget(right, 2, 2 );
+ adjustSize();
+ return true;
+}
+
+typedef KGenericFactory<AudioPlugin, QDialog> AudioPluginFactory;
+K_EXPORT_COMPONENT_FACTORY( librenaudioplugin, AudioPluginFactory("audiorename_plugin") )
diff --git a/renamedlgplugins/audio/audiopreview.cpp b/renamedlgplugins/audio/audiopreview.cpp
new file mode 100644
index 0000000..e9c6f26
--- /dev/null
+++ b/renamedlgplugins/audio/audiopreview.cpp
@@ -0,0 +1,135 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003 Fabian Wolf <fabianw@gmx.net>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; version 2
+ of the License.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <kfilemetainfo.h>
+#include <klocale.h>
+#include <kmimetype.h>
+#include <kurl.h>
+#include <qvbox.h>
+#include <qlabel.h>
+#include <qpixmap.h>
+#include <kio/netaccess.h>
+#include <kurllabel.h>
+#include <kmimetype.h>
+#include <kmediaplayer/player.h>
+#include <kparts/componentfactory.h>
+#include <ksqueezedtextlabel.h>
+
+#include "audiopreview.h"
+
+AudioPreview::AudioPreview( QWidget *parent, const char *name, const QString &fileName, const QString &mimeType)
+ : QVBox( parent, name )
+{
+ m_isTempFile = false;
+ pic = 0;
+ m_player = 0L;
+ description = 0;
+ // fileName is created by KUrl::prettyURL()
+ KURL url( fileName );
+ setSpacing( 0 );
+ if( url.isValid() && url.isLocalFile() ) {
+ m_localFile = url.path();
+ pic = new QLabel(this);
+ pic->setPixmap(KMimeType::pixmapForURL( url ));
+ pic->adjustSize();
+ initView( mimeType );
+ } else if( !url.isLocalFile() ) {
+ KURLLabel *label = new KURLLabel( this );
+ label->setText(i18n("This audio file isn't stored\non the local host.\nClick on this label to load it.\n" ) );
+ label->setURL( url.prettyURL() );
+ connect(label, SIGNAL(leftClickedURL(const QString&)), SLOT(downloadFile(const QString&)));
+ pic = label;
+ } else {
+ description = new QLabel(this );
+ description->setText(i18n("Unable to load audio file") );
+ }
+}
+
+AudioPreview::~AudioPreview()
+{
+ if ( m_isTempFile )
+ KIO::NetAccess::removeTempFile( m_localFile );
+
+ delete m_player;
+}
+
+void AudioPreview::initView( const QString& mimeType )
+{
+ KURL url = KURL::fromPathOrURL( m_localFile );
+ pic->setText( QString::null );
+ pic->setPixmap(KMimeType::pixmapForURL( url ));
+ pic->adjustSize();
+
+ KFileMetaInfo info(m_localFile);
+ KMimeType::Ptr mimeptr = KMimeType::mimeType(mimeType);
+
+ QString desc;
+ if (info.isValid())
+ {
+ if (mimeptr->is("audio/x-mp3") || mimeptr->is("application/ogg"))
+ {
+ // following 3 infos might be very long; make sure they get squeezed
+ // TODO: when string-freeze is over, eliminate trailing '\n' as it's no longer needed
+ KSqueezedTextLabel *sl;
+
+ sl = new KSqueezedTextLabel(this);
+ sl->setText(i18n("Artist: %1\n").arg(info.item("Artist").value().toString()));
+
+ sl = new KSqueezedTextLabel(this);
+ sl->setText(i18n("Title: %1\n").arg(info.item("Title").value().toString()));
+
+ sl = new KSqueezedTextLabel(this);
+ sl->setText(i18n("Comment: %1\n").arg(info.item("Comment").value().toString()));
+
+ desc.append(i18n("Biterate: 160 kbits/s", "Bitrate: %1 %2\n").arg( info.item("Bitrate").value().toString() ).arg( info.item("Bitrate").suffix() ));
+ }
+ desc.append(i18n("Sample rate: %1 %2\n").arg( info.item("Sample Rate").value().toString() ).arg( info.item("Sample Rate").suffix() ));
+ desc.append(i18n("Length: "));
+
+ /* Calculate length in mm:ss format */
+ int length = info.item("Length").value().toInt();
+ if (length/60 < 10)
+ desc.append("0");
+ desc.append(QString("%1:").arg(length/60, 0, 10));
+ if (length%60 < 10)
+ desc.append("0");
+ desc.append(QString("%1\n").arg(length%60, 0, 10));
+ }
+
+ description = new QLabel(this);
+ description->setText( desc );
+ description->adjustSize();
+ m_player = KParts::ComponentFactory::createInstanceFromQuery<KMediaPlayer::Player>( "KMediaPlayer/Player", QString::null, this );
+ if ( m_player )
+ {
+ static_cast<KParts::ReadOnlyPart*>(m_player)->openURL( url );
+ m_player->widget()->show();
+ }
+}
+
+void AudioPreview::downloadFile( const QString& url )
+{
+ if( KIO::NetAccess::download( KURL::fromPathOrURL( url ), m_localFile , topLevelWidget()) )
+ {
+ m_isTempFile = true;
+ initView( KMimeType::findByPath( m_localFile )->name() );
+ }
+}
+
+#include <audiopreview.moc>
diff --git a/renamedlgplugins/audio/audiopreview.h b/renamedlgplugins/audio/audiopreview.h
new file mode 100644
index 0000000..635a81b
--- /dev/null
+++ b/renamedlgplugins/audio/audiopreview.h
@@ -0,0 +1,75 @@
+/* This file is part of the KDE project
+ Copyright (C) 2003 Fabian Wolf <fabianw@gmx.net>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; version 2
+ of the License.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef audiopreview_h
+#define audiopreview_h
+
+#include <qvbox.h>
+
+namespace KMediaPlayer
+{
+ class Player;
+}
+
+class QPixmap;
+class QLabel;
+class AudioPreview : public QVBox
+{
+ Q_OBJECT
+public:
+ AudioPreview(QWidget *parent, const char *name, const QString &fileName, const QString &mimeType);
+ ~AudioPreview();
+
+private slots:
+ void downloadFile(const QString& url);
+
+private:
+ void initView(const QString& mimeType);
+
+ QLabel *pic;
+ QLabel *description;
+ QString m_localFile;
+ bool m_isTempFile;
+
+ KMediaPlayer::Player *m_player;
+};
+#endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/renamedlgplugins/audio/renaudiodlg.desktop b/renamedlgplugins/audio/renaudiodlg.desktop
new file mode 100644
index 0000000..cee4bdd
--- /dev/null
+++ b/renamedlgplugins/audio/renaudiodlg.desktop
@@ -0,0 +1,63 @@
+[Desktop Entry]
+Type=Service
+Name=Audio Preview
+Name[ar]=معاينة صوتية
+Name[az]=Audio Nümayişi
+Name[bg]=Прослушване на аудио
+Name[br]=Rakgwel klevet
+Name[bs]=Audio pregled
+Name[ca]=Escolta una mostra de so
+Name[cs]=Náhled zvuku
+Name[cy]=Rhagolwg Sain
+Name[da]=Lydforhåndsvisning
+Name[de]=Audio-Vorschau
+Name[el]=Προεπισκόπηση ήχου
+Name[eo]=Sonantaŭrigardo
+Name[es]=Reproducir audio
+Name[et]=Audiofailide eelvaatlus
+Name[eu]=Audio aurrebista
+Name[fa]=پیش‌نمایش صوتی
+Name[fi]=Musiikkiesikatselu
+Name[fr]=Aperçu audio
+Name[fy]=Audiofoarbyld
+Name[ga]=Réamhléargas Fuaime
+Name[gl]=Antevisión Áudio
+Name[he]=תצוגה מקדימה של שמע
+Name[hi]=आडियो पूर्वावलोकन
+Name[hr]=Pregled zvučne datoteke
+Name[hu]=Hangos betekintő
+Name[is]=Hljóðforsýn
+Name[it]=Anteprima audio
+Name[ja]=オーディオプレビュー
+Name[ka]=აუდიო წინასწარ ნახვა
+Name[kk]=Аудио файлымен алдын ала таңыстыру
+Name[km]= មើល​ជា​មុន​ដោយ​ស្វ័យប្រវត្តិ
+Name[lt]=Audio perklausaa
+Name[mk]=Преглед на звук
+Name[nb]=Lydforhåndsvisning
+Name[nds]=Klang-Vöransicht
+Name[ne]=अडियो पूर्वावलोकन
+Name[nl]=Audiovoorbeeld
+Name[nn]=Lydførehandsvisning
+Name[pa]=ਆਡੀਓ ਝਲਕ
+Name[pl]=Podgląd plików audio
+Name[pt]=Previsão Áudio
+Name[pt_BR]=Previsão de Áudio
+Name[ro]=Previzualizare audio
+Name[ru]=Аудиоознакомление
+Name[sk]=Automatický náhľad
+Name[sl]=Ogled zvoka
+Name[sr]=Преглед аудија
+Name[sr@Latn]=Pregled audija
+Name[sv]=Ljudförhandsgranskning
+Name[ta]=ஒலி முன்னோட்டம்
+Name[tg]=Аудиошиносоӣ
+Name[tr]=Audio Önizleme
+Name[uk]=Перегляд аудіо
+Name[uz]=Audio koʻrib chiqish
+Name[uz@cyrillic]=Аудио кўриб чиқиш
+Name[vi]=Xem thử âm thanh
+Name[zh_CN]=音频预览
+Name[zh_TW]=音效預覽
+X-KDE-Library=librenaudioplugin
+ServiceTypes=RenameDlg/Plugin,audio/x-mp3,audio/x-wav,application/ogg
diff --git a/renamedlgplugins/images/Makefile.am b/renamedlgplugins/images/Makefile.am
new file mode 100644
index 0000000..1c07171
--- /dev/null
+++ b/renamedlgplugins/images/Makefile.am
@@ -0,0 +1,21 @@
+#SUBDIRS= kcmimage
+
+INCLUDES = $(all_includes)
+METASOURCES = AUTO
+
+
+# Install this plugin in the KDE modules directory
+kde_module_LTLIBRARIES = librenimageplugin.la
+
+librenimageplugin_la_SOURCES = imagevisualizer.cpp image_plugin.cpp
+librenimageplugin_la_LIBADD = $(LIB_KIO)
+librenimageplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+pluginsdir = $(kde_servicesdir)
+plugins_DATA = renimagedlg.desktop
+
+# Install the .rc file in the Part's directory (in this case, the part
+# is KHTMLPart)
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/imagerename_plugin.pot
diff --git a/renamedlgplugins/images/image_plugin.cpp b/renamedlgplugins/images/image_plugin.cpp
new file mode 100644
index 0000000..7c347ea
--- /dev/null
+++ b/renamedlgplugins/images/image_plugin.cpp
@@ -0,0 +1,85 @@
+/* This file is part of the KDE project
+ Copyright (C) 2001 Holger Freyther <freyther@yahoo.com>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; version 2
+ of the License.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+//#include "image_plugin.moc"
+
+#include <kdebug.h>
+#include <kgenericfactory.h>
+#include <kiconloader.h>
+#include <renamedlgplugin.h>
+#include <kio/renamedlg.h>
+#include <qlabel.h>
+#include <qdialog.h>
+#include <qwidget.h>
+#include <qstringlist.h>
+#include <kio/global.h>
+#include <qlayout.h>
+
+#include <sys/types.h>
+
+#include "imagevisualizer.h"
+
+class ImagePlugin : public RenameDlgPlugin{
+public:
+ ImagePlugin( QDialog *dialog, const char *name, const QStringList & );
+ virtual bool initialize( KIO::RenameDlg_Mode /*mod*/, const QString &/*_src*/, const QString &/*_dest*/,
+ const QString &/*mimeSrc*/,
+ const QString &/*mimeDest*/,
+ KIO::filesize_t /*sizeSrc*/,
+ KIO::filesize_t /*sizeDest*/,
+ time_t /*ctimeSrc*/,
+ time_t /*ctimeDest*/,
+ time_t /*mtimeSrc*/,
+ time_t /*mtimeDest*/ );
+};
+
+ImagePlugin::ImagePlugin( QDialog *dialog, const char *name, const QStringList &list )
+ : RenameDlgPlugin( dialog, name, list)
+{
+}
+
+bool ImagePlugin::initialize( KIO::RenameDlg_Mode mode, const QString &_src, const QString &_dest,
+ const QString &/*mimeSrc*/,
+ const QString &/*mimeDest*/,
+ KIO::filesize_t /*sizeSrc*/,
+ KIO::filesize_t /*sizeDest*/,
+ time_t /*ctimeSrc*/,
+ time_t /*ctimeDest*/,
+ time_t /*mtimeSrc*/,
+ time_t /*mtimeDest*/ )
+{
+ QGridLayout *lay = new QGridLayout(this, 2, 3, 5 );
+ if( mode & KIO::M_OVERWRITE )
+ {
+ QLabel *label = new QLabel(this );
+ label->setText(i18n("You want to overwrite the left picture with the one on the right.") );
+ label->adjustSize();
+ lay->addMultiCellWidget(label, 1, 1, 0, 2, Qt::AlignHCenter );
+ adjustSize();
+ }
+ ImageVisualizer *left= new ImageVisualizer(this, "Visualizer Left", _dest );
+ ImageVisualizer *right = new ImageVisualizer( this, "Visualizer Right", _src );
+ lay->addWidget(left, 2, 0 );
+ lay->addWidget(right, 2, 2 );
+ adjustSize();
+ return true;
+}
+
+typedef KGenericFactory<ImagePlugin, QDialog> ImagePluginFactory;
+K_EXPORT_COMPONENT_FACTORY( librenimageplugin, ImagePluginFactory("imagerename_plugin") )
diff --git a/renamedlgplugins/images/imagevisualizer.cpp b/renamedlgplugins/images/imagevisualizer.cpp
new file mode 100644
index 0000000..cb890c5
--- /dev/null
+++ b/renamedlgplugins/images/imagevisualizer.cpp
@@ -0,0 +1,83 @@
+/* This file is part of the KDE project
+ Copyright (C) 2002 Holger Freyther <freyther@yahoo.com>
+ 2003 Carsten Pfeiffer <pfeiffer@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; version 2
+ of the License.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#include <klocale.h>
+#include <kurl.h>
+#include <kurllabel.h>
+#include <qvbox.h>
+#include <qlabel.h>
+#include <qpixmap.h>
+#include <qimage.h>
+
+#include <kio/netaccess.h>
+
+#include "imagevisualizer.h"
+
+ImageVisualizer::ImageVisualizer( QWidget *parent, const char *name, const QString &fileName )
+ : QVBox( parent, name )
+{
+ pic = 0;
+ description = 0;
+ KURL url=KURL::fromPathOrURL( fileName );
+ setSpacing( 0 );
+ if( url.isValid() && url.isLocalFile() ) {
+ pic = new QLabel(this );
+ description = new QLabel( this );
+ loadImage( url.path() );
+ } else if( !url.isLocalFile() ) {
+ KURLLabel *label = new KURLLabel( this );
+ label->setText(i18n("This picture isn't stored\non the local host.\nClick on this label to load it.\n" ) );
+ label->setURL( url.prettyURL() );
+ connect(label, SIGNAL(leftClickedURL(const QString&)), SLOT(downloadImage(const QString&)));
+ pic = label;
+ description = new QLabel(this);
+ description->adjustSize( );
+ } else {
+ description = new QLabel(this );
+ description->setText(i18n("Unable to load image") );
+ }
+}
+
+void ImageVisualizer::loadImage( const QString& path )
+{
+ QImage img(path);
+ QPixmap pixmap(img.smoothScale(180,200, QImage::ScaleMin) );
+ pic->setText( QString::null );
+ pic->setPixmap(pixmap );
+ pic->adjustSize();
+
+ QString desc;
+ desc.append(i18n("The color depth of an image", "Depth: %1\n").arg( img.depth() ));
+ desc.append(i18n("The dimensions of an image", "Dimensions: %1x%1").arg(img.width()).arg(img.height() ));
+ description->setText(desc );
+ description->adjustSize();
+}
+
+void ImageVisualizer::downloadImage(const QString& url)
+{
+ QString tmpFile;
+ if( KIO::NetAccess::download( KURL::fromPathOrURL( url ), tmpFile , topLevelWidget()) )
+ {
+ loadImage( tmpFile );
+ KIO::NetAccess::removeTempFile( tmpFile );
+ }
+}
+
+#include "imagevisualizer.moc"
diff --git a/renamedlgplugins/images/imagevisualizer.h b/renamedlgplugins/images/imagevisualizer.h
new file mode 100644
index 0000000..391fad2
--- /dev/null
+++ b/renamedlgplugins/images/imagevisualizer.h
@@ -0,0 +1,66 @@
+/* This file is part of the KDE project
+ Copyright (C) 2002 Holger Freyther <freyther@yahoo.com>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; version 2
+ of the License.
+
+ This program 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 the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+#ifndef imagevisualizer_h
+#define imagevisualizer_h
+
+#include <qvbox.h>
+
+class QPixmap;
+class QLabel;
+class ImageVisualizer : public QVBox
+{
+ Q_OBJECT
+public:
+ ImageVisualizer(QWidget *parent, const char *name, const QString &fileName );
+
+private:
+ void loadImage( const QString& path );
+
+private slots:
+ void downloadImage( const QString& url );
+
+private:
+ QLabel *pic;
+ QLabel *description;
+};
+#endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/renamedlgplugins/images/renimagedlg.desktop b/renamedlgplugins/images/renimagedlg.desktop
new file mode 100644
index 0000000..c96622b
--- /dev/null
+++ b/renamedlgplugins/images/renimagedlg.desktop
@@ -0,0 +1,66 @@
+[Desktop Entry]
+Type=Service
+Name=Image Displayer
+Name[ar]=عارض الصور
+Name[az]=Rəsm Nümayişçisi
+Name[bg]=Показване на изображения
+Name[bs]=Preglednik slika
+Name[ca]=Visor d'imatges
+Name[cs]=Prohlížeč obrázků
+Name[cy]=Arddangosydd Delweddau
+Name[da]=Billedfremviser
+Name[de]=Bildbetrachter
+Name[el]=Προβολή εικόνων
+Name[eo]=Bildprezentilo
+Name[es]=Muestra imágenes
+Name[et]=Pildifailide näitaja
+Name[eu]=Irudi bistaratzailea
+Name[fa]=نمایش‌دهندۀ تصویر
+Name[fi]=Kuvannäyttäjä
+Name[fo]=Myndaframvísari
+Name[fr]=Afficheur d'images
+Name[fy]=Ofbylden werjefteprogramma
+Name[ga]=Amharcán Íomhánna
+Name[gl]=Visor de Imaxes
+Name[he]=מציג תמונות
+Name[hi]=छवि प्रदर्शक
+Name[hr]=Preglednik slika
+Name[hu]=Képmegjelenítő
+Name[is]=Myndsjá
+Name[it]=Visualizzatore di immagini
+Name[ja]=イメージ表示ツール
+Name[ka]=გამოსახულებთა ამსახავი
+Name[kk]=Кескін көрсеткіш
+Name[km]=កម្មវិធី​បង្ហាញ​រូបភាព
+Name[lt]=Paveikslėlių rodytojas
+Name[lv]=Attēlu Rādītājs
+Name[mk]=Прикажувач на слики
+Name[mt]=Werrej ta' Stampi
+Name[nb]=Bildeviser
+Name[nds]=Bildwieser
+Name[ne]=छवि प्रदर्शक
+Name[nl]=Afbeeldingenweergaveprogramma
+Name[nn]=Biletvisar
+Name[nso]=Sebontshi sa Ponagalo
+Name[pa]=ਚਿੱਤਰ ਦਰਸ਼ਕ
+Name[pl]=Program wyświetlający obrazki
+Name[pt]=Visualizador de Imagens
+Name[pt_BR]=Visualizador de Imagens
+Name[ro]=Vizualizor imagini
+Name[ru]=просмотр изображений
+Name[sk]=Prehliadač obrázkov
+Name[sl]=Prikazovalnik slik
+Name[sr]=Приказивач слика
+Name[sr@Latn]=Prikazivač slika
+Name[sv]=Bildvisare
+Name[ta]=பிம்பக் காட்டி
+Name[tg]=тамошои тасвир
+Name[th]=เครื่องมือแสดงภาพ
+Name[tr]=Resim Gösterici
+Name[uk]=Перегляд зображень
+Name[vi]=Bộ hiển thị ảnh
+Name[xh]=Umbonisi wo Mfanekiso
+Name[zh_CN]=图像显示器
+Name[zh_TW]=影像顯示器
+X-KDE-Library=librenimageplugin
+ServiceTypes=RenameDlg/Plugin,image/jpeg,image/png